系列: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 要分四层测

  1. Unit Test:工具函数、格式转换等纯逻辑——确定性,必测。
  2. Tool Test:工具行为(权限、schema、副作用)——用 mock 外部。
  3. Prompt Test / Regression:提示词改动后,Golden Dataset 上的表现不退化。
  4. 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 如何部署》

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