评估生成式 AI 智能体

构建和评估生成式 AI 模型后,您可以使用该模型构建聊天机器人等代理。借助 Gen AI Evaluation Service,您可以衡量智能体的完成任务和实现应用场景目标的能力。

概览

您可以通过以下方式评估代理:

  • 最终回答评估:评估客服的最终输出(客服是否实现了其目标)。

  • 轨迹评估:评估代理达到最终响应的路径(工具调用序列)。

借助 Gen AI Evaluation Service,您可以在一个 Vertex AI SDK 查询中触发代理执行,并获取轨迹评估和最终回答评估的指标。

支持的代理

Gen AI Evaluation Service 支持以下类别的代理:

支持的代理 说明
使用 Agent Engine 模板构建的代理 Agent Engine(LangChain on Vertex AI)是一个 Google Cloud 平台,您可以在其中部署和管理智能体。
使用 Agent Engine 的可自定义模板构建的 LangChain 代理 LangChain 是一个开源平台。
自定义代理函数 自定义代理函数是一种灵活的函数,可接受代理的提示,并在字典中返回响应和轨迹。

定义代理评估指标

定义最终响应或轨迹评估的指标:

最终回答评估

最终回答评估遵循与模型回答评估相同的流程。如需了解详情,请参阅定义评估指标

轨迹评估

以下指标可帮助您评估模型跟随预期轨迹的能力:

完全匹配

如果预测轨迹与参照轨迹完全相同,并且工具调用完全相同且顺序完全相同,则 trajectory_exact_match 指标会返回 1 分,否则返回 0 分。

指标输入参数

输入参数 说明
predicted_trajectory 代理用于生成最终回答的工具调用列表。
reference_trajectory 代理满足查询时预计使用的工具。

输出得分

说明
0 预测轨迹与参考轨迹不符。
1 预测的轨迹与参考轨迹相符。

按顺序匹配

如果预测轨迹包含参考轨迹中的所有工具调用(按相同顺序),并且可能还有额外的工具调用,则 trajectory_in_order_match 指标会返回 1 分,否则返回 0 分。

指标输入参数

输入参数 说明
predicted_trajectory 代理用于得出最终回答的预测轨迹。
reference_trajectory 代理满足查询的预期预测轨迹。

输出得分

说明
0 预测轨迹中的工具调用与参照轨迹中的顺序不匹配。
1 预测的轨迹与参考轨迹相符。

任意顺序匹配

如果预测轨迹包含参照轨迹中的所有工具调用,但顺序无关紧要,并且可能包含额外的工具调用,则 trajectory_any_order_match 指标会返回 1 分,否则返回 0 分。

指标输入参数

输入参数 说明
predicted_trajectory 代理用于生成最终回答的工具调用列表。
reference_trajectory 代理满足查询时预计使用的工具。

输出得分

说明
0 预测轨迹不包含参照轨迹中的所有工具调用。
1 预测的轨迹与参考轨迹相符。

精确度

trajectory_precision 指标衡量预测轨迹中实际相关或正确的工具调用数量(根据参考轨迹)。

精确度计算方法如下:统计预测轨迹中同时出现在参考轨迹中的操作数量。将该计数除以预测轨迹中的操作总数。

指标输入参数

输入参数 说明
predicted_trajectory 代理用于生成最终回答的工具调用列表。
reference_trajectory 代理满足查询时预计使用的工具。

输出得分

说明
[0,1] 范围内的浮点数 得分越高,预测的轨迹越精确。

召回率

trajectory_recall 指标用于衡量预测轨迹中实际捕获了参考轨迹中多少项重要的工具调用。

召回率的计算方法如下:统计参考轨迹中同时出现在预测轨迹中的操作数量。将该计数除以参考轨迹中的操作总数。

指标输入参数

输入参数 说明
predicted_trajectory 代理用于生成最终回答的工具调用列表。
reference_trajectory 代理满足查询时预计使用的工具。

输出得分

说明
[0,1] 范围内的浮点数 得分越高,预测轨迹的召回率就越高。

单次使用

trajectory_single_tool_use 指标用于检查预测轨迹中是否使用了指标规范中指定的特定工具。它不会检查工具调用的顺序或工具的使用次数,只会检查工具是否存在。

指标输入参数

输入参数 说明
predicted_trajectory 代理用于生成最终回答的工具调用列表。

输出得分

说明
0 缺少该工具
1 该工具已存在。

此外,系统会默认在评估结果中添加以下两个代理效果指标。您无需在 EvalTask 中指定它们。

latency

客服人员返回回答所用的时间。

说明
浮点数 以秒为单位。

failure

一个布尔值,用于描述代理调用是导致错误还是成功。

输出得分

说明
1 错误
0 返回有效的响应

为代理评估准备数据集

准备数据集以进行最终响应或轨迹评估。

最终回答评估的数据架构与模型回答评估的数据架构类似。

对于基于计算的轨迹评估,您的数据集需要提供以下信息:

输入类型 输入字段内容
predicted_trajectory 代理用于生成最终回答的工具调用列表。
reference_trajectory(对于 trajectory_single_tool_use metric 不是必需的) 代理满足查询时预计使用的工具。

评估数据集示例

以下示例展示了用于轨迹评估的数据集。请注意,除 trajectory_single_tool_use 以外的所有指标都需要 reference_trajectory

reference_trajectory = [
# example 1
[
  {
    "tool_name": "set_device_info",
    "tool_input": {
        "device_id": "device_2",
        "updates": {
            "status": "OFF"
        }
    }
  }
],
# example 2
[
    {
      "tool_name": "get_user_preferences",
      "tool_input": {
          "user_id": "user_y"
      }
  },
  {
      "tool_name": "set_temperature",
      "tool_input": {
          "location": "Living Room",
          "temperature": 23
      }
    },
  ]
]

