🎉

独自ナレッジをノーコードでChatGPTに連携!Azure OpenAI「Add your data」

2023/06/20に公開

「「やってみた」記事はもう十分」という方はもう少し詳しくみてみるセクションからご覧ください!

先月のMicrosoft Buildで発表されて注目を集めていた、Azure OpenAIでコーディングなしで社内のナレッジを組み込んだ回答をするChatGPTが作成できる機能「Add your data」がパブリックプレビューになりました🎉🎉🎉🎉
https://techcommunity.microsoft.com/t5/ai-cognitive-services-blog/introducing-azure-openai-service-on-your-data-in-public-preview/ba-p/3847000

今まではこのようなアーキテクチャを独自で構築する必要があったため、なかなかハードルが高いものでした。

こちらのアーキテクチャはサンプルとして公開されているのでご興味があれば見てみてください。
https://github.com/Azure-Samples/azure-search-openai-demo

やってみる

ではセットアップしてみましょう。
今回はすでにCognitive Searchのリソースがある前提で進めます。

Azure OpenAIのプレイグランドから「チャット」にアクセスして「Add your data」タブから「Add a data source」を選択します。

構成ウィザードが表示されるのであとはそれに従って作成したCognitive Searchのリソースを選択していくだけです!

Azure Blobにパワポやwordファイルをアップロードして、そのBlobを選択することで文字読み取り、チャンク分割全て全自動でAzure Cognitive SearchのIndexを作ってくれる機能もあるみたいです(私はまだ未検証ですが)。
https://learn.microsoft.com/en-us/azure/cognitive-services/openai/concepts/use-your-data#data-formats-and-file-types

しばらくすると構成が完了し、もうこの時点でCogntive Searchのデータも使ったチャットが可能になります!(サンプルで物件情報を読み込ませています)

このままではプレイグラウンドのみでしか使えないので、実際にWebアプリとして公開します。「Deploy to」を選択

WebアプリをホストするWeb Appsを新規で作るのか、既存のリソースを使うのかを選択してWeb Appsにアプリをデプロイ(公開)します。
公開と言っても既定でAzure AD認証が有効になった状態で公開されるので、誰でもアクセスできる、というわけではありません。

実際にアプリが使えるようになるまで十数分かかりますが、特に難しいコーディングなくアプリもデプロイできました!Bing Chatのようにreferenceをクリックすると回答に使用したCognitive Searchのデータが表示されます。

もう少し詳しくみてみる

自動デプロイされたWeb Appsや裏側の処理をもう少し見てみましょう。

言語はPython & Flask

自動デプロイされたWeb AppsはAzureポータルで確認できます。言語はPythonのようです。

自動デプロイされたWebアプリのソースコードをKuduで見てみるとフレームワークにFlaskが使われているのがわかります。

Web APIも提供

冒頭に掲載したプレビューアナウンスには以下のように書かれていました。

You can use the API and endpoint to integrate this feature in the service, not just in an app.(APIとエンドポイントを利用することで、アプリだけでなく、サービス内でこの機能を統合することができます。)

ということで改めてコードを見てみると、自動デプロイされたWebアプリの/conversationにリクエストすることで独自ナレッジ反映済みのChatGPT APIとしても利用できるようです。(既定だとAAD認証が付いているのでAPIを呼ぶ際も認証が必要です。)

こちらのポイントについては以下の記事で詳解しています。
https://zenn.dev/microsoft/articles/azure-openai-add-your-data-api

プロンプトが・・・ない!?(この記事のメイントピック)

独自ナレッジを組み込んで回答する場合、「以下の情報からのみ回答を考えて〜」みたいな質問応答プロンプトをつけるのが一般的です。
このアプリはどんなプロンプト投げてるのか気になったので見てみたのですが、アプリの中にプロンプトはありませんでした。
ではどうしているのかというと、APIとして隠蔽されています(!)

Azure OpenAIのRESTリファレンスをみると、dataSourcesなるプロパティをもつCompletions extensionsというAPIがさらっと追加されています。
ここに対して独自データのエンドポイント情報をセットして、ユーザーの入力とと共にリクエストすると、あとはAzure OpenAIが勝手にやってくれる、という仕組みです。(執筆時点では日本語ドキュメントには未反映)
https://learn.microsoft.com/en-us/azure/cognitive-services/openai/reference#completions-extensions

実際にWebアプリのソースコードからもそのプロパティを使用しているのがわかります。

Completions extensions APIについては以下の記事で詳解しています。
https://zenn.dev/microsoft/articles/azure-openai-add-your-data-api

日本語精度のポイント

Add your dataの精度を左右するポイントは大きく以下の2(+1)点です。

  • Cognitive Searchに格納され{る|た}独自ナレッジの質
  • 検索クエリの質
  • (プロンプトの質)

