使用 ADK 架构开发 Agent 自动化评估脚本

在之前的文章中,我分析了当前测试方法在 LLM 应用测试中的不足,并介绍了基于 DeepEval 框架的一种解决方案(文章链接放在文末)。
DeepEval 是一个功能强大的开源评估框架,但对开发者来说,上手仍有一定门槛。最近在学习 Google 的ADK 框架时,我意外发现它内置的评估功能非常好用,上手门槛低、配置简单,真正实现了开箱即用。说直白点,已经达到了有手就能写 Agent 自动化评估脚本的程度。

这篇文章,我会带你基于 ADK 框架实现一个完整的 Agent 自动化评估脚本。

一、为什么要做 Agent 的自动化评估 在生成式大模型出现之前,我们习惯于用“预期结果 = 实际输出”这种确定性逻辑来写测试用例,执行测试脚本。
但当系统引入 LLM 之后,这套思路开始失效。因为模型输出具有非确定性,我们无法再用“pass/fail”的硬性断言来做判定,而需要引入更为灵活的指标体系,从输出质量、工具使用路径等多个维度进行评估。

Google 在 ADK 文档中有一段总结非常到位:

In traditional software development, unit tests and integration tests provide confidence that code functions as expected and remains stable through changes. These tests provide a clear "pass/fail" signal, guiding further development. However, LLM agents introduce a level of variability that makes traditional testing approaches insufficient.Due to the probabilistic nature of models, deterministic "pass/fail" assertions are often unsuitable for evaluating agent performance. Instead, we need qualitative evaluations of both the final output and the agent's trajectory – the sequence of steps taken to reach the solution. This involves assessing the quality of the agent's decisions, its reasoning process, and the final result.https://google.github.io/adk-docs/evaluate/二、评估什么 对一个 Agent 而言,执行过程主要包含两个核心环节:1. 工具筛选与调用过程 2. 最终返回结果 对应到 ADK 框架中,这两个环节也正是它评估的重点:
Evaluating Trajectory and Tool Use:评估工具调用路径是否正确,执行顺序是否合理。
Evaluating Final Response:评估最终输出是否满足用户意图。

一般来说:
工具调用轨迹需要完全匹配(默认通过分数为 1.0,即 100%);
最终输出允许有一定偏差(默认通过分数为 0.8,即 80%)。

