想象你是一位游戏关卡设计师。你精心设计了 100 个关卡,可玩家只丢下一句“太难了”或“太简单了”就离开——你完全不知道是哪个 Boss 太强、哪段迷宫太绕。于是你给每个关卡评了星级:一星是新手小怪,五星是布满陷阱的巨龙巢穴。拿到这条“星级-通关率”曲线后,你一眼就能看出玩家是栽在解谜机关上,还是根本不敢走进 Boss 房。 SWE-bench 就是为 AI 模型准备的一套“编程闯关游戏”:每个任务都是一个真实代码仓库里的 Issue,模型需要生成补丁、通过隐藏测试。而“任务难度分级”,就是给这些关卡评定星级的过程。它把原本一锅粥的平均通过率,拆解成一条随难度变化的能力曲线,让评测从“能打多少分”变成“哪方面强、哪方面弱”。

岗位关联

掌握难度分级方法,你就能从基准测试的单一分数中挖掘出模型的能力画像,为模型选型、研发迭代和团队汇报提供更有说服力的量化证据。

目录
  1. 可视化演示
  2. 为什么分级:诊断价值
  3. 分级依据:四个信号
  4. 分级流程:四步定级
  5. 难度层级:四档台阶
  6. 通过率分布:层层衰减
  7. 诊断应用:能力画像
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示系统处理流水线、实时性能指标曲线及多方案对比分析,包含数据流转、吞吐延迟监控与方案评估。

本节配有交互动效(进入视口后自动加载,约 3KB)。

系统可视化 处理流程:输入→处理→模型→输出 性能监控:实时指标 P=L×T

为什么分级:诊断价值

游戏关卡设计师若只统计总通关率,就像体检只量体重:100 斤的瘦子和 100 斤的肌肉男在体重秤上读数一样,体型却天差地别。给关卡评了星级之后,设计师才能画出“星级-通关率”曲线:一星关 99%、三星关 60%、五星关只有 5%。这条曲线,才是玩家真正的“能力体检报告”。

SWE-bench 的初衷也一样。它给 AI 模型准备了数千个来自真实代码仓库的 Issue,用 pass@1——也就是模型一次生成补丁并成功通过隐藏测试的比例——来衡量修复能力。如果只公布一个总通过率,就相当于只报了一个体重数字,谁也看不出模型是“什么都会一点”还是“只会改小 bug”。于是评测者引入难度分级,把任务按复杂度拆成若干层,让通过率在每一层分别亮灯。

分级的直接收益是“区分度”——简单任务与困难任务的通过率落差。我们用 D 来量化这个落差:

回到关卡设计的场景:有了星级,设计师不再只会说“玩家好菜”,而是能指出“玩家在五星 Boss 战里集体崩盘”。难度分级让 SWE-bench 从一个枯燥的分数,变成一张标注了短板坐标的能力地图——这,就是诊断价值的起点。

D=Peasy−PhardPeasy\displaystyle D = \frac{P_{\text{easy}} - P_{\text{hard}}}{P_{\text{easy}}}
区分度说白了就是“难度差带来的通过率差”。差得越多,越能看出模型的深浅;D 越接近 0,说明这个基准根本拉不开差距。
  1. P_easy模型在基础级任务上的通过率,代表模型的基本功下限,例如 0.72。
    PeasyP_{\text{easy}}
  2. P_hard模型在专家级任务上的通过率,代表模型能力的上限,例如 0.20。
    PhardP_{\text{hard}}
  3. 差值减法用 P_easy 减去 P_hard,得到通过率随难度上升而损失的绝对落差,这里的量纲仍是“比例”。
    Peasy−PhardP_{\text{easy}} - P_{\text{hard}}
  4. 除以 P_easy 归一化把落差除以基础通过率,得到相对落差,消除不同模型基础水平不同带来的偏差。
    Peasy−PhardPeasy\frac{P_{\text{easy}} - P_{\text{hard}}}{P_{\text{easy}}}

分级依据:四个信号

