組み込み AI ジャッジ (MLflow 2)
Databricks では、GenAI アプリの評価とモニタリングに MLflow 3 の使用を推奨しています。このページでは、MLflow 2 の Agent Evaluation について説明します。
- MLflow 3 での評価とモニタリングの紹介については、AIエージェントの評価とモニタリングを参照してください。
- MLflow 3への移行に関する情報については、Agent EvaluationからMLflow 3への移行を参照してください。
- このトピックに関する MLflow 3 情報については、 「スコアラーと LLM ジャッジ」を参照してください。
この記事では、必要な入力と出力メトリクスを含め、Agent Evaluationに組み込まれている各AIジャッジの詳細を説明します。
参照:
- Agent Evaluationによる品質、コスト、レイテンシの評価方法(MLflow 2)
- AIジャッジのカスタマイズ(MLflow 2)
- 呼び出し可能なジャッジ Python SDK リファレンス
AIジャッジの概要
すべてのジャッジがグラウンドトゥルースラベルを必要とするわけではありません。 ラベルを必要としないジャッジは、エージェントを評価するためのリクエストがセットしかない場合に便利です。
ジャッジの名前 | ジャッジが評価する品質面 | 必要な入力 | グラウンドトゥルースが必要です |
|---|---|---|---|
|
| いいえ、ただし要件あり | |
|
| はい | |
|
| はい | |
|
| No | |
|
| はい | |
|
| No | |
| リトリーバーは、ユーザーのリクエストに答えるうえで有用な(関連する)チャンクを見つけたか? 注: このジャッジは、取得された各チャンクに個別に適用され、各チャンクのスコアと根拠が生成されます。これらのスコアは、関連するチャンクの割合を表す各行の |
| No |
|
| No | |
|
| はい |
複数ターンの会話では、AIジャッジは会話の最後のエントリのみを評価します。
AI審査の出力
評価に使用された各ジャッジは、次の列を出力します。
データフィールド | Type | 説明 |
|---|---|---|
|
|
|
|
| LLMの |
|
| この評価の計算でエラーが発生した場合、エラーの詳細がここに表示されます。エラーがない場合、これはNULLです。 |
各審査員は、全体の実行に対する集計メトリクスも生成します:
メトリクス名 | Type | 説明 |
|---|---|---|
|
| 全評価のうち、 |
ガイドラインの準拠
定義 : 応答は提供されたガイドラインに従っていますか?
**グラウンドトゥルースが必要**:global_guidelines を使用する場合は「いいえ」です。行ごとのguidelinesを使用する場合に「はい」です。
ガイドライン遵守は、エージェントの応答がガイドラインに記載された特定の制約や指示に従っているかどうかを評価します。
ガイドラインは、以下のいずれかの方法で定義できます。
- 行ごと: 特定のリクエストの応答は、その評価行で定義されたガイドラインに準拠する必要があります。
- グローバル: すべてのリクエストに対するすべての応答は、グローバルガイドラインを遵守する必要があります。
必要な入力
入力評価セットには、次の列が必要です。
requestresponsemlflow.evaluate()にmodelパラメーターを指定していない場合。- 行ごとの
guidelinesまたはglobal_guidelines(設定で定義されています)。 - [呼び出し可能なジャッジのみ] ジャッジに任意のコンテキストを提供するための
guidelines_context。- この機能を利用するには、
databricks-agents>=0.20.0が必要です。
- この機能を利用するには、
例
評価セットから行ごとのガイドライン準拠を使用します。
import mlflow
eval_set = [{
"request": "What is the capital of France?",
"response": "The capital of France is Paris.",
# You can also just pass an array of guidelines directly to guidelines, but Databricks recommends naming them with a dictionary.
"guidelines": {
"english": ["The response must be in English"],
"clarity": ["The response must be clear, coherent, and concise"],
}
}]
mlflow.evaluate(
data=eval_set,
model_type="databricks-agent",
evaluator_config={
"databricks-agent": {
"metrics": ["guideline_adherence"]
}
}
)
評価セットからのグローバルガイドラインの順守を使用します。
import mlflow
eval_set = [{
"request": "What is the capital of France?",
"response": "The capital of France is Paris.",
}]
mlflow.evaluate(
data=eval_set,
model_type="databricks-agent",
evaluator_config={
"databricks-agent": {
"metrics": ["guideline_adherence"],
"global_guidelines": ["The response must be in English", "The response must be concise"]
}
}
)
ガイドライン遵守を呼び出し可能なジャッジ SDKと共に使用します:
from databricks.agents.evals import judges
assessment = judges.guideline_adherence(
request="What is the capital of France?",
response="The capital of France is Paris.",
# You can also just pass an array of guidelines directly to guidelines, but Databricks recommends naming them with a dictionary.
guidelines={
"english": ["The response must be in English"],
"clarity": ["The response must be clear, coherent, and concise"],
"grounded": ["The response must be grounded in the tool call result"],
},
# `guidelines_context` requires `databricks-agents>=0.20.0`
guidelines_context={
"tool_call_result": "{'country': 'France', 'capital': 'Paris'}",
},
)
print(assessment)
応答がガイドラインに準拠していない場合はどうすればよいですか?
応答がガイドラインに違反する場合:
- どのガイドラインが違反されたかを特定し、エージェントがそれを遵守できなかった理由を分析してください。
- 特定のガイドラインへの準拠を強調するようにプロンプトを調整するか、目的の動作に合致する追加の例でモデルを再トレーニングします。
- グローバルガイドラインについては、評価器の構成で正しく指定されていることを確認してください。
正確性
定義 : エージェントは事実上正確な回答で応答しましたか?
グラウンドトゥルースが必要 :はい、expected_facts[]またはexpected_response。
正確性とは、エージェントの実際の応答をグラウンドトゥルースラベルと比較するもので、事実誤認を検出するのに良い方法です。
必要な入力
入力評価セットには、次の列が必要です。
requestresponsemlflow.evaluate()にmodelパラメーターを指定していない場合。- expected_facts または expected_response
Databricks は、expected_response の代わりに expected_facts[] を使用することをお勧めします。expected_facts[] は、正しい応答に必要とされる最小限の事実を表し、対象分野の専門家にとってキュレーションが容易です。
expected_responseを使用する必要がある場合は、正しい応答に必要とされる最小限の事実のみを含める必要があります。別のソースから応答をコピーした場合、回答が正しいと見なされるために必須ではないテキストを削除するように応答を編集してください。
回答に厳密には必要とされない情報を除外し、必要な情報のみを含めることで、Agent Evaluationは出力品質に関するより堅牢な情報を提供できます。
例
評価セットの正確性を使用します。
import mlflow
eval_set = [{
"request": "What is the difference between reduceByKey and groupByKey in Spark?",
"response": "reduceByKey aggregates data before shuffling, whereas groupByKey shuffles all data, making reduceByKey more efficient.",
"expected_facts": [
"reduceByKey aggregates data before shuffling",
"groupByKey shuffles all data",
]
}]
mlflow.evaluate(
data=eval_set,
model_type="databricks-agent",
evaluator_config={
"databricks-agent": {
"metrics": ["correctness"]
}
}
)
呼び出し可能なジャッジSDKで正確性を使用します。
from databricks.agents.evals import judges
assessment = judges.correctness(
request="What is the difference between reduceByKey and groupByKey in Spark?",
response="reduceByKey aggregates data before shuffling, whereas groupByKey shuffles all data, making reduceByKey more efficient.",
expected_facts=[
"reduceByKey aggregates data before shuffling",
"groupByKey shuffles all data",
]
)
print(assessment)
応答が正しくない場合、どうすればよいですか?
エージェントが事実と異なる回答をした場合、次のようにします。
- エージェントが取得したコンテキストに関連性がないか、または不正確であるかを把握します。RAGアプリケーションの場合、コンテキスト十分性審査を使用して、コンテキストが
expected_factsまたはexpected_responseの生成に十分であるかを判断できます。 - 十分なコンテキストがある場合は、関連情報を含めるようにプロンプトを調整してください。
クエリへの関連性
定義 :応答は入力リクエストに関連していますか?
グラウンドトゥルースが必要 :不要です。
関連性により、エージェントの応答が無関係なトピックに逸れることなく、ユーザーの入力に直接対応することが保証されます。
必要な入力
入力評価セットには、次の列が必要です。
requestresponsemlflow.evaluate()にmodelパラメーターを指定していない場合。
例
評価セットからの関連性を使用します。
import mlflow
eval_set = [{
"request": "What is the capital of France?",
"response": "The capital of France is Paris."
}]
mlflow.evaluate(
data=eval_set,
model_type="databricks-agent",
evaluator_config={
"databricks-agent": {
"metrics": ["relevance_to_query"]
}
}
)
呼び出し可能なジャッジ SDK と組み合わせて関連性を使用します:
from databricks.agents.evals import judges
assessment = judges.relevance_to_query(
request="What is the capital of France?",
response="The capital of France is Paris."
)
print(assessment)
応答が関連しない場合はどうすればよいですか?
エージェントが関係のない応答を提供した場合は、次のステップを検討してください。
- モデルのリクエストの理解度を評価し、それに応じてリトリーバー、トレーニングデータ、またはプロンプト指示を調整してください。
コンテキストの十分性
定義 : 取得されたドキュメントは、期待される応答を生成するのに十分ですか?
グラウンドトゥルースが必要 :はい、expected_factsまたはexpected_response。
コンテキストの十分性は、取得されたドキュメントが期待される応答を生成するために必要なすべての情報を提供するかどうかを評価します。
必要な入力
入力評価セットには、次の列が必要です。
requestresponsemlflow.evaluate()にmodelパラメーターを指定していない場合。expected_factsまたはexpected_response。expected_factsガイドラインおよびexpected_responseガイドラインを参照してください。retrieved_context[].contentmlflow.evaluate()にmodelパラメーターを指定していない場合。
例
評価セットのコンテキストの十分性を使用します。
import mlflow
eval_set = [{
"request": "What is the capital of France?",
"response": "The capital of France is Paris.",
"retrieved_context": [
{"content": "Paris is the capital city of France."}
],
"expected_facts": [
"Paris"
]
}]
mlflow.evaluate(
data=eval_set,
model_type="databricks-agent",
evaluator_config={
"databricks-agent": {
"metrics": ["context_sufficiency"]
}
}
)
呼び出し可能なジャッジ SDK とともにコンテキスト十分性を使用します。
from databricks.agents.evals import judges
assessment = judges.context_sufficiency(
request="What is the capital of France?",
retrieved_context=[
{"content": "Paris is the capital city of France."}
]
)
print(assessment)
コンテキストが不十分な場合はどうすればよいですか?
コンテキストが不十分な場合:
- 必要なすべてのドキュメントが含まれるよう、検索メカニズムを強化します。
- 不足している情報を明示的に参照するか、関連するコンテキストを優先するようにモデルプロンプトを変更してください。
安全性
定義 : 回答は有害または有毒なコンテンツを回避していますか?
グラウンドトゥルースが必要 :不要です。
安全性は、エージェントの応答に有害、不快、または有害なコンテンツが含まれないことを保証します。
必要な入力
入力評価セットには、次の列が必要です。
requestresponsemlflow.evaluate()にmodelパラメーターを指定していない場合。
例
評価セットからの安全性を使用します:
import mlflow
eval_set = [{
"request": "What is the capital of France?",
"response": "The capital of France is Paris."
}]
mlflow.evaluate(
data=eval_set,
model_type="databricks-agent",
evaluator_config={
"databricks-agent": {
"metrics": ["safety"]
}
}
)
呼び出し可能なジャッジSDKで安全を使用してください。
from databricks.agents.evals import judges
assessment = judges.safety(
request="What is the capital of France?",
response="The capital of France is Paris."
)
print(assessment)
レスポンスが安全ではない場合の対処方法
応答に有害なコンテンツが含まれる場合:
- 意図しない危険な応答につながる可能性があるかどうかを特定するために、リクエストを分析します。必要に応じて入力を修正してください。
- 有害または有毒なコンテンツの生成を明確に避けるように、モデルまたはプロンプトを改善してください。
- コンテンツフィルターなどの追加の安全機構を採用して、安全でない応答がユーザーに届く前に遮断します。
根拠
定義 :応答は取得したコンテキストと事実上整合していますか?
グラウンドトゥルースが必要 :不要です。
根拠とは、エージェントの応答が取得されたコンテキストで提供された情報と一致しているかどうかを評価することです。
必要な入力
入力評価セットには、次の列が必要です。
requestresponsemlflow.evaluate()にmodelパラメーターを指定していない場合。retrieved_context[].contentmlflow.evaluate()の呼び出しでmodel引数を使用しない場合。
例
評価セットから根拠を使用します:
import mlflow
eval_set = [{
"request": "What is the capital of France?",
"response": "The capital of France is Paris.",
"retrieved_context": [
{"content": "Paris is the capital city of France."}
]
}]
mlflow.evaluate(
data=eval_set,
model_type="databricks-agent",
evaluator_config={
"databricks-agent": {
"metrics": ["groundedness"]
}
}
)
呼び出し可能なジャッジSDKで根拠を使用します:
from databricks.agents.evals import judges
assessment = judges.groundedness(
request="What is the capital of France?",
response="The capital of France is Paris.",
retrieved_context=[
{"content": "Paris is the capital city of France."}
]
)
print(assessment)
応答に根拠がない場合、どうすればよいですか?
応答が根拠に基づかない場合:
- 取得したコンテキストを確認し、期待される応答を生成するために必要な情報が含まれていることを確認します。
- コンテキストが不十分な場合は、検索メカニズムまたはデータセットを改善して関連ドキュメントを含めます。
- 応答を生成する際に、取得したコンテキストを使用することを優先させるよう、プロンプトを修正してモデルに指示します。
チャンクの関連性
定義 : 取得されたチャンクは、入力リクエストに関連していますか?
グラウンドトゥルースが必要 :不要です。
チャンクの関連性は、各チャンクが入力リクエストに関連しているかどうかを測定します。
必要な入力
入力評価セットには、次の列が必要です。
requestretrieved_context[].contentmlflow.evaluate()にmodelパラメーターを指定していない場合。
mlflow.evaluate()への呼び出しでmodel引数を使用しない場合は、retrieved_context[].contentまたはtraceのいずれかを指定する必要があります。
例
この例では、カスタム精度メトリクスでチャンク関連性ジャッジを使用して、行レベルの精度スコアをコンピュートします。カスタムメトリクスの詳細については、「カスタムメトリクス (MLflow 2)」を参照してください。
import mlflow
from mlflow.evaluation import Assessment
eval_set = [{
"request": "What is the capital of France?",
"response": "The capital of France is Paris.",
"retrieved_context": [
{"content": "Paris is the capital city of France."},
{"content": "The best baguettes are in Nice."},
{"content": "Mount Everest is the highest mountain in the world."},
],
}]
def judged_precision_at_k(request, retrieved_context, k):
judged_precisions = [judges.chunk_relevance(request, [doc]) for doc in retrieved_context[:k]]
precision_at_k = sum([1 if judgement[0].value =='yes' else 0 for judgement in judged_precisions]) / k
rationales = [
f"""## Chunk ID {i+1}: `{retrieved_context[i]['doc_uri']}`
- **{judged_precisions[i][0].value}**: `{judged_precisions[i][0].rationale}`"""
for i in range(0, k-1)]
return Assessment(name=f'judged_precision_at_{k}', value=precision_at_k, rationale='\n'.join(rationales))
@metric
def judged_precision_at_3(request, retrieved_context):
k = 3
return judged_precision_at_k(request=request, retrieved_context=retrieved_context, k=k)
mlflow.evaluate(
data=eval_set,
model_type="databricks-agent",
evaluator_config={
"databricks-agent": {
"metrics": ["chunk_relevance"]
}
},
extra_metrics=[judged_precision_at_3]
)
chunk_relevanceを呼び出し可能なジャッジSDKと共に使用します。
from databricks.agents.evals import judges
# NOTE: This callable judge returns an assessment per item in the retrieved context.
assessments = judges.chunk_relevance(
request="What is the capital of France?",
retrieved_context=[
{"content": "Paris is the capital city of France."},
{"content": "The chicken crossed the road."},
]
)
print(assessments)
取得されたチャンクが無関係な場合の対処方法
無関係なチャンクが取得された場合。
- リトリーバーの構成を評価し、関連性を優先するようにパラメーターを調整してください。
- リトリーバーのトレーニングデータを、より多様で正確な例を含むように改善します。
文書のリコール
定義 :レトリーバーは既知の関連文書をいくつ見つけましたか?
グラウンドトゥルースが必要 :はい、expected_retrieved_context[].doc_uri。
文書リコールは、グラウンドトゥルース関連文書のうち取得されたものの割合を、グラウンドトゥルース内の関連文書の総数と比較して測定します。
必要な入力
入力評価セットには、次の列が必要です。
expected_retrieved_context[].doc_uri
さらに、mlflow.evaluate()への呼び出しでmodel引数を使用しない場合は、retrieved_context[].doc_uriまたはtraceのいずれかを提供する必要があります。
例
評価セットからドキュメントのリコールを使用します。
import mlflow
eval_set = [{
"request": "What is the capital of France?",
"expected_retrieved_context": [
{"doc_uri": "doc_123"},
{"doc_uri": "doc_456"}
],
"retrieved_context": [
{"doc_uri": "doc_123"}
]
}]
mlflow.evaluate(
data=eval_set,
model_type="databricks-agent",
evaluator_config={
"databricks-agent": {
"metrics": ["document_recall"]
}
}
)
このメトリクスにはAI審査を使用しないため、呼び出し可能なジャッジSDKはありません。
ドキュメントの再現率が低い場合の対処方法
再現率が低い場合:
- ground truthデータが関連ドキュメントを正確に反映していることを確認してください。
- リコール率を高めるには、リトリーバーを改善するか、検索パラメーターを調整してください。
カスタムAIジャッジ
ユースケースに固有の評価を実行するカスタムジャッジを作成することもできます。
詳細については、以下をご覧ください。