
这项由厦门大学多媒体可信感知与高效计算教育部重点实验室联合微软研究人员开展的研究,以预印本形式发布于2026年4月,论文编号为arXiv:2604.11716,有兴趣深入了解的读者可以通过该编号查询完整论文。
**一个程序员AI的烦恼**
假设你是一位公司里的高级程序员,每天要帮同事修复代码错误。你的工作方式是这样的:同事发来一个问题,你打开代码库,翻阅相关文件,思考哪里出了问题,然后动手修改。整个过程可能要来回操作几十次,查看文件、运行测试、分析报错信息、再修改……
现在,AI也被训练来做这种事了。这类任务在学术界被称为"软件工程任务"(SWE任务),简单说就是让AI自动找到真实代码仓库里的Bug并把它修好。这听起来很酷,但背后有一个长期被忽视的麻烦——AI在做这件事的时候,到底该怎么"思考"?
厦门大学的研究团队发现,现有的AI程序员普遍存在两种极端问题,任何一种都会让它的表现大打折扣。这项研究提出的解决方案叫做**SWE-AGILE**,它的核心是一套被称为"动态推理上下文"的工作机制,像给AI装上了一套高效的记忆管理系统。
**一、AI程序员面临的两难困境:要么浅尝辄止,要么撑爆记忆**
要理解SWE-AGILE解决了什么问题,得先理解AI在多轮工作时的"记忆"是怎么运作的。
你可以把AI的"上下文窗口"理解成一张有限大小的工作桌。AI每次思考,都要把相关的内容——历史操作记录、代码片段、工具返回的信息、自己之前写下的分析——全部摊开放在这张桌子上,才能做出下一步判断。桌子的面积是有限的,放的东西越多,找到有用信息的难度就越大,甚至会出现"明明放在桌上,却怎么也找不到"的情况。
现有的AI程序员大致分成两派来应对这个问题。第一派是"浅思考派",代表是SWE-Dev、SWE-smith这类系统。它们每走一步只写下简短的"想法备注",就像一个只会说"我要查这个文件"然后就去查的助手,思考过程非常浅。好处是桌面不会变乱,但坏处同样明显:遇到真正复杂的问题,比如一个隐藏在多个文件交互逻辑中的Bug,浅薄的思考根本不够用,很容易走弯路或做错判断。
第二派是"深思考派",也就是近年大热的推理模型,比如OpenAI o1、DeepSeek-R1。这类模型会在每一步都写下大量详细的分析过程——这种方式叫做"链式思维"(Chain-of-Thought,CoT)。研究人员发现,越长、越详细的思考过程往往对应越准确的答案。但把这种方式用到需要几十轮操作的程序修复任务上,就会遇到一个灾难性的问题:每走一步,桌子上就要多摆一大堆思考记录,很快桌面就会被塞满。
桌面塞满之后会发生什么?一方面,AI处理这么长的内容需要消耗巨量的计算资源,训练速度会急剧下降;另一方面,更致命的是一个被研究人员称为"迷失在中间"(Lost-in-the-Middle)的现象——当桌上堆满了东西,AI反而无法准确找到它需要的信息,就像在一张塞满文件的乱桌子上找一张便利贴,反而比整洁的桌子更难找。
还有第三种做法:允许AI深度思考,但思考完之后立刻把思考记录丢掉,只保留最终的操作指令。这样桌面确实保持整洁了,但代价是每走新的一步,AI都得从头把整个情况重新想一遍——就像一个每次开会都要从零开始熟悉项目背景的工程师,极其低效。
研究团队用实验验证了这个困境的真实性。在基础测试中,保留完整推理历史("深思考全留"方案)的成功率只有12.42%,而把推理历史全丢、每步只保留最新思考("当前步骤思考"方案)的成功率反而达到了15.83%。这个反直觉的结果清楚地说明:"更多信息"如果没有被妥善管理,反而是负担。
**二、SWE-AGILE的解法:给AI装一套"滑动记忆窗口"**
SWE-AGILE的核心思想,可以用一位经验丰富的侦探处理案件档案的方式来理解。
侦探每天都在调查新线索、翻阅文件、走访证人。他的工作台面积有限,不可能把所有卷宗都摊开。他的做法是:最近几天的调查笔记完整保留在桌面,随时可以翻看;更早的笔记则被整理成一份简明摘要——"第三天:走访了嫌疑人A,确认了其不在场证明,排除嫌疑"——只保留关键结论,不保留完整思考过程。这样,侦探既能回顾最近的调查细节,保持思路连贯,又不会被远古卷宗淹没。
SWE-AGILE就是这样运作的。每一个工作步骤,AI都被要求生成三个严格有序的部分:首先是详细的推理过程(用``标签包裹),这是AI真正"动脑筋"的地方;其次是一份对这次推理的压缩摘要,叫做"推理摘要"(Reasoning Digest);最后才是实际的工具调用操作,比如"查看这个文件的第50到80行"。
关键在于这三个部分如何进入"历史记录"。推理摘要和操作记录会被永久保存;而详细的推理过程,只有最近N步(N是一个随机设置在2到5之间的数)的完整内容会留着,更早的详细推理会被其对应的摘要替代,从历史上"消失"。这个N步的范围就是"滑动推理窗口",它保证AI在做下一步决策时,既能看到最近几步自己完整的思考脉络,又不会被几十步之前的冗长分析淹没。
这个设计产生了一种被研究团队形象地称为"锯齿形"的上下文增长模式。在窗口内,每步都有完整的深度推理,上下文快速增长;当某步的推理滑出窗口范围,它就被压缩成摘要,上下文随之收缩——增长与压缩交替出现,形成像心电图一样的锯齿形曲线,而不是像"全留方案"那样一路直线飙升直到撑爆。
**三、训练的难题:如何让AI真正学会"按规则记忆"**
设计出这套记忆管理机制只是第一步,更难的问题是:怎么训练AI去真正掌握这套规则?
通常训练AI的方式,是把它做过的所有操作记录排成一条长序列,让AI从头到尾学习。但这种训练方式和SWE-AGILE的实际工作方式之间存在一个根本矛盾:训练时AI能看到所有历史推理细节,但工作时窗口外的推理细节已经被替换成摘要,根本不存在了。用这种方式训练出来的AI,就像一个人在考试时能查书,但实际工作时却没有书——它学到的是一种在现实中不存在的条件下的行为。
为了解决这个矛盾,研究团队发明了"轨迹快照训练"(Trajectory Snapshot Training)。做法是把一条完整的工作轨迹拆分成若干"快照",每个快照代表AI在某个特定步骤时的视角——在那个视角下,窗口外的历史推理已经被替换成摘要。每个快照就是一个独立的训练样本,AI要学的只是"在这个视角下,如何生成正确的推理、摘要和操作"。
具体来说,每个快照由两部分组成。一部分是"冻结的背景"(计算损失时被屏蔽),它完整模拟了推理时的动态上下文状态,包含窗口内的完整历史推理和窗口外被压缩成摘要的历史;另一部分是"主动学习目标",也就是AI在当前步骤需要生成的完整三件套:详细推理、推理摘要、操作指令。这样,每一条完整轨迹被拆成T个快照,每个快照都精确还原了AI在那个时刻应该"看到什么"和"生成什么",训练与推理之间的鸿沟就被填平了。
**四、让AI学会"深度思考":反填数据合成流水线**
训练这套系统还面临另一个现实困难:现有的成功轨迹数据,比如开源数据集SWE-Dev里的记录,里面的"思考过程"都非常浅薄——大多数只是简单的一句话说明意图,完全没有SWE-AGILE所需要的那种深度分析。拿这种浅薄的数据去训练,不仅无法教会AI深度推理,实验还证明这反而会损害AI的能力(成功率从基础的15.83%掉到了14.83%)。
为了解决这个数据问题,研究团队设计了一套"事后反填"(Hindsight Backfill)数据合成流水线。这个方法的灵感来自于一个很有趣的思路:如果你已经知道了答案,回过头来"解释为什么这个答案是对的",要比从零开始推导容易得多,而且质量更高。
具体操作是这样的:拿一条原始的浅薄成功轨迹,在每个步骤上,用一个能力强大的推理模型(研究团队使用了Qwen3-235B)来"补写"详细推理和推理摘要。补写时,这个强大模型会拿到三样东西作为参考:第一是那个步骤对应的正确操作(也就是"答案"),确保补写出来的推理必然朝着正确结论走;第二是原始轨迹中那一步的浅薄想法,作为"语义提示",确保新推理和原始意图保持一致;第三是模拟了动态上下文约束的历史信息,也就是窗口外的部分已经被替换成摘要——这保证了合成的推理不仅格式正确,而且与运行时的实际条件完全匹配。
最终,每个步骤的浅薄记录就被"升级"成了包含详细推理和摘要的完整三元组,而不用从零收集新轨迹。这种方式在数据效率上极具优势——研究团队仅用了2200条轨迹(来自SWE-Dev原始19300条中的精选高质量子集),就完成了冷启动阶段的训练,省去了大量从零探索的环境执行开销。
另外,研究团队还补充收集了200条通过拒绝采样得到的新轨迹,这些轨迹从一开始就按照SWE-AGILE的完整格式生成,用来进一步减少后续强化学习阶段的分布偏移。
**五、强化学习阶段:用"压缩奖励"让AI学会精练表达**
完成了监督微调之后,研究团队还引入了强化学习阶段进一步优化,算法采用的是DAPO(一种开源的大规模强化学习框架)。
强化学习的核心是设计一个好的"奖励函数"——也就是告诉AI什么是好的表现、什么是差的表现。这里研究团队设计了一个聪明的奖励函数,它同时考虑了两件事:任务有没有成功,以及上下文压缩得怎么样。
压缩率的计算方式很直观:假设所有推理细节都完整保留在历史里,总共需要占用L_full个token;而在SWE-AGILE实际机制下,窗口外的推理已经被摘要替代,实际占用的是L_hybrid个token。压缩率R_comp就等于1减去(L_hybrid除以L_full),代表节省了多少比例的上下文空间。
最终的奖励函数是:如果任务成功(I_success=1),则奖励等于1加上β乘以min(R_comp, γ);如果任务失败(I_success=0),则奖励为零。这个设计有几个精妙之处值得细说。
奖励里用了"乘法门控":只有任务成功了,压缩奖励才会被加上去。这防止了AI为了追求压缩分数而牺牲正确率——如果AI把推理写得极短,摘要也超级简洁,但任务失败了,它什么奖励都得不到。
同时,奖励里对压缩率设了一个上限γ(设定值为0.55):如果压缩率已经达到了55%,继续提升就不会再带来更多奖励了。这防止了另一种作弊方式——AI可能会故意把推理写得极长,这样即使摘要也很长,"压缩率"看起来还是很高(分母变大了),但实际上并没有节省上下文。设了上限之后,这种"膨胀分母"的把戏就没有意义了。
研究团队还特别解释了为什么使用"全局轨迹压缩率"而不是"每步压缩率的平均值"。原因在于,有些步骤(比如"按计划执行刚才决定的脚本")本来就是简单的例行操作,推理本身就很短,摘要和推理差不多长,本地压缩率近乎零。如果用每步压缩率,AI会被激励在这些简单步骤上"水推理"以提高分母,这是没有意义的。而全局压缩率天然对这类简单步骤的贡献不敏感,把优化重心集中在了那些推理又长、又确实可以大幅压缩的"深度思考步骤"上,引导AI在复杂问题上充分展开、在简单操作上精练表达。
**六、实验结果:数字背后的真实意义**
研究团队在SWE-Bench Verified基准测试上评估了SWE-AGILE,这个基准包含500个来自12个真实GitHub代码仓库的软件问题。
从结果来看,仅经过监督微调的SWE-AGILE(SFT版本)使用Qwen3-8B模型,在只有2200条训练轨迹的情况下,成功率达到了21.45%。这个数字有几个值得关注的维度:相比基础的Qwen3-8B模型(15.83%),这是35.5%的相对提升;而同样规模的7B/8B级别竞争对手中,R2EGym用了3300条轨迹达到19%,SWE-Dev用了19300条轨迹达到23.4%——SWE-AGILE用少得多的数据超过了前者,并接近了后者。
加入强化学习阶段后,SWE-AGILE(SFT+RL)的成功率进一步提升到24.05%,超过了所有同等规模的基线。更值得一提的是,这个8B模型的成绩甚至超过了基于14B参数模型的SkyRL-Agent-v0(21.6%)。在可扩展性验证上,将SWE-AGILE的SFT流水线应用于Qwen3-14B,成功率跃升至30.06%,大幅领先现有14B基线。SWE-Bench Lite上,SWE-AGILE-8B的成功率为14.77%,同样超过了SWE-smith-7B(11.7%)和R2EGym(11.0%)。
研究团队还仔细分析了模型的"每步平均推理长度"。实验发现,"当前步骤思考"的基线方法平均每步需要约1075个token的推理,因为每步都要从头重建状态;SWE-AGILE(SFT+RL完整版)的平均每步推理降低到了约819.6个token,减少了约28%。这验证了推理摘要和滑动窗口确实起到了"认知缓存"的作用——AI不再需要每次都从原始观察重新推导,而是能从摘要中快速获取历史状态,把推理资源集中在真正需要的新问题上。
在压缩奖励的效果验证上,对比有无压缩奖励的RL版本可以发现,加入压缩奖励后,推理摘要(dt)的平均长度从41个token降低到了27.3个token,减少了33.4%,而任务成功率几乎没有变化(23.45%对比24.05%)。每步节省13.7个token看起来不多,但考虑到一条轨迹平均有二十多步,并且未来还可以将这一机制扩展到压缩工具输出(工具执行结果往往占据大量上下文),节省效果会显著放大。
**七、与同类方法的区别:为什么不用现成的压缩技术?**
有人可能会问:现在不是已经有很多"压缩推理"的技术了吗?比如LightThinker、InftyThink,为什么还要专门设计SWE-AGILE?
这是一个好问题,研究团队在论文中也给出了解释。LightThinker和InftyThink等技术解决的是"单轮内的推理压缩"问题——就是如何在一次对话中,把过于冗长的内部思考过程压缩得更短。但SWE-AGILE面对的是另一个维度的挑战:如何在几十轮来回交互的过程中,保持认知连贯性的同时不让历史积累的推理拖垮整个系统。这两个问题本质上是正交的(互不干扰的),SWE-AGILE实际上可以和这些单轮压缩技术叠加使用,潜力更大。
与LangChain的对话摘要缓存(ConversationSummaryBufferMemory)和MemGPT的工作上下文相比,SWE-AGILE也有两点关键区别。前者是对整体对话历史做增量摘要,生成一个不断生长的摘要段落;后者是维护一块固定大小的非结构化文本块。而SWE-AGILE的压缩目标是"推理过程"本身而非通用的交互内容,而且每步生成一个独立的结构化摘要条目,而非滚动更新一个大摘要——这种结构化的方式更符合大语言模型的预训练行为模式,也降低了摘要之间层层传递可能带来的错误累积风险。
**八、未来的方向与局限**
研究团队在论文末尾坦诚地指出了当前版本的局限。滑动窗口的大小N在整个流程中都被设定为2到5之间的随机整数,这种设定虽然证明了系统的鲁棒性(它能适应不同窗口大小),但关于"最优窗口大小是多少"以及"窗口大小是否应该根据任务复杂度动态调整",目前还没有系统性分析。
此外,论文提到了一个很有前景的未来方向:当前的机制能隐式地减少冗余状态重建(推理变短了),但还没有办法显式地检测和惩罚冗余推理。未来可以通过计算相邻步骤推理的语义相似度,或者用"AI评判者"来识别重复分析,进而直接过滤掉冗余的SFT轨迹,或者设计专门针对重复分析的RL惩罚项,把认知效率优化推向一个新的边界。
归根结底,SWE-AGILE解决的是一个在AI走向实用化过程中绕不开的基础问题:当一个AI系统需要在复杂的现实任务中持续工作几十轮,它的记忆该如何管理,思考该如何保持深度而不失控。厦门大学的这项研究给出了一个结构清晰、实验扎实的答案:不是"全记",也不是"全忘",而是用一个精心设计的滑动窗口,让近期的深度思考完整保留,让远期的历史思考凝练成摘要——这样的AI才能既聪明又持久。对于人工智能走向更复杂、更长程的实际任务场景,这或许是一个值得深入探索的方向。你可能会好奇:随着这类技术不断进步,有一天AI程序员会不会真的能独立处理一个完整软件项目的全部Bug,而不仅仅是一个孤立问题?这个问题,也许在不久之后就会有答案。希望追踪这一方向的读者可以通过arXiv:2604.11716查阅原论文。
---
Q&A
Q1:SWE-AGILE中的"推理摘要"和普通的对话摘要有什么不同?
A:普通对话摘要(比如LangChain的方案)是把所有历史对话内容滚动压缩成一段越来越长的摘要段落,压缩对象是通用交互内容。SWE-AGILE的推理摘要专门针对AI的"思考过程"本身,而不是操作记录。而且每一步独立生成一个结构化的摘要条目,不会层层叠加,降低了错误累积的风险,也更符合大语言模型的处理习惯。
Q2:轨迹快照训练为什么有必要,直接用普通训练方式不行吗?
A:不行。普通训练会把整条轨迹作为一个连续序列,让AI学习时能看到所有历史推理细节。但SWE-AGILE在实际运行时,窗口外的推理细节已经被摘要替换掉了。用普通方式训练出来的AI,学到的是一种"训练时能看到、运行时看不到"的条件下的行为,会造成训练和推理之间的根本错位,轨迹快照训练正是为了消除这个错位。
Q3:反填数据合成为什么要提供"正确操作"给推理合成模型?
A:这是"事后反填"(Hindsight Backfill)的核心思路。知道答案之后再"补写推理过程",能确保合成的推理必然指向正确结论,质量更高、格式更可控。如果不提供答案,推理模型只能从当前状态自由生成,可能得出错误结论,甚至和实际执行的操作相互矛盾,这样的数据反而会误导训练。