三、怎么评估 在 ADK 中,评估脚本的开发主要包括两部分:编写验证JSON文件和编写调用代码。1. 编写验证JSON文件 验证文件是一个JSON格式的文件,这是评估的“输入数据”,用来描述一次完整的交互过程,包括:1)User Content:用户发出的原始问题。例如:          "usercontent": {            "parts": [              {                "text": "显示orders表结构"              }            ],            "role": "user"          }2)Expected Intermediate Tool Use Trajectory:期望的工具调用路径(包含选择了哪些工具、调用顺序等)。例如:      "expectedtooluse": [        {"name": "transfertoagent", "args": {"agentname": "tableinfo"}},        {"name": "gettableinfo", "args": {"tablename": "orders"}}      ],          "intermediatedata": {            "tooluses": [              {                "name": "transfertoagent",                "args": {                  "agentname": "tableinfo"                }              },              {                "name": "gettableinfo",                "args": {                  "tablename": "orders"                }              }            ],            "intermediateresponses": []          }3)Expected Intermediate Agent Responses:各阶段 Agent(主/子)的中间响应。例如:          "intermediatedata": {            …            "intermediateresponses": [] # Any intermediate sub-agent responses.          }4)Final Response:最终输出结果。例如:          "finalresponse": {            "parts": [              {                "text": "## 表结构:ordersnn基本信息:n- 表名:ordersn- 记录数:900 行n- 列数:19 列nn字段详情:n| 字段名                  | 数据类型           | 说明                           |n|————————-|——————–|——————————–|n| id                      | INTEGER            | 订单唯一标识                   |n| couponcode             | varchar(255)       | 使用的优惠券代码               |n| createtime             | timestamp          | 订单创建时间                   |n| logisticscompany       | varchar(255)       | 物流公司名称                   |n| note                    | varchar(255)       | 订单备注                       |n| paytime                | timestamp          | 支付时间                       |n| paymentmethod          | varchar(255)       | 支付方式                       |n| paymenttransactionid  | varchar(255)       | 支付交易ID                     |n| productid              | bigint             | 关联的产品ID                   |n| quantity                | INTEGER            | 商品数量                       |n| receiveraddress        | varchar(255)       | 收货地址                       |n| receivername           | varchar(255)       | 收货人姓名                     |n| receiverphone          | varchar(255)       | 收货人电话                     |n| specification           | varchar(255)       | 商品规格                       |n| status                  | varchar(255)       | 订单状态                       |n| totalamount            | numeric(38,2)      | 订单总金额                     |n| trackingnumber         | varchar(255)       | 物流跟踪号                     |n| updatetime             | timestamp          | 订单更新时间                   |n| userid                 | bigint             | 关联的用户ID                   |nn设计特点:n1. 主键:id 字段作为订单的唯一标识。n2. 时间字段:createtime 和 updatetime 分别记录订单的创建和更新时间。n3. 关联字段:productid 和 userid 可能与其他表(如 products 和 users)关联。n4. 状态管理:status 字段用于跟踪订单状态。n5. 金额字段:totalamount 使用 numeric(38,2) 类型,适合存储精确的金额数据。nn建议后续操作:n- 查看样本数据:使用 sampledataagent。n- 执行查询:使用 queryexecution_agent."              }            ],            "role": "model"          }完整样例:以我在前文中实现的 Agent 为例,用户输入“显示 orders 表结构”时,系统内部触发了如下三步Agent 和 LLM 之间的交互:
第 1 次:LLM 识别意图,决定调用transfertoagent,将请求路由到子 Agent;
第 2 次:子 Agent 执行 Tool,触发gettableinfo;
第 3 次:生成最终的自然语言回复,返回给用户。

整个过程如下图所示,都可以被完整写入验证 JSON 中。

使用 ADK 架构开发 Agent 自动化评估脚本

完整验证 JSON 文件tableschemaanalysis.test.json如下:{  "evalsetid": "table-schema-analysis-sqlite",  "name": "Table Schema Analysis SQLite",  "description": "测试表结构探索和schema分析能力",  "evalcases": [    {      "evalid": "table-schema-orders-structure",      "query": "显示orders表结构",      "expectedtooluse": [        {"name": "transfertoagent", "args": {"agentname": "tableinfo"}},        {"name": "gettableinfo", "args": {"tablename": "orders"}}      ],      "conversation": [        {          "invocationid": "inv-schema-1",          "usercontent": {            "parts": [              {                "text": "显示orders表结构"              }            ],            "role": "user"          },          "finalresponse": {            "parts": [              {                "text": "## 表结构:ordersnn基本信息:n- 表名:ordersn- 记录数:900 行n- 列数:19 列nn字段详情:n| 字段名                  | 数据类型           | 说明                           |n|————————-|——————–|——————————–|n| id                      | INTEGER            | 订单唯一标识                   |n| couponcode             | varchar(255)       | 使用的优惠券代码               |n| createtime             | timestamp          | 订单创建时间                   |n| logisticscompany       | varchar(255)       | 物流公司名称                   |n| note                    | varchar(255)       | 订单备注                       |n| paytime                | timestamp          | 支付时间                       |n| paymentmethod          | varchar(255)       | 支付方式                       |n| paymenttransactionid  | varchar(255)       | 支付交易ID                     |n| productid              | bigint             | 关联的产品ID                   |n| quantity                | INTEGER            | 商品数量                       |n| receiveraddress        | varchar(255)       | 收货地址                       |n| receivername           | varchar(255)       | 收货人姓名                     |n| receiverphone          | varchar(255)       | 收货人电话                     |n| specification           | varchar(255)       | 商品规格                       |n| status                  | varchar(255)       | 订单状态                       |n| totalamount            | numeric(38,2)      | 订单总金额                     |n| trackingnumber         | varchar(255)       | 物流跟踪号                     |n| updatetime             | timestamp          | 订单更新时间                   |n| userid                 | bigint             | 关联的用户ID                   |nn设计特点:n1. 主键:id 字段作为订单的唯一标识。n2. 时间字段:createtime 和 updatetime 分别记录订单的创建和更新时间。n3. 关联字段:productid 和 userid 可能与其他表(如 products 和 users)关联。n4. 状态管理:status 字段用于跟踪订单状态。n5. 金额字段:totalamount 使用 numeric(38,2) 类型,适合存储精确的金额数据。nn建议后续操作:n- 查看样本数据:使用 sampledataagent。n- 执行查询:使用 queryexecutionagent."              }            ],            "role": "model"          },          "intermediatedata": {            "tooluses": [              {                "name": "transfertoagent",                "args": {                  "agentname": "tableinfo"                }              },              {                "name": "gettableinfo",                "args": {                  "tablename": "orders"                }              }            ],            "intermediateresponses": []          }        }      ]    }  ]}2. 编写调用代码。评估脚本本身非常精简,核心代码仅 2 行:@pytest.mark.asyncioasync def testtableschemaanalysis():    """Test table structure exploration and schema analysis capabilities."""    await AgentEvaluator.evaluate(        "sqliteagent",        str(pathlib.Path(_file).parent / "data/tableschemaanalysis.test.json"),        numruns=1    )
第 6 行:指定验证 JSON 文件路径;
第 7 行:指定运行次数。

至此,我们已经完成了所有的代码编写工作,就这么简单。四、怎么运行 ADK 提供三种运行方式,按需选择即可:1.使用 ADK 自带命令行工具:adk eval     sqliteagent     eval/data/dataanalysis.test.json 2. 通过 pytest 集成:pytest eval/testeval.py::testtableschemaanalysis3. 直接用 Python 脚本调用:python -m pytest eval/testeval.py::testtableschemaanalysis -v

使用 ADK 架构开发 Agent 自动化评估脚本

五、怎么快速编写验证 JSON 文件 你可能会担心验证文件信息量太大,需要抓包、手动拼装,成本较高。其实 ADK 提供了非常友好的辅助方式,步骤如下:1. 运行 ADK 的 Web UI adk web 访问http://127.0.0.1:8000/dev-ui/2. 输入问题进行一次完整对话 使用 Web UI 的交互框,模拟用户真实输入。3. 查看交互日志 在 Event中可以看到每一轮请求和响应。点击“下载”,可将整个对话保存为 JSON 文件。可以手动提取关键字段,也可以借助 AI 辅助编码工具,根据这份 JSON 自动生成验证脚本模板。

使用 ADK 架构开发 Agent 自动化评估脚本

4.直接用 Web UI 自带的 Eval 功能 Web UI甚至提供了评估功能。你可以在 Eval 菜单中新建一个评估任务,选定某次对话 session,即可对 Agent 行为进行评估。

使用 ADK 架构开发 Agent 自动化评估脚本

六、总结 相比 DeepEval,ADK 在 Agent 评估方面提供了更贴合 LLM 工作机制的原生支持,从而帮助我们更快速地开发 Agent 自动化评估脚本,进一步降低了开发成本。附上关于DeepEval的文章:应用系统集成大模型后如何进行测试?使用deepeval对集成大模型的应用系统进行自动化测试 使用deepeval测试大模型生成内容的完整样例代码

前沿技术开源大模型新闻资讯

告别选择困难症!Dify、n8n、Coze、Fastgpt、Ragflow 怎么选?看这篇就够了。

2026-6-24 12:00:48

前沿技术开源大模型新闻资讯

聊聊Coze开源的意义

2026-6-24 14:01:27

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
购物车
优惠劵
搜索