Python を使用してバッチ評価を実装する
クラウド評価では、Microsoft Foundry のテスト データセット全体で複数のエバリュエーターを実行することで、体系的な品質評価が可能になります。 これらの自動評価により、ローカル コンピューティング インフラストラクチャを管理し、大規模な自動テスト ワークフローをサポートする必要がなくなります。
Adventure Works では、デプロイ前にプロンプトの更新を検証するために、複数の品質基準に対して 500 のテスト例を評価する必要があります。 Foundry SDK を使用したクラウド評価は、この作業を効率的に完了し、エバリュエーターを並列で実行し、分析のために結果を格納します。
注
クラウド評価には、Microsoft Foundry SDK (azure-ai-projects>=2.0.0b1) と DefaultAzureCredential()による認証が必要です。 SDK は、評価操作用の project_client.get_openai_client() を通じて OpenAI と互換性のあるクライアントを提供します。
データ スキーマとエバリュエーターを定義する
クラウド評価では、エバリュエーターを実行する前に、データ構造を理解する必要があります。 この構造は、JSONL データセット内のフィールドを記述し、実行するエバリュエーターを指定する データ ソース構成 を使用して定義します。
データ スキーマが必要な理由:
データ スキーマは、データセットに存在するフィールドと必要なフィールドを評価サービスに通知します。 データ スキーマは、実行前に検証を有効にし、サービスが適切なリソースを割り当てるのに役立ちます。 これは、データと評価サービスの間のコントラクトと考えてください。
from openai.types.eval_create_params import DataSourceConfigCustom
data_source_config = DataSourceConfigCustom(
type="custom",
item_schema={
"type": "object",
"properties": {
"query": {"type": "string"},
"response": {"type": "string"},
"context": {"type": "string"},
"ground_truth": {"type": "string"},
},
"required": ["query", "response"], # Only these fields must be present
},
)
データ マッピングを使用してエバリュエーターを構成する:
データ スキーマを定義したら、実行するエバリュエーターとデータへのアクセス方法を指定します。
testing_criteriaリストにはエバリュエーターの構成が含まれています。各エントリは、データセットに対して実行する 1 つのエバリュエーターを定義します。
testing_criteriaの各エバリュエーターは次を指定します。
-
エバリュエーター名: 使用する組み込みのエバリュエーター (例:
builtin.intent_resolution) - 初期化パラメーター: AI 支援評価に使用するモデル デプロイのような構成
-
データ マッピング:
{{item.field}}構文を使用してデータセット フィールドをエバリュエーター パラメーターに接続する方法
データ マッピングは重要です。各エバリュエーターに、必要な入力を見つける場所を指示します。
{{item.field}}構文は、JSONL データセットのフィールドを参照します。
testing_criteria = [
{
"type": "azure_ai_evaluator",
"name": "intent_resolution", # Your name for this evaluator in results
"evaluator_name": "builtin.intent_resolution", # The built-in evaluator to use
"initialization_parameters": {
"deployment_name": model_deployment_name # Which model to use for evaluation
},
"data_mapping": {
"query": "{{item.query}}", # Map dataset's "query" field to evaluator's "query" parameter
"response": "{{item.response}}", # Map dataset's "response" field to evaluator's "response" parameter
},
},
{
"type": "azure_ai_evaluator",
"name": "groundedness",
"evaluator_name": "builtin.groundedness",
"initialization_parameters": {
"deployment_name": model_deployment_name
},
"data_mapping": {
"query": "{{item.query}}",
"response": "{{item.response}}",
"context": "{{item.context}}", # Groundedness needs context to verify claims
},
},
]
Important
data_mappingのフィールド名は大文字と小文字が区別され、JSONL データセットと正確に一致する必要があります。 データセットに "質問" (大文字) があり、 "{{item.question}}" (小文字) を指定した場合、評価は失敗します。 データ スキーマとデータ マッピングの間でフィールド名が一致するかどうかを常に確認します。
評価定義を作成して実行する
クラウド評価では、 評価定義 (評価対象と方法) と 評価実行 (特定のデータセットに対して実行) が分離されます。 この分離により、再利用が可能になります。評価基準を 1 回定義してから、異なるデータセットまたはバージョンに対して複数回実行します。
評価定義を作成します。
評価定義は再利用可能なテンプレートです。 データ スキーマとテスト条件が組み合わせされていますが、特定のデータセットはまだ参照されていません。
# Create the evaluation definition
eval_object = client.evals.create(
name="adventure-works-prompt-evaluation",
data_source_config=data_source_config,
testing_criteria=testing_criteria,
)
print(f"Created evaluation: {eval_object.id}")
評価実行の作成:
評価実行では、特定のデータセットに対して評価定義が実行されます。 アップロードされたデータセットは、(前のユニットの) ID で参照します。
from openai.types.evals.create_eval_jsonl_run_data_source_param import (
CreateEvalJSONLRunDataSourceParam,
SourceFileID,
)
# Create a run using the uploaded dataset
eval_run = client.evals.runs.create(
eval_id=eval_object.id,
name="prompt-v2-evaluation",
data_source=CreateEvalJSONLRunDataSourceParam(
type="jsonl",
source=SourceFileID(
type="file_id",
id=data_id, # Dataset ID from upload
),
),
)
print(f"Started evaluation run: {eval_run.id}")
print(f"Status: {eval_run.status}")
実行中の動作:
実行を作成すると、評価サービスは次のように動作します。
- クラウド ストレージからデータセットを読み込む
- スキーマに対してデータを検証します
- 評価作業をエバリュエーター間で並列に分散する
- Foundry プロジェクトに結果を格納する
- 視覚化用の Web ベースのレポートを生成します
ヒント
評価実行は非同期であり、大規模なデータセットでは数分かかる場合があります。 このサービスは、再試行、レート制限、並列実行を自動的に処理します。 結果の準備ができたことを確認するには、実行状態をポーリングします。
完了をポーリングして結果を取得する
評価実行は、クラウドで非同期的に実行されます。 結果を取得する前に、完了するまで実行状態をポーリングする必要があります。
ポーリングが必要な理由:
複数のエバリュエーターを持つ大規模なデータセットの完了には数分かかる場合があります。 評価サービスは、並列ワーカー間で作業を分散し、モデルデプロイでレート制限を処理し、失敗した要求を自動的に再試行します。 ポーリングを利用すると、ネットワーク呼び出しでブロックされることなく、スクリプトが効率的に処理を待機できます。
import time
while True:
run = client.evals.runs.retrieve(
run_id=eval_run.id,
eval_id=eval_object.id
)
if run.status in ("completed", "failed"):
break
time.sleep(5) # Check every 5 seconds
print("Waiting for evaluation run to complete...")
print(f"Evaluation completed with status: {run.status}")
Important
エラーの処理: run.status が "失敗" の場合は、実行オブジェクトのエラーの詳細を確認します。 一般的なエラーには、モデル クォータの不足、無効なデータ マッピング、データセット アクセスの問題などがあります。 評価サービスは、問題の診断に役立つ詳細なエラー メッセージを提供します。
詳細な結果を取得します。
完了したら、データセット内の各項目のスコア付けされた結果を取得します。
# Get detailed results for each item
output_items = list(
client.evals.runs.output_items.list(
run_id=run.id,
eval_id=eval_object.id
)
)
print(f"Retrieved {len(output_items)} evaluation results")
print(f"View detailed report: {run.report_url}")
エバリュエーターの出力について:
すべてのエバリュエーターは、評価された項目ごとに標準化されたスキーマを返します。
- ラベル: 単体テストの出力と同様に、バイナリの "pass" または "fail" ラベルを使用して、エバリュエーター間の迅速な比較にラベルを使用します
- スコア: エバリュエーターの自然スケールからのスコア (品質エバリュエーターの場合は 1 から 5、安全性エバリュエーターの場合は 0 から 7、類似性メトリックの場合は 0 から 1)
- しきい値: スコアからの合格/失敗を決定する既定のしきい値 (これをオーバーライドできます)
- 理由: スコアの説明 (LLM ジャッジ エバリュエーターのみ)
- 詳細: デバッグに関するオプションの追加情報 (tool_call_accuracyなどの一部のエバリュエーターの場合)
データセット全体の集計結果の場合は、全体的な合格/失敗数の run.result_counts にアクセスし、エバリュエーターごとの内訳を run.per_testing_criteria_results します。
ヒント
report_urlを使用して、フィルター処理、並べ替え、視覚化ツールを使用して Foundry ポータルで結果を表示します。 CI/CD ワークフローの場合は、 output_items をプログラムで解析して、品質ゲートを適用します。
次のユニットでは、これらの評価ワークフローを GitHub Actions に統合して、すべてのコード変更に対する品質保証を自動化する方法について説明します。