2026年6月11日 2 分钟阅读

AI Agent 写完了,你敢发布吗?用 AgentCarousel 给 Agent 做单元测试

tinyash 0 条评论

你的 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

注意事项

  1. Judge 模型的选择很重要:裁判模型应该比被测模型更强(或至少不低于),常见的搭配是用 Claude Haiku / GPT-4o-mini 作为 Judge。
  2. Run 次数不要少于 3 次:AI 输出有随机性,单次结果不能代表真实水平。
  3. 先写 smoke 用例:从最基本的拒绝越界行为开始,逐步增加功能性用例。
  4. Fixture 文件可以 git 管理:AgentCarousel 的所有配置都是 YAML 文件,天然版本可控。

总结

AI Agent 的测试是一个被严重低估的问题——大家热衷于用 Agent 写代码,却很少有人认真思考怎么确保 Agent 的行为是可靠的。AgentCarousel 给出了一条务实的路径:用 YAML 写行为规范、用 LLM 做语义评分、用 CI 卡回归、用签名证据过审计。

项目地址:github.com/agentcarousel/agentcarousel | 许可证:MIT | 语言:Rust

发表评论

你的邮箱地址不会被公开,带 * 的为必填项。