1つ目については@tmiyata25さんの以下の記事が参考になります。
https://qiita.com/tmiyata25/items/e8866dfed6dd4b9a02ad

2つ目についてもう少し詳しく見てみます。
Add your dataの仕組みでは、まず「ユーザーの入力をクエリ化する」という作業を行います。
例えば「豪華な部屋に住みたい」とユーザーが入力した場合「豪華 部屋 物件」などと言ったようなCognitive Searchへ投げるためのクエリを生成する必要があります。イメージ的には以下の図の通りです(内部の処理が公開されていないのであくまで想像/イメージです)。

どのようなクエリが投げられているかが気になるところですが、Cognitive Searchの診断設定でログを有効にすると確認できます。
チャットにめっちゃ豪華な部屋に住みたいです!と入力した場合

チャットにタワマンのペントハウスに住みたいと入力した場合

上記を見るとわかる通り、必ずしもそのままではないものの、おおよそそのままの文章がクエリとして投げられていることがわかります。
Cognitive Searchに対しては全文検索を行うため、文章でのクエリは有効な回答が見つからない可能性が高いです。
そして、このクエリ生成部分は前述したCompletions extensions APIの中に隠ぺいされているため、開発者は手も足も出ない状況です。
今はプレビューなので英語に最適化されているものと想像しますが、今後GAのタイミングで日本語などのクエリ生成の精度も向上することを期待したいと思います。

システムプロンプトは環境変数で設定できる

Web Appsの「構成」をみると、システムプロンプトはAZURE_OPENAI_SYSTEM_MESSAGE環境変数で設定できるようになっています。
ここを変えることによってキャラクター定義をはじめとしたメタプロンプトが可能です。
ただし、この環境変数はシステムプロンプトのほかにdataSourcesプロパティのroleInformationにもセットされるようになっています。APIドキュメントを見るとroleInformationは最大100トークンという制約があるため、あまり多くの文字はセット出来なさそうです。
その他にもMax tokenなど変数としてAzure OpenAIに渡せるパラメーターは大体が環境変数になっています。

↓システムプロンプトでの参照

↓roleInformationでの参照

デプロイされるアプリはソースコードがGitHubで公開されている

Web Appsの「デプロイセンター」をみると自動デプロイされたアプリのソースコードはGitHubから引っ張ってきていることがわかります。リポジトリにアクセスしてみると、Publicで公開されたMIT licenseのプロジェクトなので、これをForkして自分のアプリを作ることもできます(Pythonですが)。

リポジトリはこちらです。
https://github.com/microsoft/sample-app-aoai-chatGPT

閉域化の対応

非対応だった以前までの内容

少し上級者向けですが、Cognitive SearchやAzure OpenAIではPrivate Linkという仕組みを使ってネットワーク的に閉域化、つまり特定のネットワーク(社内ネットワークなど)からのみアクセスを許可することができます。
特にAdd your dataのような社内ナレッジを含むシステムを構築する場合、閉域化を望むケースも多いと思います。
しかし、Completions extensions APIの場合、APIに対してデータソースとなるCognitive Searchを指定して、Azureのどこかに置かれたCompletions extensions APIの中からCognitive Searchにアクセスできる必要があります。そのため、少なくともこの記事の執筆時点ではAdd your data機能は閉域化に対応していないようです。

記事の冒頭で紹介したサンプルの場合Completions extensions APIの内部で行っている処理を自前で実装する形になるので、その場合は閉域化が可能です。
https://github.com/Azure-Samples/azure-search-openai-demo

プライベートネットワークで保護されたAzure OpenAIリソースをお持ちで、そのデータ上でAzure OpenAIによるCognitiveへのアクセスを許可したい場合は、申請フォームから申請することで構成が可能です。申請書は5営業日以内に審査され、その結果がメールで送信されます。

仕組みとしては申請が承認されると、申請したリソースに対してMicrosoftからプライベートリンクを貼るためのリクエストが飛んできます。これを承諾することで「Add your data」のトラフィックがCognitive Searchのプライベートエンドポイントへアクセスすることができるようになり、結果的にCognitive Searchへのパブリックアクセスを遮断できます。
https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/use-your-data#virtual-network-support--private-network-support

公式教材(無料)

Microsoftが提供しているEラーニングサイト「MS Learn」にて、Azure OpenAIのAdd your dataに関する無料教材が公開されています。
ご自身のAzure環境を持っていなくてもサンドボックス環境でハンズオンを行うことができますので、ぜひご活用ください。
https://learn.microsoft.com/en-us/training/modules/use-own-data-azure-openai/

GitHubで編集を提案
Microsoft (有志)

Discussion