🐷

ChatGPTのように返答するSlackBotを作った話

2023/02/06に公開

この記事は?

はやりのChatGPTのように返答するSlackBotを作成してみました!サンプルコードも載せているのでよかったら参考にしてください〜

ChatGPTのAPI、OpenAI-API

まずChatGPTのように返答する方法ですが、今回openAI APIを利用します

https://platform.openai.com/overview

下図はopenAPIの利用画面ですが、ご覧のようにいくつかのAPIが存在します

今回はこの中でもText completionというライブラリを利用していきます。
https://platform.openai.com/docs/guides/completion/introduction

APIの作成

それではここからコードを見ていきましょう

今回はCloudFunctionで作成しました
https://cloud.google.com/functions?hl=ja

クソコードですが積極的に晒していきたいので、こちらに記載してます !
https://github.com/entaku0818/chatgpt

まずSlackから来たリクエストを処理します
Slackのコマンドでは送信するリクエストが決まっています。
https://api.slack.com/interactivity/slash-commands
今回この中からtextresponse_urlの2つを使います。

token=gIkuvaNzQIHg97ATvDxqgjtO
&team_id=T0001
&team_domain=example
&enterprise_id=E0001
&enterprise_name=Globular%20Construct%20Inc
&channel_id=C2147483705
&channel_name=test
&user_id=U2147483697
&user_name=Steve
&command=/weather
&text=94070
&response_url=https://hooks.slack.com/commands/1234/5678
&trigger_id=13345224609.738474920.8088930838d88f008e0
&api_app_id=A123456 

コード上ではまずresponse_url とtextを取得しています。
またテキストの結果を待たずに200okを返しています。こうしないとSlackcommandが応答を待ってタイムアウトしまうためです。


exports.chatgpt = (req, res) => {
 console.log('req:', req.body);

 const message = req.body.text || "";
 const response_url = req.body.response_url;
 _requestCompletion(res, message,response_url);
 res.status(200).send("");
};

続いてopenaiのAPIを叩きます。
Slackからもらったtextを叩いているだけです。
openaiのAPI_KEYを入れるだけで動きます

function _requestCompletion(res, message, response_url) {
  const apiKey = %%%OPENAI_APIKEY%%%
  const apiUrl = 'https://api.openai.com/v1/completions';
  const prompt = message;
  let headers = {
    'Authorization':'Bearer '+ apiKey,
    'Content-type': 'application/json',
  };

  const body = {
      'model': 'text-davinci-003',
      'max_tokens' : 1024,
      'temperature' : 0.9,
      'prompt': prompt
      };
  const options = {
    method: 'POST',
    body:    JSON.stringify(body),
    headers: headers,
  }
  fetch(apiUrl, options)
    .then(res => res.json())
    .then((result) => {
      let resultText = "";
      result.choices.forEach(element => {
        resultText += element.text
      });
      console.log('Success:', resultText);
      _slackMessage(response_url,resultText) 
    })
    .catch((error) => {
      console.error('Error:', error);
    });
}

最後にSlackAPIです
ここもリクエストでもらった response_url に対して応答返しています。これでBotができています。

async function _slackMessage(url,text) {
  
    let headers = {
      'Content-type': 'application/json',
    };
    const body = {
      "text": text,
      "response_type": "in_channel",
     };
    const options = {
      method: 'POST',
      body:    JSON.stringify(body),
      headers: headers,
    }
  fetch(url, options)
    .then(res => res.json())
    .then((result) => {
      console.log('Success:', result);
    })
    .catch((error) => {
      console.error('Error:', error);
    });
}

Slackコマンドの作成

こちらは手順を載せようとしたのですが、特質すべき点だけ書かせていただきます!

迷うことはないのですが、APIは下記の画面から入力します。

また、SlackBot作成にありがちな、パーミッションの設定は response_url を利用してるので今回不要です。
権限毎回覚えられないので楽ちんでいいですね!

実践

おおおおおお!すごい!!

と思うじゃないですか実は間違えてました。まぁこれを参考に開発できたので良いのですが、
質問が悪いのかうまく返ってこないことが多々あります

全く知らないランチ提案してくる!と思ったらそんな店ありませんでした笑笑

しかしコードレビューしてなど、具体的にいうと結構ちゃんと返してくれます!

まとめ

以上でChatGPTのように返答するSlackBotができました

今後の気が向いたらやることを最後に書きます。

まずは対話式にしたいです。
ChatGPT利用の方は分かると思いますが、ChatGPTは対話式なのでセッションでいい感じに察してくれるんですよね。渋谷にいますと言った後にランチだったら渋谷のランチを提案してくれるような感じ。(むずそう)

あとはOpenAIの他のAPIも触ってみたいなと思いました
細かく触っていないのでわからないですが色々できそうですよね〜

再掲ですが今回利用したコードをおいておきます!参考になるかどうかわかりませんが見てもらえたら嬉しいです!
https://github.com/entaku0818/chatgpt

Voicyテックブログ

Discussion