想象你是一家公司的技术负责人,想招聘一位能独立干活的全栈工程师。面试时背书背得再好也没用,你真正想看的是:给他一台装满真实项目代码的电脑,丢给他一个用户报上来的 Bug 工单,看他自己读代码、定位问题、动手修改、最后跑通测试把修复提交上来。 SWE-bench 干的就是这件事——只不过考生换成了 AI Agent。它不是一套智力测验题,而是一张张从真实开源项目里摘出来的“入职实操考核表”:每一个任务都来自 GitHub 上真实仓库的真实 Issue(问题工单),配上真实工程师当年写下的修复补丁作为参考答案,再按统一的规则判卷:你提交的修改,是否能让原本失败的测试通过、同时不弄坏原本正常的测试?这就像给 AI 做一场标准化的“新员工试用期考核”,考的不是花哨的推销话术,而是扎扎实实的代码理解、定位、修改与验证能力。
对 AI 从业者来说,SWE-bench 是把“AI 能不能真干活”落到数字上的标尺——无论是评估模型选型、迭代 Agent 工具链,还是向团队证明你的系统真的有价值,它都能提供一份可复现、可对比的量化依据。
目录
可视化演示
展示RAG系统评估流程、多配置A/B对比实验与五维指标雷达图,交互切换模式查看不同评估维度。
本节配有交互动效(进入视口后自动加载,约 3KB)。
RAG评估流程 查询经检索增强后生成答案,全链路评估 Top-K控制检索文档数量,影响召回与延迟 F1 = 2*P*R/(P+R) 调节滑块查看不同Top-K下的指标变化
任务构造——从真实工单到考核题目
公司要设计一场“入职实操考核”,HR 不会凭空编题,而是从过去一年的客服工单里,挑出那些描述清晰、真实影响用户的经典 Bug,再配上当年老员工修复这些 Bug 时留下的代码记录。这样,每一道考题都有据可依,也有标准答案可对照。SWE-bench 正是这样出题的:它从 GitHub 上的真实开源仓库里,把历史上真实出现过的 Issue 拿出来,作为考核 AI 的题目。
具体来说,SWE-bench 团队从 Django、SymPy、scikit-learn、matplotlib 等 12 个流行的 Python 开源库中,筛选出了 2294 个真实 Issue。这些 Issue 必须满足一个关键条件:它们都对应着一个真实工程师提交的修复 PR(Pull Request)。换句话说,每一道题都有“真人考生”验证过、确定可以被解决——这就避免了出题时出现“无解难题”的尴尬。
筛选完成后,围绕每个 Issue 构建一个如下所示的任务元组:
这样,每一道“考题”都来自真实世界,考的就是 AI 在真实代码库中定位问题、动手修复、并确保测试通过的综合能力——正如一份好的入职考核,题目必须真实、答案必须验证过一样。
- Issue 描述用户提交的自然语言 Bug 报告,相当于考题题干
- 基准 CommitBug 尚未被修复时的代码版本,即考生开始动工的代码库快照
- 真人 Patch当年工程师真正修好这个 Bug 的代码改动,用作评分参考答案
- 测试用例用于验证修复有效性的专门测试,是最终判卷的依据
评测环境——隔离的考试机房
有了考题,接下来要布置考场。如果每个考生用的电脑配置不一样,有人用的 Python 版本新、依赖装得全,有人用的环境乱七八糟,那考试结果就失去了可比性。所以,正规考核一定要求:所有考生在完全相同的机器和软件环境中作答。SWE-bench 也是这个思路,它用 Docker 容器为每个任务搭建一个独立、干净、可复现的“考试机房”。
在这个隔离环境里,SWE-bench 为每个任务锁定了“基准 Commit”——也就是 Bug 还没被修复时的代码版本。Agent 拿到的代码库,恰好停在老工程师动手之前,这与真实世界里的“接单修 Bug”完全一致:你永远是从现状出发,而不是从答案出发;你打下的每一个补丁,都要能叠加在这个历史基线上。
接着,评测环境会按照依赖清单安装好所有需要的包和测试框架,然后自动跑测试。整个过程用公式描述就是:
这种方式确保了评测的可复现性——就像考场里的每台电脑都来自同一条装配线,任何考生都没有“环境作弊”的空间。
- Python 版本统一定义解释器版本,避免版本差异导致行为不同
- 依赖列表列出项目运行所需的全部第三方库及其版本
- 基准 Commit将代码仓库回滚到修复前的历史版本
- 测试框架选用项目原生的 pytest 等测试框架执行判定
解决率统计——公平的评分标准
考试不能只靠阅卷老师的印象给分,得有一套客观、明确的评分规则。SWE-bench 的评分标准相当巧妙,它借鉴了软件开发中一个朴素的原则:修复 Bug 的最高境界是“刚开失败的测试,现在通过了;原本好好的功能,也没被动坏”。这就是“失败转正”(Failed-to-Pass,F2P)与“回归保护”(Pass-to-Failed,P2F)的判定思想。
具体评分时,SWE-bench 为每个任务准备了两组测试:一组是从真人修复 PR 里提取的、能够复现 Bug 的“失败转正测试”;另一组是项目既有的“回归测试”,用来确保 Agent 的改动没有弄坏其他功能。只有当 Agent 提交的补丁让失败转正测试全部通过,同时没有让任何回归测试由通过变成失败,这个任务才被记为“解决”。
在此基础上,解决率的统计方法很直接:
除了整体解决率,社区还常用 Pass@1 指标来衡量 Agent 的“一次性成功率”——即模型第一次尝试就成功完成任务的概率。这两个指标组合起来,既看平均实力,也看单次稳定性,就像考试既看总分,也看是否一次答对。
- 总任务数进入评测的全部 SWE-bench 任务个数,即分母
- 指示函数对每个任务判断是否满足“失败转正且无回归”,满足记 1,否则记 0
- 求和平均对所有任务的指示结果求和后除以总数,得到解决比例
- 百分比转换将比例乘以 100%,得到人们习惯的百分数表述
模型对比——Agent 排行榜
考试的意义除了评估个人能力,更重要的是在候选人之间横向比较。SWE-bench 发布后,各大 AI 实验室和开源社区都把它当作“新员工考核赛场”,纷纷提交自家 Agent 的成绩单。这就像公司同时让多批候选人进入同一个考场、面对同一份试卷,然后按统一评分标准排出座次。
从 SWE-bench 论文及后续跟踪报告来看,GPT-4、Claude 系列以及各类开源模型都在这份榜单上亮过相。早期结果非常“扎心”:即使是最强模型,在完整 SWE-bench 基准上的解决率也长期徘徊在 10% 到 30% 之间。这意味着即使是最先进的 AI Agent,面对真实软件工程任务时,仍有约七成甚至九成的 Bug 修复不了。模型间的差距用如下公式刻画:
随着 SWE-bench 从最初版本迭代到 SWE-bench Verified,再到 Multilingual 多语言版本,排行榜也在不断刷新。趋势很清晰:各模型的绝对解决率在稳步爬升,但距离“人类工程师水平”仍有明显鸿沟。这也恰好说明,衡量“AI 能否独立完成真实软件工程任务”这件事,本身就是一条通往 AGI 路上极具价值的试金石。
- 模型 A 的解决率模型 A 在相同评测环境中取得的任务解决率
- 模型 B 的解决率模型 B 在完全相同的任务与环境下取得的解决率
- 差值计算两者相减得到性能差距,正值表示 A 更强,负值表示 B 更强
局限性——考试的盲区
任何考试都有盲区。SWE-bench 这套“新员工考核”虽然设计得相当严谨,但它绝不是万能的。就像一场笔试能测出知识储备,却测不出沟通能力和团队协作一样,SWE-bench 也有它力所不能及的地方。
第一,数据泄漏风险。SWE-bench 的真实 Issue 和真实 PR 都来自公开 GitHub 仓库,而这些数据很可能已经在模型预训练时被“读”过。这就好比考生在考前偷偷看到了原题,哪怕没有标准答案,也会产生“见过类似题”的熟悉感,让分数偏高。用公式表达就是:
第二,语言单一。SWE-bench 的核心基准几乎全部集中在大众熟知的 Python 项目上,对于前端、移动端、系统级开发等其他技术栈的覆盖面极为有限。第三,评测成本高。每个任务都要拉起 Docker 容器、安装依赖、跑完整测试,评测一次要耗费大量 GPU 算力和时间,这也是社区迭代 SWE-bench Verified 时反复权衡的因素。
认识到这些盲区,我们才能更理性地看待排行榜上的数字——考试分数高代表“在真实任务上表现好”,但绝不等于“所有软件开发场景都天下无敌”。
- 泄漏任务数模型训练语料中可能包含的评测任务数量
- 任务总数SWE-bench 基准中的全部任务
- 比例计算两者相除得到泄漏率,用于评估评测分数的可信度
改进方向——让考试更可信
认识到考试盲区之后,自然就要推动“考试制度改革”。SWE-bench 团队和开源社区做了大量改进,核心追求只有一个:让这份考核更公平、更有区分度、结果更可信。
最受关注的是 SWE-bench Verified。这个版本从原始基准中精选出 500 个任务,由人工逐一验证问题描述的清晰度和测试的有效性,把“题意模糊”或“测试不可靠”的劣质考题剔除掉,相当于聘请资深工程师对每一道考题进行二审。随后推出的 SWE-bench Multilingual 把覆盖范围扩展到 JavaScript、Java、Rust、Go 等更多语言,试图打破“只会 Python”的单一评价局限。此外,评测工具链本身也在标准化,比如统一的 Dockerfile 构建流程、公开的评分脚本,以及更完善的提交模板。这些改进可以用一个“覆盖度”指标来理解:
改进的方向背后,是评测理念的升级:从“考得严”到“考得真”,从“考得窄”到“考得广”。这场考试的最终目标,是让 AI 软件工程能力拥有一个被全行业认可的、可信赖的度量衡——就像现代社会的职业资格认证一样,一旦标准被广泛接受,整个行业的用人决策和技术迭代就有了坚固的地基。
- 已支持语言数SWE-bench 当前纳入扩展评测的语言种类
- 目标总语言数SWE-bench 计划覆盖的全部语言目标
- 百分比转换两者相除并乘以 100%,得到覆盖度百分比
AI 应用场景
场景一:代码助手产品迭代的“体检报告”
阶段:模型评测与迭代
解决的问题:代码助手类产品(比如自动补全、Bug 修复插件)迭代时,团队往往靠人工尝试几个示例来评估效果,既主观又无法规模化。借助 SWE-bench 的评测思路,可以自动对每次模型更新做一次“真实代码任务体检”,量化地知道这个版本比上个版本在真实 Bug 修复上进步了多少。
具体案例:某团队开发了一款基于大模型的安全漏洞自动修复插件。他们在每次发布新版本前,把内部私有代码库中沉淀的上百个历史 Issue 按 SWE-bench 方式构造任务集,自动跑一遍“失败转正”测试。某次迭代中,新模型的解决率从 61% 提升到 67%,但回归测试破坏率也上升了 0.8%,团队据此决定推迟发布、加强补丁验证。
场景二:自动化 Bug 修复机器人的验收标准
阶段:模型训练与交付验收
解决的问题:训练出一个“自动修 Bug”的 Agent 很容易,但怎样验收它到底行不行,很难用传统的人工 Code Review 回答。SWE-bench 提供了一套客观验收标准:让 Agent 在 Docker 隔离环境中提交补丁,再通过自动化测试判定质量。
具体案例:某大型 AI 公司训练跨项目 Bug 修复 Robot,直接把完整 SWE-bench 基准作为验收门禁。每一轮训练完成后,在固定的 GPU 集群上评估解决率和 Pass@1,解决率低于阈值则模型不允许上线。最终该 Robot 在 SWE-bench Verified 上达到 25% 解决率,才被允许进入真实工单系统试运行。
场景三:企业私有代码能力基线的建立
阶段:模型选型与技术预研
解决的问题:企业引进 AI 编程工具时,面对各家模型的宣传数据一头雾水。SWE-bench 的“真实任务 + 统一环境 + 自动判定”框架可以直接套用到企业私有代码库上,构建一套自定义的“企业版 SWE-bench”,用内部真实业务代码做选型评估。
具体案例:某银行科技部门希望选购代码辅助模型。他们从过去两年的内部工单中筛选出 200 个 Bug,构造了私有评测集,在统一容器环境里测试三个候选模型。结果发现,某开源模型在企业专属框架上的解决率比通用榜单高 12 个百分点,团队据此选择了更符合自身场景的模型,并沉淀为长期评测基线。
Python 演示
"""简化版 SWE-bench 解决率模拟器根据 Agent 是否让"失败测试转正"且未破坏回归测试,计算解决率"""import re class ResolvedRateEvaluator: def __init__(self): self._task_list = [] def add_task(self, issue, commit, test_file): self._task_list.append({ "issue": issue, "base_commit": commit, "test_file": test_file, }) def _run_failed_to_pass(self, task, patch): # 从 issue 描述中提取目标文件名,模拟生成失败转正测试 target = re.search(r"[a-z_]+\.py", task["issue"]) return target is not None and target.group() in patch def _run_regression(self, task, patch): # 若补丁修改了测试文件本身,视为可能破坏回归测试 return "test_" in patch and task["test_file"] in patch def evaluate(self, patch): passed_count = 0 for task in self._task_list: ok_f2p = self._run_failed_to_pass(task, patch) ok_reg = not self._run_regression(task, patch) if ok_f2p and ok_reg: passed_count += 1 total = len(self._task_list) rate = passed_count / total if total else 0.0 return passed_count, total, rate if __name__ == "__main__": bench = ResolvedRateEvaluator() bench.add_task("修复 utils.py 中的空指针异常", "abc123", "test_utils.py") bench.add_task("修复 api.py 中超时设置无效", "def456", "test_api.py") bench.add_task("修复 db.py 中连接泄漏", "ghi789", "test_db.py") patch_good = "--- a/utils.py\n+++ b/utils.py\n+def safe_call():\n+ pass" passed, total, rate = bench.evaluate(patch_good) print(f"补丁A -> 通过 {passed}/{total},解决率 {rate:.2%}") patch_bad = "--- a/test_api.py\n+++ b/test_api.py\n- def test_timeout():\n- assert False" passed, total, rate = bench.evaluate(patch_bad) print(f"补丁B -> 通过 {passed}/{total},解决率 {rate:.2%}")
self._task_list = []初始化任务列表,用于存放所有模拟的 SWE-bench 任务re.search(r"[a-z_]+\.py", task["issue"])从 issue 描述中提取要修改的文件名,模拟 Agent 定位 Bugtarget is not None and target.group() in patch判断补丁是否覆盖了目标文件,对应“失败转正”条件的简化为ok_f2p and ok_reg两个条件同时满足时,任务才算解决,与 SWE-bench 评分逻辑一致passed_count / total if total else 0.0计算解决率,注意避免除零错误
常见误区
误区“Agent 生成了补丁,代码语法也正确,issue 里提到的问题都改了,那这个任务肯定算解决了吧?”
正解SWE-bench 根本不关心代码“看起来”对不对,它只认自动化测试的客观结果。判卷的唯一标准是:失败转正测试是否通过、回归测试是否被破坏。就像入职考核不看你自我感觉多好,而是看你交的代码能否通过 CI 流水线。
为何常见:人们习惯用肉眼判断代码输出质量,但真实软件工程的可靠性恰恰建立在自动化验证之上。
误区“如果 RAG 模型在 SWE-bench 上做到 60% 解决率,应该比很多初级工程师还厉害了吧?”
正解SWE-bench 只是从大量真实任务中抽样出来的一个基准,它覆盖的 Python 语言、可测试的 Bug 类型、以及纯代码修复的形态都远不能代表真实的软件工程。真实工作还要包括需求沟通、代码评审、架构设计、运维部署等,这些 SWE-bench 都无法衡量。
为何常见:人们习惯用一个数字代替复杂判断,忽略基准的覆盖边界,犯了“以偏概全”的典型错误。
误区“用 Docker 不就是图个测试方便、自动化跑批处理吗?普通人手动装环境也行吧。”
正解Docker 的真正价值是“环境即代码、即证据”。它把 Python 版本、依赖、基准 Commit、测试框架全部声明成可复现的配置,确保任何人在任何时候重跑评测,结果都一致。这直接决定了 SWE-bench 分数的可信度和可比性。
为何常见:习惯了本地开发环境的人,容易把 Docker 理解成简单的沙箱工具,忽略了它作为“复现性基础设施”的核心意义。
误区“PASS@1 就是解决率吧,都是算模型能修好多少 Bug。”
正解解决率是对每个任务给一次“修改机会”后统计的通过比例;PASS@1 则强调“流程上允许模型多次尝试,但只取第一次尝试结果”的正确率。在实际评测中,PASS@1 通常对模型更苛刻,因为它禁止了“先跑一遍发现问题,再调整补丁”的后验优势。
为何常见:两个指标在数值上有时接近,名字又都带“通过”或“解决”的字眼,初学时分不清很正常,但它们在论文图表中代表两种完全不同的评测协议。
面试题
Q1. SWE-bench 任务判定的核心标准是?
- A.失败测试转正通过← 正确答案
- B.代码编译无错即可
- C.人工阅读补丁确认
- D.模型自信度足够高
答案:A。SWE-bench 用自动化测试判卷,核心是“失败转正”——原本失败的测试必须通过。编译无错、人工阅读、模型自信度都不能客观验证修复效果,这与真实 CI 流水线的判定逻辑一致。
Q2. SWE-bench 的题目主要来自哪个平台?
- A.GitHub 真实仓库← 正确答案
- B.Kaggle 数据集
- C.StackOverflow 问答
- D.LeetCode 算法题库
答案:A。SWE-bench 从 Django、SymPy 等 12 个流行 Python 开源库的真实仓库中提取 Issue 和修复 PR。Kaggle、StackOverflow、LeetCode 都不是完整的代码工程评测来源。
Q3. SWE-bench 任务中“基准 Commit”的作用是?
- A.指定修复后的版本代码
- B.锁定修复前的代码基线← 正确答案
- C.记录 Agent 运行日志
- D.保存测试用例的集合
答案:B。基准 Commit 把代码库回滚到 Bug 未修复时的状态,是 Agent 开始工作的起点,也保证所有考生面对同一份“现状代码”。修复后的版本是 Agent 应该产出的结果,不是输入。
Q4. SWE-bench 为保证评测公平性采取了哪些措施?
- A.使用 Docker 容器统一环境← 正确答案
- B.固定基准版本代码← 正确答案
- C.自动运行测试判定结果← 正确答案
- D.随机抽选模型的输出答案
答案:ABC。Docker 隔离环境、固定 BaseCommit、自动跑测试这三者共同保证了“同一台电脑、同一份试卷、同一套判卷规则”。随机抽选答案会破坏评测严肃性,不可能用于公平评测。
Q5. 某 Agent 在 SWE-bench 上解决率为 20%,这说明?
- A.模型成功修复了 20% 的任务← 正确答案
- B.模型通过了 20% 的测试用例
- C.模型代码覆盖率达到 20%
- D.模型输出格式正确率为 20%
答案:A。解决率的分子是“被判定为解决的任务数”,一个任务必须完整通过失败转正且无回归才计为解决。通常涉及多个测试用例,不能简单等同为“通过 20% 测试用例”。
Q6. SWE-bench 的已知局限包括哪些?
- A.评测数据集中于 Python← 正确答案
- B.存在训练数据泄漏风险← 正确答案
- C.评测计算成本比较高← 正确答案
- D.可以覆盖全部编程语言
答案:ABC。SWE-bench 核心基准几乎全为 Python 项目,存在公开数据被预训练语料吸收的泄漏风险,且每个任务都要拉 Docker 跑测试、耗费大量算力。它无法覆盖全部语言,D 恰恰与事实相反。
Q7. SWE-bench Verified 相比原始版本的改进是?
- A.加入人工验证去除噪声← 正确答案
- B.改用 Java 语言重写
- C.完全取消 Docker 环境
- D.只保留前端相关任务
答案:A。SWE-bench Verified 从原始题库中精选 500 个任务,由人工逐一验证问题描述和测试质量,剔除模糊或不可靠的题目。它没有换语言、更没去掉隔离环境,也并非只保留前端任务。
Q8. 构建一个 SWE-bench 任务时,需要配对哪些信息?
- A.问题描述 Issue← 正确答案
- B.修复前的基准版本← 正确答案
- C.真人工程师 Patch← 正确答案
- D.配套的失败测试用例← 正确答案
答案:ABCD。任务元组由 Issue 描述、基准 Commit、真人 Patch 和测试用例四要素构成。Issue 给出题干,基准锁定起点,真人 Patch 说明“此题可解”,测试给出判分标准,缺一不可。
Q9. PASS@1 指标的含义是?
- A.模型第一次尝试即成功的比例← 正确答案
- B.模型运行一次的推理耗时
- C.模型生成的代码行数水平
- D.测试用例一次执行的数量
答案:A。PASS@1 强调“只允许试一次”的严格协议,衡量模型在单次尝试中就完成任务的比例。它排除多次采样的运气成分,比允许重试的指标更能反映模型真实实力。
Q10. 模型 A 解决率 18%、模型 B 解决率 22%,最合理的结论是?
- A.模型 B 肯定显著优于 A
- B.模型 B 略优但需显著性检验← 正确答案
- C.两个模型表现完全相同
- D.模型 B 的代码质量不如 A
答案:B。4 个百分点的差异在排行榜上看起来明显,但必须考虑评测方差、任务抽样和随机种子等因素。结论只能说 B“略优”,但要断言显著超越,需要做显著性检验或扩大任务样本,不能只看单一数字。