最近、毎日ChatGPTの恩恵を受けている大澤です。 動かないコードの解析をさせて原因を特定してもらったり、出力されたエラーログをChatGPTに投げて原因箇所と対策を教えてもらったりしています。
もちろん100%信用できるわけではないので、最終的には自分で原因を特定しないといけませんが、そのステップをアシストしてくれるのはとても便利ですね。
ChatGPTを使用するときはOpenAIの公式からだったりするわけですが、SlackでChatGPTが使えたら便利かなと思い実装してみました。
ちなみにもともとはGPT-3のAPIを利用して作ったのですが、記事を書いているときにちょうどChatGPTのAPIが公開されたので、ChatGPTのAPIに切り替えました。
GPT-3時点では会話させるのに工夫が必要で、そこも↓こんな感じで頑張って作ったのですが無駄になってしまいましたね…
気を取り直してChatGPT for Slackを作っていきます。
■準備
- Slackbotの作成
- SlackAPIキーの取得
- OpenAIのAPIキーの取得
1、2については弊社のブログで既に紹介されているので、こちらを参考にしてください。
GAS & SlackでMeetのリンク自動生成Botを作ってみた - Briswell Tech Blog
OpenAIのAPIキーの取得
1. アカウントを作成
まずはOpenAIのアカウントを取得します。 以下のリンクをクリックしてアカウント登録を行うことができます。
https://platform.openai.com/signup
2. キーを発行
アカウント登録ができたらログインし、右上の[profile]から[View API Keys]をクリックします。
[Create new secret key]のボタンをクリックし、発行されたキーをどこかに保管しておきましょう。
実装
今回はAWS LambdaでSlack API, ChatGPT APIを使用していきます。プログラムの流れとしては以下です。
- SlackのOutgoing Webhookを使用して「@Chatbot」というメンションをトリガーにしてLambdaにメッセージを送信する。
- LambdaでChatGPTのAPIを叩いてレスポンスを取得する。
- 取得したレスポンスをSlack APIでスレッドに投稿する。
1. OutgoingWebhookを使用する。
OutgoingWebhookの設定の仕方については以下のように多くの記事があるので、そちらを参考にしました。
今回は次のような設定にしました。
トリガー:<botのメンバーID>
URL:AWS Lambdaの関数URL
2. ChatGPTのAPIを叩く。
ChatGPTのAPIのボディは以下の形式です。
{ "model": "gpt-3.5-turbo", "messages": [ {"role": "system", "content": "システムプロンプト"}, {"role": "user", "content": "ユーザー側のプロンプト"}, {"role": "assistant", "content": "ChatGPTの返答"}, {"role": "user", "content": "ユーザー側のプロンプト"}, … ] }
抜粋ですが、コードとしてはこのように書いてみました。openAIのライブラリではなく、requestsライブラリで直接APIを叩きに行ってます。
import requests import json OPENAI_HEADERS = { 'Authorization': 'Bearer 【openAIのAPIキー】'}, 'Content-type': 'application/json' } CHATGPT_URI = 'https://api.openai.com/v1/chat/completions' messages = [ {"role":"system", "content":"あなたはとてもフレンドリーで賢いAIアシスタントです。ユーザーは株式会社ブリスウェルというIT企業に勤めています。ITに関する複雑な質問も来ると思いますが、step by stepで考えて回答しましょう。"} ] ~~~ # --- ユーザーのメッセージとChatGPTのメッセージを振り分ける for conversation in conversations: message={} if conversation[1]=="【<botのメンバーID>】": # botならassistantに割り振る message['role'] = "assistant" message['content'] = conversation[0] else: message['role'] = "user" message['content'] = conversation[0].replace('【<botのメンバーID>】','') print(message['content']) messages.append(message) data = { "model": "gpt-3.5-turbo", "messages": messages } response = requests.post(CHATGPT_URI, headers=OPENAI_HEADERS, data=json.dumps(data)) r = response.json()
Slackのスレッドを取得してconversationsに入れ、それを辞書型に加工してChatGPTのAPIを叩きに行ってます。
ちなみにSlackのスレッドを取得するにはSlack APIのconversations.repliesを利用します。
Slack APIのページには「Tester」というタブがあり、そのページでAPIのテストができます。とても便利でした。
3. ChatGPTからの回答をスレッドに投稿する。
こちらはSlack APIのchat.postmessageを叩くだけです。
SLACK_TOKEN = "【SlackのAPIキー】" POST_URL = "https://slack.com/api/chat.postMessage" HEADERS = {"Authorization": "Bearer "+SLACK_TOKEN} # --- スレッドへ返信する。 data = { 'channel': channel_name, # 投稿するチャンネル名 'text': f'{messages}', # 投稿するメッセージ(ChatGPTの回答) 'thread_ts': ts # 投稿するスレッドの親メッセージのtimestamp } r = requests.post(POST_URL, headers=HEADERS, data=data)
GPT-3のときに比べてシンプルに実装できるようになっていました。