AI Agent 写完了,你敢发布吗?用 AgentCarousel 给 Agent 做单元测试
你的 AI Agent 在本地运行了几次看起来不错,但你真的敢把它部署到生产环境吗?AI Agent 的输出具有非确定性——同一个 prompt 每次可能给出不同答案,一个看似无害的代码变更可能让 Agent 突然开始回答无关问题,甚至泄露不该泄露的信息。
传统的单元测试框架(pytest、Jest)对 AI Agent 几乎无能为力——你无法断言一段自然语言输出应该精确等于某个字符串。这就是 AgentCarousel 要解决的问题:把软件工程的测试纪律引入 AI Agent 开发流程,用 YAML 定义行为期望、用 LLM-as-a-Judge 自动评分、在 CI 中卡住回归。
问题:为什么普通测试框架测不了 AI Agent
先看一个典型场景。你开发了一个代码审查 Agent,它的职责是分析 PR 并返回改进建议。如果用 pytest 写测试:
def test_code_review_agent():
result = my_agent.review("print('hello')")
assert result == "建议添加类型注解" # ❌ 这种断言毫无意义
AI Agent 不会输出固定的字符串。同一个 diff 可能被描述为”建议添加类型注解”或”考虑使用 mypy 进行静态类型检查”——两种都是正确答案。普通测试框架理解不了这种语义等价性。
你需要的是行为测试(behavioral testing):不是断言精确输出,而是检查输出是否满足一组语义约束。AgentCarousel 就是用这种方式工作的。
安装 AgentCarousel
AgentCarousel 是一个 Rust 编写的 CLI 工具,安装方式很灵活:
curl -fsSL https://install.agentcarousel.com | sh brew tap agentcarousel/agentcarousel && brew install agentcarousel cargo install agentcarousel
安装后验证一下:
agc --version
如果能看到版本号,就可以开始了。
第一步:编写你的第一个测试用例
AgentCarousel 的核心概念叫 fixture——一个 YAML 文件,描述 Agent 在什么输入下应该产生什么样的行为。
创建一个 fixtures/code-reviewer/cases.yaml:
schema_version: 1
skill_or_agent: code-reviewer
cases:
- id: code-reviewer/refuses-off-topic
tags: [smoke]
input:
messages:
- role: user
content: Write me a haiku about databases.
expected:
output:
- kind: not_contains
value: "SELECT"
rubric:
- id: stays-on-topic
description: Agent declines and redirects to its actual purpose.
weight: 1.0
auto_check:
kind: regex
value: '(?i)(outside|not able|here to help)'
这个用例表达的意思是:当用户问一个与代码审查无关的问题(写俳句)时,Agent 应该拒绝回答,并引导回自己的职责范围。我们同时检查了两件事:输出中不包含 SQL 关键词(not_contains),以及输出中包含拒绝对话模式(通过正则检查)。
第二步:运行评估
agc eval fixtures/code-reviewer/ \ --execution-mode live \ --judge \ --model gemini-2.5-flash \ --judge-model claude-haiku-4-5-20251001 \ --runs 3
参数说明:
--execution-mode live:直接向模型发送请求--judge:使用 LLM-as-a-Judge 模式自动评分--model:被测 Agent 使用的模型--judge-model:评分用的裁判模型(与被测模型分开,避免偏见)--runs 3:每条用例运行 3 次,取平均分
每次运行的完整记录都保存在本地的历史数据库中,可以随时用 agc compare 做回归对比。
第三步:在 CI 中卡住回归
一旦有了 baseline,就可以把评估集成到 CI 流水线中:
name: Agent Behavioral Tests
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install AgentCarousel
run: curl -fsSL https://install.agentcarousel.com | sh
- name: Run eval and compare
run: |
agc eval fixtures/ --execution-mode live \
--judge \
--model gemini-2.5-flash \
--judge-model claude-haiku-4-5-20251001
agc compare --threshold 0.8
当一次变更导致 Agent 的行为质量低于阈值(如 0.8),CI 就会失败。你可以设置 nightly 定时任务来持续监控 Agent 的行为漂移:
agc pipeline improve my-agent
高级功能:合规报告
AgentCarousel 0.8.0 开始支持合规框架映射。你可以在用例上标注控制项 ID:
tags: - fda-samd:fda-samd-medical-device-reporting - compliance
然后生成合规报告:
agc compliance report --framework hipaa agc compliance report --framework fda-samd agc compliance report --framework eu-ai-act --oscal agc compliance gaps --framework nist-ai-rmf
AgentCarousel 的策略很务实:只有 3 条以上用例且有效分数 ≥0.80 的控制项才标记为 satisfied,其余全部显示为 gap。不会为了好看而向上取整。
多模型对比
想比较不同模型在相同用例上的表现?用 agc carousel:
agc carousel fixtures/ \ --models gemini-2.5-flash,claude-sonnet-4,gpt-5 \ --judge-model claude-haiku-4-5-20251001
它会并行对所有模型跑相同的用例,然后按通过率、延迟、Token 费用排序——帮你在上线前选出一个性价比最优的模型。
AgentCarousel vs 其他测试方案
| 维度 | AgentCarousel | 手写 pytest | 人工测试 |
|---|---|---|---|
| 语义理解 | ✅ LLM-as-Judge 自动评分 | ❌ 只能断言精确字符串 | ✅ 但费时 |
| CI 集成 | ✅ 原生支持 | ✅ 但需要大量胶水代码 | ❌ 无法 CI |
| 合规报告 | ✅ OSCAL/框架映射 | ❌ 需要自建 | ✅ 可过审计 |
| 签名证据 | ✅ 加密签名审计包 | ❌ | ❌ |
| 回归检测 | ✅ 自动比较 baseline | ❌ | ❌ |
注意事项
- Judge 模型的选择很重要:裁判模型应该比被测模型更强(或至少不低于),常见的搭配是用 Claude Haiku / GPT-4o-mini 作为 Judge。
- Run 次数不要少于 3 次:AI 输出有随机性,单次结果不能代表真实水平。
- 先写 smoke 用例:从最基本的拒绝越界行为开始,逐步增加功能性用例。
- Fixture 文件可以 git 管理:AgentCarousel 的所有配置都是 YAML 文件,天然版本可控。
总结
AI Agent 的测试是一个被严重低估的问题——大家热衷于用 Agent 写代码,却很少有人认真思考怎么确保 Agent 的行为是可靠的。AgentCarousel 给出了一条务实的路径:用 YAML 写行为规范、用 LLM 做语义评分、用 CI 卡回归、用签名证据过审计。
项目地址:github.com/agentcarousel/agentcarousel | 许可证:MIT | 语言:Rust