Azure OpenAI x Pinecone x TeamsでFAQ検索ボットを作成する~概要編
やりたいこと
Teamsでbotを作って、社内FAQを検索して、Chat-GPTに回答を書かせたい。
この記事について
この記事は概要説明のみで、実装には触れておりません。
全体概要
概要図
説明
Logic App(Azure上のpower automateだと思います)を利用して、Teamsの投稿を監視して、新しい投稿があれば、App Serviceで構築した一連のChat-GPT処理を行い、Logic AppがTeamsへ返信を投稿します。
構成について
なぜこうしたのか
Teamsの投稿を拾う方法は色々とありましたが、一番、簡単そうなのがLogic Appだったため、Logic Appを真っ先に採用しました。次にネックになったのがLogic Appは私の実力では複雑な処理が書けなかったため、Pythonで動くWeb Serviceを作成する必要がありました。となると、ここで他社のサービスを使うというよりはApp Serviceを使うことにしました。なお、Pineconeを採用したのはFAQ検索の事例としてどこかで紹介されており、それをそのまま採用したためです。
改めて検索して見つけました。出典はこれです。Chatbots with Pinecone
各サブシステムの流れなどについて
1.Pineconeへのアップロード
FAQをvector化して、Pineconeへ保存します。vector化処理として、Azure OpenAI(以下AzAI)のembeddedを利用します。なぜOpenAIではないかというと、社用で使うためという建前と、OpenAIでも、処理は全く同じためです。ですので、概要レベルではAzAIでもOpenAIでも同じであろうという理由です。
さて、本題に戻ります。
あらかじめ「text-embedding-ada-002」モデルをデプロイして使えるようにしておく必要があります。その手順は割愛します。pythonからAPIを呼び出して、embeddedを処理するとディメンジョンサイズが1536のvectorにしてくれるので、それをまとめて、Pineconeへupsertします。具体的なやり方はPineconeアップロード編に記載しました。Pineconeのテーブルはindexと呼ばれているようで、このindexを検索でも利用します。
pineconeの公式QuickStartなどを参考に誌ました。How to get started with the Pinecone vector database.
2.Databaseへのアップロード
Pineconeでは元の文書が保存できないようです。metadataとかあるのですが、取り出し方が全く分からず。OpenAIのChat-GPTを問い詰めたところ、取り出せないという回答だったので、断念しました。そこで、FAQの内容をWeb ServiceのDBへアップロードして取り出すことにしました。なぜならば、社内で使っているFAQデータがオンプレからしかアクセスできず、どこかのクラウドに上げなくてはいけなかったからです。Web ServiceにDBをインストールするのではなく、App Serviceを作成する際に「Webアプリとデータベース」を選んで進むだけですので大した手間ではありませんでした。この辺りはオンプレからすると、隔世の感があり、いい世の中になったと感じられるところです。(2023/06/20訂正です。)
公式のqueryの解説を眺めていたら、queryのoptionにinclude_metadataなるものがありました。早速ためしたところ、元の文書が取り出せました。しかし今後の拡張性を考えるとやはりDBがあったほうがいいと思い、自分のシステム構成は変えておりません。
参照元はUsing metadata filters in queriesこちらになります。Chat-GPTも人間同様、問い詰めるとダメなようです。(反省)
3.App ServiceでWebサービスを作成
Teamsで受け取った質問をLogic Appからpineconeの検索をさせる。次に関連度の高いFAQのIDを取得する。その次にFAQの本文をAzAIの「gpt-35-turbo」に処理させるにはLogic Appから直接の呼び出しでは自由度が低すぎて実質できないと判断しました。(自分の実力不足ですかね)
そのため、仲介するWebServiceを構築するため、こちらもAzureのApp Serviceを利用することにしました。App Serviceは今回、flaskを利用しました。結果、2と3は同じApp Serviceを利用することになり、後々ソースが融合されました。なお、この辺りはazureの公式QuickStartのDeploy a Python (Django or Flask) web app with PostgreSQL in Azureのソースを丸ごと利用しています。
4.Logic AppでTeamのbotの挙動を作成
Logic AppからTeamsへのトリガーを通じて、特定のチャネルでチャネルをメンションした際にその投稿を取得します。取得できる投稿内容がhtmlなので、そのhtmlタグをそれなりにクリーニングします。次に3で作成したApp Serviceにjsonで投稿内容を投げます。App Serviceはそれをembedded処理をして、pineconeにあらかじめupsertされたIndexに検索に行きます。そして、その結果から、元のFAQデータを検索しに行きます。そのFAQの本文をプロンプトのassistant情報にそのまま書き付けて、openai.ChatCompletion.createAPIに投げます。その回答を今度はTeamsで返信ができるように、App Service側でそれなりにHTMLタグをつけてリターンをして、Logic AppからTeamsへ返信投稿をします。
相互リンク
Pineconeアップロード編
postgresqlアップロード編
pineconeにqueryを投げる+LLMで回答を作成する編
Logic App作成編
最終版
お詫び
手順4まで書いたつもりで投稿を公開していましたが、書いてませんでした。2023年06月19日に気が付いて手順を追加しました。
その他、記事の内容の加筆修正も行いました。