やりたいこと
ファイルに関する質問をSlackメンションに投げると回答を返してくれる。
どうやるか
事前に対象ファイルをAzure AI Searchに読み込ませておく(ベクトルインデックス化)
Slackから質問がきたら、OpenAIやCosmosDBを連携させながらAI Search検索を行い
その検索結果を基にOpenAIで回答を生成してSlackに返す。
今回のslackbot作成にあたり、こちらを大変参考させて頂きました🙏
誠に有難うございます🙇
https://zenn.dev/microsoft/articles/jp-openai-5v1
フローイメージ
事前準備
・MicroSoftアカウント
・Azureサインイン
・Python
・VSCode
・npm
作業環境
・Windows
作業項目
- SlackAPI準備
- Azure OpenAI準備
- Azure Functions準備
- VSCode&プロジェクトソース準備
- Azure AI Search準備
- Azure AI Searchデータ投入
- Azure Cosmos DB準備
- 動作確認(ローカル)
- 動作確認(Azure Fuctions)
1. SlackAPI準備
- 以下にアクセスしてslackbotアプリを作成する
https://api.slack.com/apps
(1)ベクトル検索用
(2)通常質問用
※今回はベクトル検索の説明なのですが、ついでに通常の質問も別APIで試せるので
そちらのSlackAPIも併せて作成しておきます
※「Event Subscriptions」にslackbotのURLをセットするのですが、疎通がOKに
ならないと設定ができないためここでは一旦スルーする
以下を参考にさせて頂きました🙇
https://www.beex-inc.com/blog/slackbot-aws-lambda
2. Azure OpenAI準備
- Azure portalでOpenAIをデプロイする
https://portal.azure.com/
(1)AISearch検索クエリ・回答作成用 ⇒ gpt-35-turboモデル
(2)ベクトル検索データ作成用 ⇒ text-embedding-ada-002モデル
以下を参考にさせて頂きました🙇
https://qiita.com/AGV_morinaga/items/04c1b3f505efca8b1511
3. Azure Functions準備
- Azure portalでSlackBot用のAzure Functionsを用意する
https://portal.azure.com/
以下を参考にさせて頂きました🙇
https://qiita.com/pkopko-b8/items/0083c86af60339435e00
4. VSCode&プロジェクトソース準備
- VSCodeの設定とソースを展開する
(1)VSCode拡張機能から「Azure Functions」を取得する
(2)「azure-functions-core-tools」をインストールする
npm install -g azure-functions-core-tools
(3)Azure Functionsの初期プロジェクトを生成する
- VSCode拡張機能Azureで「Create Function」を選択する
- 空のディレクトリを作成&選択する(今回はsampleとしました)
- Pythonを選択する
- Model V2を選択する
- Python x.x.xを選択する
- HTTP triggerを選択する
- ANONYMOUSを選択する
- 以下プロジェクトをダウンロードして「sample」に上書きする
https://github.com/totoaoao/slackbot-chatgpt-for-azure
※いきなり上記プロジェクトを「sample」ディレクトリに入れても良いのですが
VSCodeとAzure Functionsの連携方法があっても良いのかなと思いましたので
記載しておきました👍(あと.venvも生成されないので)
5. Azure AI Search準備
- Azure portalでファイルベクトル検索用のAI Searchを用意する
https://portal.azure.com/
以下を参考にさせて頂きました🙇
参照:https://qiita.com/tatsuki-tsuchiyama/items/fc268beebd5bdead63e4
6. Azure AI Searchデータ投入
- 上で準備したAI Searchに対象ファイルデータを投入する
(1)Azure AI Searchに取り込みたいファイルをプロジェクト下のlangchain/filesに置く
(2)ライブラリをインストールする
pip install --r requirements.txt
AZURE_OPENAI_EMBEDDINGS_DEPLOYMENT_NAME
AI_SEARCH_ENDPOINT
AI_SEARCH_SERVICE_NAME
AI_SEARCH_API_KEY
AI_SEARCH_INDEX_NAME
7. Azure Cosmos DB
- Azure portalで会話履歴用のAzure Cosmos DBを用意する
以下を参考にさせて頂きました🙇
https://qiita.com/ymasaoka/items/3784c64baf30bbe7b761
8.動作確認(ローカル)
- 環境変数を設定してPythonを起動する。
Slack通知をローカルにポートフォワードさせるURLを作成しSlackアプリにセットする。
対象メンションに質問すると回答が返ってくる。
(1)環境変数を設定する
https://github.com/totoaoao/slackbot-chatgpt-for-azure/blob/main/.env
BOT_TOKEN='Slackトークン_通常ChatGPT用'
SLACK_SIGNING_SECRET='Slackシークレットキー_通常ChatGPT用'
BOT_TOKEN_AI_SEARCH='Slackトークン_ベクトル検索用'
SLACK_SIGNING_SECRET_AI_SEARCH='Slackシークレットキー_ベクトル検索用'
OPENAI_API_BASE='OpenAIエンドポイント'
OPENAI_API_VERSION='OpenAIバージョン'
OPENAI_API_KEY='OpenAI APIキー'
GPT_DEPLOYMENT_NAME='OpenAIデプロイ名'
GPT_DEPLOYMENT_MODEL='OpenAIデプロイモデル'
COSMOS_DB_HOST='CosmosDBエンドポイント'
COSMOS_DB_MASTER_KEY='CosmosDB APIキー'
COSMOS_DB_ID='CosmosDB ID名'
COSMOS_DB_CONTAINER_ID='CosmosDB コンテナID'
AI_SEARCH_API_KEY='AI Search APIキー'
AI_SEARCH_ENDPOINT='AI Search エンドポイント'
AI_SEARCH_SERVICE_NAME='AI Search サービス名'
AI_SEARCH_INDEX_NAME='AI Search インデックス名'
(2)「Attach to Python Funcsions」をクリックしてPythonを起動する
以下が表示されるようであれば「Debug anyway」選択
(3)Slack通知を受信してローカルにポートフォワードさせるようにする
①ngrokをダウンロードする
https://ngrok.com/
②ngrok.exeを起動して以下コマンド実施
ngrok http 7071
③発行されたURLをSlackアプリの「Event Subscriptions」にセットする
(1)ベクトル検索用:発行URL
(2)通常質問用:発行URL/ai_search
④問題なければSlackに対象アプリのメンションと質問をいれると
以下のような回答が得られるようになる
ファイルに関する質問
通常の質問
9.動作確認(Azure Functions)
- 環境変数を設定してプロジェクトをAzure Functionsへデプロイする。
Azure FunctionsのURLをSlackアプリにセットする。
対象メンションに質問すると回答が返ってくる。
(1)Azure portalのAzure Functionsにある「構成」⇒「新しいアプリケーション設定」で
環境変数を設定する
(2)VSCode「Azureアイコン」⇒「デプロイアイコン」⇒「Deploy to Function App」で
対象となるAzure Functionsにデプロイする
(3)Azure FunctionsのURLを「関数のURLの取得」から取得して、Slackアプリの
「Event Subscriptions」にセットする
(4)問題なければ上記と同様の回答が得られるようになる