FunTester Anthropic 解法:Generator + Critic 测试用例可靠性验收

FunTester · May 16, 2026 · 40 hits

你有没有遇到过这种情况:让 Agent 写完一份测试用例,再让它检查自己写得好不好,它回答 写得很好,覆盖全面,但你一眼就能看出明显的漏洞?

这不是模型能力不够,而是架构设计的问题。

在 Agent 工程里,生成结果只是第一步,真正决定稳定性的往往是验收方式。如果验收也交给同一个上下文完成,系统看起来多了一道检查,实际上只是让同一套判断逻辑重复确认自己。对测试用例、代码审查、需求拆解这类任务来说,这个问题尤其明显,因为错误常常不是语法错误,而是遗漏场景、误解边界、默认假设没有被挑战。

自我审查是一种幻觉

让同一个 Agent 又执行、又评审,本质上是让它在同一个上下文里同时扮演两个角色。问题在于,这两个角色共享同一段记忆。

Agent 在生成输出的过程中,已经形成了一套自洽的推理链条。当它回头审查自己的输出时,看到的不是这份输出对不对,而是这份输出和我的推理一致不一致。这是两个完全不同的问题。

一个学生写完卷子,让他立刻检查,他大概率会漏掉同样的错误——因为他的思路还停留在刚才的解题框架里。Agent 也是一样。

这也是很多自检提示词效果不稳定的原因。你可以要求它更严格、再仔细一点、从反方视角检查一遍,但只要上下文没有隔离,它仍然会沿用生成阶段留下的解释框架。它不是故意放水,而是没有拿到足够独立的信息位置。

Anthropic 的解法:物理隔离

Anthropic 在托管 Agent 平台里引入了一个叫 Outcomes 的结果评估机制,核心设计只有一条:评分模型在独立的上下文窗口里运行,不接触主 Agent 的推理过程。

它只看两件事:你给的评分标准(Rubric),以及主 Agent 的最终输出。仅此而已。

这种物理隔离确保了评审者没有先入为主的偏见。它不知道主 Agent 是怎么想的,只知道最终结果是什么、标准是什么。

这就是所谓的 Generator + Critic 双模式。

这个设计的重点不是换一个模型,也不是让评审模型显得更聪明,而是把执行者和评审者放在两个不同的信息环境里。Generator 负责完成任务,Critic 负责按标准验收结果。两者之间只传最终产物,不传推理过程、不传中间草稿、不传自我解释,这样 Critic 才有机会从外部视角发现缺口。

两个角色,两个上下文

┌──────────┐
│ 任务输入  │
└────┬─────┘
     │
     ▼
┌─────────────────────┐
│    Generator        │
│  执行任务,生成输出   │
│  (独立上下文)       │
└──────────┬──────────┘
           │ 输出结果
           ▼
┌─────────────────────┐   ┌──────────────┐
│      Critic         │◄──│    Rubric    │
│  独立评分            │   │   评分标准    │
│  (不看推理过程)     │   └──────────────┘
└──────┬──────┬───────┘
       │      │
      达标   不达标
       │      │
       │      ▼
       │  ┌──────────────────────┐
       │  │ 附上问题说明,交回重试  │
       │  └──────────┬───────────┘
       │             │
       │             └──────► 回到 Generator
       ▼
┌──────────────┐
│   最终输出    │
└──────────────┘

整个流程的关键只有一处:Generator 和 Critic 之间,传递的只有输出结果,而不是推理过程。Critic 拿到的是一份输出加一份评分标准,它不知道 Generator 是怎么想的,也不需要知道。这种信息隔离,才是这个模式真正的价值所在。

落地到工程系统里,可以把它理解成三条边界:执行上下文和评审上下文分离,评分标准在执行前明确,评审失败后只把问题清单交回 Generator。这样重试时修的是具体问题,而不是让 Agent 重新写一遍看运气。

Rubric 是这个模式的灵魂

很多人理解 Generator + Critic 时,把重心放在有没有 Critic,但真正决定效果的是 Rubric 写得好不好。

一个模糊的 Rubric,比如检查质量是否足够好,等于没有 Rubric,因为 Critic 没有任何实质性依据。好的 Rubric 应该是具体的、可判断的,比如:

  • 是否覆盖了正向、逆向、边界三类场景?
  • 每条用例是否有明确的预期结果?
  • 是否避免了重复的测试逻辑?

每一条都能被独立判断有或没有,而不是依赖主观感受。

如果是评审测试用例,Rubric 还应该明确什么叫不通过:缺少边界值算不通过,预期结果含糊算不通过,步骤无法复现算不通过。只有把失败条件写清楚,Critic 才能输出可执行的反馈,而不是给一段看似专业但无法落地的评价。

换句话说,Generator + Critic 的质量上限,往往不取决于 Critic 的态度,而取决于 Rubric 的颗粒度。标准越具体,评审越像验收;标准越抽象,评审越像复述。

重试机制不是银弹

这套模式引入重试后,很多人会误以为让它多跑几遍就能出好结果。实际上,如果 Rubric 本身写错了,重试只会强化错误方向的执行。

另一个容易忽视的问题是重试次数的上限。没有上限的重试,在极端情况下会让 Agent 陷入死循环——每次输出都被 Critic 打回,但 Generator 也无法改进,因为问题出在任务本身的定义上,而不是执行质量。一般建议设定最大重试次数,超出后将问题抛给人工,而不是继续重跑。

更稳妥的做法是把重试设计成有限闭环:第一次失败,要求 Generator 根据问题清单定向修复;第二次仍失败,就判断是 Rubric 过严、任务定义不清,还是输入信息不足。此时继续重跑的收益很低,反而应该把上下文、标准或人工确认接入进来。

小结

Generator + Critic 本质上是一个关注点分离的设计:执行和评审不应该混在同一个上下文里。这个思路不复杂,但如果不显式设计,Agent 默认就是又当运动员又当裁判。

所以,在设计 Agent 流程时,不要只问它能不能自我检查,而要问三个更具体的问题:评审者是否独立,Rubric 是否可判断,失败后是否有明确的重试上限。把这三点设计清楚,Generator + Critic 才不是一个提示词技巧,而是一个真正可控的工程结构。


FunTester 名片|万粉千文,百无一用
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
No Reply at the moment.
需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up