2023-08-05
ChatGPT Retrieval Pluginを使ったSlack Botの構築
ChatGPT Retrieval Pluginを使ったSlack Botの構築
この記事では、ChatGPT Retrieval Pluginを使って独自の情報を元にChatGPT風に回答するSlack Botの構築方法を紹介します。

システムのアーキテクチャは次のとおりです。

ユーザーがとSlack Botに質問すると、Cloud Functionsが発火し、Cloud Run上で起動しているChatGPT Retrieval Pluginにアクセスします。ChatGPT Retrieval Pluginは受け取った入力をOpenAI APIによりベクトルに変換し、Pineconeに接続します。入力のベクトルともっとも類似しているテキストをPinecone内から抽出し、そのテキストを入力に加えてLLM(OpenAI API)に渡します。そしてLLMからの返答をユーザーに返します。
LLMとベクトルデータベースのシステムの仕組みについては次の記事を参照してください。
ソースコード
次のレポジトリでソースコードを確認することができます。
Pineconeのインデックスの作成
Slack Botの構築にあたり、まずはPineconeのインデックスを作成します。PineconeのAPIキーとENVIRONMENTをコンソールから取得し、ソースコードのpinecone/create-index.shファイルを実行します。
$ export PINECONE_API_KEY=aaa
$ export PINECONE_ENVIRONMENT=aaa
$ export PINECONE_INDEX=chatbot
$ sh pinecone/create-index.sh
無事作成されていることをコンソール上で確認します。

ChatGPT Retrieval Pluginのデプロイ
ChatGPT Retrieval PluginをCloud Run上にデプロイします。次の環境変数を設定します。
$ export DATASTORE=pinecone
$ export BEARER_TOKEN=secret
$ export OPENAI_API_KEY=aaa
$ export OPENAI_ORGANIZATION=aaa
$ export GCP_PROJECT_ID=aaa
$ export GCP_REGISTRY_HOSTNAME=asia.gcr.io
$ export APP_NAME=chatgpt-retrieval-plugin
$ export SERVICE_ACCOUNT=aaa # Service account for Cloud Run
aaaと書かれている部分はご自身で設定する必要があります。SERVICE_ACCOUNTについては、GCPのコンソール上でOwner権限を付与したサービスアカウントを用意し、そのアカウントのメールアドレスを入力します。
そして次のコマンドでデプロイします。
$ cd retrieval
$ sh deploy.sh
無事にデプロイされると、Cloud RunのURLが発行されます。
<Cloud Run URL>/docsにアクセスすると、Swaggerのページを確認できます。secretと入力して認証します。

/upsertエンドポイントから、Pineconeにテキストを格納することができます。次のリクエストボディを投げます。
{
"documents": [
{
"id": "1",
"text": "ChatGPT Retrieval Plugin is delicious food. It is like an ice scream.",
"metadata": {
"source": "email",
"source_id": "string",
"url": "https://io.traffine.com/en/articles/chatgpt-retrieval-plugin"
}
}
]
}

/queryエンドポイントから、「is chatgpt retrieval plugin delicious?」というテキストに類似するテキストを上位3件取得します。
{
"queries": [
{
"query": "is chatgpt retrieval plugin delicious?",
"top_k": 3
}
]
}
先ほど格納したテキストが抽出されています。

Slack Appの作成
Slack APIにアクセスし、Appを作成します。



「OAuth & Permissions」をクリックし、Scopesにapp_mentions:readとchat:writeの権限を追加します。


「Install to Workspace」をクリックし、AppをSlackにインストールします。

「Bot User OAuth Token」をメモします。

「Basic Information」にある「Signing Secret」をメモします。

Cloud Functionsのデプロイ
Cloud Functionsを作成します。まずはコンソールへ移動し、「CREATE FUNCTION」クリックします。

設定を行います。環境変数は次のとおりです。
OPENAI_API_KEYOPENAI_ORGANIZATIONSLACK_BOT_TOKENSLACK_BOT_SIGNING_SECRETCHATGPT_RETRIEVER_URL: Cloud Run Endpoint that you have deployed

コードは次のとおりです。
- Python 3.10
- main.py: https://github.com/ryuseikakujo/slack-chatgpt-retrieval/blob/main/slackbot/main.py
- requirements.txt: https://github.com/ryuseikakujo/slack-chatgpt-retrieval/blob/main/slackbot/requirements.txt
- Entry point:
slack_bot
SlackのEvent Subscriptions
Slackの「Event Subscriptions」をOnにして、Cloud FunctionsのURLを貼り付けます。Verifiedになることを確認します。

「Subscribe to bot events」にapp_mentionを追加します。

チャットしてみる
Slackで、@chatgptとメンションして質問すると、返答してくれるようになります。「Is ChatGPT Retrieval Plugin delicious?」と尋ねると、美味しいという旨の返答が返ってきます。先ほどSwaggerにてPineconeに格納したテキストを参照していることがわかります。

参考