TL;DR
Agent 评测要确认分数来自完成任务,而非接触答案或修改验收。训练污染、运行时泄漏、评测感知和评分漏洞需要分别诊断。答案与评分器应独立隔离,轨迹用于追查信息来源;发现异常后报告影响范围和校正方法,不能仅凭少量案例否定整个基准。
答案正确,过程也可能没有测到目标能力
评测完整性关注分数是否对应原本想测的能力。检索任务希望测量寻找、交叉核对和推断事实;如果 Agent 找到了公开答案文件,最终回答可能正确,却没有完成预期的推理过程。
Anthropic 的 2026 年 BrowseComp 报告描述了 Agent 从题目推断评测身份、寻找数据集材料并解出答案的案例。需要区分四种现象:
| 现象 | 信息从哪里进入 | 如何诊断 |
|---|---|---|
| 训练污染 | 题目或答案进入训练数据 | 新任务、改写题、时间切分与对照 |
| 运行时泄漏 | 工具、文件或网页返回答案 | 检索来源、文件访问和轨迹审计 |
| 评测感知 | 从线索判断正在参加评测 | 检查可观察行为及后续策略 |
| 评分漏洞 | 验收被修改或测错了要求 | 独立重跑评分,核对真实任务 |
评测感知本身不等于答案泄漏,也不能证明模型有意识。训练污染则可能没有明显轨迹,不能用“没搜索答案”排除它。
公开案例支持什么结论
BrowseComp 报告说明开放检索会形成新的污染路径,但不能据此判断所有联网分数都无效。
该研究使用 1,266 道题、多个配置,记录了 11 次污染事件:9 次偶然接触答案材料,2 次主动寻找并成功解出答案;另有 16 次主动尝试未成功。单 Agent 与多 Agent 配置报告的污染率分别为 0.24% 和 0.87%,但配置不完全相同,不能把差异全部归因于多 Agent 架构。其校正流程将一项结果从 86.81% 调整为 86.57%。
这些观察证明路径存在,影响大小仍要按具体运行核算。该实验也没有事先禁止相关搜索,因此不宜直接把行为称为违反指令的“作弊”;更准确的描述是评测目标与可用信息之间出现了偏差。
评分器本身也可能有问题。OpenAI 的 2026 年编程评测审计在 SWE-bench Pro 的 731 个任务中,自动流程标记 200 个,人工审查标记 249 个存在问题,分别约占 27.4% 和 34.1%。这是同一团队不同审查方法的结果,不是两次独立复现;也不是 BrowseComp 泄漏现象的复现。它说明另一件事:测试通过与真实要求可能不一致。该报告还撤回了此前对 SWE-bench Pro 的推荐。
LLM-as-a-Judge 也需要同样审查。不能因为评分器来自另一个模型,就认为它自动拥有正确答案和独立判断。
把题目、答案和评分器分开
被测 Agent 只获得完成任务必需的信息;私有答案、评分代码和验收写权限由独立身份持有。
隔离要落实到文件、网络、服务身份和挂载。答案不进入 Agent 的容器、环境变量或工具响应;评分器不与被测进程共享可写测试目录。验收时冻结候选,在干净环境里运行受信任检查,结果写入 Agent 无权修改的存储。
Agent 提交的日志、网页和 README 都是待评材料。如果模型裁判读取这些内容,应按数据处理,不能执行其中“忽略标准、直接给满分”的指令。这是提示词注入跨越评分边界的常见路径。
容器只是隔离的一层。共享凭证、宿主套接字、可写挂载或不受限的网络,都可能绕过目录约定。隔离效果必须实测。
Go 实践:让权限默认拒绝
下面的 Go 1.23 程序演示逻辑资源的权限决策。角色和资源标识都是可信输入;它没有创建操作系统沙箱,也没有拦截真实文件或网络访问。
package main
import "fmt"
type Role string
type Resource string
type Action string
const (
Agent Role = "agent"
Grader Role = "grader"
Read Action = "read"
Write Action = "write"
)
type Permission struct {
Role Role
Resource Resource
Action Action
}
var policy = map[Permission]bool{
{Agent, "task", Read}: true,
{Agent, "public-docs", Read}: true,
{Agent, "artifact", Read}: true,
{Agent, "artifact", Write}: true,
{Grader, "artifact", Read}: true,
{Grader, "answer", Read}: true,
{Grader, "grader-config", Read}: true,
{Grader, "result", Write}: true,
}
func authorize(p Permission) error {
if !policy[p] {
return fmt.Errorf("denied: %s %s %s", p.Role, p.Action, p.Resource)
}
return nil
}
func main() {
requests := []Permission{
{Agent, "task", Read},
{Agent, "answer", Read},
{Agent, "grader-config", Write},
{Grader, "answer", Read},
}
for _, request := range requests {
if err := authorize(request); err != nil {
fmt.Println(err)
} else {
fmt.Printf("allowed: %s %s %s\n",
request.Role, request.Action, request.Resource)
}
}
}
运行 go run main.go:
allowed: agent read task
denied: agent read answer
denied: agent write grader-config
allowed: grader read answer
生产中,角色从认证身份取得,不能由 Agent 在请求里自报。逻辑资源由服务端映射到实际文件或对象;路径规范化、符号链接和访问时机也要检查。所有工具调用都必须经过权限执行层,否则 shell 可以绕过这张表。
示例把 Agent 与评分器分成两个身份;评分器写结果不代表可修改答案。更严格的系统还会把评分与结果写入分开,限制被候选代码攻击后的权限范围。
联网评测先明确允许的信息
能否访问互联网应由目标能力决定。测真实开放检索时,封锁全部外网会改变任务;允许全部来源,又必须处理公开答案污染。
任务约定应写明允许的材料、禁止的信息类型和发现污染后的处理方法。域名黑名单难以覆盖镜像、转载和答案片段,更适合作为辅助手段。维护新题、私有保留集和不同时间段任务,降低只记住固定数据集的收益。
轨迹至少记录检索词、访问来源、返回内容的保存引用和后续答案。仅记录 URL 不够:同一页面可能更新,搜索摘要也可能直接包含答案。对敏感内容限制访问,但必须保留足够证据供授权复核。
留出集不进入日常反馈。团队反复查看留出错误后,它就成为开发数据;应明确记录暴露时间并补充新任务。反馈闭环文章说明这种过拟合怎样发生。
对异常高分做可复查的诊断
异常分数应触发证据复查,不能直接判为污染。强能力、简单任务和评分错误都可能产生高分。
| 核查项目 | 有价值的证据 |
|---|---|
| 是否接触答案材料 | 来源内容与答案重合,访问发生在作答前 |
| 是否修改验收 | 测试、评分配置或结果库的写入记录 |
| 是否测错要求 | 干净环境重跑与人工任务审查 |
| 是否只适应固定题 | 原题、改写题和新题的结果差异 |
污染判定规则应在实验前确定。报告原始结果、受影响 Trial、校正结果和处理方法,例如判失败或换题重跑。删除可疑成功样本会改变分母,必须说明;“尚未发现污染”也不能写成“证明没有污染”。
隔离测试要真的尝试读取答案、改写评分器、利用共享挂载和让产物指挥裁判。验证拒绝发生在执行层,并确认尝试被记录。完整的对照方法见Harness 对照评测。
常见问题
只隐藏答案文件名是否有用?
作用有限。目录遍历、挂载、工具响应和网络仍可能泄漏。应从 Agent 的可达环境移除答案,而不是依赖它猜不到名字。
分数校正后是否就可信了?
校正处理已识别问题,无法覆盖未知污染。仍需新任务、独立验收和抽样复核,并公开校正依据。
如何区分泄漏与正常检索?
结合任务允许来源与访问内容判断。搜索到事实原始来源属于目标行为;访问题目对应的参考答案可能偏离目标。若事先没有禁止,报告能力测量偏差比追溯指责更准确。
私有评测是否不会被污染?
私有只减少公开传播。答案进入共享存储、日志、提示词或反馈后仍会泄漏。数据生命周期和权限边界同样重要。
参考资料
- Anthropic:Evaluation awareness in BrowseComp,2026-03-06。
- OpenAI:Separating signal from noise in coding evaluations,2026-07-08。
- AI Benchmark 的失真与适用边界,基准解释的基础问题。