エバリュエーターを人間の基準に合わせる
自動化されたエバリュエーターを人間の判断に合わせるのは 1 回限りではありません。これは、自動化が実際に気にしているものを確実に測定する継続的なワークフローです。
Adventure Works では、自動化されたエバリュエーターが人間のエバリュエーターが識別するのと同じ品質パターンをキャプチャすることを検証する必要があります。 これにより、プロンプト更新プログラムを展開するかどうかを決定するときに、自動スコアを信頼できます。 配置ワークフローにより、評価基準の進化に合わせて自動化が意味を持ち続けます。
自動エバリュエーターを人間の評価に合わせるには、次の手順に従います。
- 品質ディメンションに一致する組み込みのエバリュエーターを選択する
- シャドウ評価を実行 して、人間のスコアとの初期アラインメントを測定する
- 時間の経過に伴うアライメントを監視 して、システムの進化に伴うドリフトを検出する
- 相関関係がしきい値を下回った場合のミスアラインメントを調査する
- 組み込みオプションでドメイン固有のニーズがキャプチャされない場合にカスタム エバリュエーターを使用して調整する
組み込みのエバリュエーターを選択する
まず、人間の評価基準に一致する Microsoft Foundry エバリュエーターを選択します。
使用可能な組み込みエバリュエーター:
| エバリュエータ | 対策 | 最適な用途 |
|---|---|---|
| 意図の解決 | 応答がユーザーのニーズにどの程度完全に対応しているか | エージェントがユーザーのタスクを完了していることを確認する |
| 関連性 | 回答が質問にどの程度対応しているか | 回答がオントピックであることを確認する |
| Groundedness | ソースに基づく事実の精度 | 提供された情報に応答が忠実であるかを確認する |
ヒント
次の表は、一般的に使用されるエバリュエーターのサブセットを示しています。 必要な入力、スコアリング範囲、実装ガイダンスなど、使用可能なすべてのエバリュエーターの詳細な仕様については、 エバリュエーター リファレンスを参照してください。
条件をエバリュエーターにマップします。
Adventure Works の場合、人間のエバリュエーターは次を評価します。
- 意図の解決 → 意図の解決
- 関連性→ 関連性
- 接地→ 接地
人間の基準を超えて重要なエバリュエーターを追加します。
人間はシャドウ レートを行わないが、安全性やコンプライアンスに不可欠なエバリュエーターを含めることができます。
evaluators = {
# Shadow-rated against human judgment
'intent_resolution': IntentResolutionEvaluator(),
'relevance': RelevanceEvaluator(),
'groundedness': GroundednessEvaluator(),
# Essential safety checks (not shadow-rated)
'content_safety': ContentSafetyEvaluator(),
'pii_detection': PIIDetectionEvaluator()
}
注
安全性とコンプライアンスの評価者は、人間の評価に関係なくゲートとして機能できます。 応答は、人間が検証したディメンションで十分にスコアを付けることができますが、それでもコンテンツの安全性で失敗し、デプロイがブロックされます。
シャドウ評価を実行する
シャドウ レーティングは、両方が同じ例を個別に評価することで、自動エバリュエーターが人間の判断にどの程度合っているかを測定します。
シャドウ評価プロセス:
- 評価例の選択 - ユース ケースを表す 100 ~ 200 件の回答を選択する
- 人間の評価 - 人間の評価者は、基準に基づいて例をスコア付けします (1 から 5 スケール)
- 自動評価 - 同じ例で選択したエバリュエーターを実行する
- 相関の計算 - ピアソン相関係数を使用してアライメントを測定する
import pandas as pd
from scipy.stats import pearsonr
# Compare scores
df = pd.DataFrame({
'response_id': response_ids,
'human_intent_resolution_score': human_scores,
'automated_intent_resolution': intent_resolution_scores
})
# Calculate correlation
correlation, p_value = pearsonr(
df['human_intent_resolution_score'],
df['automated_intent_resolution']
)
print(f"Correlation: {correlation:.2f}")
相関関係の解釈:
| 相関 | 説明 | アクション |
|---|---|---|
| ≥ 0.7 | 厳密な配置 | 自動化の続行 |
| 0.5-0.7 | 中程度の配置 | 調査して改善する |
| < 0.5 | 弱いアライメント | 必要な主な調整 |
Adventure Works は、デプロイの決定のための自動化を信頼する前に、人間の評価スコアと自動エバリュエーター スコアの間の 0.75 の相関関係をターゲットとしています。
時間の経過に伴う配置の監視
配置は静的ではなく、システムの進化、基になるモデルの変更、評価基準のシフトに伴ってドリフトします。
アラインメント ドリフトの原因:
- モデルの更新 - 基になる言語モデルによって応答パターンが変更される
- 新しいシナリオ - システムがトレーニングデータ分布外のケースに遭遇する
- 基準の進化 - 人間のエバリュエーターが品質基準を調整する
- エバリュエーターの変更 - Microsoft のエバリュエーター モデルの更新
監視周期を確立します。
# Monthly alignment check
monthly_sample = select_random_sample(production_responses, n=50)
human_review = get_human_scores(monthly_sample)
automated_review = run_evaluators(monthly_sample)
current_correlation = calculate_correlation(human_review, automated_review)
if current_correlation < CORRELATION_THRESHOLD:
trigger_alignment_investigation()
アラートのしきい値を設定します。
- 警告のしきい値 (0.65) - レビューをスケジュールし、人間のサンプリングを増やす
- 重大しきい値 (0.55) - 配置が復元されるまで自動ゲートを一時停止する
- 重大なしきい値 (0.45) - 完全に人間による評価に戻す
ヒント
ポイントインタイム値だけでなく、時間の経過に伴う相関関係の傾向を追跡します。 0.75から0.68への緩やかな減少は、調査を必要とする体系的なドリフトを示します。
ミスアラインメントを調査する
相関関係が低下した場合は、問題が人間の不整合または自動化の誤りによって生じるかどうかを判断します。
まず、人間のエバリュエーターの整合性を確認します。
自動エバリュエーターを調整する前に、人間が一貫して基準を適用していることを確認します。
評価者間信頼性を計算します。
from sklearn.metrics import cohen_kappa_score
# Have two evaluators score same examples
evaluator_1_scores = [4, 5, 3, 4, 2, 5, 3]
evaluator_2_scores = [4, 4, 3, 5, 2, 5, 4]
kappa = cohen_kappa_score(evaluator_1_scores, evaluator_2_scores)
print(f"Inter-rater reliability (Cohen's Kappa): {kappa:.2f}")
カッパ スコアの解釈:
| カッパ | 契約 | アクション |
|---|---|---|
| > 0.8 | 非常に良い | 人間が一貫して、自動化を調査 |
| 0.6-0.8 | 本質的 | 一般的に信頼性が高く、微調整が必要 |
| 0.4-0.6 | 適度 | 人間との評価基準を明確にする |
| < 0.4 | 貧しい | 自動化の前に人間の不整合を解決する |
ヒント
人間の評価者間の信頼性が低い場合は、自動化の調整に時間を費やす前に、評価者のトレーニングとより明確な評価基準への投資を行います。 一貫性のない条件を自動化すると、不整合がスケーリングされるだけです。
不一致パターンを分析する:
人間の整合性が確認されたら、自動化が分岐する場所を調べます。
# Find high-disagreement examples
df['score_diff'] = abs(df['human_score'] - df['automated_score'])
disagreements = df[df['score_diff'] >= 1.5]
# Categorize patterns
for _, row in disagreements.iterrows():
print(f"Response: {row['response_text'][:100]}")
print(f"Human: {row['human_score']}, Auto: {row['automated_score']}")
print(f"Likely issue: {categorize_disagreement(row)}")
一般的な不一致パターン:
- オートメーションは、人間が包括的に価値を持つ場合に長さを罰する
- オートメーションでドメイン固有の用語が見落とされる
- オートメーションは、特殊なコンテキストに汎用的な品質基準を適用します
カスタム エバリュエーターを使用して絞り込む
組み込みのエバリュエーターが常にドメイン固有の品質ディメンションを見逃している場合は、独自の要件をキャプチャするカスタム エバリュエーターを作成します。
カスタム エバリュエーターを作成する場合:
- 組み込みのエバリュエーターにドメイン コンテキストがない (安全用語、業界標準)
- 構成の調整にもかかわらず、相関関係はしきい値を下回る
- 特定の品質ディメンションには組み込みの同等機能がない(規制コンプライアンス、ブランドのトーン)
カスタム エバリュエーターを作成します。
from azure.ai.evaluation import EvaluatorBase
class TrailSafetyEvaluator(EvaluatorBase):
"""Custom evaluator for trail safety information completeness"""
def __init__(self):
self.required_elements = [
'weather considerations',
'difficulty rating',
'preparation requirements',
'emergency contact info'
]
def evaluate(self, response: str, query: str = None) -> dict:
response_lower = response.lower()
elements_found = sum(
1 for element in self.required_elements
if any(keyword in response_lower for keyword in element.split())
)
score = 1 + (elements_found * 1.0) # 1-5 scale
return {
'safety_score': min(5, score),
'elements_present': elements_found,
'reasoning': f"Found {elements_found}/{len(self.required_elements)} required safety elements"
}
カスタム エバリュエーターの配置をテストします。
# Run custom evaluator on shadow rating examples
custom_scores = [
TrailSafetyEvaluator().evaluate(response)['safety_score']
for response in test_responses
]
# Check correlation with human safety ratings
custom_correlation = pearsonr(human_safety_scores, custom_scores)
print(f"Custom evaluator correlation: {custom_correlation[0]:.2f}")
アラインメントが達成されるまで反復処理します。
- 不一致分析に基づいてスコアリング ロジックを調整する
- 人の優先順位に基づいて必要な要素を追加または削除する
- キーワード マッチングを調整してドメイン用語をキャプチャする
- 各調整後にシャドウ評価を再実行する
Important
カスタム エバリュエーターには継続的なメンテナンスが必要です。 ドメインの進化や言語モデルの変化に合わせて、カスタム ロジックが人間の判断に沿っていることを再検証します。
自動エバリュエーターを人間の基準に合わせる方法を理解したら、合成テスト データセットを作成する方法を学習する準備ができました。