小区水管半夜漏水,AI 师傅上门维修。师傅手艺到底行不行,不能光看他递过来的维修方案写得多专业——方案再漂亮,水管还是漏,等于白干。真正算数的是“验收”这一刻:拧开阀门看水压、盯住渗漏点、把所有水龙头都试一遍,一连串检查全部合格,才敢在验收单上盖“合格”的章;任何一项不对劲,整单维修都得打回重做。 在 AI 修复代码的世界里,这个“验收”动作就叫修复验证。AI 模型每提交一个补丁(patch),就像师傅递上一份方案,而 Pass 和 Fail 就是验收单上那枚“合格/不合格”的印章。本文用“修水管验收”这个比喻贯穿始终:先看 Pass/Fail 怎么定义,再认识 SWE-bench 这个“物业巡检大队”如何组织验收,接着拆解验证流程的每个标准动作、那些“看着修好其实是假象”的坑,最后给出给 AI 师傅们排名的指标体系。读完你就能看懂各家评测报告里的数字,也能亲手搭建一套不会轻易被骗的修复验证流程。
学完这篇,你能看懂 AI 修复类评测报告里的核心数字,能搭建防止“假阳性”混过去的验证流水线,为 AI 代码生成、Agent 评测和自动化测试工作建立客观的评估能力。
可视化演示
展示计算机视觉中边缘检测算法的六步处理流程:从灰度化、高斯滤波到梯度计算、非极大值抑制和双阈值检测,逐步演示边缘提取过程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
灰度化处理 将彩色图像转换为灰度图,简化后续计算 Gray=0.299R+0.587G+0.114B 灰度化是边缘检测的第一步,将三维颜色空间降为一维亮度值
验证基本概念
凌晨两点,水管又开始滴滴答答。AI 维修师傅清晨送来一份维修方案,字迹工整、逻辑严谨,把漏水原因分析得头头是道。可你放下方案走到水槽边,拧开阀门,水还是从接头处喷出来——方案写得再好,也抵不过一次真实的试水。这个“拧阀门”的动作,就是验证;而 Pass/Fail,是验收单上最终盖下的章。
在代码世界里,AI 模型的“维修方案”是一个补丁(patch),可能只改了几行代码。要怎么知道它真的修好了那个 bug?答案不是靠人读代码、靠感觉,而是把它放进一个干净、可控的环境里,运行与该 bug 相关的测试套件,看所有断言是否满足。这个“放进环境跑测试”的完整过程,就叫修复验证。验证之后产生的最关键输出,是一个二值标签:Pass(通过)或 Fail(不通过)。
修复验证有三要素:补丁(输入)、隔离环境(执行容器)、测试报告(输出)。其中最容易忽略的是“受控”二字——环境不干净、依赖版本不对、测试顺序被干扰,都会让结果失真。Pass 不代表补丁“绝对正确”,只代表“在当前环境、当前测试集下,所有断言都满足”;它是证据,不是真理。
回到水管场景:Pass 就是打开每个水龙头,水流正常、水压稳定、没有新渗漏点;Fail 则是任何一处出了问题。所以当你看到某份 AI 修复评测报告时,先别急着为高通过率鼓掌——要追问一句:这个 Pass 是跑完整个测试套件后得到的真章,还是只看了一两个测试就盖上的橡皮图章?
- Result最终输出的验证标签,只有 Pass 和 Fail 两个取值,没有“差不多”的中间态。
- Pass 条件 = 全部测试通过所有被执行的测试断言都满足,数量上“一项都不能少”。
- Fail 条件 = 任一问题失败、异常、超时,三种情况任意出现一种,都判 Fail。
SWE-bench基准
物业公司想考核 AI 师傅们的维修水平,不能每家每户自己说了算,得有一支统一的“巡检大队”。这支大队收集真实住户报修过的漏水记录,配上楼栋的原始水管图纸、官方维修档案和一套标准验收清单,让每个师傅在同一栋楼、同一套设备上接受同样的检验。这个巡检大队,就是 AI 修复评测领域赫赫有名的 SWE-bench。
SWE-bench 是构建在真实 GitHub issue 之上的标准化评测基准。它把“AI 能不能修好真实 bug”这个模糊问题,拆解成一个一个可复现的任务。每个任务包含四样东西:一个代码仓库(那栋楼的原始水管图)、一个真实 issue 描述(住户的报修记录)、gold patch(官方认可的标准维修档案)、以及精心准备的测试套件(验收清单)。AI 模型拿到前三样,输出自己的补丁,评测引擎像物业验收员一样,在干净环境里应用补丁并跑起测试。
测试套件是 SWE-bench 最讲究的地方。它被拆成两组清单:FAIL_TO_PASS(F2P) 记录的是“修复前应该失败、修复后必须通过”的测试,证明 bug 真的被解决;PASS_TO_PASS(P2P) 记录的是“修复前本来就通过、修复后也必须保持通过”的测试,防止师傅修好了漏水却砸坏了墙壁。两组测试完全通过,这个任务才算「resolved」(修复成功)。
SWE-bench 的价值在于“真实”和“统一”。它不像玩具题目那样编造场景,而是直接使用 GitHub 上真实仓库、真实 issue、真实开发者写过的测试。有了这个物业巡检大队,不同 AI 师傅的水平才有了可比性——你说你家的模型能修 bug,那就到 SWE-bench 的同一套水管系统里试试。
- 分子 = 判定为 Pass 的任务数只有那些 F2P 和 P2P 全部通过的任务,才有资格进入分子。
- 分母 = 任务总数评测集里全部任务的数量,不剔除任何难题。
- 乘 100%把比率换算成百分数,方便跨模型、跨论文直接比较。
Pass判定标准
物业验收的终极标准是四个字:滴水不漏。阀门开到最大,水流要饱满;压力表数值要达标;厨房、卫生间、阳台每个水龙头都得试一遍;过 24 小时再回来看看有没有渗水。任何一项不满足,验收单上就盖不下“合格”章。AI 补丁的 Pass 判定,也是同样严苛的逻辑。
一个补丁要拿到 Pass,必须同时满足三个硬条件:第一,F2P 清单里的测试全部通过——这证明 bug 确实被修复了;第二,P2P 清单里的测试全部保持通过——这证明没有弄坏原本正常的代码;第三,整个执行过程没有出现超时、崩溃、异常退出等意外状况。此外,SWE-bench 还有一条隐式规则:补丁必须是“真实改动”,空补丁、只改注释的补丁即使测试碰巧通过,也不算有效修复。
这里最反直觉的一点是:Pass 不是“大多数测试通过”,而是“所有测试通过”。十个 F2P 测试过了九个,剩下一个失败,这个任务依然是 Fail。为什么这么苛刻?因为用户报告的 bug 是一个整体,任何一个相关场景没被修复,说明 AI 师傅没有真正理解漏水的原因,可能在某个隐蔽的接头处还漏着。
回到水管验收:F2P 就像“报修的问题场景清单”,P2P 就像“全屋原有水系统检查清单”。验收员不会因为主卧水龙头修好了就放行——他还会走进厨房拧开那个原本就正常的龙头,确认你没有把厨房也修漏水。AI 评测中的 Pass,就是这种“全屋检查合格”的严谨结论。
- ∀(全称量词)读作“对于所有”,强调一个都不能少——这就是 Pass 与“部分通过”的本质区别。
- ∈(属于)表示 t 属于后面这个集合,即 t 是这些测试中的一员。
- ∪(并集)把 F2P 和 P2P 两个清单合并成一个总清单,验收时要一起考核。
- run(t) = pass测试 t 被执行后的结果必须是通过状态。
- ⟺(当且仅当)两边互为充要条件——满足右侧逻辑则 Pass,Pass 必然满足右侧逻辑。
Fail判定标准
验收单上盖“不合格”章的理由五花八门。水龙头拧开不出水——断言失败;水流细得像眼泪——性能不达标;厨房原本好好的龙头开始漏水——回归破坏;师傅修了三天三夜没完工——超时。在 AI 修复验证里,Fail 的成因也被归纳为清晰的几类,每一种都对应着补丁的不同“病症”。
第一种是断言失败(assertion failure):测试顺利执行了,但代码行为与预期不符,断言直接亮红灯。这是最常见的 Fail,说明补丁没有真正解决问题。第二种是超时(timeout):测试在规定时间内没跑完,被评测系统强制终止。超时意味着补丁可能引入了死循环、性能退化或卡死的请求。第三种是异常/崩溃(crash):补丁运行时抛出未捕获异常、段错误或进程崩溃,连测试都执行不下去。
第四种最隐蔽也最致命——回归破坏(regression):F2P 里新增的测试全过了,但 P2P 里原本通过的旧测试失败。这就像师傅修好了漏水的主管道,却在墙上凿了一排新洞。这也是为什么 SWE-bench 要同时用 F2P 和 P2P 两组清单:只看“修好了什么”,不看“弄坏了什么”,是验证体系最大的盲区。
理解了 Fail 的类型,你就掌握了 AI 补丁的“病理学”。当你在评测报告里看到一个 Fail,不要止步于“没通过”三个字,而是追问它是哪一类——如果大量 Fail 来自回归破坏,说明这个模型擅长“头痛医头”而缺乏全局意识;如果大量 Fail 来自超时,说明模型生成的代码可能有性能隐患。类型,比一个简单的红叉更有诊断价值。
- Fail_Type失败的类型标签,它告诉你补丁“怎么死的”,方便定位问题。
- ∈(属于)最终判定结果一定会落到右边集合中的某一类。
- 四种类型断言失败(assertion)、超时(timeout)、崩溃(crash)、回归破坏(regression)。
验证流程设计
物业巡检大队给每位验收员印发了一份《验收标准作业书》:第一步,关闭总水阀,隔离现场;第二步,接上压力表,先测一遍管线原始压力是否正常;第三步,打开阀门,启动通水测试;第四步,记录所有压力读数和水流状态;第五步,填写验收报告。每一步都不能省,顺序也不能乱。AI 修复验证的流程设计,同样是一套环环相扣的标准动作。
完整的验证流程可以拆成五个阶段:环境隔离——用 Docker 等容器技术创建干净、与宿主机隔离的运行环境,固定操作系统、语言版本和依赖包版本;基线复测——在应用补丁之前,先跑一遍 P2P 测试,确认测试套件本身在这个环境下能正常通过;应用补丁——把 AI 生成的补丁应用到代码仓库,检查 git apply 是否干净成功;执行测试——按顺序运行 F2P 和 P2P 全部测试,设置超时上限;采集与判定——记录退出码、日志、耗时,汇总成 Pass/Fail 结论并输出结构化报告。
其中“基线复测”这一步最容易被新手跳过。它的作用类似“先确认压力表没坏再测水压”——如果测试套件本身在这个环境里就全挂,那补丁应用后无论什么结果都不可信。为了判断环境是否合格,我们定义一个基线有效的条件:
可以这样理解:AI 修复验证最怕的不是“补丁不行”,而是“环境背锅”。基线复测就是给环境做体检,体检过了,后面补丁出的所有问题才真正算在补丁头上。这一轮标准动作做完,产出物的核心只有一个:一份附带着环境信息、测试日志和判定标签的验证报告——它是后续一切分析和决策的原料。
- BaselineOK环境基线的布尔标记,相当于“压力表校验合格”。
- ∀ t ∈ P2P对 P2P 清单里的每一个测试。
- run_env(t) = pass在当前隔离环境(env)下运行,结果是通过。
常见误判陷阱
验收最怕遇到“假象”。水龙头一开,水哗哗流,你以为修好了——后来发现那是隔壁水箱透过来的水,自家水管其实还是漏的。在代码世界里,这种“看着修好了”的假象被统称为假阳性(false positive),它是修复验证中最隐蔽的坑。
假阳性的典型成因有三种。第一种,测试断言形同虚设:测试函数里没写真正的断言,或者断言被 skip、被 mock 掉,测试“通过”了却什么都没验证。第二种,测试污染:测试之间共享全局状态,某个测试碰巧因为前一个测试留下的数据而通过,补丁其实没生效。第三种,环境差异:验证环境与真实使用环境不一致——依赖版本不同、缺少某个系统库,导致测试结果无法迁移到真实场景。SWE-bench 社区对此有句名言:一个测试通过,不是它验证了修复,而是它恰好没发现漏洞。
为了量化这种假象的严重程度,引入误报率(False Positive Rate, FPR)这个指标。它衡量在所有“原本应该 Fail”的任务里,有多少被错误地判成了 Pass。换句话说,FPR 越高,验证体系的“水分”越大,报告里的 Pass 越不可信。
理解了假阳性和 FPR,你就拥有了质疑评测报告的能力。看到某篇论文宣称“通过率高达 85%”,先别兴奋——去看看它的测试断言是否有效、P2P 是否齐全、FPR 是多少。维修行业的行话叫“回头客多不多”:如果验收时频繁开假章,那高通过率就是一场数字游戏。
- FP(假阳性)实际没修好,但被判为 Pass 的任务数量。
- TN(真阴性)实际没修好,并且也被判为 Fail 的任务数量。
- 分子 FP只看“被骗”的那部分。
- 分母 FP + TN所有“实际没修好”的任务总数。
评估指标体系
物业公司每年要给 AI 师傅们排座次、定奖金。怎么排才公道?不能只看一单维修的结果,要看统计意义上的表现。于是他们设计了几个核心指标:修好率、一次修复率、错判率。AI 修复评测也有一套类似的指标体系,其中最常被引用的三个指标是:通过率(Pass Rate)、修复率(Resolved Rate)和误报率(FPR)。
通过率是最直观的指标:判定为 Pass 的任务数除以任务总数。它是验证流程的“出厂合格率”。修复率(SWE-bench 中常称为 Resolved Rate)更严格:一个任务必须 F2P 和 P2P 全部通过才算被“真正修复”,它衡量的是“完整解决用户问题的能力”。通常情况下,通过率 ≥ 修复率,因为有些任务虽然跑了测试,但补丁并不完整,只是恰好通过了部分断言。误报率则衡量验证体系自身的水分,前面已经介绍过。
为什么不能只看一个指标?因为单一数字会掩盖问题。通过率高但误报率也高,说明验证体系在“发假章”;修复率高但通过率低,说明模型擅长解决完整任务但常常答不到点上。三个指标合在一起,才能拼出 AI 师傅的真实画像。修复率的数学定义如下:
在真实的评测报告里,这三个指标通常会一起出现。比如“SWE-bench Verified 上通过率 62%,修复率 45%,误报率 3%”,翻译成物业的话就是:这批师傅验收合格率不错,但真正把问题彻底解决的不到一半,而且验收体系还算老实,假章比例低。指标本身没有好坏,关键是学会组合解读,从数字倒推出模型的真实能力边界。
- 1/N平均数的系数,把总和归一到 0~1 的范围。
- Σ(求和符)把 N 个任务的贡献全部加起来。
- 𝟙[·](指示函数)当方括号里的条件成立时取 1,否则取 0——任务 Pass 记 1,Fail 记 0。
落地实践要点
物业公司最终把这套验收方法固化成了制度:每次维修单完成,系统自动走验收流程;每个季度对所有已验收的维修单做“回访”;每个月的榜单都要公示。AI 修复验证要想真正发挥作用,也必须从“跑一次实验”走向“长期运转的体系”,这就是工程落地要做的事。
第一,CI 集成:把验证流水线接到持续集成系统中。AI 模型每生成一个补丁,自动触发容器构建、依赖安装、测试执行、结果归档,全程无需人工干预。第二,回归守护:把历史任务中全部通过的任务收集起来,形成“回归集”。每次新的补丁出现,除了跑它自己的 F2P/P2P,还要抽跑回归集,防止“修好新问题、弄坏老问题”。第三,人工复核:系统判定 Pass 后,再由工程师对关键任务的补丁做代码走查,杜绝“测试全绿但代码写得一塌糊涂”漏网。
回归守护是其中最关键的机制。它的本质是把“历史正确”当作不可退让的底线:无论修什么新 bug,都不能破坏任何一条曾经通过的测试。这个底线用公式表达就是:
把这三件事做成体系,AI 修复就从“实验室里的实验”变成了“生产线上的质检环节”。普通用户面对的不再是一个孤零零的 Pass 标签,而是一套可持续进化的验证基础设施——每个补丁都要过自动测试关、回归关、人工抽查关,三层关卡层层把关。这就像物业公司不只靠一次验收,而是有回访、有榜单、有制度,才能让维修质量长期稳定。
- P2P_history历史任务中沉淀下来的、曾经通过所有测试的测试集合。
- after patch明确时间点——在补丁应用之后运行,而不是应用之前。
- ∀ t 都通过任何一个历史测试失败,回归守护就亮红灯,整个补丁被打回。
AI 应用场景
AI 代码助手的质量闸门
阶段:验证与评测阶段
解决的问题:企业内部 AI 编程助手(或称 Copilot)每天生成大量补丁,人工 review 慢且容易看走眼。传统方式依赖工程师肉眼判断补丁是否靠谱,无法发现“测试没跑过就上线”的风险。引入修复验证流程后,每个补丁提交自动触发 F2P/P2P 测试,任一不过即打回给模型迭代,把质量闸门前置到提交流程中。
具体案例:某支付团队在 GitLab CI 中接入验证脚本,模型提交“修复订单超时 bug”的补丁后,流水线自动执行 24 个 F2P 用例和 310 个 P2P 用例。结果显示 F2P 通过 22 个,2 个超时——补丁被判 Fail 并附带超时日志返回给模型。经过两轮迭代,补丁全量通过才被允许合并。利用 Pass/Fail 机制,人工审查量降低了 60%。
安全漏洞自动修复 Agent 的选型评估
阶段:模型能力评测
解决的问题:安全团队想用 AI 自动修复历史 CVE 漏洞,但担心模型“修了漏洞、砸了兼容性”。传统做法是把漏洞修复外包给人工,成本高且周期长。利用 SWE-bench 风格的评测集,把 300 个历史 CVE 构造成“漏洞报告 + 代码仓库 + F2P/P2P 测试”的任务,统一评估候选模型的修复能力。
具体案例:评测结果中,模型 A 的通过率为 58%,但其中 12% 的任务存在 P2P 回归破坏;模型 B 通过率只有 41%,但回归破坏率降至 2%。安全团队最终选择了 B 模型,因为它更“稳”——宁可修复率稍低,也不能接受补丁把线上功能弄坏。这个决策完全依赖修复验证中 Pass/Fail 的细分类型。
开源维护者的 PR 快速筛选
阶段:生产环境验证
解决的问题:开源项目每天收到大量 AI 生成的 PR,维护者没时间逐个仔细 review。传统做法是先人工看 diff 再决定是否跑 CI,效率极低。复用 SWE-bench 的验证方法论,为每个 PR 自动生成“新增测试(对应 F2P)+ 原有测试(对应 P2P)”的验证组合,全绿才进入人工 review 队列。
具体案例:某热门开源仓库部署了自动验证机器人,AI 提交的 bug 修复 PR 会在 15 分钟内得到一份验证报告:F2P 通过数、P2P 通过数、超时告警、判定结论。维护者只看报告就能筛掉 70% 不合格的 PR,把宝贵时间留给真正有潜力的补丁。这套流程让 AI 贡献者的合入率提升了近一倍。
Python 演示
import random F2P_TESTS = ["test_login", "test_checkout", "test_rate_limit"]P2P_TESTS = ["test_legacy_auth", "test_existing_user", "test_core_math"] def run_test(test_name, quality): """Simulate a single test execution.""" if quality > 0.7: return True return random.random() < quality class PatchValidator: def __init__(self, f2p, p2p): self.f2p_list = f2p self.p2p_list = p2p self.pass_count = 0 self.fp_count = 0 self.seen_count = 0 def evaluate_patch(self, quality): self.seen_count += 1 all_ok = True for t in self.f2p_list + self.p2p_list: if not run_test(t, quality): all_ok = False result = "PASS" if all_ok else "FAIL" if result == "PASS": self.pass_count += 1 if quality < 0.5: self.fp_count += 1 return result def stats(self): pass_rate = self.pass_count / self.seen_count if self.seen_count else 0 fpr = self.fp_count / self.seen_count if self.seen_count else 0 return { "tasks": self.seen_count, "pass_rate": round(pass_rate, 3), "false_positive_rate": round(fpr, 3), } def main(): random.seed(42) validator = PatchValidator(F2P_TESTS, P2P_TESTS) samples = [ ("good_patch", 0.9), ("noop_patch", 0.1), ("partial_patch", 0.5), ("broken_patch", 0.05), ("decent_patch", 0.75), ] for name, quality in samples: result = validator.evaluate_patch(quality) print("%s -> %s" % (name, result)) print("summary:", validator.stats()) if __name__ == "__main__": main()
all_ok = True先把“全部通过”的假设置为真,只要有一个测试失败就翻转为 False,对应 Pass 要求“无一失败”。for t in self.f2p_list + self.p2p_list:把 F2P 和 P2P 两个清单合并成一份总验收清单,逐条执行。if not run_test(t, quality):只要 run_test 返回 False,立即把 all_ok 置为 False,等价于“发现一处漏水,整单验收失败”。result = "PASS" if all_ok else "FAIL"最终判定只有两个出口,没有中间态。if quality < 0.5:模拟“实际没修好却拿到 Pass”的假阳性:质量分低于 0.5 的补丁本不该通过。self.fp_count += 1记录一次假阳性,为计算误报率累积分母中的分子。pass_rate = self.pass_count / self.seen_count if self.seen_count else 0通过率 = Pass 任务数 ÷ 总任务数,用条件表达式防止除零。random.seed(42)固定随机种子,保证每次运行结果一致,让评测可复现。validator.evaluate_patch(quality)对每个补丁执行完整验证流程,得到 Pass 或 Fail。"good_patch", 0.9高质量补丁样本,预期应该 Pass;这种“已知答案”的样本是检查验证器是否正常的标尺。
常见误区
误区AI 生成了一个补丁,我随便写了两三个测试跑一下,通过了我就可以放心地认为这个 bug 修好了。
正解这就像验收水管时只拧了主卧一个龙头,其他水龙头都不管。修复验证必须覆盖“修复相关测试(F2P)”和“原有功能测试(P2P)”两组。真正的 Pass 需要所有相关测试全部通过,任何一个环节没测到,都可能藏着漏网之鱼。测试覆盖不足导致的"Pass",本质上是假阳性。
为何常见:初学时容易把“验证”理解成“跑几个例子看看”,忽略了验证的完整性和系统性,而 SWE-bench 这类基准恰恰是用严格的 F2P/P2P 双清单来杜绝这种偷懒式验证。
误区看到某份报告里 AI 修复通过率 80%,立马觉得模型很厉害,可以直接上线。
正解通过率只是统计意义上的“验收合格率”,它掩盖了大量细节。要追问:评测有多少任务?F2P 测试是否有效?P2P 回归破坏率是多少?误报率多少?通过率 80% 的同时可能伴随 12% 的 P2P 破坏——修复一个 bug 弄坏两个功能,这种“修复能力”其实是灾难。合理姿势是用通过率、修复率、误报率三指标组合判断。
为何常见:人对单一数字有天然的信任感,尤其当数字来自“知名基准”时更容易放弃审查。实际上 SWE-bench 官方也反复强调,只看一个得分会严重误判模型能力。
误区本地能跑通测试就行,环境细节无所谓,补丁验证结果应该差不多。
正解环境差异是假阳性和不可复现的温床。同一个补丁,在 Python 3.8 上通过、在 3.11 上失败;在开发机上通过、在 CI 容器里失败。没有环境隔离和基线复测的验证结果,严格来说不具备参考价值。SWE-bench 把环境复现性看得和测试本身一样重要,因为不可复现的 Pass 等于没验证。
为何常见:小白通常只关注“代码逻辑是否正确”,而忽略了运行环境本身对结果的决定性影响——这就像用一块没校零的压力表去测水压,数读得再认真也是错的。
误区补丁运行时卡顿、超时,我只是觉得它性能不好,但功能上应该算修好了。
正解在修复验证中,超时就是 Fail。一方面,评测体系有资源配置和时限预算,超时说明补丁可能在死循环或指数爆炸;另一方面,真实用户可等不起无限挂起的程序。SWE-bench 的超时机制是为了筛选“工程上可用”的补丁,而不是停留在“理论正确”。
为何常见:人们习惯把“功能正确”和“性能达标”分开看,但在自动化验证体系里,超时是明确的失败信号,不能被宽容地归为“性能优化项”。
面试题
Q1. 在 SWE-bench 评测中,一个任务被判定为修复成功(resolved)的核心条件是什么?
- A.F2P 与 P2P 测试全部通过← 正确答案
- B.补丁能通过编译且运行不报错
- C.AI 模型报告修复完成无需复测
- D.大部分测试通过个别可失败
答案:A。SWE-bench 的判定标准是“全部通过”:F2P 证明 bug 被修复,P2P 证明原有功能未被破坏,两者缺一不可。B 只看编译和运行,漏掉了测试断言;C 是模型自评,不能替代客观验证;D 允许个别失败直接违背了“全过才 Pass”的硬规则。
Q2. 补丁应用后,PASS_TO_PASS 列表中有一个测试失败,最终判定应为下列哪种?
- A.Pass, 因为核心功能已修复
- B.Fail, 因为破坏了原有功能回归← 正确答案
- C.等待人工复核后再决定
- D.跳过该测试重新统计
答案:B。P2P 测试代表“修复前本来就通过、修复后必须保持通过”的原有功能。只要有一个 P2P 失败,说明补丁造成了回归破坏,按验证规则必须判 Fail。这和“水管修好主卧、却把厨房弄漏水”一个道理——验收单上照样盖不合格。
Q3. 以下哪些情况会让一个补丁被判为 Fail?
- A.某个 FAIL_TO_PASS 测试断言失败← 正确答案
- B.测试执行超过时限被强制终止← 正确答案
- C.补丁导致原有通过测试回归失败← 正确答案
- D.测试环境输出大量警告日志
答案:ABC。断言失败、超时、回归破坏都属于 Fail 的标准触发条件。D 输出警告日志不代表失败,只要测试断言通过,警告不会影响 Pass/Fail 判定。记住四个失败类型:assertion、timeout、crash、regression,警告不在其列。
Q4. “假阳性”(false positive)在修复验证中指的是哪种情况?
- A.补丁正确修复了 bug, 且测试全部通过
- B.测试全部通过,但补丁实际上并没有真正修复问题← 正确答案
- C.补丁没有生效,但代码评审人员仍然批准
- D.AI 模型答错题目,但评测数据没记录
答案:B。假阳性就是“验证判 Pass,但实际没修好”。它可能源于测试断言形同虚设、测试被跳过或环境意外耦合,是验证体系里最隐蔽的坑。C 虽然也是误判,但那是人审环节的问题,不是测试验证的假阳性定义;D 属于数据记录错误。
Q5. 在验证流程设计中,环境隔离的主要目的是什么?
- A.排除宿主机依赖对测试结果的干扰← 正确答案
- B.保证不同 AI 模型的评测可复现← 正确答案
- C.防止测试之间的全局状态相互污染← 正确答案
- D.减少测试用例的数量以加快速度
答案:ABC。环境隔离通过容器化固定操作系统、依赖版本,让补丁在干净、一致的环境里接受检验:宿主机依赖不会悄悄影响结果,不同模型的评测之间可比,测试间的全局状态污染也被容器边界隔开。D 与隔离无关,隔离不减少用例。
Q6. 一个测试被跳过(skip)却仍计入“通过”,这属于哪类验证陷阱?
- A.环境差异导致结果不可复现
- B.测试污染造成的偶然通过
- C.假阳性:断言没有真正执行← 正确答案
- D.超时阈值设置不合理
答案:C。测试被 skip 意味着其中的断言根本没有执行,测试框架却把这视为“通过”,这是典型的假阳性——表面绿灯,实际什么都没验证。B 是共享状态导致的巧合通过,A 和 D 与 skip 无关。遇到 skip 的“通过”,应该视为无效验证。
Q7. 通过率(Pass Rate)与修复率(Resolved Rate)的关系是?
- A.Pass Rate 一定等于 Resolved Rate
- B.Pass Rate 一般大于等于 Resolved Rate← 正确答案
- C.Resolved Rate 一般大于 Pass Rate
- D.两者之间没有任何关系
答案:B。Pass Rate 是“判定为 Pass 的任务占比”,Resolved Rate 要求任务在 F2P 和 P2P 全过意义上“被真正修复”。由于后者的标准更严,通常 Pass Rate ≥ Resolved Rate。如果两者差距过大,说明验证体系里存在不少“勉强通过”的注水任务。
Q8. 下列哪些方法能有效降低修复验证中的假阳性?
- A.检查测试是否真的执行了断言← 正确答案
- B.规定超时并拦截挂起测试← 正确答案
- C.用 F2P 与 P2P 双重清单全量校验← 正确答案
- D.只看补丁 diff 大小进行判断
答案:ABC。检查断言防止“空转测试”,设置超时防止挂起被误判,F2P/P2P 双清单全量校验堵住覆盖盲区——三者都能压缩假阳性空间。D 看 diff 大小纯属猜测,补丁大不代表有效,小也不代表无效,验证要靠测试而不是肉眼量尺寸。
Q9. 在 SWE-bench 中 "gold patch" 的作用是什么?
- A.作为唯一允许的答案,提交必须逐字一致
- B.构造测试套件和对照参考,不排斥其他合法解法← 正确答案
- C.用来计算模型的代码风格得分
- D.用来替代测试套件直接判定补丁好坏
答案:B。gold patch 是官方开发的“标准答案”,主要用于指导测试套件的构造(设计者们根据它推断哪些测试应该包含在 F2P 中),也作为人工对照参考。但 AI 模型提交的补丁不需要与 gold patch 逐字一致,只要测试全过就算 Pass。C、D 都曲解了它的用途。
Q10. 回归守护(regression guard)在 CI 验证中的核心逻辑是?
- A.每次修复后重跑历史全过任务,防旧问题复发← 正确答案
- B.只运行本次变更涉及的两个测试用例
- C.用静态扫描结果代替运行时测试判定
- D.对每次提交都做全量代码重写验证
答案:A。回归守护把历史任务中全部通过的任务收集成回归集,每次新补丁都要抽跑这些任务,确保修复新 bug 不会弄坏旧功能。B 只看本次变更范围,覆盖不了回归;C 静态扫描发现不了运行时问题;D 全量重写既不现实也不是回归验证的本意。