チュートリアル: パート 3 - Azure AI Foundry SDK を使用するカスタム チャット アプリケーションを評価する
このチュートリアルでは、チュートリアル シリーズのパート 2 で構築したチャット アプリの評価を、Azure AI SDK (およびその他のライブラリ) を使用して行います。 このパート 3 では、次の方法について説明します。
- 評価データセットを作成する
- Azure AI エバリュエータを使用してチャット アプリを評価する
- アプリの反復と改善
このチュートリアルは、3 部構成のチュートリアルのパート 3 です。
前提条件
- チャット アプリケーションを構築するには、チュートリアル シリーズのパート 2 を完了します。
- 必ず、パート 2 の「テレメトリのログを追加する」の手順を完了しておいてください。
チャット アプリの応答の品質を評価する
チャット履歴など、チャット アプリがクエリに適切に応答することがわかったので、いくつかの異なるメトリックとより多くのデータでコパイロットのパフォーマンスを評価しましょう。
エバリュエータを評価データセットおよびターゲット関数 get_chat_response()
と共に使用し、その評価結果を評価します。
評価を実行したら、システム プロンプトの改善などによってロジックを向上させ、チャット アプリの応答がどのように変化し、改善されるかを観察できます。
評価データセットを作成する
次の評価データセットを使用します。このデータセットには、質問の例と想定される回答 (真理) が含まれています。
chat_eval_data.jsonl という名前のファイルを assets フォルダー内に作成します。
このデータセットをファイルに貼り付けます。
{"query": "Which tent is the most waterproof?", "truth": "The Alpine Explorer Tent has the highest rainfly waterproof rating at 3000m"} {"query": "Which camping table holds the most weight?", "truth": "The Adventure Dining Table has a higher weight capacity than all of the other camping tables mentioned"} {"query": "How much do the TrailWalker Hiking Shoes cost? ", "truth": "The Trailewalker Hiking Shoes are priced at $110"} {"query": "What is the proper care for trailwalker hiking shoes? ", "truth": "After each use, remove any dirt or debris by brushing or wiping the shoes with a damp cloth."} {"query": "What brand is TrailMaster tent? ", "truth": "OutdoorLiving"} {"query": "How do I carry the TrailMaster tent around? ", "truth": " Carry bag included for convenient storage and transportation"} {"query": "What is the floor area for Floor Area? ", "truth": "80 square feet"} {"query": "What is the material for TrailBlaze Hiking Pants?", "truth": "Made of high-quality nylon fabric"} {"query": "What color does TrailBlaze Hiking Pants come in?", "truth": "Khaki"} {"query": "Can the warrenty for TrailBlaze pants be transfered? ", "truth": "The warranty is non-transferable and applies only to the original purchaser of the TrailBlaze Hiking Pants. It is valid only when the product is purchased from an authorized retailer."} {"query": "How long are the TrailBlaze pants under warranty for? ", "truth": " The TrailBlaze Hiking Pants are backed by a 1-year limited warranty from the date of purchase."} {"query": "What is the material for PowerBurner Camping Stove? ", "truth": "Stainless Steel"} {"query": "Is France in Europe?", "truth": "Sorry, I can only queries related to outdoor/camping gear and equipment"}
Azure AI エバリュエータを使用して評価する
次に、次のような評価スクリプトを定義します。
- チャット アプリ ロジックの対象の関数ラッパーを生成します。
- サンプル
.jsonl
データセットを読み込みます。 - 対象の関数を受け取り、評価データセットとチャット アプリからの応答をマージして、評価を実行します。
- GPT 支援メトリック (関連性、根拠性、一貫性) を生成し、チャット アプリの回答の質を評価します。
- 結果をローカルに出力し、クラウド プロジェクトにログを記録します。
このスクリプトでは、結果をコマンド ラインや JSON ファイルに出力することで、ローカルで結果を確認できます。
また、スクリプトは評価結果をクラウド プロジェクトにログ記録するため、UI で評価の実行を比較できます。
evaluate.py という名前のファイルをメイン フォルダー内に作成します。
必要なライブラリをインポートし、プロジェクト クライアントを作成し、設定を構成するために、次のコードを追加します。
import os import pandas as pd from azure.ai.projects import AIProjectClient from azure.ai.projects.models import ConnectionType from azure.ai.evaluation import evaluate, GroundednessEvaluator from azure.identity import DefaultAzureCredential from chat_with_products import chat_with_products # load environment variables from the .env file at the root of this repo from dotenv import load_dotenv load_dotenv() # create a project client using environment variables loaded from the .env file project = AIProjectClient.from_connection_string( conn_str=os.environ["AIPROJECT_CONNECTION_STRING"], credential=DefaultAzureCredential() ) connection = project.connections.get_default(connection_type=ConnectionType.AZURE_OPEN_AI, include_credentials=True) evaluator_model = { "azure_endpoint": connection.endpoint_url, "azure_deployment": os.environ["EVALUATION_MODEL"], "api_version": "2024-06-01", "api_key": connection.key, } groundedness = GroundednessEvaluator(evaluator_model)
ラッパー関数を作成するコードを追加します。クエリと応答の評価のための評価インターフェイスがこれによって実装されます。
def evaluate_chat_with_products(query): response = chat_with_products(messages=[{"role": "user", "content": query}]) return {"response": response["message"].content, "context": response["context"]["grounding_data"]}
最後に、評価を実行してその結果をローカルで見るための次のコードを追加します。これにより、Azure AI Foundry ポータルの評価結果へのリンクも表示されます。
# Evaluate must be called inside of __main__, not on import if __name__ == "__main__": from config import ASSET_PATH # workaround for multiprocessing issue on linux from pprint import pprint from pathlib import Path import multiprocessing import contextlib with contextlib.suppress(RuntimeError): multiprocessing.set_start_method("spawn", force=True) # run evaluation with a dataset and target function, log to the project result = evaluate( data=Path(ASSET_PATH) / "chat_eval_data.jsonl", target=evaluate_chat_with_products, evaluation_name="evaluate_chat_with_products", evaluators={ "groundedness": groundedness, }, evaluator_config={ "default": { "query": {"${data.query}"}, "response": {"${target.response}"}, "context": {"${target.context}"}, } }, azure_ai_project=project.scope, output_path="./myevalresults.json", ) tabular_result = pd.DataFrame(result.get("rows")) pprint("-----Summarized Metrics-----") pprint(result["metrics"]) pprint("-----Tabular Result-----") pprint(tabular_result) pprint(f"View evaluation results in AI Studio: {result['studio_url']}")
評価モデルを構成する
この評価スクリプトではモデルが何回も呼び出されるため、評価モデルの 1 分あたりのトークン数を増やすことをお勧めします。
このチュートリアル シリーズのパート 1 で .env ファイルを作成しましたが、この中で評価モデルの名前 gpt-4o-mini
が指定されています。 使用可能なクォータがある場合は、このモデルの 1 分あたりのトークン数の上限を大きくしてみてください。 クォータが不足していてこの値を大きくできない場合でも、問題はありません。 このスクリプトは、制限エラーに対処するように設計されています。
- Azure AI Foundry ポータルのプロジェクトで、[モデルとエンドポイント] を選択します。
- gpt-4o-mini を選択します。
- 編集を選択します。
- [1 分あたりのトークン レート制限] を引き上げるのに十分なクォータがある場合は、30 に増やしてみてください。
- 保存して閉じるを選択します。
評価スクリプトを実行する
コンソールから、Azure CLI を使用して Azure アカウントにサインインします。
az login
必要なパッケージをインストールします。
pip install azure-ai-evaluation
次に、評価スクリプトを実行します。
python evaluate.py
評価結果の解釈
コンソール出力に各質問への回答が表示され、メトリックをまとめた表がそれに続いて出力されます。 (出力には異なる列が表示される場合があります。)
モデルの 1 分あたりのトークン数の制限を引き上げることができなかった場合は、タイムアウト エラーが発生する可能性がありますが、これは想定どおりです。 評価スクリプトは、このようなエラーに対処して実行を続けるように設計されています。
Note
WARNING:opentelemetry.attributes:
も多数表示される場合がありますが、これは無視しても問題なく、評価結果には影響しません。
====================================================
'-----Summarized Metrics-----'
{'groundedness.gpt_groundedness': 1.6666666666666667,
'groundedness.groundedness': 1.6666666666666667}
'-----Tabular Result-----'
outputs.response ... line_number
0 Could you specify which tent you are referring... ... 0
1 Could you please specify which camping table y... ... 1
2 Sorry, I only can answer queries related to ou... ... 2
3 Could you please clarify which aspects of care... ... 3
4 Sorry, I only can answer queries related to ou... ... 4
5 The TrailMaster X4 Tent comes with an included... ... 5
6 (Failed) ... 6
7 The TrailBlaze Hiking Pants are crafted from h... ... 7
8 Sorry, I only can answer queries related to ou... ... 8
9 Sorry, I only can answer queries related to ou... ... 9
10 Sorry, I only can answer queries related to ou... ... 10
11 The PowerBurner Camping Stove is designed with... ... 11
12 Sorry, I only can answer queries related to ou... ... 12
[13 rows x 8 columns]
('View evaluation results in Azure AI Foundry portal: '
'https://xxxxxxxxxxxxxxxxxxxxxxx')
Azure AI Foundry ポータルで評価結果を表示する
評価の実行が完了したら、リンクに従って Azure AI Foundry ポータルの [評価] ページで評価結果を表示します。
また、個別の行を見て、行ごとのメトリック スコアを見たり、検索されたすべてのコンテキストやドキュメントを表示したりすることもできます。 これらのメトリックは、評価結果の解釈やデバッグに役立ちます。
Azure AI Foundry ポータルでの評価結果の詳細については、「Azure AI Foundry ポータルで評価結果を表示する方法」を参照してください。
反復と改善
応答には十分な根拠がないことに注意してください。 多くの場合、モデルは、回答ではなく質問で応答します。 これは、プロンプト テンプレートの指示の結果です。
- assets/grounded_chat.prompty ファイルで、"If the question is related to outdoor/camping gear and clothing but vague, ask for clarifying questions instead of referencing documents." (質問はアウトドアまたはキャンプ用品や衣類に関連しているが、あいまいな場合は、ドキュメントを参照しないで、質問を明確にするように求めてください。) という文を見つけます。
- この文を "If the question is related to outdoor/camping gear and clothing but vague, try to answer based on the reference documents, then ask for clarifying questions" (質問はアウトドアまたはキャンプ用品や衣類に関連しているが、あいまいな場合は、参照ドキュメントに基づいて回答を試み、その後に質問を明確にするように求めてください。) に変更します。
- ファイルを保存し、評価スクリプトを再実行します。
プロンプト テンプレートに対して他の変更を試すか、別のモデルを試して、変更が評価結果にどのように影響するかを確認します。
リソースをクリーンアップする
不要な Azure コストが発生しないように、このチュートリアルで作成したリソースが不要になったら削除してください。 リソースを管理するために、Azure portal を使用できます。