关卡评星不能只看 Boss 血量。一个 Boss 血厚但动作笨拙,另一个 Boss 血少却会召唤小怪、还会拆桥,难度天差地别。设计师手里盯着一套评分表,上面写着四行指标:Boss 血量、召唤物数量、机关连锁度、战斗场地大小。SWE-bench 的难度分级,也依样画葫芦地使用四个信号。

首先是代码改动范围。它关注任务涉及的源文件数量与增删行数:只改一个文件的单行逻辑,和横跨五个文件的大手术,显然不在一个量级。其次是依赖复杂度,即任务牵涉的内部模块数、第三方库调用数,以及这些依赖之间的耦合深度——就像 Boss 召唤的小怪越多,场面越难控制。第三是任务类型:bug 修复通常目标明确,功能实现需要凭空设计,重构则要在不破坏行为的前提下调整结构,三者难度基准天然不同。最后是上下文长度,指 Issue 描述加上相关代码片段的总长度——战场越大,模型需要同时记住的信息就越多。

这四个信号的量纲各不相同,先归一化为 F₁ 到 F₄,再按权重加权求和,得到任务的综合难度得分:

你发现没有?星级不是拍脑袋定的,而是像游戏评分表一样,把“敌人强度、机关密度、地图规模”逐项打分后加总——每一个关卡都有据可查,每一个 SWE-bench 任务也都有它的“难度档案”。

Score=w1F1+w2F2+w3F3+w4F4\displaystyle \text{Score} = w_1 F_1 + w_2 F_2 + w_3 F_3 + w_4 F_4
权重由评测者对数据集的经验标定:改动范围最直观,所以权重最大;依赖复杂度次之;任务类型和上下文长度作为辅助调节,避免单指标误伤。
  1. F₁ 到 F₄四个信号各自归一化后的得分,取值在 0 到 1 之间,代表“这一维度有多难”。
    F1,F2,F3,F4F_1, F_2, F_3, F_4
  2. w₁ 到 w₄四个信号对应的权重,表示评测者认为哪个维度更关键,所有权重之和通常为 1。
    w1,w2,w3,w4w_1, w_2, w_3, w_4
  3. 加权求和把每个维度的难度贡献乘上权重再累加,得到一个综合的难度分数,分数越高,任务越难。
    w1F1+w2F2+w3F3+w4F4w_1 F_1 + w_2 F_2 + w_3 F_3 + w_4 F_4

分级流程:四步定级

设计师拿到一个新关卡,会走一套标准流程:先扫描地图数据(敌人数量、机关位置),再对照公司标准表把原始数据换算成“威胁值”,接着填入加权公式计算总分,最后按总分贴星。SWE-bench 的难度分级流程,就是这条流水线的翻版。

第一步是信号提取。从 Issue 文本、补丁文件和仓库元数据中,读取涉及文件数、依赖模块数、任务类型标签和上下文行数。第二步是规则映射。用启发式规则把原始信号转换为归一化得分,处理“文件数从 1 到 30”这种跨度极大的情况。第三步是综合打分,按权重加权求和得到难度得分。第四步是等级划分,按分数区间把任务映射到具体的难度档位。

第二步的归一化尤其关键。文件数、依赖数、上下文行数都呈长尾分布——大多数任务改动小,少数任务大得离谱。如果直接用原始值,极少数巨无霸任务会把平均分带偏。于是采用对数压缩:

四步流程把“评星”变成了自动化的流水线作业,任何新任务丢进来,都能在几毫秒内贴好难度标签——这为大规模评测提供了工程上的可行性。

F=log⁡(1+x)log⁡(1+xmax⁡)\displaystyle F = \frac{\log(1 + x)}{\log(1 + x_{\max})}
对数压缩就像“工资个税阶梯”:10 万和 1 亿的差距,在对数尺度上被压成 5 和 9,极端值不再一票否决,普通任务也能获得合理的区分。
  1. x 与 x_maxx 是当前任务的原始信号值(如涉及 3 个文件),x_max 是整个数据集里该信号的最大值(如 30 个文件)。
    x,xmax⁡x, \quad x_{\max}
  2. log(1+x)对原始值取对数,把 1、3、10、30 这种快速增长的数字压缩到接近 0、0.6、1、1.3,避免大数压垮小数。
    log⁡(1+x)\log(1 + x)
  3. 比值归一化除以 log(1+x_max),保证 F 落在 0 到 1 之间,让文件数、依赖数、上下文长度可以在同一个量纲下加权。
    log⁡(1+x)log⁡(1+xmax⁡)\frac{\log(1 + x)}{\log(1 + x_{\max})}

