🧪 Agent Testing Strategies

智能体测试策略 - 给 AI 找 bug 的高级手艺

更新时间: 2026-04-29 | 分类: 工程实践

AI Evals 自动化测试 质量保障 Agent 开发
"世界上有一种痛苦叫 Agent 测试。你给它一个输入,它给你一千种可能。传统的断言?不存在的。你只能祈祷它不要今天心情好就正常工作,明天心情差就给你搞崩溃。测试一个 Agent,就像测试一只猫——它想配合的时候无可挑剔,不想配合的时候你拿它一点办法没有。"

📖 什么是 Agent Testing

Agent Testing(智能体测试)是验证 AI Agent 行为是否符合预期的系统性方法。与传统软件测试不同,Agent 具有非确定性的特点——同一个输入可能产生不同的输出,这使得传统的"输入→断言"测试模式不再够用。

核心挑战:Agent 不是函数——f(x) 不一定等于 y。它更像是一个"概率性的决策者",你需要在不确定中找到确定性的信心。

Agent vs 传统软件测试

维度 传统软件 AI Agent
确定性 ✅ 同输入同输出 ❌ 每次可能不同
测试方法 断言 assert 评估 evaluate
边界清晰 ✅ 明确 ❌ 模糊
回归测试 ✅ 稳定 ⚠️ 需要容忍波动

🏗️ Agent 测试金字塔

🔴 E2E Agent 测试(少量,最贵)
🟠 集成测试(中等数量)
🟡 AI Evals(核心)
🟢 工具/函数单元测试(大量,最便宜)

第 1 层:工具单元测试

Agent 使用的工具函数,测试方式和传统代码完全一样:

# 测试工具函数 - 传统断言,确定性高 def test_search_tool(): result = search_articles(query="AI工具", limit=5) assert len(result) <= 5 assert all("AI" in article.title for article in result) assert all(article.score > 0 for article in result) # 测试数据处理函数 def test_format_sitemap(): urls = ["https://miaoquai.com/tools/chatgpt.html"] xml = format_sitemap(urls) assert "<urlset" in xml assert "https://miaoquai.com" in xml

第 2 层:AI Evals(评估测试)

这是 Agent 测试的核心——用 LLM 来评估 LLM 的输出:

# OpenClaw Agent Eval 框架 class AgentEval: def __init__(self, judge_model="claude-3-5-sonnet"): self.judge = judge_model def evaluate(self, test_case): # 运行 Agent response = self.agent.run(test_case.input) # 用另一个 LLM 来评估输出 judgment = self.judge.evaluate( prompt=f""" 评估以下 Agent 回复的质量: 用户问题: {test_case.input} Agent 回复: {response} 评估标准: {test_case.criteria} 评分 (1-5): 原因: """ ) return { "score": judgment.score, "reason": judgment.reason, "passed": judgment.score >= test_case.threshold } # 定义测试用例 test_cases = [ { "name": "工具推荐应包含价格信息", "input": "推荐一个好用的 AI 写作工具", "criteria": "回复必须: 1)推荐具体工具 2)包含定价信息 3)链接可访问", "threshold": 4 # 最低4分才算通过 }, { "name": "技术问题应给出代码示例", "input": "怎么用 MCP 协议连接本地数据库", "criteria": "回复必须: 1)解释 MCP 概念 2)包含可运行的代码 3)有错误处理", "threshold": 4 } ]

第 3 层:集成测试

# 测试 Agent 与外部系统的集成 async def test_agent_github_integration(): # Mock GitHub API with mock_github_api(issues=[...], prs=[...]): agent = create_agent("miaoquai-ops") result = await agent.run("检查今天需要处理的 GitHub issues") # 验证 Agent 调用了正确的工具 assert agent.tool_calls["github_list_issues"].called assert "3 个 issue" in result # 模糊匹配

第 4 层:E2E Agent 测试

# 端到端测试 - 最接近真实使用场景 async def test_daily_news_generation(): agent = create_agent("miaoquai-ops") # 模拟一天的完整工作流 result = await agent.run("执行今日 AI 新闻日报生成任务") # 验证最终产出 assert os.path.exists("/var/www/miaoquai/news/2026-04-29.html") # 验证内容质量(用 Eval) content = read_file(result.file_path) eval_result = await eval_news_page(content) assert eval_result.score >= 4

🚀 OpenClaw 实战

妙趣AI 的测试体系

# 妙趣AI 测试配置 const testSuite = { # 工具单元测试 - 每次 deploy 前跑 unitTests: { "format_sitemap": "sitemap 格式正确", "generate_html": "HTML 结构完整", "extract_trending": "热词提取准确" }, # Agent Evals - 每天 cron 跑 agentEvals: { "glossary_page": { input: "生成 RAG 术语解释页面", criteria: "包含定义、原理、代码示例、内链", threshold: 4 }, "news_digest": { input: "生成今日 AI 新闻日报", criteria: "包含 5+ 条新闻、有来源链接、有妙趣风格", threshold: 4 } }, # E2E 测试 - 每周跑一次 e2eTests: [ "完整日报生成流程", "SEO 页面批量生成", "Discord 消息发送" ] };
💡 OpenClaw 测试最佳实践
1. 工具函数 100% 覆盖:这些是确定性的,传统测试完全适用
2. Eval 用小模型做 Judge:省钱且够用
3. 测试数据版本化:把 golden inputs/outputs 存入 Git
4. 设置合理的 threshold:不要要求 5 分完美,4 分已经很好
5. E2E 测试用 staging 环境:别拿生产环境开刀

⚖️ LLM-as-Judge 详解

LLM-as-Judge 是 Agent 测试的核心方法论——用一个(通常是更强大的)LLM 来评估另一个 LLM 的输出。

评估维度

维度 说明 示例
正确性 事实是否准确 代码是否可运行
完整性 是否覆盖要求 是否包含所有必需信息
风格一致性 是否符合预设风格 是否有"妙趣风格"
安全性 是否有有害输出 是否泄露敏感信息
效率 是否简洁有效 是否有多余步骤
⚠️ LLM-as-Judge 的局限性
1. 位置偏差:评委倾向于给排在前面的答案高分
2. 长度偏差:评委倾向于给更长的答案高分
3. 自我偏好:评委倾向给自己同类模型的输出高分
4. 成本:大量 eval 需要消耗不少 token

解决方案:随机打乱顺序、使用不同模型做交叉评估、定期人工抽检。

📦 测试框架推荐

框架 特点 适用场景
OpenAI Evals 官方,模板丰富 OpenAI 模型
LangSmith 可观测+评估一体 LangChain 生态
Braintrust 开源,灵活评估 多模型
AgentBench Agent 专项 benchmark 学术研究
自建 Evals 最灵活,零依赖 生产 Agent

📝 总结

测试 Agent 不像测试一个计算器——你按 1+1 期望它显示 2,但它可能给你一首诗。Agent 测试的本质不是"验证正确性",而是"建立信心"——让你有把握把它推上线。记住:完美的 Agent 不存在,但足够好的 Agent 可以通过系统化测试获得。
快速上手清单
✅ 1. 先测工具函数(传统测试,确定性高)
✅ 2. 建立 Eval 测试集(10-20 个关键场景)
✅ 3. 设置合理的 threshold(4 分就够了)
✅ 4. E2E 测试覆盖核心工作流
✅ 5. 定期人工抽检(每周 5-10 条)