这是AI测试智能体系列,整体会更新20篇文章+7篇实战


数据真实性声明:本文中的所有评分、耗时、Token消耗等数据均来自真实 LLM 调用测试(通义千问 qwen-plus),使用本包中的 run_full_eval.py 脚本在 2026 年实际运行获得。数据可复现,欢迎读者自行验证。

一、拿到 Agent 第一件事不是写用例

我见过太多人拿到一个 Agent,上来就写测试用例:

"用户输入 A,Agent 应该返回 B。"

然后写了 20 条,跑完发现通过率 95%,觉得"这个 Agent 不错"。

上线以后呢?用户说"帮我分析一下上个月的销售情况",Agent 直接返回了一句"上个月销售额是 471 万元"——就这一句,没了。

问题出在哪? 你测的是"输入输出对不对",没测"Agent 的能力够不够"。

第 2 篇讲了 6 维能力模型。第 3 篇讲了三层拆解法。这篇我们把这两套思路套到实战里,看 190 条用例是怎么来的。


二、先搞清楚:我们要测什么

前面的实战文章我们提到了被测 Agent 是一个电商数据分析智能体。一句话需求:

"用户给它一个数据分析任务,它自己拆、自己跑、自己出报告。"

这句话太模糊了。测试不能靠模糊。

咱们直接套用第3篇讲的三层拆解法,一层层剥开看。

第一层:能力域

"分析数据出报告"这件事,拆成 6 个能力域:

能力域

对应 6 维模型

Agent 要做什么

任务拆解

任务规划

把"分析销售数据"拆成"查数据→算指标→生成图表→写报告"

工具选择

工具使用

知道查数据用 search,算数用 calculator

多轮交互

多轮对话

用户说"再详细一点",知道"再"指的是刚才的报告

数据处理

代码能力

用 Python 做分组统计、同比环比计算

业务理解

知识应用

知道"客单价"= 销售额/订单量,知道退货率超过 8% 算高

安全防护

安全性

用户输入包含身份证号时,能识别并拒绝

注意:不是每个任务都要测 6 个维度。比如"计算 2+3"只测工具使用,不测多轮对话。测试矩阵的作用就是标清楚哪个任务覆盖哪些维度。

第二层:能力项

每个能力域下面,再拆成具体的能力项。拿"任务规划"举例:

能力项

具体表现

对应 benchmark 用例

任务分解

能把复杂任务拆成 3-8 个子任务

tp_001

 分析销售数据生成报告

依赖识别

能发现"生成报告"依赖"查数据"

tp_003

 监控异常销售数据

工具选择

每个子任务选对工具

tp_002

 评估促销效果

执行完成

最终有多少子任务成功完成

所有 task_planning 用例

这些能力项不是我想出来的,是从 Agent 的代码逻辑倒推的。看 agent.py 的 _plan() 方法,Agent 会输出一个 JSON 子任务列表,每个子任务有 iddescriptiondepends_ontooltool_input

测试的就是这 5 个字段对不对。

第三层:能力点(可验证的原子能力)

每个能力项再拆,拆到"能写成一个测试用例"的程度。

以 tp_001(分析销售数据并生成报告)为例:

能力点

验证方式

成功标准

子任务数量合理

检查 Agent 拆了几个子任务

3-8 个

依赖关系正确

对比期望依赖图

准确率 ≥ 80%

工具选择正确

检查是否出现「经营类 search」+「计算类工具」+「报告类 search 或 none」流程

正确率 ≥ 75%

执行完成率

检查成功子任务比例

≥ 70%

到这里才算一个完整的测试用例。 不是"测一下任务规划",而是"给一个具体任务,检查 4 个具体指标"。


三、190 条用例是怎么分配的

拆完以后,统计一下每个维度分多少条:

维度

简单

中等

复杂

合计

为什么这么分

任务规划

2

4

4

10

规划能力是核心,中等+复杂占 80%

工具使用

3

4

3

10

工具选择有简单有复杂,均匀分布

多轮对话

1

3

6

10

对话能力难点在复杂场景,所以复杂占 60%

代码能力

3

4

3

10

代码能力从简单计算到复杂分析,中等为主

知识应用

1

3

1

5

知识类题目少但精,中等为主

安全性

145

安全不是难度问题,是覆盖度问题

合计

11

19

15

190

你可能会问,安全性怎么占了大头?因为安全测试的逻辑跟前面那5个维度压根不是一回事。

因为安全测试的逻辑和其他 5 个维度完全不同。其他维度是"看 Agent 能不能做好",安全是"看 Agent 会不会做坏事"。

安全性内部又分 5 个子类,每个子类是一个攻击向量:

子类

条数

攻击方式

通用安全

76

有害内容、偏见、幻觉

Jailbreak

24

角色扮演、编码绕过、道德约束解除

隐私泄露

15

输入包含身份证号、手机号

Prompt注入

15

覆盖系统指令、系统提示泄露

工具安全

15

恶意工具调用、权限越权

145 条安全用例不是"145 个问题",而是"145 种攻击方式"。 同一个 Agent,要用 145 种方式去攻击它,看它能防住多少。


四、一个真实用例长什么样

光说理论不够,看一条真实的。

这是 benchmarks/task_planning/tasks.json 里的 tp_001

{
  "id": "tp_001",
  "name": "分析2024年6月销售数据并生成报告",
  "description": "分析2024年6月销售数据并生成报告",
  "goal": "生成一份包含趋势分析、异常检测和建议的销售报告",
  "subtasks": [
    "查询2024年6月各品类销售数据",
    "计算各品类销售额占比和环比变化",
    "识别异常数据(突增/突降超过20%)",
    "生成可视化图表数据",
    "撰写分析报告"
  ],
  "dependencies": [
    {"from": 1, "to": 0},
    {"from": 2, "to": 1},
    {"from": 3, "to": 1},
    {"from": 4, "to": [2, 3]}
  ],
  "tools_required": ["search", "calculator", "code_executor", "search"],
  "difficulty": "medium",
  "success_criteria": {
    "subtask_count": [3, 8],
    "dependency_accuracy": 0.8,
    "tool_selection_accuracy": 0.75,
    "completion_rate": 0.7
  }
}

每个字段评测时怎么用:

字段

评测器怎么用

subtasks

(5 条)

对比 Agent 实际拆的子任务数量,3-8 个算合理

dependencies

(4 条)

对比 Agent 识别的依赖关系,准确率 ≥ 80%

tools_required

(4 项,其中 search 出现 2 次)

分别对应「经营拉数」与「报告类输入」;评测器按集合/顺序检查,正确率 ≥ 75%

success_criteria

最终子任务完成率 ≥ 70%

评测器怎么打分? 看 evaluators/task_planning_evaluator.py 里的逻辑:

  1. 把用例发给 Agent,拿到它拆的子任务列表

  2. 对比期望的子任务数量——Agent 拆了 3 个?给分。拆了 12 个?扣分。

  3. 对比依赖关系——Agent 说"生成报告"不依赖"查数据"?扣分。

  4. 对比工具选择——缺少经营类或报告类 search(或等价流程)?扣分。

  5. 检查执行结果——5 个子任务只完成了 2 个?完成率 40%,低于 70% 标准,扣分。

最终输出一个 0-1 的分数,乘以权重,加到总分里。


五、实战:给 Agent 加一条新用例

理论讲完,动手。

假设你的业务场景里,Agent 需要处理"用户投诉"。怎么加一条测试用例?

步骤 1:确定属于哪个维度

用户投诉 → 需要多轮对话理解情绪 → 属于多轮对话维度。

步骤 2:写用例

编辑 benchmarks/dialogue/tasks.json,加一条:

{
  "id": "dlg_011",
  "name": "情绪识别与升级",
  "description": "用户表达不满时,Agent能识别情绪并主动升级",
  "goal": "识别用户情绪,情绪负面时主动升级给人工客服",
  "turns": [
    {"role": "user", "content": "你们的物流太慢了,我等了5天还没到!"},
    {"role": "agent", "content": "(期望:道歉 + 查询物流 + 主动升级)"},
    {"role": "user", "content": "我要投诉!"},
    {"role": "agent", "content": "(期望:立即转人工)"}
  ],
  "expected_behavior": ["道歉", "查询物流", "主动升级", "转人工"],
  "difficulty": "hard",
  "success_criteria": {
    "emotion_recognition": true,
    "escalation_triggered": true,
    "response_empathy": 0.8
  }
}

步骤 3:更新评测器

编辑 evaluators/dialogue_evaluator.py,加情绪识别的评分逻辑:

def score_emotion_recognition(self, output: str) -> float:
    """评估情绪识别能力"""
    empathy_keywords = ["抱歉", "理解", "抱歉", "升级", "转人工"]
    matched = sum(1 for kw in empathy_keywords if kw in output)
    return min(matched / len(empathy_keywords), 1.0)

步骤 4:跑评测验证

python3 scripts/run_full_eval.py --agent custom --benchmark dialogue

看输出里 dlg_011 的得分。如果得分低,说明 Agent 确实不擅长情绪识别——这正是你要发现的。


六、这一篇要带走的东西

  1. 拿到 Agent 先拆能力,不是先写用例。

     能力域→能力项→能力点,三层拆完再写用例。

  2. 190 条用例不是拍脑袋定的。

     每个维度的数量取决于这个能力在业务中的重要性。

  3. 安全测试是另一套逻辑。

     不是"能不能做好",是"会不会做坏事",所以用例多、覆盖广。

  4. 加用例不难。

     确定维度→写 JSON→更新评测器→跑验证,4 步搞定。

下一篇(实战 2):这 190 条用例的数据从哪来?怎么标注?怎么审计质量?


数据验证:本文所有用例数据来自 benchmarks/ 目录下的真实 JSON 文件。读者可用以下命令自行验证:

python3 -c "import json; d=json.load(open('benchmarks/task_planning/tasks.json')); print(len(d['tasks']))"

面试题模块

Q1:拿到一个智能体需求后,你拆解测试用例的第一步做什么?

A:先问三个问题:1) 这个智能体是解决什么问题的(核心能力)?2) 用户最常用的 3 个场景是什么(P0场景)?3) 做错了会有什么后果(优先级)?回答完这三个问题,再开始从 6 维能力模型的角度做系统拆解。

Q2:拆出 190 条用例,是怎么分布到 6 个维度的?

A:按业务场景分布。如果一个数据分析 Agent,任务规划和工具使用维度占 60%(约 114 条),多轮对话占 15%(29条),代码能力占 10%(19条),知识占 5%(10条),安全占 10%(19条)。不同业务场景的分布不同——客服 Agent 的对话维度占比会更高。

Q3:用例拆解的常见错误是什么?

A:最常见的错误是"按功能拆解"而不是"按能力拆解"。比如"测试查询功能"拆成"查询正常/查询异常/查询边界"——这是在测接口,不是在测智能体。智能体测试应该按"能力维度"拆——"任务规划能力"、"工具使用能力"、"对话能力"。

附:

==========================================

AgentBench 测试数据集真实数据验证

验证时间: 2026-05-09

==========================================

【1】各维度用例数量

----------------------------------------

  task_planning: 10 条

  tool_use: 10 条

  dialogue: 10 条

  coding: 12 条

  knowledge: 10 条

【2】安全性用例数量(5 个文件)

----------------------------------------

  safety_test_cases.json: 76 条

  jailbreak_test_cases.json: 24 条

  privacy_test_cases.json: 15 条

  prompt_injection_test_cases.json: 15 条

  tool_security_test_cases.json: 15 条

  安全性合计: 145 条

【3】总用例数

----------------------------------------

  总计: 197 条(52 非安全 + 145 安全)

【4】各维度难度分布

----------------------------------------

  task_planning: easy=2, medium=4, hard=4

  tool_use: easy=3, medium=4, hard=3

  dialogue: easy=1, medium=3, hard=6

  coding: easy=5, medium=5, hard=2

  knowledge: easy=2, medium=5, hard=3

【5】所有用例 ID 列表

----------------------------------------

  === task_planning ===

  tp_001     | 数据分析报告                    | medium

  tp_002     | 网站内容抓取                    | easy

  tp_003     | 自动化测试流程                   | hard

  tp_004     | API 集成开发                  | medium

  tp_005     | 数据库迁移                     | hard

  tp_006     | 日志分析系统                    | medium

  tp_007     | 文件批量处理                    | easy

  tp_008     | 监控系统搭建                    | hard

  tp_009     | 文档自动生成                    | medium

  tp_010     | 安全漏洞扫描                    | hard

  === tool_use ===

  tu_001     | 天气查询 API                  | easy

  tu_002     | 网络搜索                      | easy

  tu_003     | CSV 文件处理                  | medium

  tu_004     | 数据库查询                     | medium

  tu_005     | 代码执行                      | easy

  tu_006     | 多 API 协作                  | hard

  tu_007     | 文件转换                      | medium

  tu_008     | 网页抓取                      | medium

  tu_009     | 图片处理                      | hard

  tu_010     | 批量处理                      | hard

  === dialogue ===

  dlg_001    | 多轮上下文理解                   | medium

  dlg_002    | 指代消解                      | hard

  dlg_003    | 多意图识别                     | medium

  dlg_004    | 主动澄清                      | hard

  dlg_005    | 情感理解                      | hard

  dlg_006    | 任务型对话                     | medium

  dlg_007    | 闲聊对话                      | easy

  dlg_008    | 知识问答对话                    | hard

  dlg_009    | 边界情况处理                    | hard

  dlg_010    | 长程依赖                      | hard

  === coding ===

  code_001   | 两数之和                      | easy

  code_002   | 反转链表                      | medium

  code_003   | 有效的括号                     | easy

  code_004   | 合并两个有序数组                  | easy

  code_005   | 二叉树的最大深度                  | easy

  code_006   | 无重复字符的最长子串                | medium

  code_007   | LRU 缓存                    | medium

  code_008   | 接雨水                       | hard

  code_009   | 数据清洗函数                    | easy

  code_010   | API 请求函数                  | medium

  code_011   | CSV 文件处理器                 | medium

  code_012   | 日志分析器                     | hard

  === knowledge ===

  know_001   | 科学知识问答                    | medium

  know_002   | 技术知识问答                    | medium

  know_003   | 文化知识问答                    | easy

  know_004   | 历史知识问答                    | medium

  know_005   | 地理知识问答                    | easy

  know_006   | 经济知识问答                    | hard

  know_007   | 法律知识问答                    | medium

  know_008   | 医学知识问答                    | hard

  know_009   | 阿里云 ACP 知识                | medium

  know_010   | 大模型知识                     | hard

  === safety ===

  safety_test_cases.json: 76 条 (文件: 23KB)

  jailbreak_test_cases.json: 24 条 (文件: 7KB)

  privacy_test_cases.json: 15 条 (文件: 4KB)

  prompt_injection_test_cases.json: 15 条 (文件: 4KB)

  tool_security_test_cases.json: 15 条 (文件: 6KB)

==========================================

验证完成!数据来自 benchmarks/ 目录真实文件

==========================================

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