重要
このページでは、MLflow <0.22
を使用したエージェント評価<2.x
について説明します。 Databricks では、エージェント評価 >1.0
と統合された MLflow 3 を使用することをお勧めします。 エージェント評価 SDK メソッドは、 mlflow
SDK を介して公開されるようになりました。
このトピックの詳細については、「 定義済みのジャッジとスコアラー」を参照してください。
この記事では、必要な入力と出力メトリックなど、Mosaic AI Agent Evaluation に組み込まれている各 AI ジャッジの詳細について説明します。
次も参照してください。
AI ジャッジの概要
手記
すべてのジャッジでグラウンド トゥルース ラベルが必要なわけではありません。 ラベルを必要としないジャッジは、エージェントを評価するための一連の要求しかない場合に役立ちます。
判事の名前 | 審査委員が評価する品質面 | 必要な入力 | グラウンド トゥルースが必要 |
---|---|---|---|
global_guideline_adherence |
生成された応答はグローバル ガイドラインに準拠していますか? |
request , response , global_guidelines (evaluator_config から) |
いいえ。ただし、必要です global_guidelines |
guideline_adherence |
生成された応答は、提供されている質問ごとのガイドラインに従っていますか? |
request 、 response または guidelines_context 、 guidelines |
はい |
correctness |
生成された応答は(地上の真理と比較して)正確ですか? |
request 、 response 、 expected_facts[] 、または expected_response |
はい |
relevance_to_query |
応答アドレスはユーザーの要求に関連していますか? |
request 、response |
いいえ |
context_sufficiency |
レトリバーは、予想される応答を生成するのに十分な情報を持つドキュメントを見つけたか。 |
request 、retrieved_context 、expected_response |
はい |
safety |
応答に有害または有毒なコンテンツはありますか? |
request 、response |
いいえ |
chunk_relevance |
レトリバーは、ユーザーの要求に応答するのに関連する役立つチャンクを見つけましたか。 注: このジャッジは、取得された各チャンクに個別に適用され、チャンクごとにスコア & 根拠が生成されます。 これらのスコアは、関連するチャンクの % を表す各行の chunk_relevance/precision スコアに集計されます。 |
request 、retrieved_context |
いいえ |
groundedness |
生成された応答は、取得されたコンテキストに固定されていますか (幻覚ではありません)。 |
request 、response 、trace[retrieved_context] |
いいえ |
document_recall |
レトリバーが見つけた既知の関連ドキュメントの数はいくつですか? |
retrieved_context 、expected_retrieved_context[].doc_uri |
はい |
手記
複数ターンの会話の場合、AI のジャッジは会話の最後のエントリのみを評価します。
AI ジャッジの出力
評価で使用される各ジャッジは、次の列を出力します。
データ フィールド | 型 | 説明 |
---|---|---|
response/llm_judged/{judge_name}/rating |
string |
ジャッジが合格した場合は yes 、ジャッジが失敗した場合は no します。 |
response/llm_judged/{judge_name}/rationale |
string |
LLM の yes または no に関する書面による推論。 |
response/llm_judged/{judge_name}/error_message |
string |
この評価の計算中にエラーが発生した場合は、エラーの詳細がここに表示されます。 エラーがない場合、ここは NULL になります。 |
各ジャッジは、実行全体の集計メトリックも生成します。
メトリックの名前 | 型 | 説明 |
---|---|---|
response/llm_judged/{judge_name}/rating/average |
float, [0, 1] |
yes であると判断されたすべての評価の割合。 |
ガイドラインの準拠
定義: 応答は提供されたガイドラインに準拠していますか?
グラウンド トゥルースが必要: global_guidelines
を使っているときは、いいえ。 行単位の guidelines
を使用する場合ははい。
ガイドラインの準拠は、エージェントの応答がガイドラインに記載されている特定の制約または指示に従っているかどうかを評価します。
ガイドラインは、次のいずれかの方法で定義できます。
- 行単位: 特定の要求の応答は、その評価行に定義されているガイドラインに従う必要があります。
- グローバル: 要求に対するすべての応答は、グローバル ガイドラインに従う必要があります。
必要な入力
入力評価セットには、次の列が必要です。
request
-
response
にmodel
パラメーターを指定していない場合は、mlflow.evaluate()
します。 - 構成で定義されている行ごとの
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
。
正確性は、エージェントの実際の応答をグラウンド・トゥルース・ラベルと比較し、ファクト・エラーを検出するのに適した方法です。
必要な入力
入力評価セットには、次の列が必要です。
重要
Databricks では、expected_facts[]
の代わりに expected_response
を使用することをお勧めします。
expected_facts[]
は、適切な対応に必要な最小限の事実セットを表し、対象分野の専門家が簡単にキュレーションできます。
必要な情報のみを含め、応答に厳密に要求されない情報を除外することで、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
を生成するのに十分かどうかを判断できます。 - 十分なコンテキストがある場合は、関連情報を含むようにプロンプトを調整します。
クエリへの関連性
定義: 応答は入力要求に関連していますか?
グラウンド トゥルースが必要: いいえ。
関連性により、エージェントの応答は、関連のないトピックに割り当てることなく、ユーザーの入力に直接対処できます。
必要な入力
入力評価セットには、次の列が必要です。
request
-
response
にmodel
パラメーターを指定していない場合は、mlflow.evaluate()
します。
例
評価セットからの関連性を使用します。
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
。
コンテキスト機能は、取得したドキュメントが、予想される応答を生成するために必要なすべての情報を提供するかどうかを評価します。
必要な入力
入力評価セットには、次の列が必要です。
request
-
response
にmodel
パラメーターを指定していない場合は、mlflow.evaluate()
します。 -
expected_facts
またはexpected_response
。expected_facts
ガイドラインとexpected_response
ガイドラインを参照してください。 -
retrieved_context[].content
にmodel
パラメーターを指定していない場合は、mlflow.evaluate()
します。
例
評価セットのコンテキストの十分性を活用します。
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)
コンテキストが不十分な場合はどうすればよいですか?
コンテキストが不十分な場合:
- 必要なすべてのドキュメントが確実に含まれるように、取得メカニズムを強化します。
- モデル プロンプトを変更して、不足している情報を明示的に参照するか、関連するコンテキストに優先順位を付けます。
安全
定義: 応答は有害または有毒なコンテンツを回避しますか?
グラウンド トゥルースが必要: いいえ。
安全性により、エージェントの応答に有害、不快、または有毒なコンテンツが含まれていないことが保証されます。
必要な入力
入力評価セットには、次の列が必要です。
request
-
response
にmodel
パラメーターを指定していない場合は、mlflow.evaluate()
します。
例
評価セットから安全性を利用します。
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)
応答が安全でない場合はどうすればよいですか?
応答に有害なコンテンツが含まれている場合:
- 要求を分析して、誤って安全でない応答につながる可能性があるかどうかを特定します。 必要に応じて入力を変更します。
- 有害または有毒なコンテンツの生成を明示的に回避するように、モデルまたはプロンプトを調整します。
- ユーザーに到達する前に安全でない応答をインターセプトするために、コンテンツ フィルターなどの追加の安全メカニズムを採用します。
グラウンデッドネス
定義: 応答は実際には取得されたコンテキストと一致していますか?
グラウンド トゥルースが必要: いいえ。
Groundedness は、エージェントの応答が取得されたコンテキストで提供される情報と一致しているかどうかを評価します。
必要な入力
入力評価セットには、次の列が必要です。
request
-
response
にmodel
パラメーターを指定していない場合は、mlflow.evaluate()
します。 -
retrieved_context[].content
の呼び出しでmodel
引数を使用しない場合は、mlflow.evaluate()
します。
例
評価セットからグラウンデッドネスを使用します。
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)
応答に根拠がない場合はどうすればよいですか?
応答が基盤に基づいていない場合:
- 取得したコンテキストを確認して、予想される応答を生成するために必要な情報が含まれていることを確認します。
- コンテキストが不十分な場合は、関連するドキュメントを含むように取得メカニズムまたはデータセットを改善します。
- 応答の生成時に取得したコンテキストの使用に優先順位を付けるようモデルに指示するようにプロンプトを変更します。
チャンクの関連性
定義: 取得されたチャンクは入力要求に関連していますか?
グラウンド トゥルースが必要: いいえ。
チャンクの関連性は、各チャンクが入力要求に関連するかどうかを測定します。
必要な入力
入力評価セットには、次の列が必要です。
request
-
retrieved_context[].content
にmodel
パラメーターを指定していない場合は、mlflow.evaluate()
します。
model
の呼び出しで mlflow.evaluate()
引数を使用しない場合は、retrieved_context[].content
または trace
も指定する必要があります。
例
この例では、チャンクの関連性を判定する機能をカスタム精度メトリックと共に使用して、行レベルの精度スコアを算出します。 カスタム メトリックの詳細については、「カスタム メトリック (レガシ)」を参照してください。
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]
)
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
さらに、model
の呼び出しで mlflow.evaluate()
引数を使用しない場合は、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 はありません。
ドキュメント リコールが低い場合の対処方法
リコールが低い場合:
- 基底真実データが関連するドキュメントを正確に反映していることを確認します。
- リトリーバーを改善するか、検索パラメーターを調整して再呼び出しを増やします。
カスタム AI ジャッジ
また、ユース ケースに固有の評価を実行するカスタム ジャッジを作成することもできます。
詳細については、以下を参照してください。