To Diff or Not to Diff? Structure-Aware and Adaptive Output Formats for Efficient LLM-based Code Editing
本文介绍了结构感知差异格式(BlockDiff 和 FuncDiff)以及一种自适应策略(AdaEdit),使大语言模型能够动态选择最节省令牌的编辑格式,在实现全代码准确性的同时,将长代码编辑任务的延迟和成本降低 30% 以上。
原始论文采用 CC BY 4.0 许可(http://creativecommons.org/licenses/by/4.0/)。 这是对下方论文的AI生成解释。它不是由作者撰写或认可的。如需技术准确性,请参阅原始论文。 阅读完整免责声明
想象你是一位资深编辑,正与一位才华横溢但略显死板的机器人助手合作。你的任务是指导该机器人如何修复一段代码(即一组计算机指令)。
问题所在:“蛮力”机器人
目前,大多数 AI 编程助手的工作方式就像一位蛮力画家。如果你要求它们修改一本 1000 页书中仅仅一个词,它们不会只写出那个新词,而是会从头开始重写整本 1000 页的书。
- 为何这是糟糕的: 这极其缓慢(高延迟),且消耗巨大的计算资源(高成本),因为它们生成了成千上万你根本不需要的词。
- 替代方案: 你可能会想,“只需告诉机器人写一个‘差异’(diff,即变更列表),例如‘第 5 行:将'cat'改为'dog''"。
旧有的“差异”问题:脆弱的地图
该论文发现,标准的“差异”格式就像脆弱的藏宝图,依赖于精确的坐标(例如“前往第 42 行,第 3 列”)。
- 问题所在: AI 模型擅长推测上下文,却不擅长计数。如果 AI 猜错行号是 43 而不是 42,整个指令就会失败。这就像根据一个不存在的门牌号给人指路;他们立刻就会迷路。
- 另一个问题: 有时“差异”会将一个句子切断,要求 AI 仅修复句子的中间部分,而没有开头或结尾。这对 AI 来说显得不自然,从而导致错误。
解决方案:“块”与“函数”方法
作者 Wei Cheng 及其同事引入了一种与机器人沟通的新方式。他们不再提供坐标或破碎的句子片段,而是教导 AI 以逻辑块进行思考。
将代码文件想象成不是长长的行列表,而是一座乐高城堡。
- 旧方法: “移除第 10 行、第 5 列的红色积木。”(难以定位,容易出错)。
- 新方法(BLOCKDIFF 与 FUNCDIFF): “取出城堡的整个‘窗户’部分,并用新的窗户设计替换它。”
现在,AI 将代码视为连贯的单元(如循环、函数或 if 语句)。它会一次性重写整个“窗户”或“门”。这对 AI 来说自然得多,就像人类描述修复整个房间比移动单块瓷砖更容易一样。
智能切换:ADAEDIT
研究人员意识到,有时重写整个“块”实际上比重写整页还要“多此一举”。如果你需要修改 90% 的代码,发送变更列表比直接发送新代码还要长。
因此,他们创建了ADAEDIT,一个智能开关。
- 工作原理: 在 AI 开始输入之前,它会审视任务并自问:“是发送变更列表更快,还是直接发送整个新代码更快?”
- 结果: AI 学会自动做出这一选择。如果变更很小,它发送“块差异”;如果变更巨大,它发送完整代码。
结果:更快、更便宜、同样出色
该论文在各种编程任务上测试了这种方法。以下是他们的发现:
- 准确性: 新方法与传统“重写一切”方法的准确性一样高。
- 速度与成本: 对于长代码,这种新方法快且便宜 30% 以上,因为它阻止了 AI 浪费时间重写未变更的代码部分。
- 可靠性: 由于 AI 不再猜测行号,这些“补丁”(修复)在应用到代码时确实有效。
简而言之: 该论文教导 AI 编程助手停止像复印机那样为单个错别字重印整本书,转而像一位熟练的编辑,知道何时只需替换一个段落,何时需要重写整个章节。
您所在领域的论文太多了?
获取与您研究关键词匹配的最新论文每日摘要——附技术摘要,使用您的语言。