GMOアドマーケティングのR.Aです。
この度、社内でSlackアプリとChatGPTを連携させ、Slack上から気軽に利用できるようにしてほしいと
要望があったため実装を行いました。
今回は、実装までの流れについて説明させていただきます。
完成後の動きについて
まずは、完成後の動きについてイメージしていただきたいと思います。今回作成したアプリ宛にメンションをつけ、質問を行うとスレッド内で返信が返ってきます。
続けてスレッド内で返信を行うと対話形式となります。 仕様は以下の通りです。
前提
- 対話が行えるBOTとしてChatGPTを使用する
- 1問1答形式ではなく、文脈の理解が必要
- BOTとの会話は必ずメンションをつけて行う
- メンションでBOTを呼び出し、そのメッセージのスレッドでBOTが解答する
開発の流れ
今回開発を行った流れは以下となります。①Slackアプリの作成
↓
②Slackアプリの設定
↓
③Cloud Functionsで関数の作成
↓
④Slackのメッセージ取得とChatGPTにリクエストする処理の作成
それでは、早速各カテゴリ毎に説明を行っていきます。
①Slackアプリの作成
まず、Slackのアプリを作成します。以下の画面の右上にある「Create New App」をクリックします。
https://api.slack.com/apps?new_app=1
その後、アプリ名とアプリの所属を選択する画面に遷移するので、任意の値を入力します。
入力が完了したら、「Create App」をクリックします。
これでアプリの作成が完了します。
②Slackアプリの設定
続いてアプリの設定を行って行きます。アプリにメンションがあった場合、その内容を読み取る必要があるため、必要な権限を付与していきます。
まず、アプリのトップ画面に移動し、左のメニューから「OAuth & Permissions」を選択します。
クリックすると、「Scopes」項目の「Bot Token Scopes」というものがありますので、以下を追加します。
app_mentions:read:アプリが参加している会話を読み込む。
channels:history:チャンネルのメッセージ履歴を取得する。
groups:history:プライベートのグループメッセージを取得する。
im:history:DMに来たメッセージ履歴を取得する。
im:write:DMにメッセージを書き込む。
mpim:history:グループダイレクトメッセージを取得する。
mpim:write:グループダイレクトメッセージに書き込む。
③Cloud Functionsで関数の作成
続いて、Slackに届いたメッセージを取得し、ChatGPTに送信するための環境を構築します。今回は、GoogleのCloud Functionsを使用します。
関数の作成
Cloud Functionsのトップページに移動し、画面上部にある「関数の作成」をクリックしてください。
それぞれ必要事項を入力してください。
今回は、環境は第2世代とし、リージョンはasia-northeast1と設定しました。
保存をクリックすると関数が作成されるので、次にプログラムを書いていきます。
④Slackのメッセージ取得とChatGPTにリクエストする処理の作成
まず始めに、Slackのメッセージ取得するための処理を作成します。③の保存を行うとコードを記述するページに遷移します。
今回の作成はPythonで行うため、ランタイムにPythonを選択します。
(今回はバージョン3.10を選択しました。)
そして、左側の入力欄にコード記述します。
最初に、初期設定でSlackとの通信ができることを確認する必要があるため、
以下のコードを記述し、Cloud FunctionsとSlack APPの通信が行える事を確認します。
1 2 3 4 5 6 7 |
import json def verify(param): if param.get_json().get('type') == 'url_verification': body = json.dumps({'challenge': param.get_json()['challenge']}) headers = {'Content-Type': 'application/json'} return (body, 200, headers) |
しばらくすると、デプロイが完了しますので、メニューから「トリガー」を選択します。
URLが表示されるので、その値をコピーします。 次に、Slackアプリの設定画面に移動し、「Event Subscriptions」を選択します。
この項目はデフォルトでは「Off」になっていますので、「On」に変更し、「Request URL」に先ほどコピーしたURLを貼り付けます。 これで、先ほど作成した関数にリクエストが送信され、問題ないか確認を行います。
成功すると、URLの上部に「Verified」と表示されます。
1、Slackのメッセージ取得
エントリポイントに登録してあるものから実行されます。また呼び出し時にparamには、ユーザーがSlack送信を行なった内容が格納されているので、paramの中身([‘event’][‘text’])を確認するとメッセージの取得が行えます。
1 2 3 4 |
def verify(param): body = param.get_json() user_text = body['event']['text'] print(user_text) |
2、ChatGPTへのリクエスト処理の記述
次に、ChatGPTに質問を投げる処理を実装します。 まず、ChatGPTをAPIで実行するためには、OpenAIのアカウントが必要です。アカウントを作成すると、APIキーが取得できます。
アカウントの作成方法やAPIキーの取得方法は、多数の記事で解説されていますので、ここでは省略します。
以下の手順でAPIにアクセスし、ChatGPTに質問を投げます。
- OpenAIにサインアップする
- OpenAIのサイトでAPIキーを取得する
- openaiモジュールをインストールする
- openai.ChatCompletion.createメソッドを呼び出し、質問文を投げる
先ほども記述した通り、エントリポイントのverifyから実行され、paramにSlackのテキストやスレッド情報が格納されているので、テキストをjson形式にしChatGPTにリクエストします。その後結果がanswerに返却されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
import openai def postChatGPT(input_text): KEY = "取得したAPIキー" openai.api_key = KEY MODEL_NAME = "gpt-3.5-turbo-0301" TEMPARATURE = 0.7 TOP_P = 1.0 response = openai.ChatCompletion.create( model=MODEL_NAME, messages=input_text, temperature=TEMPARATURE, top_p=TOP_P) reply = response["choices"][0]["message"]["content"] return reply, "OK" def verify(param): body = param.get_json() user_text = body['event']['text'] question.append({"role": "user", "content": user_text}) answer = postChatGPT(question) |
7行目では、使用するモデルを指定しています。
今回はコスト面とレスポンス速度を考慮し、gpt-3.5-turbo-0301を使用しています。
8行目と9行目は、生成されるテキストを調整するためのパラメータとして機能します。
11行目ではChatGPTにリクエストを送り、結果がresponseに格納されます。
この実装では、一問一答形式が可能です。
今回はコスト面とレスポンス速度を考慮し、gpt-3.5-turbo-0301を使用しています。
8行目と9行目は、生成されるテキストを調整するためのパラメータとして機能します。
11行目ではChatGPTにリクエストを送り、結果がresponseに格納されます。
この実装では、一問一答形式が可能です。
また、Slackにはスレッドという機能があるため、メッセージを取得する際にはスレッド内のテキストを全て取得するようにすることで、対話形式でChatGPTとやりとりすることもできます。
以下のように記述します。
以下のように記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
import openai def postChatGPT(): KEY = "取得したAPIキー" openai.api_key = KEY MODEL_NAME = "gpt-3.5-turbo-0301" TEMPARATURE = 0.7 TOP_P = 1.0 response = openai.ChatCompletion.create( model=MODEL_NAME, messages=[ # {"role": "user", "content": "花粉が辛いです。"}, # {"role": "assistant", "content": "私は人工知能のAIであり、花粉症を持っていませんが、花粉症の方々にとっては本当につらい季節ですね。正しい対処方法を行い、身体に負担をかけすぎないように心がけましょう。"}, # {"role": "user", "content": "よく効く薬はありますか?"} ], temperature=TEMPARATURE, top_p=TOP_P) reply = response["choices"][0]["message"]["content"] return reply, "OK" |
上記を行うと添付のようにChatGPTと会話するよう質問が行えます。
まとめ
今回は重要な部分に絞って説明を行いましたが、いかがでしたでしょうか。完全に動くように記載することもできましたが、Slackアプリの作成から説明したため、かなりのボリュームになってしまうため要点を絞ってご説明しました。
今回で一通りの説明ができたと思いますので、今後ChatGPTがアップデートされた場合には、詳しく説明できるようにしたいと思います。
皆さんも普段の業務にChatGPTを取り入れ、業務効率化やサポートを行ってみてはいかがでしょうか。