你有没有想过一件事:我们天天在用的编程AI助手,比如IDE里那个能帮你写代码、改bug的智能助手,它们的"考试题"到底长什么样?
大部分人可能从没细想过这个问题。但JetBrains的研究团队想了,而且想出了一个挺让人意外的结论。
他们扒了4782次真实程序员使用编程助手的会话记录,结果发现一个扎心的事实:我们现在用来给AI编程助手打分的那些测试题,和真实程序员实际在用助手干的事情,压根不是一回事。
这不是一个无伤大雅的细节偏差,而是整个评测体系可能一直在"考错题目"。
**先看一眼现在的考题长什么样**
目前业界公认比较权威的编程助手测试集之一叫SWE-Bench Pro。
SWE-Bench Pro*:一个基于真实GitHub issue构建的编程智能体评测基准,要求AI读取一个软件缺陷或功能需求描述,然后生成一个能通过测试的代码补丁。
这类基准的玩法很统一:扔给AI一个详细描述清楚的问题,AI一次性输出一个补丁,跑测试,通过就算分。
研究团队统计了一下,SWE-Bench Pro里94%的任务,要么是"修个bug",要么是"加个新功能",而且都是一次性讲清楚需求,一锤子买卖。
这就好比你去考驾照,科目二的考题永远是"倒车入库"和"侧方停车",教练也只教这两样,因为这是整个驾考体系默认的"标准路况"。
但真实开车的人每天面对的是什么?堵车要不要变道、导航突然重新规划、副驾驶临时改主意说要绕去买杯咖啡。
如果驾校的全部训练和考试都只覆盖"倒车入库"这一种场景,那考出来的司机,面对真实路况时,到底有多大把握能开好车?
**真实用户到底在干什么**
研究团队拿到的4782次真实会话,筛出了其中消息数量大于等于3条的"长对话"样本,这部分占了33%。
为什么只看长对话?因为短对话(用户只发一条消息,AI回一次就结束)往往是简单问答,没什么研究价值。真正能反映用户和AI怎么"打交道"的,是那些来回好几轮的会话。
这一看,问题就出来了。
在这些长会话里,修bug和加新功能这两类任务加起来,占比远远不到一半。剩下的大部分时间,用户在干这些事:问AI项目里某段代码是怎么运作的、让AI帮忙做规划、请AI审查一段改动、要求重构代码、执行某个命令。
更关键的是第二个发现:用户会在一次对话里反复切换任务类型。
一个典型的真实场景是这样的:用户先提了个新功能需求,AI刚开始写,用户突然插一句"等等,这段现有代码是干嘛的?",AI解释完,用户又说"那你先帮我规划一下怎么改",规划完才真正开始写代码,写完用户还要求"review一下这段改动"。
这是一条曲折的路,有问有答,有计划有调整,而不是一条直线冲到终点。
但现在的评测基准呢?它只测那条直线冲刺,根本不考核AI能不能应付这种九曲十八弯的真实对话。
论文里有一张图,专门画出了这种差异:左边SWE-Bench Pro的任务类型图,只有三种颜色的色块(新功能、修bug、重构),简单得像个儿童识字卡片;右边真实生产会话的图,是一张色彩斑斓、线条交织的桑基图,十几种任务类型来回流动、互相转化。
这张对比图本身就是最直观的证据,一个是单色道具,一个是万花筒。
**更麻烦的是,连"真实"本身都没有统一标准**
研究团队没有止步于此,他们还找了另外三份公开的人机交互数据集做对比:SpecStory(IDE导出的真实会话)、DataClaw(社区分享的AI编程助手会话)、SWE-chat(基于聊天场景的编程交互数据)。
结果发现,这三份数据集的"任务流"彼此之间也长得完全不一样。
SpecStory里规划类任务占比特别高;DataClaw被"执行命令"和短平快的操作型对话主导;SWE-chat里执行和规划两类任务占了大头。
这说明了一个很重要的事:根本不存在一种"放之四海而皆准"的真实用户行为分布。
不同产品、不同用户群体、不同使用场景,催生出的是完全不同的交互模式。
这就像问"中国人平均一天吃几顿饭"一样,南方人和北方人不同,上班族和自由职业者不同,你压根没法用一个数字概括所有人。
研究团队由此提出了这篇论文最核心的立场:不存在一个普遍适用的、"最真实"的编程智能体评测基准。基准的设计者必须先说清楚自己到底想测哪一类用户、测哪一种使用场景,然后去实际测量这类用户的行为分布,再照着这个分布去校准评测基准的交互方式。
这个主张听起来简单,但其实是在挑战整个行业默认的评测思路。
**任务流到底怎么量化**
光说"用户行为很复杂"还不够,研究团队得把这种复杂性变成可以计算、可以比较的东西,于是他们提出了一个叫"任务流"的概念。
任务流(Task Flow)*:用三组统计分布来刻画一批对话的整体特征,分别是会话长度分布(一次对话平均几条消息)、任务类型分布(每种任务类型出现的比例)、类型转移分布(从一种任务类型切换到下一种类型的概率)。
要测出这三组分布,第一步得先把每条用户消息打上标签,判断这条消息到底属于哪种任务类型。
研究团队设计了一套16类的任务分类体系,包括修bug、加新功能、写测试、重构、解释代码、规划、代码审查、执行命令等等,然后用一个开源大模型逐条给用户消息打标签。
为了验证这套分类靠不靠谱,他们用三个不同的开源模型对同样100条会话分别打标签,结果三个模型两两之间的平均一致率是76.1%。
这个数字说明什么?说明给自然语言消息分类这件事本身就带有一定的模糊性,不同模型之间会有分歧,但大体方向是可信的。
统计结果显示,4782次会话里,超过一半(50.9%)只有1条用户消息,75分位数是3条,90分位数是8条。第一条消息平均30.7个词,后续消息平均只有16到19个词,说明用户一开始会把需求讲得比较完整,后面的交流则更简短、更即兴。
而在那些长会话里,修bug占25.9%,新功能占18.9%,加起来不到一半,和SWE-Bench Pro的94%形成了鲜明对比。
值得单独说一说的是"解释代码"这个类型(EXPLAIN)。在长会话里,这类"帮我看看这段代码到底在干嘛"的请求占6.1%,加上更泛化的编程问答(QUESTION)类型的9.7%,两者加起来接近16%。
这类需求在issue驱动的基准里几乎完全不存在,但在真实使用中却稳定出现在对话的每一个位置。这个发现直接催生了论文后面要讲的一个解决方案。
**怎么把老基准改造成新基准**
发现问题是第一步,研究团队没有停在"吐槽现状",而是提出了一套具体的改造方案,叫SWE-TaskFlow。
SWE-TaskFlow*:一种把现有issue驱动型编程基准(比如SWE-Bench Pro)改造成多轮交互式评测的方法,核心思路是保留原有任务验证机制不变,只重新设计交互层。
这里有个关键的设计取舍:为什么不干脆重新收集一批真实多轮对话数据,自己造一个全新的基准?
因为那样做成本太高,而且会浪费掉现有基准里已经积累的宝贵资产,比如每个任务对应的代码仓库环境、验证补丁是否正确的测试用例。这些东西是经过大量人力验证过的,扔掉重来不划算。
这就像装修房子,如果地基和水电管线已经铺好且验收合格,你没必要为了改个风格就把房子推倒重建,只需要重新设计室内布局和软装就够了。
如果真要推倒重建,工程量和出错概率都会急剧上升,还可能引入新的质量问题,反而得不偿失。
SWE-TaskFlow具体做了两件事。
第一件事叫"提示拆分"(prompt splitting)。SWE-Bench风格的issue描述通常是一次性把目标、背景、约束条件甚至实现思路全都写在一条消息里,这其实是"过度规范化"的表现,真实用户很少这样做。拆分的做法是用大模型把一条issue拆成3条按顺序排列、各自独立成立的用户消息,模拟真实用户逐步透露需求的过程。
但这个拆分不是随便拆的,拆分模型必须严格保证:原始issue里的每一条需求都不能丢,不能凭空捏造新需求,代码片段、接口名这些技术细节必须原样保留,而且每一步新消息都要能在前面步骤留下的代码仓库状态基础上继续操作。
能通过这套严格检查的任务才会被保留下来,731个公开SWE-Bench Pro任务里,最终700个通过了检验。
第二件事叫"仓库问答"(repository QA),专门用来补上EXPLAIN这个类型的空缺。做法是从一个曾经成功解决过这个issue的AI运行记录里,挖掘出0到3个关于代码仓库行为的问题,这些问题会被插入到issue拆分出来的几条消息之间,可以放在最前面、中间穿插,或者放在最后。
这里最讲究的地方是怎么保证这些生成出来的问题是靠谱的。每个问题都配有一个隐藏的参考答案,而且必须经过一个可执行的"证明脚本"在干净的代码仓库副本里跑一遍验证,确保这个问题确实能从代码仓库本身推导出答案,确保它在补丁打上去之前和之后都依然成立,而且不会提前泄露issue的解决方案。
这套机制保证了"仓库问答"不是随便编的送分题,而是真正能检验AI对代码理解能力的硬指标。
拆分和问答两种手段加起来,每个任务可以生成1到6条用户消息,其中至少3条消息的那部分,就构成了对标真实长会话场景的新基准。
**怎么知道改造得够不够像**
有了拆分和问答这两个工具,接下来的问题是:怎么量化"这个改造后的基准,到底有多接近真实用户的任务流"?
研究团队为此设计了一个专门的打分指标,叫TaskFlow对齐分数。
TaskFlow Alignment Score,简称TFAS*:用来衡量一个生成的基准,在会话长度分布、任务类型分布、类型转移分布这三个维度上,和目标真实任务流有多接近的综合评分,取值范围0到100,100代表完全匹配。
TFAS的计算用到了一个叫Jensen-Shannon散度的统计工具,用来衡量两个概率分布之间的差异程度,差异越小,对应维度的得分越接近1,三个维度得分的几何平均数乘以100,就是最终的TFAS。
有了这把尺子,研究团队就可以做一件很有意思的事:对同一个任务,生成多种不同的拆分方式和问答插入方式,然后挑出TFAS分数最高的那一版,作为最终校准后的基准任务。
实验结果很说明问题。纯拆分(Split)的TFAS是59.6分,加上固定位置插入的问答后能提升到75.6到77.1分,而经过算法优化、自动选择插入几个问题以及插在哪个位置之后,TFAS进一步提到了77.8分。
这个优化过程保留了454个仓库问答问题,覆盖700个任务里的255个,有113个会话插了1个问题,85个插了2个,57个插了3个,插入位置也呈现出多样化分布,有的全放在issue消息之前,有的全放在之后,有的穿插在中间。
这组数据说明了一件事:单纯做拆分,离真实用户任务流还有相当的距离;只有把"解释代码"这类缺失的意图类型补回来,才能真正把基准的交互分布拉近到真实场景。
**改造之后,考出来的成绩会不一样吗**
这是整篇论文最硬核的实证部分。研究团队用mini-swe-agent这个开源AI编程助手框架,在GPT-5.6 Luna、GPT-5.6 Terra、GPT-5.4 Mini、Gemini 3.7 Flash四个模型上,对比了三种交互方式:Single(原版一次性给完整issue)、Split(拆分成3条消息)、Split+QA(拆分加仓库问答)。
结果出乎很多人的预料:Split相比Single,让AI解决同一批任务所花费的成本大约翻了一倍,但解决问题的成功率(resolve rate)并没有稳定地上升或下降,各个模型之间的变化方向还不一致,基本和同一设置多次重复运行产生的波动差不多大。
这个结果值得细细琢磨。
它不是说"交互方式拆分了之后AI变弱了",也不是"变强了",而是说交互协议本身这件事,会显著改变AI完成任务所需要付出的代价,但不一定改变AI最终能不能做对。
这其实是个挺深刻的发现。如果评测只盯着"做没做对"这一个指标,会完全漏掉"做对这件事到底耗费了多大代价"这个维度。两个AI可能最终都把任务做对了,但一个花了两分钟、一次问答就搞定,另一个被拆成三轮对话、中间还被追问了两次代码细节、花了双倍的钱才做对,这两种表现在真实使用体验上是天差地别的。
打个比方,两个学生都考了满分,一个是直接秒做完卷子交卷,另一个是被老师拦下来追问了三遍"你这步为什么这么写",追问完才勉强把分数拿满。
卷面分数一样,但这两个学生展现出的真实能力完全不是一回事,后者可能只是蒙对了答案,前者才是真正理解了。
如果评测只看最终分数,就永远发现不了这种差异,而如果只用"一锤子买卖"式的基准去测AI,这种差异也根本无从体现。
另外一个值得关注的数据是仓库问答的答题准确率,四个模型的表现在69.8%到83.0%之间,这是继"任务解决率"之外的第二个可验证信号。这意味着拆分加问答之后的新基准,不再只给出一个0或1的终极判断,而是能针对每一轮对话都产生一个独立的验证结果,这对后续做更精细化的诊断和训练都有价值。
研究团队还专门设计了一组对照实验,用来排除"拆分过程本身是不是丢失或扭曲了原始信息"这个干扰因素。他们设置了一个叫Concat的对照组,把拆分出来的三段内容原样拼回一条消息里发给AI,结果Concat和Single的表现接近,说明拆分本身没有明显损伤原始issue信息,真正带来成本变化的是"分批次、按顺序发送"这种交互形式本身。
他们还测试了仓库问答插入的位置(放最前、放最后、随机穿插)对结果的影响,发现不管怎么摆放,成功率和答题准确率都没有稳定的差异,这也说明TFAS优化算法可以放心地根据目标任务流去调整问题插入位置,不用担心这种调整会意外改变任务本身的难度。
**这事儿还没做完**
研究团队很坦率地承认,这篇论文目前只覆盖了16种意图类型里的一小部分。拆分方法只用于"修bug""加新功能"这类实现型任务,仓库问答只覆盖了"解释代码"这一种类型。
真实任务流里还有大量其他类型,比如一般性编程问答、规划、代码审查、重构、执行命令、不带修复的纯调试,这些目前都还没有对应的改造方法。
难点在于,很多这类任务没有现成的、可自动化的验证标准。一个规划步骤对不对,一次代码审查的意见好不好,目前都很难用脚本去判定对错,这是留给后续研究的开放问题。
研究团队还特别强调了一个更底层的区分:SWE-TaskFlow属于"静态交互",所有用户消息在AI开始干活之前就已经固定好了,这样做的好处是可以精确复现、公平对比不同AI模型的表现。但现实中还有一种"反应式交互",AI做了什么、用户才会给出下一步反馈,这种交互更贴近真实场景但没法完全复现,每次跑都可能因为模拟用户的随机性而有所不同。
这两种交互方式各有取舍,论文认为一个完整的评测体系应该把两者结合起来,用校准过的静态核心加上针对性的反应式压力测试。
论文最后也坦承了几个局限:意图分类器没有经过人工标注的标准答案集去验证准确率,只能用模型间一致性做参考;部分issue因为内容本身不满足拆分条件而被排除;仓库问答的难度会因为生成模型不同而有所波动;每组实验只跑了三次,用的是最大最小值区间而不是统计学意义上的置信区间,所以论文里报告的成功率变化都只能算方向性参考,还不能当作有统计显著性的结论。
写在后面
读完这篇论文,我脑子里一直转的一个问题是:我们是不是习惯性地把"评测基准做得越标准化、越干净"当成一种进步,却忘了问一句,标准化之后测出来的东西,到底还对不对得上真实世界?
这事让我想起一个更大范围的现象。很多领域的"标准化测试",一开始都是为了方便比较、方便复现而设计的,比如教育里的标准化考试、机器学习里的固定数据集。标准化本身没有错,错的是我们渐渐忘了这些标准只是"真实世界的一个简化切片",久而久之,大家开始为了考好这个切片本身而优化,而不是为了解决真实世界的问题而优化。
这篇论文让我意外的一点是,它没有简单地喊"基准不行,要重做",而是提出了一个更有操作性的思路:先测量,再校准。先老老实实统计清楚真实用户到底在干什么,再拿这份统计结果去调整评测该测什么、怎么测。这种"先调研再设计"的朴素逻辑,其实在很多工程领域都适用,只是在AI评测这个被"刷榜"心态裹挟得很深的领域,反而显得有点新鲜。
还有一个细节我觉得值得单独拎出来说:论文里提到,拆分交互让AI解决任务的成本翻了一倍,但成功率没有明显变化。这组数据乍一看有点"所以呢"的感觉,但细想一下很扎心,它说明现在很多AI编程助手的"聪明",可能很大程度上建立在"用户把话一次说清楚"这个隐藏假设上。一旦交互变得更像真实对话,AI要花更多力气去理解、去追问、去适应,这才是真实世界里AI助手每天在面对的隐性成本,只是过去的评测体系从来没把这部分成本算进去过。
如果你的编程助手在真实使用中经常让你觉得"每次都要多解释几句才懂",现在你知道了,这不是错觉,这是整个评测体系长期以来的一个盲区。
Q&A
Q1:SWE-TaskFlow是什么?
A:SWE-TaskFlow是一种把现有issue驱动型编程基准改造成多轮交互式评测的方法,通过提示拆分和仓库问答两种手段,在保留原有任务验证机制不变的前提下,让交互方式更贴近真实用户的使用习惯。
Q2:为什么现有的编程助手评测基准不够真实?
A:因为SWE-Bench Pro这类基准94%的任务都是一次性讲清需求的修bug或加新功能,而真实用户在长对话中会频繁切换提问、解释、规划、审查等多种任务类型,两者的交互模式差异很大。
Q3:交互方式改变后,AI编程助手的表现会有什么变化?
A:实验发现,把一次性需求拆分成多轮对话后,AI完成任务的成本大约翻倍,但最终解决问题的成功率没有稳定变化,说明交互协议本身是影响AI使用成本的重要因素,而不只是看最终是否做对。







