🐷 SlackにGPT-3の機能を追加して話し相手になってもらった

2023-02-01 /Development #Slack

話題のGPT-3で応答してくれるSlackのボットを作成してみました。

次回またボットを作りたくなった時にササっと思い出せる様に手順をメモ。

Slackのアプリを作成する

まずはSlackにログインして以下のURLからアプリを作成します。

Slack API: Applications | Slack https://api.slack.com/apps

作成ができたら、tokenとsecretが取得できるので、それを環境変数として使えるように.envファイルに記載しておきます。

コピーしました
SLACK_BOT_TOKEN=
SLACK_SIGNING_SECRET=

openaiのAPI keyも取得する

openaiの方も必要なので取得しておきます。

こちらもアカウントを作成してログインしたら以下のURLからAPI keyが取得できるので、.envに追記しておきます。

OpenAI API https://platform.openai.com/account/api-keys
コピーしました
OPENAI_API_KEY=

ボットを作成する

APIのキーが取得できたらjsファイルを作成します。

まずはメッセージを渡したら返事をかえしてくれるだけの関数を作成しておきます。 text-davinci-003と入れておくとGPT-3が使えるそうです。

コピーしました
const { Configuration, OpenAIApi } = require("openai");

async function callOpenAI(message) {
  const configuration = new Configuration({
    apiKey: process.env.OPENAI_API_KEY,
  });

  const openai = new OpenAIApi(configuration);

  const completion = await openai.createCompletion({
    model: "text-davinci-003",
    prompt: message,
    max_tokens: 512,
  });

  return completion.data.choices[0].text;
}

あとはこの関数を呼び出す側を書くだけです。

ボット部分は Bolt を使って作成します。メンションとSlashコマンドに対応するブロックを作り、そこから先ほどの関数を呼び出すように記載します。

コピーしました
const { App } = require("@slack/bolt");
require("dotenv").config();

const app = new App({
  token: process.env.SLACK_BOT_TOKEN,
  signingSecret: process.env.SLACK_SIGNING_SECRET,
});

(async () => {
  await app.start(8080);
  
  //どの投稿にも反応されると困るので教えてって言った時だけ反応するように
  app.message(/.*<@xxxxxxxxxx>.*/, async ({ message, say }) => {
    const t = message.text;
    if (t.includes("教えて") || t.includes("おしえて")) {
      const re = await callOpenAI(t);
      await say(re);
    }
  });

  //教えて以外で細かくプロンプトを設定したい場合にはSlash command経由で
  app.command("/ai", async ({ command, ack, say, respond }) => {
    const message = await callOpenAI(command.text);

    await ack();
    await say(message);
  });
})();

あとはこれをDockerで動くようにしてCloud Runにデプロイすると、いつでも返事をしてくれる話し相手の出来上がりです。

Cloud Runにデプロイする部分は こちらのチュートリアルの記事 に細かく記載されていていてわかりやすかったので貼っておきます。

所感

脳内では若本さんの声で再生するようにしています。なんて事のない疑問にも適当にお返事を返してくれて話し相手として非常に良い感じです。

3ヶ月間は上限$18.00までなら無料で使用できるようです。

Comment
comments powered by Disqus
Profile

石原 悠 / Yu Ishihara

デザインとプログラミングと編み物とヨーグルトが好きです。