内置的 AI 判定

本文介绍马赛克 AI 代理评估中内置的每个 AI 法官的详细信息,包括所需的输入和输出指标。

另请参阅:

人工智能法官概述

注释

并非所有判定都需要真实的标签。 当你只有一组请求可用于评估代理时,使用不需要标签的判定会很有帮助。

法官的姓名 法官评估的质量方面 所需的输入 需要事实依据
global_guideline_adherence 生成的响应是否遵循全球准则? request responseglobal_guidelines(来自evaluator_config 否,但需要 global_guidelines
guideline_adherence 生成的响应是否遵循提供的按问题指南? request response或, guidelines_contextguidelines 是的
correctness 生成的响应相对于真实值是否准确? requestresponseexpected_facts[]expected_response 是的
relevance_to_query 响应地址(是否与用户的请求相关) ? requestresponse
context_sufficiency 检索器是否查找包含足够信息的文档来生成预期的响应? requestretrieved_contextexpected_response 是的
safety 响应中是否有有害或有毒的内容? requestresponse
chunk_relevance 检索器是否在回答用户请求时发现有用(相关)的区块?
注意:此判定分别应用于每个检索到的区块,并为每个区块生成分数和理由。 这些分数将聚合为每行的 chunk_relevance/precision 分数,代表相关区块的百分比。
requestretrieved_context
groundedness 生成的响应是否以检索的上下文(未幻觉)为基础? requestresponsetrace[retrieved_context]
document_recall 检索器找到多少个已知相关文档? retrieved_contextexpected_retrieved_context[].doc_uri 是的

注释

对于多轮次对话,AI 评委仅评估对话中的最后一个条目。

AI 判定输出

在评估中使用的每个判定输出以下列:

数据字段 类型 描述
response/llm_judged/{judge_name}/rating string 如果判定通过,则返回 yes;如果判定失败,则返回 no
response/llm_judged/{judge_name}/rationale string LLM 的书面推理 yesno
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().
  • 配置中定义的按行 guidelinesglobal_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_responseexpected_facts[] 表示给出正确响应所需的最少事实,更利于主题专家进行整理。

如果必须使用 expected_response,则它应仅包含正确响应所需的最小事实集。 如果从另一个源复制响应,请编辑该响应,删除将答案视为正确而不需要的任何文本。

仅包含所需的信息,而忽略答案中不严格要求的信息,使得代理评估能够提供更可靠的输出质量信号。

例子

使用评估集的正确性:

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_factsexpected_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_factsexpected_response

上下文充分性评估检索的文档是否提供生成预期响应所需的所有信息。

所需的输入

输入评估集必须具有下面的列:

  • request
  • response 如果尚未将 model 参数指定为 mlflow.evaluate().
  • expected_factsexpected_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)

响应不安全时该怎么办?

当响应包含有害内容时:

  • 分析请求以确定它是否无意中导致不安全的响应。 如有必要,请修改输入。
  • 优化模型或提示,明确避免生成有害或有毒内容。
  • 使用其他安全机制(如内容筛选器)在到达用户之前截获不安全响应。

真实性

定义:响应是否与检索的上下文实际一致?

需要实事求是:不。

智能体回复的一致性评估是看其是否与检索到的上下文信息保持一致。

所需的输入

输入评估集必须具有下面的列:

  • 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[].contenttrace

例子

此示例使用具有自定义精度指标的区块相关性判断来计算行级精度分数。 有关自定义指标的更多详细信息,请参阅 自定义指标

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

此外,如果不使用 model 参数(在 mlflow.evaluate() 调用中),则还必须提供 retrieved_context[].doc_uritrace

例子

使用评估集的文档召回率:

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

此指标没有可调用的判断 SDK,因为它不使用 AI 法官。

文档召回率较低时该怎么办?

召回率较低时:

  • 验证地面真实数据是否准确反映相关文档。
  • 改进检索器或调整搜索参数以提高召回率。

自定义 AI 判定标准

还可以创建自定义法官来执行特定于用例的评估。

有关详细信息,请参阅: