系列:AI Agent 工程实践
上一篇:第 29 篇《成本控制》
下一篇:第 31 篇《Agent 如何部署》
一、开场:改提示词改崩了别的场景
一个团队优化了退款话术的提示词,效果很好。一周后客服反馈:退款场景好了,但"查物流"场景的回答变啰嗦了,因为没人测过提示词改动对其他场景的影响。没有测试,优化就是拆东墙补西墙。
上篇(29)讲成本控制,这篇讲"改了不崩"的护栏——测试。
二、问题背景:不测 vs 系统测试
不测版:
# 改完手动聊两句,没问题就发 def test_agent(): pass # 没有系统测试版:
def test_refund_tool(): with mock_provider(reply_with_tool="refund"): out = run_agent("我要退款") assert "退款" in out # 行为可验证差别:不测 = 每次改动是赌博;系统测试 = 改动有护栏。
三、错误尝试:三种测试翻车
错误 1:只手动测 happy path
开发者自己聊两句就发。边界场景(乱码、长文本、注入)全靠用户撞。
错误 2:不测 LLM 输出
因为"LLM 输出不确定"就放弃测试,结果工具调用、流程分支这些确定部分也没测。
错误 3:不隔离外部依赖
测试真调 API,又慢又烧钱又不稳定(网络一抖就红)。
四、关键观察:Agent 要分四层测
- Unit Test:工具函数、格式转换等纯逻辑——确定性,必测。
- Tool Test:工具行为(权限、schema、副作用)——用 mock 外部。
- Prompt Test / Regression:提示词改动后,Golden Dataset 上的表现不退化。
- Mock LLM:用假模型固定返回,让"流程是否会调对工具"可被稳定验证。
LLM 输出不确定 ≠ 不能测。能测的是:工具是否被调用、流程是否走到正确分支、确定性逻辑是否正确。不确定的"生成质量"交给 Golden Dataset 做回归对比,而不是精确断言。
五、最终方案:测试分层
tests/ ├── unit/ # 工具函数、schema 校验(纯逻辑) ├── tool/ # 工具行为,mock 外部依赖 ├── prompt/ # 提示词回归,跑 Golden Dataset └── conftest.py # mock_provider 固定 LLM 返回Golden Dataset 示例(JSON):
[ {"input": "我要退款", "expect_tool": "refund", "expect_contains": "退款"}, {"input": "北京天气", "expect_tool": "get_weather", "expect_contains": "℃"} ]测试分层(Mermaid):
六、代码对比:无测试 vs 有 mock 测试
无测试(问题):
# 改了 prompt,靠手聊验证 def run_agent(inp): ...有 mock 测试(生产):
def test_refund_flow(): with mock_provider(tool_calls=[{"name": "refund"}]): out = run_agent("我要退款") assert "退款" in out # 验证行为 assert called("refund") # 验证调对工具关键差异:用mock_provider固定返回,测试"流程是否调对工具"稳定可重复;不真调 API,快且不烧钱。
七、设计权衡:测到什么程度
| 场景 | 建议 | 理由 |
|---|---|---|
| 工具/逻辑 | 必测 Unit + Tool | 确定性,价值高 |
| 提示词改动 | 必跑 Golden Dataset 回归 | 防退化 |
| 生成质量 | 用区间/规则断言,不精确匹配 | LLM 不确定 |
| 端到端 | 关键路径少量,不必全覆 | 成本高、易碎 |
反过度工程:不要为 LLM 生成内容写精确匹配断言——它天生不确定,硬测只会产生脆弱测试。
八、总结
- ✅ 无测试 = 改提示词改崩别场景,优化变拆东墙。
- ✅ 三种翻车:只手测 happy path、因不确定放弃测、不隔离外部依赖。
- ✅ 分四层:Unit / Tool / Prompt 回归 / Mock LLM。
- ✅ LLM 不确定 ≠ 不能测:工具调用、流程分支、确定性逻辑都可验。
- ✅ 反过度工程:生成内容用区间断言,不精确匹配。
下一篇,把这一切跑起来的最后一步——部署。(31)
参考资料(带用途说明)
- 本系列(29)成本控制:测试用 Mock LLM 不烧钱,呼应(29)成本意识。
- 本系列(24)Tool Registry:本文 Tool Test 直接复用(24)Registry 的
call接口做行为验证。 - 本系列(18)Agent 如何做 Benchmark:Benchmark 是质量的系统性评测,本文回归测试是其工程落地。
- pytest 文档(docs.pytest.org):本文测试框架的实现参考。
本文是 AI Agent 工程实践系列的第 30 篇(第四阶段第十篇)。
系列导航
上一篇:第 29 篇《成本控制》
下一篇:第 31 篇《Agent 如何部署》