Skip to content

用于 ADK 智能体的 MLflow 评分器

Supported in ADKPython

MLflow 将五个 ADK 评估器包装为第三方评分器,使你可以在任何 mlflow.genai.evaluate() 运行中使用 ADK 的轨迹匹配、ROUGE 响应相似度和 LLM-judge 指标。该集成涵盖了 ADK 的 TrajectoryEvaluatorRougeEvaluatorFinalResponseMatchV2EvaluatorSafetyEvaluatorV1HallucinationsV1Evaluator

如果你还在追踪 ADK 智能体,请参阅 MLflow Tracing 集成了解一行 OTel 自动追踪设置。下面的确定性评分器直接从这些追踪中读取工具调用。

使用场景

  • 工具轨迹评估:使用 EXACTIN_ORDERANY_ORDER 匹配验证智能体是否以正确的顺序调用了正确的工具。
  • 响应相似度:使用 ROUGE-1 F-measure 对智能体的最终响应与参考答案进行评分。
  • LLM 评判的响应质量:使用 Gemini 以多数投票方式对智能体的响应是否语义匹配预期响应进行评分。
  • 幻觉检测:使用 Gemini 对智能体的响应是否包含捏造事实进行评分。
  • 安全检查:使用 Vertex AI 的预构建 SAFETY 指标标记不安全输出,无需管理评判模型。
  • 混合匹配评分:在单个 mlflow.genai.evaluate() 调用中同时运行确定性评分器和 LLM 评判,在更昂贵的评判调用之下叠加廉价的结构检查。

前置条件

  • MLflow 3.13 或更高版本以获得完整评分器集。MLflow 3.11 提供两个确定性评分器;三个 LLM-judge 评分器在 3.13 中引入。
  • 环境中已安装 ADK。
  • 对于 LLM-judge 评分器:需要 GEMINI_API_KEY(Gemini Developer API)或 Google Cloud 项目凭据(Vertex AI)。Safety 始终需要 Vertex AI 路径,因为它委托给托管指标。

安装依赖

pip install "mlflow>=3.13" google-adk

可用评分器

五个 MLflow 评分器,按评分方式分组:

评分器 评估内容 包装
ToolTrajectory 智能体是否以正确的顺序调用了正确的工具 TrajectoryEvaluator
ResponseMatch 实际响应和预期响应之间的词法相似度(ROUGE-1 F-measure) RougeEvaluator
ResponseEvaluation 最终响应是否语义匹配预期响应(LLM judge) FinalResponseMatchV2Evaluator
Safety 响应是否包含不安全内容 SafetyEvaluatorV1(Vertex AI 托管)
Hallucination 响应是否包含幻觉内容(LLM judge) HallucinationsV1Evaluator

ToolTrajectoryResponseMatch 在微秒级运行,无 API 成本。ResponseEvaluationHallucination 调用默认的 Gemini Flash 评判模型并进行五次采样多数投票;模型和采样次数均可配置。Safety 是例外。它通过 Vertex AI 的预构建 SAFETY 指标路由,该指标管理自己的模型选择,因此如果你传入 modelnum_samples,评分器会抛出 TypeError

快速入门

直接调用评分器:

from mlflow.genai.scorers.google_adk import ToolTrajectory

scorer = ToolTrajectory(match_type="EXACT", threshold=0.5)
feedback = scorer(
    inputs="Book a flight to Paris",
    outputs="Booked flight AA123 to Paris",
    expectations={
        "expected_tool_calls": [
            {"name": "search_flights", "args": {"destination": "Paris"}},
            {"name": "book_flight", "args": {"flight_id": "AA123"}},
        ],
        "actual_tool_calls": [
            {"name": "search_flights", "args": {"destination": "Paris"}},
            {"name": "book_flight", "args": {"flight_id": "AA123"}},
        ],
    },
)

print(feedback.value)            # "yes" or "no"
print(feedback.metadata["score"]) # 1.0 on a full match

或者在单次评估中组合多个评分器:

import mlflow
from mlflow.genai.scorers.google_adk import (
    ToolTrajectory,
    ResponseMatch,
    ResponseEvaluation,
)

eval_data = [
    {
        "inputs": {"query": "Find me a flight to Paris next Friday."},
        "outputs": "I found 3 flights to Paris on Friday: AA101, DL202, UA303.",
        "expectations": {
            "expected_tool_calls": [
                {"name": "search_flights", "args": {"destination": "Paris"}},
            ],
            "actual_tool_calls": [
                {"name": "search_flights", "args": {"destination": "Paris"}},
            ],
            "expected_response": "Here are flights to Paris next Friday.",
        },
    },
]

results = mlflow.genai.evaluate(
    data=eval_data,
    scorers=[
        ToolTrajectory(match_type="EXACT", threshold=0.5),
        ResponseMatch(threshold=0.5),
        ResponseEvaluation(threshold=0.6),
    ],
)

工具调用如何解析

ToolTrajectory 需要预期工具调用(来自 expectations["expected_tool_calls"])和智能体实际进行的工具调用。它按以下顺序解析实际调用:

  1. expectations["actual_tool_calls"](如存在)。适用于已将工具调用捕获为数据的离线评估。
  2. MLflow 追踪上的 TOOL 跨度。当未提供显式覆盖时,评分器遍历追踪并从标记为 TOOL 的跨度中读取工具调用。这是直接传递追踪或使用 mlflow.genai.evaluate(predict_fn=...) 的实时评估路径。
  3. 空列表。如果两者都不可用,评分器将预期列表与空的实际列表进行比较,这将导致非空预期的评分为 0.0。

将其与 MLflow Tracing 集成配对使用,实现完全在线的设置:ADK 在智能体执行期间发出 OTel 跨度,MLflow 接收它们,评分器从追踪中读回工具调用,无需任何显式数据管道。

LLM-judge 配置

ResponseEvaluationHallucination 接受 Gemini 模型 ID、通过/失败阈值和多数投票的采样次数:

from mlflow.genai.scorers.google_adk import Hallucination, ResponseEvaluation

response_eval = ResponseEvaluation(
    model="gemini-flash-latest",
    threshold=0.5,
    num_samples=5,
)

hallucination = Hallucination(model="gemini-flash-latest", threshold=0.5)

模型必须是 ADK 的 LlmRegistry 可以解析的名称,如 gemini-flash-latestgemini-pro-latestdatabricksopenai:/gpt-4o 等 MLflow 模型 URI 不受支持,因为 ADK 的评估器直接连接到 Google 的模型注册表。

Safety 通过 Vertex AI 的托管 SAFETY 指标运行。它需要 GOOGLE_CLOUD_PROJECTGOOGLE_CLOUD_LOCATIONgcloud auth application-default login(或服务账号):

from mlflow.genai.scorers.google_adk import Safety

safety = Safety(threshold=0.5)

当缺少认证时,LLM-judge 评分器返回带有 error 字段的 Feedback 而非抛出异常。评估运行继续,并按样本显示配置错误。

资源