背景
API版のchatGPTは入力データを学習データとして利用しないという情報を見て、(機敏な機密情報を含まない)業務のソースコードを使って質問し、作業効率化を図りたいと思い、slackでchatGPTに問い合わせられるbotを作ってみました。
概要
今回bot作成に利用したのは、Slack 新プラットフォームの開発者用オープンベータ版です。
slack側でインフラ面を自動でやってくれるみたいです。
Beta期間中は、無料で使えるそうです。
手順
- OpenAIからAPIキーを取得する
- slack CLIのインストール
- 使いたいslackアカウントと連携する
slack login
- プロジェクトのテンプレートを作成する
slack create
- ロジックを実装する
- ローカルでテストする
slack run
- デプロイ
slack deploy
- デプロイ後に変更を適用する
slack update
openAI chat completion API の仕組み
APIのパラメータには、
- 使用するモデル (GPT-3.5-turbo, GPT4, ...)
- 会話の情報
- APIキー
を最低限入れる必要があります。
特に、web版のリクエスト構造と違い、API版では必要な会話履歴をすべて入れる必要があります。
一つの質問を入れるだけだと、その前の文脈を含めて回答してくれません。
APIのレスポンスには、AIの返答に加え、入力文・出力文・合計のトークン数が返されます。
これは、このAPIが合計トークン数あたりの従量課金制だからです。
gpt-3.5-turboモデルを使用した場合、$0.002/1000トークンなので数百行程度のコードを質問したり、記事の要約をするくらいなら、1円もかからない場合が多そうです。
実装
実装詳細は、他の記事に情報があるため、要点だけまとめます。
スレッドに返信する
メンションしたメッセージにスレッドとして返信するには、ReplyInThreadというslack関数をワークフローの最後で呼び出します。
スレッドを取得する
スレッドを取得するには、conversations.repliesというslackの関数を利用します。
スレッドIDに当たるものがthread_tsで、まだスレッド化されていない(まだ返信のないメッセージの)場合にはメッセージオブジェクトの中にプロパティが存在しないため、存在チェックはしておいたほうが良さそうです。
スレッド内から取得する最大のメッセージ数はlimitで指定できます。
スレッド全体をchatGPTに送る
APIの入力分のオブジェクト構造は、
{
"role": "user" または "assistant" または "system",
"content": ”質問文”
}
このような形式です。
会話履歴を送るとき、botのuser_idかどうかで条件分岐して、"user"か”assistant"かroleの値を自動的に決定するようにしました。
つまりどころ
slack platformの利用規約に同意する必要がある
デプロイの際に、ワークスペースの管理者にslack開発者プラットフォーム利用規約に同意してもらう必要がありました。
slackのチャンネルIDの調べ方
チャンネル名をクリックして出てくるチャンネル情報の一番下に記載されています。
botがメンションに反応するようにする場合は、指定のチャンネルでしか動かない
app_mentionedというイベントトリガーが用意されています。
トリガー定義内でイベントを以下のように定義します。
event: {
event_type: "slack#/events/app_mentioned",
channel_ids: [
"XXX",
"YYY"
]
}
ワークスペース内のどこでも使えるようにするためには、全てのチャンネルIDを登録しなければいけなそうです。
デプロイされているアプリのロギング
slack activity
で直近のログを見れるようです。
https://api.slack.com/automation/logging
Denoが使われている
普段denoを使用していないので、まだよくわからない部分があります。
よくわからない部分
たまにbotが反応してくれない
関数を使用してワークフローを構築する場合、関数ごとに 15 秒のタイムアウトがあります。関数が開始されてから 15 秒以内に実行が終了しない場合、ログにタイムアウト エラーが表示されます。
タイムアウトは15秒に設定されているようなので、それが原因ではなさそうです。
感想
botレベルでlambda関数を用意して、権限を付与して...などやろうとすると面倒に感じた経験があるので、とても便利だなと思いました。
データストアもあるみたいなので、chatGPTの合計課金額の計算に今後使ってみたいです。
参考
・ChatGPT APIリリースに伴ってOpenAIのAPIデータ利用ポリシーが改定されたので読んでみた
・生成系 AI の業務利用ガイドラインを紹介します
・OpenAI API Reference
・ChatGPT Bot を new Slack Platform で動かしてみた