难度层级:四档台阶

星级最终要落成玩家看得懂的档位。游戏通常把关卡分成“新手村、迷雾森林、暗影城堡、最终圣殿”四档,每档对应不同的装备门槛和剧情进度。SWE-bench 也把连续的难度得分切成四档,每档对应一种典型的工程场景。

基础级(easy):单文件、零外部依赖的小改动,最常见的是修一个变量名错误或补一个边界条件,上下文通常很短。进阶级(intermediate):跨 1 到 2 个模块、依赖模块较少的改动,需要理解函数间的调用关系。挑战级(hard):多文件协调、强依赖耦合,要求模型深入理解项目架构后才能动手。专家级(expert):大规模重构或跨仓库协作,涉及大量内部库调用与极长上下文,即使人类工程师也要花上半天。

分档方式的数学表达很简单——把连续得分切成等宽的桶:

四档台阶让“星级”有了正式的名字。从此模型评测报告里不必再写“得分 0.73”,而是直接写“在挑战级任务上通过率 31%”——就像游戏存档上的推荐等级一样,任何人一看就懂。

Level=⌊ScoreΔ⌋\displaystyle \text{Level} = \left\lfloor \frac{\text{Score}}{\Delta} \right\rfloor
等宽分箱就像把身高按 5 厘米一档分成“矮、中等、高”,简单直观,方便统计。Δ 越小,分档越细;Δ 越大,每档内部的任务差异越明显。
  1. Score上一步加权求和得到的任务难度得分,例如 0.83。
    Score\text{Score}
  2. Δ(Delta)档位宽度,即每一档覆盖的分数区间大小,例如 0.4 分一档。
    Δ\Delta
  3. 向下取整把除法结果向下取整,确保 0.8 分落在第 2 档而不是第 3 档,边界清晰不重叠。
    ⌊⋅⌋\left\lfloor \cdot \right\rfloor

通过率分布:层层衰减

玩家社区里流传着一张“通关率热力图”:越靠近关底 Boss 的房间,墙上刻的通关记录越少。没人会对此感到惊讶——难度越高,通关率越低。但“低到什么程度”,才是真正的传说级情报。SWE-bench 的评测数据揭示了同样的模式。

整体下坡:从基础级到专家级,几乎所有主流模型的通过率都单调递减,没有哪个模型能违背这条大趋势。模型差异:最耐人寻味——基础级任务上,弱模型和强模型差距很小,大家都能轻松过关;可是一到专家级,强弱模型的通过率会被急剧拉开,强者恒强。影响因素:Issue 描述是否清晰、隐藏测试是否严格、参考补丁是否容易从上下文中推断,都会改变同一个任务的实际难度。基准验证:这些规律在多个主流模型和多个 SWE-bench 子集上反复出现,说明“难度越高通过率越低”不是一个巧合,而是稳定可复现的评测现象。

若把难度水平记为 d(基础级=1,专家级=4),通过率大致服从指数衰减:

设计师只需看一眼热力图,就知道下一个 Boss 该设计得多难;评测者只需拟合出衰减曲线中的 k 值,就能判断一个模型是“通才”还是“只会在新手村逞能”。

P(d)=P0⋅e−kd\displaystyle P(d) = P_0 \cdot e^{-k d}
指数衰减就是“每升一级难度,通过率约打固定折扣”。比如每升一级打七折,四级下来就只剩三成半;k 越大,模型在难度面前“崩得越快”。
  1. P₀拟合出的理想基础通过率,相当于“零难度”时的通过率上限,通常小于 1,因为模型永远不会 100% 正确。
    P0P_0
  2. e 的指数幂以自然常数 e 为底的指数函数,让 P(d) 随 d 的增长呈光滑的递减曲线。
    e−kde^{-k d}
  3. k(衰减速率)控制曲线下降快慢的核心参数,k 越大,高难度任务的通过率掉得越惨,是衡量模型“抗压能力”的指标。
    −kd-k d

