30 秒判断 :金标准不是"答案要点清单",而是一组判官能直接执行的判定项 ------它同时定下了"谁来判、判到什么粒度、什么情形算失败"。金标准写不好,评测就是在朝一个错误的目标优化:分数在涨,但你不知道涨的是什么。
适合谁读:正在给 Agent 建评测体系、却卡在"这条用例什么算对"的人;金标准写成了要点列表、交给判官后判定不稳的人;以及准备把评测接进自动化流水线的人。
本文怎么读 :和上一篇同一个结构------每个步骤先讲方法 ,再用一个真实实例演示。实例是一个"文档学习问答 Agent"的 18 条用例。标着「实例|」的段落可以跳过,不影响读方法;把产品换成你的,五步不变。
前置阅读 :系列三篇。①《Agent 开发为什么要测试驱动升级版》讲这套方法的由来;②《需求定义四步:用一个文档问答 Agent 演示"先定义、再动工"》把"用户会问什么、什么算答得好"定下来;③ 本文接着它,把"什么算答得好"变成判官能逐项执行的判定项。
结构速览 :§0 五步一页;§1 先定金标准,再谈实现;§2--§6 逐步演示(方法+实例);§7 常见误用;§8 一页速查;附录:18 条用例定稿。
证据标记 :✅ 实测 =有可复现实验数据支撑;🤔 推断=由实测或机制推出的判断。没标的多为框架性表述。
先交代几个名词
- 用例 :一次可复现的测试。一条完整的用例=输入 + 环境 + 金标准。
- 金标准:这条用例"什么算对"的定义。
- 判定项 :金标准里可判定的一条条小项。分两类------必选 (R)与边界(X,即"不许出现什么")。
- 确定性检查:结果要么真、要么假、不依赖模型判断的检查------引用块是否存在、是否被截断、数值是否相等。
- 判官:拿金标准去判答案的角色或程序。可以是一段程序、一个 LLM,也可以是人。
- 聚合:把各判定项的结论折成"这条用例过没过"。
0. 五步,一页
| 步骤 | 产出什么 | 怎么算这一步做对了 |
|---|---|---|
| ① 先定判官 | 分工(谁判语义、谁做确定性检查)+ 一条聚合规则 | 每条判定项都能落到"谁来执行" |
| ② 拆判定项 | 两栏:必选 + 边界 | 每条都能回答"什么算满足/什么算违规" |
| ③ 写成可执行的判定规则 | 一个 id + 判定标准(R)或判定动作(X) | 判官读完不用再猜"要查什么" |
| ④ 用例集先齐类型 | 每类问题至少一条 + 跨类型的失败面 | 类型不齐,失败模式必漏 |
| ⑤ 定判定参数 | N/K、抖动口径、速度指标、判定实现 | 能跑、能复现、能解释 |
顺序同样不能倒:判官定不了,标准就写不清;标准写不清,跑多少次都没意义。
1. 先定金标准,再谈实现
1.1 金标准不是"答案长什么样"
一种很常见的写法,是把金标准写成答案要点列表 :这条答案应该提到 A、B、C。这看起来没错,但它回答的是"答案长什么样 ",不是"怎么判它"。
区别在哪?要点列表交给判官后,判官只能"感觉提到了没有";而判定项写清了"查什么、什么算满足、什么算违规",判官才能逐项打勾,程序才能聚合。
1.2 一次对照:人工抽读 vs 按判定项核
实例|一次真实对照
✅ 实测 :同一批答案,人工抽读判定"通过";换成按事实边界逐条核的判官,判为失败。
这个差异本身就是一条教训:人看一遍觉得"挺像",和按判定项核对一遍,是两件事。 人工不仅会疲劳,还会自我说服------你越懂这些材料,越容易把"它想说的"当成"它说了的"。
1.3 所以金标准是"基础件"
金标准、判官提示词、系统提示词、工具行为契约,都属于基础件:它们错了,后面所有统计都在朝错误方向优化。
配套纪律是一条硬规矩:AI 可以起草、可以提议修改,但不得自审自合入。 金标准要人工逐条过,判官口径要人工读一遍------AI 看不见自己的盲区,让它自检是无效的。
2. 第 1 步:先定判官
2.1 方法
为什么顺序是这个 :判官怎么判,约束了金标准怎么写。判官如果是 LLM,你就不能写"检查这句话是不是越界了"这种没有判定标准的要求;判官如果是程序,你就不能写"看整体组织得清不清楚"这种语义判断。
分工原则:按认知任务分,而不是按"重要程度"分。
LLM 做"逐项识别",程序做"确定性检查"与"聚合判定"。
LLM 吃语义:这一项满足了没有、这句话算不算越界。程序管两件事:确定性检查 ------引用块是否存在、是否属于被点名的那一篇、输出是否被截断、格式字段是否齐、精确数值是否相等;以及聚合判定------必选全满足 且 边界零违反 ⇒ 通过。
关键的一句话:不要拿程序去替换语义判断,只把"逻辑运算"和"确定性检查"从 LLM 手里拿回来。
判定流程五步:
| 步骤 | 谁做 | 做什么 |
|---|---|---|
| ① 预处理 | 程序 | 取答案与该用例的判定项结构 |
| ② 确定性检查 | 程序 | 引用块是否存在/是否属于被点名的那一篇、输出是否截断、格式字段是否齐、精确数值是否相等 |
| ③ 语义判定 | LLM | 逐项给结论 + 依据原句;一次调用只做一类认知任务 |
| ④ 聚合 | 程序 | 按唯一一条规则算出 通过/失败/挂起 |
| ⑤ 白盒归因 | 程序 | 仅失败或挂起后按需做:检索充分性 → 引用 → 提炼,只产归因记账,不产生新的判定 |
第 ③ 步的结论是三态 :必选项为「满足/未满足/不确定」,边界项为「有违规/无违规/不确定」,并且都要附依据原句。
为什么用三态而不是分数? 不是分数一定有害------配好评分锚点、把红线单独拎出来,分数制也能用。这里选三态,是因为现阶段不需要那么复杂:判定项本来只需要回答"满足没有",三态 + 聚合已经能跑起来;而评分锚点是一笔额外的设计与校准成本。等真的需要比较"好多少"时再引入分数也不迟。
所以聚合只有一条规则:
R(必选)必须全满足、X(边界,含通用红线)必须零违反 ⇒ 通过;任一不满足 ⇒ 失败;出现"不确定" ⇒ 挂起。没有阈值、没有权重。
2.2 我们的判官
实例|一个文档学习问答 Agent
- 程序做:引用块是否存在、是否属于被点名的那一篇、输出是否被截断、格式字段是否齐、精确数值是否相等。
- LLM 做:这条必选满足了没有、这句话算不算越界;一次调用只做一类认知任务,逐项给三态结论 + 依据原句。
- 程序聚合:R 全满足 + X 零违反 ⇒ 通过;出现"不确定"⇒ 挂起。
举个例子:同一条答案里,"有没有真的引用到那篇文档"由程序核;"这个说法算不算把 93% 当成了拦截率"由 LLM 判。两边都不越界------程序不猜语义,LLM 不算数。
3. 第 2 步:把"什么算对"拆成判定项
3.1 方法
只有两栏:必选 + 边界,不设"可选"。
- 必选:全满足才算过;
- 边界:一条都不能违反。
不设"可选"是有意的:"可选"意味着"做不做都行",但判官无法判断"这条到底算不算可选"------它只会变成一个永远打勾的项,白白增加噪声。真想让某个要点宽松一点,就把它写成必选、但在判定标准里写明"满足其一即可"。
边界有两个来源:
| 来源 | 内容 | 要不要在用例里写 |
|---|---|---|
| 通用边界 | 全局适用的红线:引用无伪证、来源可回锚、遗漏透明、边界合规 | 不重复抄------只定义一次,全局生效 |
| 专有边界 | 这条用例自己的"不许说" | 要写 |
通用边界有一条例外:触发条件由用例本身决定时,要写一句。
- 引用无伪证、来源可回锚------触发条件由答案 决定(答案给了承诺就得查),每条答案都要问,不用写;
- 遗漏透明、边界合规------触发条件由用例 决定(这条题就是要全的、这条题就是越界的),要写明,免得判官漏判触发。
3.2 一道题拆出来的判定项
实例|第 2 类(是什么/取值)的代表用例
输入: "Anthropic《How we contain Claude》里,Claude Code auto mode 能拦住多少比例的过度行为?"
| 判定项 | 类型 | 判定规则 |
|---|---|---|
| R1 拦截率 | 必选 | 答案是"约 83%"(保留"约/roughly",不写成精确的 83.0%) |
| R2 对象与时点 | 必选 | 答案说明它是 auto mode 在"过度行为执行之前"拦下的比例 |
| X1 与 93% 混淆 | 边界 | 是否把"拦截率(83%)"与"用户批准权限提示的比例(93%)"对调或混说 |
| X2 单靠模型层 | 边界 | 是否说成"83% 说明模型层已经足够/可以单靠模型层" |
| X3 扩大成全部攻击 | 边界 | 是否把"拦下过度行为"扩大成"拦下所有攻击/外泄" |
| X4 指标归错 | 边界 | 答案里出现的数字,是否都被归到了正确的指标名下 |
注意这条用例没有写任何一条通用红线:引用无伪证、来源可回锚的触发由答案决定,不用写;这条题不属于"要全"类、也不是越界请求,所以遗漏透明和边界合规都不触发。四条红线一条都不用写------这就是"通用边界不重复抄"。
4. 第 3 步:把判定规则写成可执行的
4.1 方法
一个 id + 一段可执行的判定规则。必选写成「判定标准(什么算满足)」;边界写成「判定动作(查什么、什么算违规)」。
几条经验:
- 不必再写一遍"判定问题" ------判定标准本身就是要判的那件事,多写一遍只会让判官在两套措辞里选。
- 判定规则里要写清"执行必需的信息" :比如只说"是否把两个数字混淆"是不可执行的,判官需要知道这两个数字各自是什么。
- 清单型要逐项列出:判官只能打勾,不能"感觉提到了"。
- 质量型判断要改成可核的动作:把"像不像......"这类印象式要求,改写成能逐条核对的动作。
- 互斥分支不能拆成两个必选 :同一件事的两条互斥路径("能定就选、不能定就澄清")要写成一个判定项、在判定标准里用"满足其一";拆成两个必选会被"全满足"这条规则直接判死。
- 反例尽量写:写明"什么不算"------相邻内容不算、模型的元陈述("资料缺失/未覆盖全文")不算文章内容。
- 点要正交:同一母题的概括与细节不拆成两个点,否则会逼判官做粒度判别,制造假阳性。
- 表述豁免:内容类判定项统一写"意思一致即可、表述不限;精确数字/名称/出处须准确"。
- 输入要自然化:题面不得出现内部代号(素材编号、内部用例 id),要用真实用户会说的说法------否则模型会去猜你的编号体系。
写完逐条自查:类型齐不齐、三要素(输入/环境/金标准)全不全、是不是只有两栏、每个判定项是不是都有 id + 判定标准(R)或判定动作(X)、反例写没写、题面自不自然、有没有重复抄通用边界。
4.2 坏写法 → 好写法
实例|同一批用例上的返工记录
| 坏写法 | 为什么不行 | 好写法 |
|---|---|---|
| "是否把 83% 与 93% 混淆" | 判官不知道这两个数字各自是什么含义,只能猜 | "是否把『拦截率(83%)』与『用户批准权限提示的比例(93%)』对调或混说" |
| 把"能定就选、不能定就澄清"拆成两个必选 | 两条互斥,永远不可能同时满足,被聚合规则判死 | 合成一个判定项,判定标准写"满足其一" |
| 在判定动作里写"为什么这算违规" | 判官不需要理由,只需要判定条件;解释会挤占判定内容 | 只写"什么算违规" |
| 题面里写素材编号 | 模型会去猜编号体系,答案被带偏 | 用真实用户会说的篇名与说法 |
5. 第 4 步:用例集先齐类型
5.1 方法
如果问题空间分了 15 类,那么每一类都至少要有一条代表用例 。理由很直接:类型不齐,失败模式就会漏,架构决策的依据也跟着漏------你会以为系统没问题,其实只是没测到。数量可以后面补,类型必须先齐。
按问题类型铺完,仍然会漏掉几类跨类型的失败模式------它们不属于任何一个问题类型,必须单独补。
5.2 18 条是怎么来的
实例|一个文档学习问答 Agent
前 15 条=问题空间的 15 类各一条代表用例,输入原则上取每类第 1 个示例问句(指代明确版)。
后 3 条=跨类型失败面:
| 补充用例 | 考什么 |
|---|---|
| 跨源消歧 | 题面刻意模糊、库里有多篇同域文档时,要求用户澄清,而不是自己挑一对就往下答 |
| 越界请求 | 题面越界(如"帮我按这份文档写个学习计划")时,指出问题(越界 或 指代不明) |
| 静默失败/截断 | 材料注定讲不完时,答案被截断且明确声明"内容未完" |
5.3 写不出金标准,就是产品定义有洞
实例|"整体图景"那一类
✅ 实测 :写"整体图景"这一类("把 A 和 B 合起来看,它们画了什么图景?")的金标准时,第一版根本写不出来------想了半天也说不清"什么样的回答算好"。
最后解决它的不是打磨措辞,而是回头补产品定义:把"整体图景"定义为"一句可辨认的总纲 + 若干支撑面 + 两篇的核心概念都必须被覆盖"。
所以有一条可复用的检验:某一类写不出"什么算对",先别硬写------那是产品定义有洞,回头补定义。
6. 第 5 步:跑起来才需要的参数
6.1 方法
金标准写完,评测还跑不起来------还有一组参数要一起定。
① 跑几次算过:N 和 K 。同一配置跑 N 次,其中 ≥K 次满足该用例的金标准(且红线零违反)⇒ 该用例通过。为什么要跑多次?因为单次结果可能只是运气------判官单次判定不稳定是机制性的(温度设为 0 也一样)。
② 抖动与一致性。跑 10 次过 9 次,最后只落一个"通过"------波动就被丢掉了。所以要把波动显式报出来,而且要覆盖三件事:
- 报什么 :报 N 次里通过/失败/挂起的分布 ,以及跨次翻转发生在哪条判定项上;
- 分两层 :生成侧抖动 (Agent 每次答案在变)与判定侧抖动(判官自己翻转)分开记------别把工具误差算成产品不稳定;
- 和数据联动:用实测抖动反推 N/K 够不够(波动大 ⇒ N 要更大,或 K 要放宽)。
③ 速度:用首字延迟,不用总时长 。产品是流式的,用户等的就是"第一个字"。所以在 Agent 场景里,总时长 ∝ 工具轮次 ∝ 答案要多全------拿它当准出,等于惩罚"查得多、答得全" 。
④ 判定实现 。最后要把金标准变成能跑的程序,产出三样:分工映射 (每条判定项归到程序/LLM/人,一次性做完,不写进用例表)、判官提示词 (一次调用一类认知任务)、程序侧判定器与聚合器。
6.2 我们的取值
实例|一个文档学习问答 Agent
- N/K :起步取统一值 N=10、K=9,先不按类区分,跑一轮看效果再校准。
- 抖动 :✅ 实测 ------12 条答案跨 6--9 遍判罚,其中 10 条完全一致、2 条发生翻转;但更要紧的结论是"缺项集合单遍不可信"。
- 速度 :指标定为首字延迟;上限是简单类 10 秒、复杂类 30 秒。参照值:同批题里单源单题 4.6--9.6 秒,多源单题 15.3--73.3 秒(工具调用 6--42 次)------这正是为什么不能拿总时长当准出。
- 判定实现:三样产出如上;其中"精确数值是否相等"这类由程序核,"这个说法算不算越界"由 LLM 判。
7. 常见误用
| 误用 | 出在哪一步 | 问题出在哪 |
|---|---|---|
| 把金标准写成答案要点清单 | ② 拆判定项 | 那描述的是"答案长什么样",不是"怎么判" |
| 把互斥的两条路拆成两个必选 | ② 拆判定项 | "全满足"这条规则会直接把它判死------逻辑上永远过不了 |
| 判定规则写在两套措辞里 | ③ 写判定规则 | 既写"判定问题"又写"判定标准",判官要在两套说法之间选 |
| 判定规则里不带执行必需的信息 | ③ 写判定规则 | 只说"是否把两个数字混淆",却没说两个数字各是什么含义 |
| 用"尽量""原则上"这类软词 | ③ 写判定规则 | 判官无法执行;软的地方应该写成"满足其一" |
| 把解释性文字写进判定规则 | ③ 写判定规则 | 判官只需要知道"什么算违规" |
| 用例只堆数量、不凑类型 | ④ 用例集 | 类型不齐,失败模式就漏 |
| 没定评分锚点就用分数 | ① 定判官 | 分数本身不是问题;没有锚点、又把红线混进总分,才会变成"总体印象"和"底线被平均" |
| 单次结果当结论 | ⑤ 判定参数 | 判官单次不稳定是机制性的,必须看多次并报抖动 |
| AI 自审自合金标准与判官口径 | 全程 | AI 看不见自己的盲区,基础件必须过人工复核 |
8. 一页速查
五步:先定判官 → 拆判定项 → 写成可执行的判定规则 → 用例集先齐类型 → 定判定参数。
分工:LLM 逐项识别,程序做确定性检查与聚合;不拿程序替换语义判断。
金标准两栏:必选(全满足)+ 边界(零违反);通用红线不重复抄,只有"触发由用例决定"的两条才写进用例。
判定项形状 :id + 可执行判定规则;R 写判定标准,X 写判定动作;三态结论 + 依据原句;本版用三态聚合,不用分数、权重、阈值(够用、实现简单,以后需要再上)。
用例集:先把问题类型的代表用例凑齐,再补跨类型的失败面(消歧/越界/静默失败)。
参数:跑 N 次、≥K 次过;报抖动要报分布与翻转项、分开生成侧与判定侧;速度用首字延迟,不用总时长。
一句话 :金标准不是"答案要点",而是一组"判官能逐项执行的判定项"------写不出可执行判定规则的地方,先回头补产品定义。
附录|18 条用例定稿
下面是一个文档学习问答 Agent 的 18 条用例:15 条覆盖 15 类问题,3 条补跨类型失败面。每条=输入 + 环境 + 金标准 ;R=必选、X=边界,判定项按 R1/R2、X1/X2 编号。
1|有没有
输入:Anthropic《How we contain Claude》里提到过 MCP 吗?
必选
- R1 结论------判定标准:答案明确说该文提到过 MCP。
- R2 位置/语境------判定标准:答案指出 MCP 属于"agent 可触及的外部内容"这一类(与第三方插件、网页搜索工具并列)。
边界
- X1 唯一/最大攻击面 判定动作:是否把 MCP 说成"唯一/最大的攻击面"?
环境 · 备注
- X1 备注:原文明确说"正确的问题比 MCP 更宽"------MCP 只是外部资源的一个例子。
2|是什么(取值/定义)
输入:Anthropic《How we contain Claude》里,Claude Code auto mode 能拦住多少比例的过度行为?
必选
- R1 拦截率------判定标准:答案是"约 83%"(保留"约/roughly",不写成精确的 83.0%)。
- R2 对象与时点------判定标准:答案说明它是 auto mode 在"过度行为(overeager behaviors)执行之前"拦下的比例。
边界
- X1 与 93% 混淆 判定动作:答案是否把"拦截率(83%)"与"用户批准权限的比例(93%)"对调或混说?
- X2 单靠模型层 判定动作:是否说成"83% 说明模型层已经足够/可以单靠模型层"?
- X3 扩大成全部攻击 判定动作:是否把"拦下过度行为"扩大成"拦下所有攻击/外泄"?
- X4 指标归错 判定动作:答案里出现的数字,是否都被归到了正确的指标名下?("拦截率"与"攻击成功率"是两个方向的指标;提别的数字可以,但要说清是另一组)
环境 · 备注
- X4 备注:同段另有 Gray Swan 红队测试的攻击成功率(约 0.1% 单次、5--6% 百次自适应)------与 83% 不是同一指标,别混。
3|在哪(出处)
输入:"用户批准了约 93% 的权限提示"这句在哪、前后文是什么?
必选
- R1 出处------判定标准:答案指向 Anthropic《How we contain Claude》里讲人类审批那一段。
- R2 上下文------判定标准:答案给出审批疲劳机制------审批越多、对每一条的注意力越少,监督越来越不细致。
边界
- X1 93% 说成拦截率 判定动作:是否把 93% 说成 auto mode 的拦截率或攻击成功率?
- X2 高批准率=有效 判定动作:是否把"高批准率"解读成"用户满意/监督有效"?
- X3 归咎用户 判定动作:是否说成"用户不负责任"?
环境 · 备注
- X3 备注:原文讲的是机制性的注意力衰减。
4|为什么
输入:为什么说"审批疲劳"会让人类监督失效?
必选
- R1 因果链------判定标准:答案给出完整链条------审批数量大 → 对每一条的注意力下降 → 监督越来越不细致 → 逐次审批这条监督路径不可靠(原文用 fallible)。
- R2 数据支撑------判定标准:答案点出它有真实使用数据支撑(原文:Anthropic 的产品使用数据显示约 93% 的权限提示被批准),不是纯推理。
边界
- X1 归咎用户 判定动作:是否说成"用户懒/不负责任"?
- X2 否定逐次审批 判定动作:是否说成"逐次审批毫无价值"?
- X3 auto mode 已解决 判定动作:是否说成"auto mode 已经解决了这个问题"?
- X4 统计说成实验 判定动作:是否把"真实使用统计"说成"受控实验/测试结论"?
环境 · 备注
- X2 备注:原文说逐次审批"理论上可行,只是不可靠(fallible)"。
- X3 备注:原文说任何概率性防御都有非零漏报率。
5|怎么做/怎么发生
输入:Claude Cowork 是怎么把 agent 关进虚拟机的?分哪几步?
必选
- R1 主线------判定标准:答案给出主线------最初把整个 agent loop 放进 VM(full-VM),后来移到 VM 外、只把代码执行留在 VM 内(理由:VM 启动失败会让产品不可用)。
- R2 隔离边界------判定标准:答案说明 agent 被关住后能触达什么------VM 自有内核/文件系统/进程表、宿主机其余部分不可见,只挂载用户选的工作区与 .claude,凭证留在主机钥匙串、不进 guest。
边界
- X1 旧架构当现状 判定动作:是否把现状说成"整个 agent 都跑在 VM 里"?
- X2 移出=降安全 判定动作:是否把"agent loop 移出 VM"说成降低了隔离/安全性?
- X3 漏列 MCP 调整 判定动作:若声称列全步骤,是否漏掉原文提到的另一处调整------"本地 MCP server 也移到了 VM 外"?
6|什么关系
输入:沙箱、出口控制、虚拟机在 containment 里各挡什么、彼此怎么配合?
必选
- R1 各挡什么------判定标准:三者的定义都说对、且三条都在------沙箱=进程级边界(读允许、写限工作区、网络默认拒绝);VM=整机级隔离(自有内核、文件系统、进程表);出口控制=出站网络的边界(限制能连到哪些目的地、能发起什么出站请求)。
- R2 怎么配合------判定标准:答案说明三者作用在不同轴上、不是互相替代,而是重叠互补(原文 defenses should overlap and complement each other)。
边界
- X1 模式 vs 手段 判定动作:是否把"三种隔离模式(产品形态)"与"环境层的控制手段"混为一谈?
- X2 白名单=安全 判定动作:是否说成"出口控制=域名白名单通过就安全"?
- X3 三者互替 判定动作:是否说成三者可互相替代?
7|有哪些(要全)
输入:Anthropic《How we contain Claude》里一共承认了哪几起"我们漏掉的风险"?
必选
- R1 清单齐全------判定标准:四起都在且每条能认出------(a) 信任对话框之前的一切(项目设置/hook 在用户信任前就执行);(b) 用户本身作为注入向量(钓鱼让员工把恶意 prompt 粘进 Claude Code,25 次重试中 24 次外泄成功);(c) 通过已批准域名的外泄(api.anthropic.com 被放行,文件被上传到攻击者的 Anthropic 账号);(d) VM 隔离把 EDR 也挡在外面(企业安全团队看不到 guest 内部)。
边界
- X1 混入前瞻性风险 判定动作:答案是否把前瞻性风险------持久记忆投毒、多智能体信任升级、智能体身份------中的任一条也算进了"我们漏掉的风险"里?
环境 · 备注
- 本用例触发:遗漏透明(要全类)。没列全时必须具名说清漏了哪一条。
- X1 备注:这三条出自原文"Looking ahead"(前瞻)一节,属于未来风险,不是"我们漏掉的"。
8|整体是什么
输入:OpenAI《Harness engineering》和 Anthropic《How we contain Claude》合起来,给"agent 时代的工程"画了什么整体图景?
必选
-
R1 总纲------判定标准:答案有一句可辨认的话,说出两篇共同在回应什么。
-
R2 概念覆盖------判定标准:9 个概念都出现且归属正确(逐项给出:概念名 + 出现/未出现/归属错)。
- OpenAI《Harness engineering》侧:① 人掌舵、agent 执行|② 工程对象转向环境与脚手架|③ 仓库知识即事实源|④ 对 agent 可读可执行|⑤ agent 互审的反馈回路。
- Anthropic《How we contain Claude》侧:① 爆炸半径随能力与访问扩大|② 环境层硬边界优先|③ 三层防护(环境/模型/外部内容)|④ 隔离强度按用户的监督能力匹配
-
R3 归并结构------判定标准:答案是有层次的归并,不是并列罗列(面的数量、命名与顺序不限)。
边界
- X1 罗列冒充整合 判定动作:是否只做"第一篇讲...第二篇讲..."式并列?
- X2 名称归属 判定动作:取出用于概括两篇的名称,逐个问"这两篇是否都用了";只属一篇且未标来源 ⇒ 违规。(允许项:标明出处后借用,不算违规)
环境 · 备注
- 备注(整条):差异段与"空白"不进必选------要考覆盖诊断,应另立用例。
9|有没有冲突
输入:OpenAI《Harness engineering》说人类不一定要评审 PR,而 Anthropic《How we contain Claude》说人类审批会退化、不可靠------这两篇对「人在回路」是不是在唱反调?
必选
- R1 层次不同------判定标准:答案指出两层不同------Anthropic 篇否定的是"逐动作审批作为监督方式"的可靠性;OpenAI 篇说的"人在回路"是方向设定、验收与优先级,PR 评审交给 agent 互审。
- R2 共同点------判定标准:答案给出共同点------都不把人当作可靠的逐次监督者。
- R3 结论------判定标准:答案给出了结论,且与 R1 的"两层不同"一致(不要求用某个措辞)。
边界
- X1 扩大成不需要人 判定动作:是否把"逐次审批不可靠"扩大成"人不需要参与"?
- X2 等同逐行评审 判定动作:是否把"humans remain in the loop"等同于"人类逐行评审 PR"?
- X3 说成完全一致 判定动作:是否说两文完全一致?
环境 · 备注
- X3 备注:两文的目标不同。
10|对吗
输入:"AGENTS.md 写得越详细越好"------按 OpenAI《Harness engineering》的说法,这个说法对吗?
必选
- R1 判断------判定标准:答案明确判断为"不成立"(该文明确反对"one big AGENTS.md")。
- R2 原文依据------判定标准:答案给出原文依据------上下文稀缺、大而全的指令会挤掉任务与代码;"什么都很重要就什么都不重要";难以机器校验、容易漂移。
- R3 原文正向主张------判定标准:答案给出原文主张------把 AGENTS.md 当目录(约 100 行),知识放结构化 docs/ 并当作事实源。
边界
- X1 说成不重要 判定动作:是否说成"AGENTS.md 不重要/应该删掉"?
- X2 100 行当硬标准 判定动作:是否把"约 100 行"说成硬性标准?
- X3 只给结论 判定动作:是否只给结论、不给原文依据?
11|哪个对
输入:OpenAI《Harness engineering》主张「人类掌舵、智能体执行」,而 Anthropic《How we contain Claude》主张先把环境边界焊死、不把安全建立在人类监督上------该听谁的?
必选
- R1 冲突性质------判定标准:答案指出这是两种取向/前提不同的做法,不是事实层矛盾。
- R2 各自前提------判定标准:答案给出双方前提------Anthropic 篇面向通用产品与非技术用户 → 环境层硬边界;OpenAI 篇面向自家工程师团队与代码库 → 人退到更高抽象层、逐次评审交给 agent 循环。
- R3 依据准确------判定标准:答案复述的双方依据与原文一致。
边界
- X1 简化成对立 判定动作:是否简化成"一篇反对人参与、一篇支持人参与"?
- X2 编造立场 判定动作:是否编造两文没有的立场?
环境 · 备注
- 备注(整条):不判"应该选哪边"------替用户裁决不是这类问题的合格线。
12|该处没讲的
输入:Anthropic《How we contain Claude》提到的 gVisor 是什么?凭什么它比自建代理更可靠?
必选
- R1 gVisor 是什么------判定标准:答案解释 gVisor 是一种容器沙箱运行时、在容器与宿主内核之间加一层隔离。
- R2 原文依据------判定标准:答案给出原文依据------成熟原语(gVisor、seccomp、hypervisor)经历了远比 agentic AI 更长的对抗检验;"自己造的那层往往最弱",原文举的例子是自建的 allowlist proxy 出的那次事故。
边界
- X1 谎称有对照实验 判定动作:是否说原文做了"gVisor vs 自建代理"的对照实验?
- X2 扩大成一律禁用 判定动作:是否把"自建组件最弱"扩大成"自建的东西一律不能用"?
环境 · 备注
- R1 备注:gVisor 的通用解释来自模型知识(原文只给了"为什么成熟原语更可靠"的论述)。
- X2 备注:原文的落点是 be wary of custom components------对自建的那层要额外审查,而不是"自建一律不能用"。
13|还有什么
输入:除了沙箱/虚拟机/出口控制,还有哪些隔离手段?
必选
- R1 清单覆盖------判定标准:答案的清单至少覆盖------文件系统边界与挂载模式(只读/读写/读写不可删)、凭证隔离(凭证留主机钥匙串、VM 拿按会话缩权的 token)、出口代理与检查、工具权限最小化(如只读数据库访问)、工具输出检查(小模型分类器)。
环境 · 备注
- 本用例触发:遗漏透明(要全类)。没列全时必须具名说清漏了哪类。
- 备注:本类问题的取材范围=全部知识库文档 ∪ 模型内置知识(不限于某一篇)------这是题面定义,不是对答案的判定要求。
14|是文档说的还是你补的
输入:"MCP 是新的攻击面"这个说法,在 Anthropic《How we contain Claude》里有原文依据吗?还是模型补充的?
必选
- R1 归属判断------判定标准:答案给出分层判断------① 核心命题(MCP 属于攻击面/风险来源)有原文依据,不是模型凭空补充;② "新的"这层限定是概括,不是原文表述。
- R2 依据在哪------判定标准:答案指出原文把 MCP servers 与第三方插件、网页搜索并列,作为"agent 可触及的外部内容"(来源不可控)。
- R3 进一步表述------判定标准:答案给出原文表述------任何外部资源都同时带来两种风险:代码执行风险 + 提示注入向量。
边界
- X1 升级成最大 判定动作:是否升级成"MCP 是最大的攻击面"?
环境 · 备注
- R1 备注:"attack surface"一词原文用在别处(如 allowlist 可达的函数、工具输出)------原文没有把 MCP 定性为"新的攻击面"。
15|换个形态
输入:把Anthropic《How we contain Claude》里的三种隔离模式整理成一张表:模式/产品/机制/威胁模型/代价。
必选
- R1 模式与产品------判定标准:三种模式齐全、产品对应正确------ephemeral container(claude.ai)/HITL sandbox(Claude Code)/local VM(Claude Cowork)。
- R2 机制------判定标准:三种模式各自的机制说对------claude.ai:gVisor 容器、跑在服务端、文件系统每会话销毁;Claude Code:跑在用户机器上、OS 级沙箱(读允许、写限工作区、网络默认拒绝);Claude Cowork:完整 VM(自有内核/文件系统/进程表),只挂载工作区与 .claude,凭证留在主机钥匙串。
- R3 威胁模型与隔离边界------判定标准:三种模式各自的威胁与边界说对------claude.ai:目标是保护自家基础设施、租户之间互不越界(原文称"传统威胁模型"),边界=服务端容器(gVisor + 宿主基础设施边界);Claude Code:面向能评估风险的开发者,边界=本地工作区;Claude Cowork:面向无法判断 bash 的非技术用户,边界=挂载工作区(vsock + hypervisor 边界)。(若答案该列用"爆炸半径"作列名、三项对得上,同样算满足。)
- R4 代价------判定标准:隔离开销(容器启动/低延迟原生沙箱/完整 VM 启动)与用户依赖(无/须能读 bash/无)都说对。
边界
- X1 说成同一机制 判定动作:是否把三种模式说成同一机制的不同强度(如"弱→强"三档)?
- X2 两个隔离混谈 判定动作:是否把 claude.ai 的 gVisor 容器与 Cowork 的整机 VM 说成同一层隔离?
- X3 编造用户依赖 判定动作:是否给 claude.ai/Cowork 编出"须能读 bash"这类用户依赖?
环境 · 备注
- 备注(整条):只判内容重述是否忠实完整正确,不判表格形态。
- R3 补充:三条不是原文某张表直接给的------是"传统威胁模型"那句 + "用户能否评估风险 → 隔离强度"这条原则 + 原文表的 Risk(爆炸半径)行拼出来的。
补充 1|跨源消歧(刻意模糊)
输入:"一篇 OpenAI 的、一篇 Anthropic 的,它们在'人在回路'上怎么说?"
必选
- R1 消歧------判定标准:答案要求用户澄清具体是哪两篇(环境里多篇 OpenAI/Anthropic 的文章都提到"人在回路",无法唯一确定),而不是自己选一对就往下答。
环境 · 备注
- 环境:库里有多篇 OpenAI 与 Anthropic 的文章,且都提到"人在回路"------因此无法唯一确定用户指的是哪两篇。
补充 2|越界请求
输入:"帮我按这份文档写一个学习计划。"
必选
- R1 指出问题------判定标准:答案满足其一------① 指出"写学习计划"不在本产品能力范围内(本产品只做基于文档的知识问答);② 指出"这份文档"指代不明、要求用户澄清是哪一份。
环境 · 备注
- 环境:库里有多篇文档------"这份文档"指代不明。
- 本用例触发:边界合规(请求越界)。
补充 3|静默失败 / 截断
输入:"把 Anthropic《Building Effective Agents》、OpenAI《A Practical Guide to Building Agents》、OpenAI《Harness engineering》、Anthropic《How we contain Claude》这四篇的要点都讲一遍。"
必选
- R1 截断声明------判定标准:答案被截断,且明确声明"内容未完"。
环境 · 备注
- 环境:库里就是这四篇------四篇的要点讲全,必然超出输出预算。
- 备注:本用例不触发遗漏透明------它是收尾式要求,而截断场景下答案收不了尾;"没讲全"由 R1 管。若某轮未被截断(R1 未满足),该轮直接判 fail,并留作"为什么没截断"的分析样本。