Python でチャット アプリの回答を評価する
この記事では、チャット アプリの回答を正しい回答または理想的な回答 (グラウンド トゥルースと呼ばれる) のセットと比較して評価する方法について説明します。 回答に影響を与えるような方法でチャット アプリケーションを変更するたびに、評価を実行して変更を比較します。 このデモ アプリケーションでは、評価を簡単に実行できるツールを提供しています。
この記事の手順に従うことで、次の操作を行います。
- 関心領域に合わせて調整したサンプル プロンプトを使用します。 これらのプロンプトは既にリポジトリにあります。
- 独自のドキュメントから、ユーザーへのサンプルの質問とそれらのグラウンド トゥルースの回答を生成します。
- 生成されたユーザーへの質問を含むサンプル プロンプトを使用して評価を実行します。
- 回答の分析を確認します。
Note
この記事では、記事内の例とガイダンスの土台として、1 つ以上の AI アプリ テンプレートを使用しています。 AI アプリ テンプレートは、適切にメンテナンスされ、デプロイが容易なリファレンス実装を提供します。これは、高品質な AI アプリの作成を開始するために役立ちます。
アーキテクチャの概要
アーキテクチャの主なコンポーネントは次のとおりです:
- Azure ホステッド チャットアプリ: チャットアプリは Azure App Service で実行されます。
- Microsoft AI チャット プロトコルは、AI ソリューションと言語全体で標準化された API コントラクトを提供します。 チャット アプリは Microsoft AI チャット プロトコルに準拠しているため、このプロトコルに準拠する任意のチャット アプリに対して評価を実行できます。
- Azure AI Search: チャット アプリは Azure AI Search を使用して、独自のドキュメントのデータを保存します。
- サンプル質問生成ツール: ドキュメントごとに数多くの質問とそれらのグラウンド トゥルースを生成できます。 質問が多いほど、評価時間は長くなります。
- 評価ツール は、サンプルの質問とプロンプトをチャット アプリに対して実行し、結果を返します。
- 確認ツール により、評価の結果を確認できます。
- 差分ツール により、評価間で回答を比較できます。
この評価を Azure にデプロイすると、独自の容量を持つ GPT-4
モデル用に Azure OpenAI エンドポイントが作成されます。 チャット アプリケーションを評価するときは、エバリュエーターが独自の容量を持つ GPT-4
を使用する独自の OpenAI リソースを持っている必要があります。
前提条件
Azure のサブスクリプション。 無料で作成できます
目的の Azure サブスクリプション内の Azure OpenAI に付与されたアクセス権。 詳細については、https://aka.ms/oai/access をご覧ください。
前述のチャット アプリの手順 を完了して、チャット アプリを Azure にデプロイします。 このリソースは、評価が機能するために必要です。 前の手順の「リソースのクリーンアップ」セクションを完了しないでください。
そのデプロイ (この記事では チャット アプリ と呼んでいます) から次の Azure リソース情報が必要になります。
- チャット API URI:
azd up
プロセスの最後に表示されるサービス バックエンド エンドポイント。 - Azure AI Search。 次の値が必要です。
- リソース名:
azd up
プロセス中にSearch service
として報告された Azure AI 検索リソース名の名前。 - インデックス名: ドキュメントが保存されている Azure AI Search インデックスの名前。 これは、Search Service の Azure portal にあります。
- リソース名:
チャット API URL を使用すると、評価はバックエンド アプリケーションを介して要求を行うことができます。 Azure AI 検索情報を使用すると、評価スクリプトは、ドキュメントと共に読み込まれたバックエンドと同じデプロイを使用できます。
これらの情報を収集したら、もう チャット アプリ の開発環境を使用する必要はありません。 ただし、この記事の後半で、 チャット アプリ を 評価アプリがどのように利用するかを示すために、チャット アプリについて言及します。 この記事の手順をすべて完了するまでは、 チャット アプリ のリソースを削除しないでください。
- チャット API URI:
開発コンテナー 環境は、この記事を完了するために必要なすべての依存関係と共に使用できます。 開発コンテナーは、(ブラウザーで) GitHub Codespaces で実行することも、Visual Studio Code を使用してローカルで実行することもできます。
- GitHub アカウント
開発環境を開く
この記事を完了するため、すべての依存関係がインストールされている開発環境から始めます。 このドキュメントと開発環境の両方を同時に表示できるように、モニターのワークスペースを配置する必要があります。
この記事は、評価デプロイの switzerlandnorth
リージョンでテストされました。
GitHub Codespaces は、 Visual Studio Code for the Web をユーザー インターフェイスとして使用して、GitHub によって管理される開発コンテナーを実行します。 最も簡単な開発環境では、GitHub Codespaces を使用して、この記事を完了するために正しい開発者ツールと依存関係がプレインストールされるようにします。
重要
すべての GitHub アカウントでは、2 つのコア インスタンスで毎月最大 60 時間無料で Codespaces を使用できます。 詳細については、「GitHub Codespaces に月単位で含まれるストレージとコア時間」を参照してください。
main
GitHub リポジトリのAzure-Samples/ai-rag-chat-evaluator
ブランチに新しい GitHub Codespace を作成するプロセスを開始します。開発環境と利用可能なドキュメントを同時に表示するには、次のボタンを右クリックして、[リンクを新しいウィンドウで開く] を選択します。
[codespace の作成] ページで、Codespace の構成設定を確認した後に、[新しい codespace の作成] を選択します
Codespace が起動するまで待ちます。 この起動プロセスには数分かかることがあります。
画面の下部にあるターミナルで、Azure Developer CLI を使用して Azure にサインインします。
azd auth login --use-device-code
ターミナルからコードをコピーし、ブラウザーに貼り付けます。 手順に従って、Azure アカウントで認証します。
評価アプリに必要な Azure リソース、Azure OpenAI をプロビジョニングします。
azd up
この
AZD command
により、評価アプリはデプロイされませんが、開発環境で Azure OpenAI リソースが作成されます。このリソースには、評価アプリをローカルで実行するために必要なGPT-4
のデプロイが含まれます。この記事の残りのタスクは、この開発コンテナーのコンテキストで行われます。
GitHub リポジトリの名前が検索バーに表示されます。 このビジュアル インジケーターは、この評価アプリとチャット アプリを区別するのに役立ちます。 この記事では、この
ai-rag-chat-evaluator
リポジトリを 評価アプリ と呼んでいます。
環境値と構成情報を準備する
評価アプリ用に前提条件で収集した情報を使用して、環境値と構成情報を更新します。
次に基づいてファイルを
.env
作成します.env.sample
。cp .env.sample .env
次のコマンドを実行して、デプロイされたリソース グループに必要
AZURE_OPENAI_EVAL_DEPLOYMENT
な値を取得しAZURE_OPENAI_SERVICE
、それらの値をファイルに.env
貼り付けます。azd env get-value AZURE_OPENAI_EVAL_DEPLOYMENT azd env get-value AZURE_OPENAI_SERVICE
チャット アプリ からの、その Azure AI Search インスタンスに対する次の値を
.env
に追加します。これらの値は、 前提条件 のセクションで収集したものです。AZURE_SEARCH_SERVICE="<service-name>" AZURE_SEARCH_INDEX="<index-name>"
構成情報に Microsoft AI チャット プロトコルを使用する
チャット アプリと評価アプリは、Microsoft AI Chat Protocol specification
の両方、オープンソース、クラウド、および使用と評価に使用される言語に依存しない AI エンドポイント API コントラクトを実装します。 クライアントと中間層のエンドポイントがこの API 仕様に準拠している場合、AI バックエンドで評価を一貫して使用および実行できます。
my_config.json
という名前の新規ファイルを作成して、それに次の内容をコピーします。{ "testdata_path": "my_input/qa.jsonl", "results_dir": "my_results/experiment<TIMESTAMP>", "target_url": "http://localhost:50505/chat", "target_parameters": { "overrides": { "top": 3, "temperature": 0.3, "retrieval_mode": "hybrid", "semantic_ranker": false, "prompt_template": "<READFILE>my_input/prompt_refined.txt", "seed": 1 } } }
評価スクリプトによって、
my_results
フォルダーが作成されます。overrides
オブジェクトには、アプリケーションに必要な構成設定がすべて含まれています。 各アプリケーションは、独自の設定プロパティのセットを定義します。次の表を使用して、チャット アプリに送信される設定プロパティの意味を理解します。
プロパティの設定 説明 semantic_ranker セマンティック ランカーを使用するかどうか。これは、ユーザーのクエリに対するセマンティック類似性に基づいて検索結果を再ランク付けするモデルです。 このチュートリアルでは、コストを削減するために無効にします。 retrieval_mode 使用する取得モード。 既定値は、 hybrid
です。温度 モデルの温度設定。 既定値は、 0.3
です。上位 返す検索結果の数。 既定値は、 3
です。prompt_template 質問と検索結果に基づいて回答を生成するために使用されるプロンプトのオーバーライド。 シード GPT モデルへの呼び出しのシード値。 シードを設定すると、評価間でより一貫性のある結果が得られます。 target_url
を チャット アプリからの URI 値に変更します。この値は、 前提条件 のセクションで収集したものです。 チャット アプリはチャット プロトコルに準拠している必要があります。 URI の形式はhttps://CHAT-APP-URL/chat
です。 プロトコルとchat
ルートが URI の一部であることを確認してください。
サンプル データを作成する
新しい回答を評価するには、特定の質問に対する理想的な回答である「グラウンド トゥルース」回答と比較する必要があります。 チャット アプリ用に Azure AI Search に保存されているドキュメントから質問と回答を生成します。
example_input
フォルダーをmy_input
という名前の新しいフォルダーにコピーします。ターミナルで、次のコマンドを実行してサンプル データを生成します。
python -m evaltools generate --output=my_input/qa.jsonl --persource=2 --numquestions=14
質問と回答のペアが生成され、次のステップで使用される評価ツールへの入力として my_input/qa.jsonl
(JSONL 形式) に保存されます。 本番の評価では、このデータセットに対してより多くの QA ペア (200 を超える) を生成することになります。
Note
ソースごとの質問と回答の数が少ないのは、この手順をすばやく完了できるようにするためです。 これは本番の評価を意図したものではなく、本番の評価ではソースごとにより多くの質問と回答が必要になります。
調整したプロンプトを使用して最初の評価を実行する
my_config.json
構成ファイルのプロパティを編集します。プロパティ 新しい値 results_dir my_results/experiment_refined
prompt_template <READFILE>my_input/prompt_refined.txt
調整したプロンプトは関心領域について具体的です。
If there isn't enough information below, say you don't know. Do not generate answers that don't use the sources below. If asking a clarifying question to the user would help, ask the question. Use clear and concise language and write in a confident yet friendly tone. In your answers ensure the employee understands how your response connects to the information in the sources and include all citations necessary to help the employee validate the answer provided. For tabular information return it as an html table. Do not return markdown format. If the question is not in English, answer in the language used in the question. Each source has a name followed by colon and the actual information, always include the source name for each fact you use in the response. Use square brackets to reference the source, e.g. [info1.txt]. Don't combine sources, list each source separately, e.g. [info1.txt][info2.pdf].
ターミナルで、次のコマンドを実行して評価を実行します。
python -m evaltools evaluate --config=my_config.json --numquestions=14
このスクリプトにより、評価を含む新しい実験フォルダーが
my_results/
に作成されました。 このフォルダーには、次のような評価結果が含まれています。File Name 説明 config.json
評価に使用される構成ファイルのコピー。 evaluate_parameters.json
評価に使用されるパラメーター。 非常によく config.json
似ていますが、タイムスタンプなどの追加のメタデータが含まれています。eval_results.jsonl
各質問と回答、および各 QA ペアの GPT メトリック。 summary.json
平均 GPT メトリックなどの全体的な結果。
質の低いプロンプトを使用して 2 つ目の評価を実行する
my_config.json
構成ファイルのプロパティを編集します。プロパティ 新しい値 results_dir my_results/experiment_weak
prompt_template <READFILE>my_input/prompt_weak.txt
その質の低いプロンプトには、関心領域に関するコンテキストがありません。
You are a helpful assistant.
ターミナルで、次のコマンドを実行して評価を実行します。
python -m evaltools evaluate --config=my_config.json --numquestions=14
特定の温度で 3 つ目の評価を実行する
より創造的な回答を得るためのプロンプトを使用します。
my_config.json
構成ファイルのプロパティを編集します。Existing プロパティ 新しい値 Existing results_dir my_results/experiment_ignoresources_temp09
Existing prompt_template <READFILE>my_input/prompt_ignoresources.txt
新しい 温度 0.9
既定の
temperature
は 0.7 です。 温度が高いほど、回答はより創造的になります。ignore
プロンプトは短い値です。Your job is to answer questions to the best of your ability. You will be given sources but you should IGNORE them. Be creative!
構成オブジェクトは次のようになりますが、
results_dir
を実際のパスに置き換えます。{ "testdata_path": "my_input/qa.jsonl", "results_dir": "my_results/prompt_ignoresources_temp09", "target_url": "https://YOUR-CHAT-APP/chat", "target_parameters": { "overrides": { "temperature": 0.9, "semantic_ranker": false, "prompt_template": "<READFILE>my_input/prompt_ignoresources.txt" } } }
ターミナルで、次のコマンドを実行して評価を実行します。
python -m evaltools evaluate --config=my_config.json --numquestions=14
評価の結果を確認する
さまざまなプロンプトとアプリ設定に基づいて 3 つの評価を実行しました。 結果は my_results
フォルダーに保存されています。 設定に基づいて結果がどのように異なるかを確認します。
レビュー ツールを使用して、評価の結果を確認します。
python -m evaltools summary my_results
結果は次のようになります。
各値は数値とパーセンテージとして返されます。
以下の表を使用して、値の意味を理解します。
Value 説明 現実性 これは、モデルの回答がどの程度、事実に基づいた検証可能な情報に基づいているかを指します。 回答が事実に基づき現実を反映している場合、その回答は根拠があると見なされます。 関連性 これは、モデルの回答がどの程度、コンテキストまたはプロンプトに関連しているかを指します。 回答がユーザーの質問や発言に過不足なく対処している場合、関連性があると見なされます。 一貫性 これは、モデルの回答がどの程度、論理的に一貫しているかを指します。 回答が一貫していて論理的な流れを保っている場合、矛盾しないと見なされます。 引用 これは、モデルの回答がどの程度、プロンプトで求められた形式で返されたかを指します。 長さ これは、モデルの回答の長さを測るものです。 結果として、3 つのすべての評価で関連性が高くなったものの、
experiment_ignoresources_temp09
の関連性が最も低くなりました。評価の構成を表示するフォルダーを選択します。
Ctrl + C を入力してアプリを終了し、ターミナルに戻ります。
回答を比較する
評価から返された回答を比較します。
比較する評価を 2 つ選択し、同じレビュー ツールを使用して回答を比較します。
python -m evaltools diff my_results/experiment_refined my_results/experiment_ignoresources_temp09
結果を確認します。 結果は異なる場合があります。
Ctrl + C を入力してアプリを終了し、ターミナルに戻ります。
さらなる評価のための提案
my_input
のプロンプトを編集して、関心領域や長さなど、回答をカスタマイズします。my_config.json
ファイルを編集して、temperature
やsemantic_ranker
などのパラメーターを変更し、実験を再実行します。- さまざまな回答を比較して、プロンプトと質問が回答の質にどのような影響を与えるかを理解します。
- Azure AI Search インデックス内のドキュメントごとに、質問とグラウンド トゥルースの回答の個別のセットを生成します。 その後、評価を再実行して、回答がどのように異なるかを確認します。
- プロンプトの最後に要件を追加することで、より短いまたは長い回答を示すようにプロンプトを変更します。 たとえば、
Please answer in about 3 sentences.
のようにします。
リソースと依存関係をクリーンアップする
Azure リソースをクリーンアップする
この記事で作成した Azure リソースは、Azure サブスクリプションに課金されます。 今後これらのリソースが必要になるとは思わない場合は、削除して、より多くの料金が発生しないようにします。
次の Azure Developer CLI コマンドを実行して、Azure リソースを削除し、ソース コードを削除します:
azd down --purge
GitHub Codespaces をクリーンアップする
GitHub Codespaces 環境を削除すると、アカウントに対して取得するコアごとの無料時間エンタイトルメントの量を最大化できることが保証されます。
重要
GitHub アカウントのエンタイトルメントの詳細については、「 GitHub Codespaces に月単位で含まれるストレージとコア時間」を参照してください。
GitHub Codespaces ダッシュボード (https://github.com/codespaces) にサインインします。
Azure-Samples/ai-rag-chat-evaluator
GitHub リポジトリをソースとして現在実行中の Codespaces を見つけます。codespace のコンテキスト メニューを開いた後に、 [削除]を選択します。
チャットアプリの記事に戻り、それらのリソースをクリーンアップします。