诊断应用:能力画像

俱乐部把星级关卡当作“体检器械”,给每位玩家出具专属报告:力量型玩家在 Boss 关高光,解谜型玩家在机关关高光,全面型玩家处处不拉胯。模型同样需要这样的体检。难度分级的最终目的,不是把任务分个三六九等就完事,而是把分层后的通过率数据变成可执行的诊断结论。

能力画像:把任务类型和难度两层交叉统计,横轴是 bug 修复、功能实现、重构等类型,纵轴是从基础级到专家级的通过率,画成雷达图或热力图——一眼看清模型在哪个象限里是学霸、哪个象限里是学渣。短板识别:对比同一个模型在简单与困难任务上的通过率落差,落差最大的类型就是它的短板。研发方向:短板数据直接指导数据采集、指令微调或强化学习训练策略的分配。横评标准:不同模型在相同难度维度上的对比,逐渐成为行业里衡量代码模型能力的标准化参考。

为了量化某个任务类型 j 的短板程度,定义能力落差指标:

评分表的终点是让玩家变强,难度分级的终点是让模型变强。每一档通过率都是一个改进指令:如果功能实现的 Gap 远大于 bug 修复,那下一次训练,就该往功能实现方向加码了。

Gapj=Pˉj,easy−Pˉj,hard\displaystyle \text{Gap}_j = \bar{P}_{j,\text{easy}} - \bar{P}_{j,\text{hard}}
能力落差就像“体育课分项成绩”:百米和马拉松都厉害才是真全面,只擅长一个项目的话,落差距会立刻把你戳穿。
  1. 类型 j任务类型下标,可以取 bug 修复、功能实现或重构,代表我们要考察的能力维度。
    jj
  2. P̄_j,easy模型在类型 j 的所有基础级任务上的平均通过率,反映这个能力维度的下限水平。
    Pˉj,easy\bar{P}_{j,\text{easy}}
  3. P̄_j,hard模型在类型 j 的所有专家级任务上的平均通过率,反映这个能力维度的上限水平。
    Pˉj,hard\bar{P}_{j,\text{hard}}
  4. 相减求落差简单减去困难,得到“遇难则崩”的幅度,Gap 越大,说明这个维度越是模型的软肋。
    Pˉj,easy−Pˉj,hard\bar{P}_{j,\text{easy}} - \bar{P}_{j,\text{hard}}

AI 应用场景

场景一:模型能力评估报告

阶段:评测与分析

解决的问题:传统评测只报平均通过率,掩盖了模型在复杂任务上的真实缺陷,导致团队误以为“模型已经够好了”,上线后却在真实工程场景中频繁翻车。

具体案例:某大模型团队在发布新版代码模型前,用 SWE-bench 难度分级数据制作“能力体检卡”:展示 bug 修复在简单任务上通过率 82%、困难任务上只有 15%,功能实现更是低至 8%。报告让管理层直观看到“长链路修复”是当前短板,于是决定推迟发布并补训相关数据。

场景二:课程学习的数据筛选

阶段:训练数据准备

解决的问题:训练代码模型时均匀采样任务数据,会导致模型被海量简单样本“喂饱”,困难样本见识太少,模型始终学不会复杂改造。

具体案例:机器学习工程师在构建训练集时,先按难度分级给数据打标签,再按“基础级 50%、进阶级 30%、挑战级 15%、专家级 5%”的比例分层采样。训练过程中逐渐提高高难度任务的占比,实现课程学习(Curriculum Learning),让模型先在简单任务上打牢语法基础,再逐步挑战架构级改动。

场景三:模型选型横评

阶段:技术选型

解决的问题:企业选购代码模型时,供应商提供的平均分相差无几,难以判断哪个模型更适合自己的复杂业务代码库。

具体案例:某金融科技公司的技术负责人对比两个候选模型:A 模型总通过率 38% 略高于 B 的 36%,但按难度分级拆开看,A 在专家级通过率只有 7%,而 B 达到 18%。考虑到公司的核心系统都是跨模块的高耦合代码,负责人最终选择 B,并在汇报中用“难度分级通过率曲线”成功说服了决策层。

Python 演示

python57 行
import math # 模拟 SWE-bench 任务实例TASKS = [    {"id": "t001", "files": 1, "deps": 0, "kind": "bug_fix", "context": 120, "passed": True},    {"id": "t002", "files": 1, "deps": 1, "kind": "bug_fix", "context": 200, "passed": True},    {"id": "t003", "files": 2, "deps": 3, "kind": "feature", "context": 380, "passed": False},    {"id": "t004", "files": 3, "deps": 5, "kind": "feature", "context": 520, "passed": False},    {"id": "t005", "files": 1, "deps": 6, "kind": "refactor", "context": 640, "passed": False},    {"id": "t006", "files": 4, "deps": 8, "kind": "feature", "context": 900, "passed": False},    {"id": "t007", "files": 5, "deps": 12, "kind": "refactor", "context": 1200, "passed": False}] KIND_WEIGHT = {"bug_fix": 0.8, "feature": 1.0, "refactor": 1.2}WEIGHTS = {"files": 0.35, "deps": 0.30, "kind": 0.20, "context": 0.15}LEVEL_NAMES = ["easy", "intermediate", "hard", "expert"]  def norm(value, vmax):    """对原始信号做对数压缩归一化"""    return math.log(1 + value) / math.log(1 + vmax)  def score_of(task):    """按四个信号加权求和,返回难度得分"""    s = 0.0    s += WEIGHTS["files"] * norm(task["files"], 5)    s += WEIGHTS["deps"] * norm(task["deps"], 10)    s += WEIGHTS["kind"] * KIND_WEIGHT[task["kind"]] / 1.2    s += WEIGHTS["context"] * norm(task["context"], 1000)    return s  def level_of(score):    """按得分区间映射到难度等级"""    idx = int(score // 0.45)    return LEVEL_NAMES[min(idx, len(LEVEL_NAMES) - 1)]  def main():    stats = {}    for t in TASKS:        sc = score_of(t)        lv = level_of(sc)        stats.setdefault(lv, {"total": 0, "passed": 0})        stats[lv]["total"] += 1        if t["passed"]:            stats[lv]["passed"] += 1     print("Difficulty level distribution in SWE-bench:")    for lv, v in stats.items():        rate = v["passed"] / v["total"] * 100        print(f"  {lv}: pass rate = {rate:.1f}% ({v['passed']}/{v['total']})")  if __name__ == "__main__":    main()
目的:演示难度分级器如何从四个信号出发,为每个任务计算难度得分、划分等级,并统计不同难度档位上的通过率分布。
  1. def norm(value, vmax):对数归一化函数,把文件数、依赖数这类长尾分布信号压到 0~1 区间,防止大任务一票否决。
  2. s += WEIGHTS["files"] * norm(task["files"], 5)改动范围信号加权,文件数越多、改动越大,得分越高。
  3. s += WEIGHTS["kind"] * KIND_WEIGHT[task["kind"]] / 1.2任务类型信号加权,重构比 bug 修复默认更难,除数 1.2 是为了让权重归一化。
  4. idx = int(score // 0.45)根据分数区间映射难度档位,得分越高、档位越靠后。
  5. stats.setdefault(lv, {"total": 0, "passed": 0})按难度等级分组统计,每个等级维护任务总数和通过数。
  6. if __name__ == "__main__": main()程序入口,保证作为模块导入时不会误执行评测逻辑。

常见误区

误区我以为任务难度只看代码改动范围,改得越多的任务就越难。一个文件改动 200 行的任务,肯定比改 2 个文件各改 5 行的任务难得多,其他信号都不用看。

正解改动范围只是四个信号之一,而且不是唯一的主角。改 2 个文件各 5 行,可能涉及跨模块理解,模型需要先读懂两个模块的接口契约;改 200 行却很可能是往一个脚本里堆重复代码。依赖复杂度和上下文长度常常比行数更能反映真实难度。多信号加权打分,正是为了纠正“单指标定天下”的偏见。

为何常见:改动行数是补丁里最直观、最容易统计的数字,人脑天然倾向于用最简单可得的信号做判断,于是忽略了对依赖链和上下文的理解成本。

误区只要某个任务所有模型都做不对,通过率几乎为 0,那它一定是最难的任务,难度标签直接按通过率倒排就行,何必搞什么四信号打分。

正解通过率是模型能力与任务特性交互的结果,不是任务固有的属性。一个任务通过率低,也可能因为 Issue 描述含糊、隐藏测试用例苛刻、训练数据里缺乏同类样本,导致模型“发挥失常”。难度分级依据的是任务本身的元数据信号,属于“事前标定”;通过率是评测的事后统计,两者不能混为一谈。否则,模型变强之后所有任务的难度标签都会失真。

为何常见:人习惯用结果倒推原因,看到“没人通关”就本能地归结为“关卡太难”,忽略了评测环境、提示质量和样本偏差等干扰因素。

误区只要给 SWE-bench 的任务标好了难度标签,这个标签就永远有效。模型能力再强,专家级还是专家级,不用重新标定。

正解难度是相对的。随着模型能力整体提升,曾经的“专家级”任务可能集体跌到“挑战级”甚至“进阶级”,通过率曲线会整体右移,区分度随之下降。评测基准需要周期性重新标定难度阈值,否则就会像旧版考试难度配不上新一代学生一样失灵。这也是为什么 SWE-bench 社区强调分级方法必须“可复现、可更新”。

为何常见:标签一旦生成,就容易被当成静态的元数据存储,人们忽略了“难度”本质上是一个相对模型能力而变化的动态量。

误区评测模型只需要关注专家级任务的通过率。简单任务谁都会做,说明不了问题,看它们纯属浪费时间。

正解基础级任务是“能力基线”,用来判断模型是否具备基本的代码理解和修改素养;专家级任务是“能力上限”,检验模型的复杂工程能力。只有把全谱系的难度放在一起,才能画出完整的能力曲线。一个模型基础级 90%、专家级 5%,和另一个基础级 60%、专家级 5%,短板形态完全不同,前者是“偏科高手”,后者是“全面平庸”——只看最难一档根本分不清。

为何常见:压轴题天然吸引眼球,话题性最强,但评测的科学性依赖系统性的分层取样,戏剧性并不等于信息量。

面试题

Q1. SWE-bench 任务难度分级的主要目的是什么?

单选题 · easy

  • A.降低基准测试的整体通过率
  • B.让评测结果获得更细粒度诊断← 正确答案
  • C.减少模型推理所需的计算资源
  • D.替代人工编写全部测试用例

答案:B。难度分级把任务按复杂度分层,让通过率从“单一总分”变成“分层诊断报告”,对应答案是 B。A 是误解,分级不是为了压低分数;C 和 D 与分级目标无关。

Q2. 以下哪项不属于 SWE-bench 难度分级的核心依据?

单选题 · easy

  • A.代码改动范围
  • B.依赖复杂度
  • C.模型参数量← 正确答案
  • D.上下文长度

答案:C。难度分级依据的是任务本身的元数据信号——改动范围、依赖复杂度、任务类型、上下文长度。模型参数量是模型属性,不是任务属性,正如关卡难度由关卡设计决定,与玩家装备无关。

Q3. 难度得分公式 Score = w₁F₁ + w₂F₂ + w₃F₃ + w₄F₄ 中,Fᵢ 的含义是什么?

单选题 · mid

  • A.对应维度的归一化难度得分← 正确答案
  • B.模型在该任务上的通过率
  • C.训练数据的批次大小
  • D.隐藏测试用例的数量

答案:A。Fᵢ 是第 i 个信号(改动范围、依赖复杂度等)经对数归一化后的得分,取值 0~1。B 是事后统计,不参与事前定级;C、D 与难度信号的数学定义无关。

Q4. 归一化函数 F = log(1+x)/log(1+x_max) 的主要作用是?

单选题 · mid

  • A.把数据变成标准的正态分布
  • B.将不同量纲的原始信号压缩到同一尺度← 正确答案
  • C.过滤掉所有超出阈值的数据点
  • D.让所有任务的难度得分完全相同

答案:B。文件数从 1 到 30、上下文从 100 行到 2000 行,量纲差异巨大。对数压缩把长尾分布映射到 0~1,使四个信号可以加权相加。A 不对,对数归一化不产生正态分布;C、D 与归一化目标相反。

Q5. 关于 SWE-bench 通过率分布,以下说法正确的有哪些?

多选题 · mid

  • A.难度越高通过率普遍越低← 正确答案
  • B.强弱模型在高难度任务上差距更大← 正确答案
  • C.任务描述清晰度会影响实际通过率← 正确答案
  • D.所有模型在各难度档位的通过率完全相同

答案:ABC。A 是“整体下坡”规律,B 是“模型差异”现象,C 是“影响因素”之一,三者都在评测数据中被反复验证。D 显然错误——如果所有模型通过率都一样,基准测试就没有任何区分价值了。

Q6. 一个任务只改 1 个文件但依赖 3 个内部库,另一个任务改 2 个文件且零依赖。按多信号加权打分,哪个可能被判为更难?

单选题 · hard

  • A.前者,因为依赖复杂度是独立强信号← 正确答案
  • B.后者,因为文件数是唯一权威依据
  • C.两者分数必然完全相同
  • D.无法判断,难度分级从不看依赖

答案:A。难度分级是四信号加权,不只看文件数。依赖复杂度作为独立的强信号参与打分,改 1 个文件但依赖 3 个内部库,往往需要跨模块理解,加权后得分可能更高,因此 A 正确。B 错在把文件数当成唯一依据;C 忽视了权重分配差异;D 与分级方法相悖。

Q7. SWE-bench 难度分级的典型应用场景包括哪些?

多选题 · mid

  • A.生成模型的多维度能力画像← 正确答案
  • B.识别模型的具体能力短板← 正确答案
  • C.横向对比不同模型的优劣差异← 正确答案
  • D.直接替代模型的训练过程

答案:ABC。能力画像、短板识别、横评对比都是难度分级的直接应用。D 是错误的——难度分级是评测工具,只能指导训练方向,不能替代训练本身,就像考试分数能反映学生水平,但不能替代上课。

Q8. 以下哪些因素会影响 SWE-bench 任务的实际难度表现?

多选题 · hard

  • A.Issue 问题描述的清晰程度← 正确答案
  • B.仓库代码的风格与可读性← 正确答案
  • C.隐藏测试用例的严格程度← 正确答案
  • D.评测所用 GPU 的显存大小

答案:ABC。描述清晰度决定模型能否准确理解需求,代码风格影响调试验证难度,测试用例严格程度决定补丁是否容易“蒙混过关”,这些都是实际难度的影响因素。GPU 显存只影响推理速度,不改变任务本身的理解难度,好比换更好的键盘不会让题目变简单。

Q9. SWE-bench 难度分级对 AI 行业的核心价值是什么?

单选题 · easy

  • A.完全替代所有人工代码评测
  • B.提供可复现的标准化能力参考← 正确答案
  • C.让所有模型获得相同评测得分
  • D.减少 AI 模型训练所需的算力

答案:B。难度分级以任务元数据为支撑、有明确的计算流程,输出可复现的分层通过率,成为行业横向对比的标准参考。A 过于绝对,分级不能替代人工评测的全部价值;C 与目标相悖;D 与评测无关。

Q10. 通过率指数模型 P(d) = P₀·e^(−kd) 中,参数 k 反映的是什么?

单选题 · hard

  • A.通过率随难度上升的衰减速度← 正确答案
  • B.训练集里样本的总数量
  • C.模型上下文窗口的长度
  • D.隐藏测试用例的覆盖比例

答案:A。k 是衰减速率,k 越大,曲线下降越陡,说明模型在高难度任务上“崩得越快”——这正是衡量模型抗压能力的指标。B、C、D 分别是数据量、模型参数和测试属性,与衰减曲线的形状无关。