predicted_trajectory = [
# example 1
[
  {
    "tool_name": "set_device_info",
    "tool_input": {
        "device_id": "device_3",
        "updates": {
            "status": "OFF"
        }
    }
  }
],
# example 2
[
    {
      "tool_name": "get_user_preferences",
      "tool_input": {
          "user_id": "user_z"
      }
    },
    {
      "tool_name": "set_temperature",
      "tool_input": {
          "location": "Living Room",
          "temperature": 23
      }
    },
  ]
]

eval_dataset = pd.DataFrame({
    "predicted_trajectory": predicted_trajectory,
    "reference_trajectory": reference_trajectory,
})

导入评估数据集

您可以使用以下格式导入数据集:

  • 存储在 Cloud Storage 中的 JSONL 或 CSV 文件

  • BigQuery 表

  • Pandas DataFrame

Gen AI Evaluation Service 提供了公共数据集示例,以演示如何评估代理。以下代码展示了如何从 Cloud Storage 存储分区导入公共数据集:

# dataset name to be imported
dataset = "on-device" # Alternatives: "customer-support", "content-creation"

# copy the tools and dataset file
!gcloud storage cp gs://cloud-ai-demo-datasets/agent-eval-datasets/{dataset}/tools.py .
!gcloud storage cp gs://cloud-ai-demo-datasets/agent-eval-datasets/{dataset}/eval_dataset.json .

# load the dataset examples
import json

eval_dataset = json.loads(open('eval_dataset.json').read())

# run the tools file
%run -i tools.py

其中 dataset 是以下公共数据集之一:

  • "on-device" 用于设备端 Google 助理,用于控制家居设备。该客服人员可帮助回答诸如“将卧室空调设为在晚上 11 点到早上 8 点开启,其余时间关闭”等问题。

  • "customer-support" 与客户支持人员联系。客服人员会帮助您解答问题,例如“您能否取消所有待处理的订单并上报所有未解决的支持服务工单?”

  • "content-creation" 用于营销内容创作代理。客服人员可帮助您解答各种问题,例如“将广告系列 X 重新安排为在社交媒体网站 Y 上投放一次性广告系列,预算减少 50%,仅投放于 2024 年 12 月 25 日”。

运行代理评估

针对轨迹或最终响应评估运行评估:

对于代理评估,您可以混合使用响应评估指标和轨迹评估指标,如以下代码所示:

single_tool_use_metric = TrajectorySingleToolUse(tool_name='tool_name')

eval_task = EvalTask(
    dataset=EVAL_DATASET,
    metrics=[
        "rouge_l_sum",
        "bleu",
        custom_trajectory_eval_metric, # custom computation-based metric
        "trajectory_exact_match",
        "trajectory_precision",
        single_tool_use_metric,
        response_follows_trajectory_metric # llm-based metric
    ],
)
eval_result = eval_task.evaluate(
    runnable=RUNNABLE,
)

指标自定义

您可以使用模板化接口或从头开始自定义基于大型语言模型的指标来评估轨迹,如需了解详情,请参阅基于模型的指标部分。下面是一个模板示例:

response_follows_trajectory_prompt_template = PointwiseMetricPromptTemplate(
    criteria={
        "Follows trajectory": (
            "Evaluate whether the agent's response logically follows from the "
            "sequence of actions it took. Consider these sub-points:\n"
            "  - Does the response reflect the information gathered during the trajectory?\n"
            "  - Is the response consistent with the goals and constraints of the task?\n"
            "  - Are there any unexpected or illogical jumps in reasoning?\n"
            "Provide specific examples from the trajectory and response to support your evaluation."
        )
    },
    rating_rubric={
        "1": "Follows trajectory",
        "0": "Does not follow trajectory",
    },
    input_variables=["prompt", "predicted_trajectory"],
)

response_follows_trajectory_metric = PointwiseMetric(
    metric="response_follows_trajectory",
    metric_prompt_template=response_follows_trajectory_prompt_template,
)

您还可以定义基于计算的自定义指标来评估轨迹或响应,如下所示:

def essential_tools_present(instance, required_tools = ["tool1", "tool2"]):
    trajectory = instance["predicted_trajectory"]
    tools_present = [tool_used['tool_name'] for tool_used in trajectory]
    if len(required_tools) == 0:
      return {"essential_tools_present": 1}
    score = 0
    for tool in required_tools:
      if tool in tools_present:
        score += 1
    return {
        "essential_tools_present": score/len(required_tools),
    }

custom_trajectory_eval_metric = CustomMetric(name="essential_tools_present", metric_function=essential_tools_present)

查看和解读结果

对于轨迹评估或最终回答评估,评估结果会显示如下:

显示客服人员评估指标的表格

评估结果包含以下信息:

最终回答指标

实例级结果

说明
回答 客服人员生成的最终回答。
latency_in_seconds 生成回答所花的时间。
失败 指示是否生成了有效的回答。
得分 系统为指标规范中指定的响应计算的得分。
说明 指标规范中指定的分数的说明。

汇总结果

说明
平均值 所有实例的平均得分。
标准差 所有得分的标准差。

轨迹指标

实例级结果

说明
predicted_trajectory 工具调用序列,后跟代理,以获得最终响应。
reference_trajectory 预期工具调用的顺序。
得分 为指标规范中指定的预测轨迹和参考轨迹计算得分。
latency_in_seconds 生成回答所花的时间。
失败 指示是否生成了有效的回答。

汇总结果

说明
平均值 所有实例的平均得分。
标准差 所有得分的标准差。

后续步骤

请试用以下聊天机器人评估笔记本: