LoginSignup
1
4

Slackbot(Azure Functions×FastAPI)でAzure AI Search(旧Cognitive Search)でベクトル検索をやってみた

Last updated at Posted at 2024-02-20

やりたいこと

ファイルに関する質問を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

作業項目

  1. SlackAPI準備
  2. Azure OpenAI準備
  3. Azure Functions準備
  4. VSCode&プロジェクトソース準備
  5. Azure AI Search準備
  6. Azure AI Searchデータ投入
  7. Azure Cosmos DB準備
  8. 動作確認(ローカル)
  9. 動作確認(Azure Fuctions)

1. SlackAPI準備

 (1)ベクトル検索用
 (2)通常質問用

  ※今回はベクトル検索の説明なのですが、ついでに通常の質問も別APIで試せるので
   そちらのSlackAPIも併せて作成しておきます

  ※「Event Subscriptions」にslackbotのURLをセットするのですが、疎通がOKに
   ならないと設定ができないためここでは一旦スルーする
 
   以下を参考にさせて頂きました🙇
   https://www.beex-inc.com/blog/slackbot-aws-lambda

2. Azure OpenAI準備

 (1)AISearch検索クエリ・回答作成用 ⇒ gpt-35-turboモデル
 (2)ベクトル検索データ作成用 ⇒ text-embedding-ada-002モデル

  以下を参考にさせて頂きました🙇
  https://qiita.com/AGV_morinaga/items/04c1b3f505efca8b1511

3. Azure Functions準備

  以下を参考にさせて頂きました🙇
  https://qiita.com/pkopko-b8/items/0083c86af60339435e00

4. VSCode&プロジェクトソース準備

  • VSCodeの設定とソースを展開する

 (1)VSCode拡張機能から「Azure Functions」を取得する
image.png

 (2)「azure-functions-core-tools」をインストールする

npm install -g azure-functions-core-tools

 (3)Azure Functionsの初期プロジェクトを生成する

  1. VSCode拡張機能Azureで「Create Function」を選択する
    image.png
  2. 空のディレクトリを作成&選択する(今回はsampleとしました)
    image.png
  3. Pythonを選択する
    image.png
  4. Model V2を選択する
    image.png
  5. Python x.x.xを選択する
    image.png
  6. HTTP triggerを選択する
    image.png
  7. ANONYMOUSを選択する
    image.png
  8. 以下プロジェクトをダウンロードして「sample」に上書きする
    https://github.com/totoaoao/slackbot-chatgpt-for-azure

 ※いきなり上記プロジェクトを「sample」ディレクトリに入れても良いのですが
  VSCodeとAzure Functionsの連携方法があっても良いのかなと思いましたので
  記載しておきました👍(あと.venvも生成されないので)

5. Azure AI Search準備

 以下を参考にさせて頂きました🙇
 参照: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
  • 実行する
    image.png

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を起動する
image.png

    以下が表示されるようであれば「Debug anyway」選択
image.png

 (3)Slack通知を受信してローカルにポートフォワードさせるようにする
   ①ngrokをダウンロードする
   https://ngrok.com/
   ②ngrok.exeを起動して以下コマンド実施

ngrok http 7071

   ③発行されたURLをSlackアプリの「Event Subscriptions」にセットする
image.png

   (1)ベクトル検索用:発行URL
   (2)通常質問用:発行URL/ai_search

   ④問題なければSlackに対象アプリのメンションと質問をいれると
    以下のような回答が得られるようになる

ファイルに関する質問

image.png

通常の質問

image.png

9.動作確認(Azure Functions)

  • 環境変数を設定してプロジェクトをAzure Functionsへデプロイする。
    Azure FunctionsのURLをSlackアプリにセットする。
    対象メンションに質問すると回答が返ってくる。

 (1)Azure portalのAzure Functionsにある「構成」⇒「新しいアプリケーション設定」で
    環境変数を設定する

image.png

 (2)VSCode「Azureアイコン」⇒「デプロイアイコン」⇒「Deploy to Function App」で
   対象となるAzure Functionsにデプロイする
image.png

 (3)Azure FunctionsのURLを「関数のURLの取得」から取得して、Slackアプリの
   「Event Subscriptions」にセットする
image.png

 (4)問題なければ上記と同様の回答が得られるようになる

1
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4