メインコンテンツまでスキップ

組み込み AI ジャッジ (MLflow 2)

重要

Databricks では、GenAI アプリの評価とモニタリングに MLflow 3 の使用を推奨しています。このページでは、MLflow 2 の Agent Evaluation について説明します。

この記事では、必要な入力と出力メトリクスを含め、Agent Evaluationに組み込まれている各AIジャッジの詳細を説明します。

参照:

AIジャッジの概要

注記

すべてのジャッジがグラウンドトゥルースラベルを必要とするわけではありません。 ラベルを必要としないジャッジは、エージェントを評価するためのリクエストがセットしかない場合に便利です。

ジャッジの名前

ジャッジが評価する品質面

必要な入力

グラウンドトゥルースが必要です

global_guideline_adherence

生成された応答はグローバルガイドラインに準拠していますか?

requestresponseglobal_guidelinesevaluator_configから)

いいえ、ただし要件あり global_guidelines

guideline_adherence

生成された応答は、提供された質問ごとのガイドラインに準拠していますか?

requestresponse または guidelines_contextguidelines

はい

correctness

生成された応答は正確ですか(正解と比較して)?

requestresponseexpected_facts[]または expected_response

はい

relevance_to_query

レスポンスはユーザーのリクエストに関連していますか?

request, response

No

context_sufficiency

レトリーバーは、期待される応答を生成するために十分な情報を持つドキュメントを見つけましたか?

requestretrieved_contextexpected_response

はい

safety

応答に有害または有毒なコンテンツは含まれていますか?

request, response

No

chunk_relevance

リトリーバーは、ユーザーのリクエストに答えるうえで有用な(関連する)チャンクを見つけたか?

注: このジャッジは、取得された各チャンクに個別に適用され、各チャンクのスコアと根拠が生成されます。これらのスコアは、関連するチャンクの割合を表す各行のchunk_relevance/precisionスコアに集計されます。

request, retrieved_context

No

groundedness

生成された応答は、取得されたコンテキストに基づいていますか(幻覚ではありませんか)?

requestresponsetrace[retrieved_context]

No

document_recall

レトリーバーは既知の関連文書をいくつ見つけましたか?

retrieved_context, expected_retrieved_context[].doc_uri

はい

注記

複数ターンの会話では、AIジャッジは会話の最後のエントリのみを評価します。

AI審査の出力

評価に使用された各ジャッジは、次の列を出力します。

データフィールド

Type

説明

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です。

各審査員は、全体の実行に対する集計メトリクスも生成します:

メトリクス名

Type

説明

response/llm_judged/{judge_name}/rating/average

float, [0, 1]

全評価のうち、yesと判定された割合です。

ガイドラインの準拠

定義 : 応答は提供されたガイドラインに従っていますか?

**グラウンドトゥルースが必要**:global_guidelines を使用する場合は「いいえ」です。行ごとのguidelinesを使用する場合に「はい」です。

ガイドライン遵守は、エージェントの応答がガイドラインに記載された特定の制約や指示に従っているかどうかを評価します。

ガイドラインは、以下のいずれかの方法で定義できます。

  • 行ごと: 特定のリクエストの応答は、その評価行で定義されたガイドラインに準拠する必要があります。
  • グローバル: すべてのリクエストに対するすべての応答は、グローバルガイドラインを遵守する必要があります。

必要な入力

入力評価セットには、次の列が必要です。

  • request
  • response mlflow.evaluate()modelパラメーターを指定していない場合。
  • 行ごとの guidelines または global_guidelines (設定で定義されています)。
  • [呼び出し可能なジャッジのみ] ジャッジに任意のコンテキストを提供するための guidelines_context
    • この機能を利用するには、databricks-agents>=0.20.0が必要です。

評価セットから行ごとのガイドライン準拠を使用します。

Python
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"]
}
}
)

評価セットからのグローバルガイドラインの順守を使用します。

Python
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と共に使用します:

Python
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_response の代わりに expected_facts[] を使用することをお勧めします。expected_facts[] は、正しい応答に必要とされる最小限の事実を表し、対象分野の専門家にとってキュレーションが容易です。

expected_responseを使用する必要がある場合は、正しい応答に必要とされる最小限の事実のみを含める必要があります。別のソースから応答をコピーした場合、回答が正しいと見なされるために必須ではないテキストを削除するように応答を編集してください。

回答に厳密には必要とされない情報を除外し、必要な情報のみを含めることで、Agent Evaluationは出力品質に関するより堅牢な情報を提供できます。

評価セットの正確性を使用します。

Python
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で正確性を使用します。

Python
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 mlflow.evaluate()modelパラメーターを指定していない場合。

評価セットからの関連性を使用します。

Python
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 と組み合わせて関連性を使用します:

Python
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 mlflow.evaluate()modelパラメーターを指定していない場合。
  • expected_facts または expected_responseexpected_facts ガイドラインおよびexpected_response ガイドラインを参照してください。
  • retrieved_context[].content mlflow.evaluate()modelパラメーターを指定していない場合。

評価セットのコンテキストの十分性を使用します。

Python
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 とともにコンテキスト十分性を使用します。

Python
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 mlflow.evaluate()modelパラメーターを指定していない場合。

評価セットからの安全性を使用します:

Python
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で安全を使用してください。

Python
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)

レスポンスが安全ではない場合の対処方法

応答に有害なコンテンツが含まれる場合:

  • 意図しない危険な応答につながる可能性があるかどうかを特定するために、リクエストを分析します。必要に応じて入力を修正してください。
  • 有害または有毒なコンテンツの生成を明確に避けるように、モデルまたはプロンプトを改善してください。
  • コンテンツフィルターなどの追加の安全機構を採用して、安全でない応答がユーザーに届く前に遮断します。

根拠

定義 :応答は取得したコンテキストと事実上整合していますか?

グラウンドトゥルースが必要 :不要です。

根拠とは、エージェントの応答が取得されたコンテキストで提供された情報と一致しているかどうかを評価することです。

必要な入力

入力評価セットには、次の列が必要です。

  • request
  • response mlflow.evaluate()modelパラメーターを指定していない場合。
  • retrieved_context[].content mlflow.evaluate()の呼び出しでmodel引数を使用しない場合。

評価セットから根拠を使用します:

Python
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で根拠を使用します:

Python
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 mlflow.evaluate()modelパラメーターを指定していない場合。

mlflow.evaluate()への呼び出しでmodel引数を使用しない場合は、retrieved_context[].contentまたはtraceのいずれかを指定する必要があります。

この例では、カスタム精度メトリクスでチャンク関連性ジャッジを使用して、行レベルの精度スコアをコンピュートします。カスタムメトリクスの詳細については、「カスタムメトリクス (MLflow 2)」を参照してください。

Python
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と共に使用します。

Python
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のいずれかを提供する必要があります。

評価セットからドキュメントのリコールを使用します。

Python
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ジャッジ

ユースケースに固有の評価を実行するカスタムジャッジを作成することもできます。

詳細については、以下をご覧ください。