写点什么

从补全到 Agentic Edit:Trae 在代码编辑上的落地与进化

冯绪 InfoQ

  • 2025-12-04
    北京
  • 本文字数:4951 字

    阅读完需:约 16 分钟

从补全到 Agentic Edit:Trae 在代码编辑上的落地与进化

作者|冯绪

编辑|李忠良

策划|AICon 全球人工智能开发与应用大会


当 AI 编程助手迈入 Agentic 阶段,它不再只是“补全工具”,而是能自我规划、跨文件协同、按反馈迭代的开发伙伴。围绕这一转变,Trae 团队走过“补全 + Chat → Apply → Builder + Cue”的三阶段路径,逐步攻克文件精准定位、跨文件修改与效率—准确性—资源开销的平衡。InfoQ 荣幸邀请到了冯绪字节跳动 /Trae 架构师 在 AICon 全球人工智能开发与应用大会·深圳站上分享了《Trae 插件在 Agent 代码编辑的落地实践》,他系统拆解 Apply 与 Search/Replace 的取舍、Cue 的智能补全机制,以及在“太阳系行星页面”等真实案例中的落地经验,提供可复用的工程方法论。


12 月 19~20 日的 AICon 北京站 将锚定行业前沿,聚焦大模型训练与推理、AI Agent、研发新范式与组织革新,邀您共同深入探讨:如何构建起可信赖、可规模化、可商业化的 Agentic 操作系统,让 AI 真正成为企业降本增效、突破增长天花板的核心引擎。


详细日程见:


https://aicon.infoq.cn/202512/beijing/schedule


以下是演讲实录(经 InfoQ 进行不改变原意的编辑整理)


AI 编程助手正加速走向智能化。凭借自主定位文件、修改代码以及自动规划与执行任务,AI Agent 既能高效完成开发工作,又能对结果进行自我校正与迭代,显著提升开发效率。然而,要实现上述能力,仍面临两项挑战:文件精准定位不足与跨文件修改困难。

TRAE 编程助手的发展阶段



在介绍 Trae 如何解决这些问题之前,先回顾其产品形态的演进,整体分为三个阶段。


第一阶段是最初、也是最基础的“补全 + Chat”。编辑能力以代码续写为主:根据用户在编辑器中的输入,系统自动提示可能的后续内容;同时提供聊天面板,用户可在其中提问并获得代码建议。但用户仍需手动复制粘贴,整体效率提升有限。


为解决手动复制粘贴的问题,进入第二阶段:Check & Apply。核心变化是在代码块上提供“Apply”能力,用户点击即可将生成的代码自动应用到原始文件,实现一定程度的自动化编辑。同时,我们开始探索模型的自动定位能力:当模型给出代码块时,会同时指明期望应用的目标文件。


第三阶段(也是当前阶段)是 Builder 与 Cue,目标是打造高度自动化的开发体验。其一,Cue 提供更智能的补全,支持多行编辑与智能改写,甚至可以预测下一步的光标位置;其二,Builder 能感知项目级上下文,自动规划任务,并完成多文件的编辑与迭代。在这三个阶段中,模型的编辑能力持续增强:早期仅能进行简单续写;中期具备一定的文件定位与修改能力;到第三阶段,已能自动定位与修改文件,并执行更为精确的编辑。

从代码补全到 Agentic Edit


现在来看 Trae 产品在代码编辑能力上的三阶段演进。代码补全是大模型最基础、也最擅长的能力。通过 Fill-in-the-middle、基于最近打开文件的上下文等策略,我们进一步提升了光标位置的续写效果。然而局限也很明显:只能在光标处编辑。


同一时期的 Trae 功能则显得较为鸡肋——模型生成代码后,用户仍需手动复制、粘贴,与直接打开 GPT 页面问答差别不大。为了解决这一问题并提升可用性,我们引入了 Apply 机制,使模型生成的代码片段能够准确无误地应用到原始文件中。



为实现这一目标,可以先分析当时 Trae 模型生成代码块的特征。


如上图所示,模型的实际输出并非完整文件,而是仅给出需要修改的核心片段。以该示例为例,模型按指令插入了注释,因此中间部分被完整展示;至于未涉及修改的上下文,则以 existing code 等简写形式标注,表示这些区域无需改动。


之所以采用这种输出方式,主要是为了显著减少 token 消耗,从而提升生成效率。众所周知,模型的上下文窗口存在限制。当时模型能力尚未达到如今水平,应用场景仍以问答式交互为主;受限于上下文窗口,模型难以一次性输出完整全文。此外,在生成回答时,大量 token 还需用于拼接所采集的上下文信息。


有人会问,为什么不采用 Diff 格式进行输出,就像 Git 那样?事实上,我们在实践中也尝试过这种方式,但发现存在两个主要问题。


首先,模型并不擅长输出 Diff 格式。Diff 格式对语法和符号(如“+”“-”)等要求非常严格,一旦输出的格式不符合标准,就会直接影响代码编辑的准确性;其次,用户在使用过程中需要良好的阅读体验。通常,用户在看到模型输出的代码后,会先确认其是否正确、是否符合预期,然后才会采纳。然而 Diff 格式本身可读性较差,阅读和理解起来比较费力。因此,我们最终放弃了采用 Diff 格式作为直接输出的方案。


由此带来的核心挑战是:如何将模型输出的带有缩略格式的代码块精准地合并到原始文件中?


由于代码在格式和内容上差异巨大,不同开发者的代码风格也千差万别,如果仅依赖规则匹配来完成合并,几乎不可能覆盖所有情况。



基于上下文与语义的改写任务,正是大模型能够发挥优势的场景。因此,我们训练了一个专用于代码编辑的 Apply 模型。该模型接收两类输入:一是原始文件内容,二是 Chat 模块 /Chat 模型输出的带有缩略的代码块(我们称之为 Plan)。在获取上述输入后,模型对内容进行改写与编辑,并输出编辑后的完整文件。随后,我们用该完整内容替换原文件,并以 Diff 形式展示给用户,便于判断哪些变更需要采纳、哪些可以忽略。


要实现这一目标,对模型的选型与训练提出了要求:其一,低时延;其二,良好的指令遵循能力;其三,支持长上下文。原因也不难理解:低时延可确保用户点击 Apply 按钮后快速看到编辑结果;而在编辑任务中,模型需要严格遵照 Plan 的指令输出,因此必须具备良好的指令遵循能力;同时,跨片段、跨文件的编辑需要更长的上下文支持。由于输入和输出会共享模型的 Token 窗口,而我们的方案要求将完整的原始文件交给模型处理,这会占用相当一部分上下文空间,导致留给生成内容的窗口减少。因此,模型必须具备较长的上下文处理能力,以确保能够覆盖更广的修改范围。


基于上述三点选型后,我们在训练数据的构造上投入了大量精力。具体而言,我们针对不同 Chat 模型的输出习惯,生成多种缩略格式的数据。不同的 Chat 模型对缩略格式的表达并不一致,甚至同一模型在不同次输出中采用的缩略方式也可能不同:有的会输出“existing code”,有的只会用“.”占位。为提升任务的准确性,我们对模型进行微调。


除了缩略格式,我们还面向不同场景构造数据:例如为“添加注释”“import 依赖”“删除代码”“代码重构”等需求准备样例。通常需要先理解用户意图,再生成相应数据,以提升模型在具体场景中的准确性。此外,我们也针对常用编程语言构造数据,使模型能够处理更丰富多样的场景。



经过一系列训练后,Apply 方案上线。这里有一个实际案例:我需要为某个文件的每个函数补充文档注释,只需给出“请为每个函数补上文档”的指令,模型就自动生成了相应内容;模型会输出相应的内容,部分函数细节可能采用了省略形式。随后,当我点击 apply 按钮后,模型能够根据生成的结果,为整个文件自动补充完整的注释。


这一方案的上线确实显著提升了用户体验,但也存在三方面的局限:其一,额外的资源开销——除了调用 Chat 模型生成代码块,还需再调用一个模型执行编辑任务,整体资源消耗上升;其二,效率不足——在部分场景中,Chat 模型只需改一行,Apply 模型却会重写整个文件,导致效率偏低;其三,长文件限制——输入与输出共享上下文窗口,文件过长不仅可能无法处理,还会影响生成结果的准确性。工程上我们通过设置长度上限来规避风险,但当超长文件被拒绝服务时,用户体验仍会受影响。


尽管存在这些限制,Apply 在当时确实带来了明显的体验提升,也启发我们反思:代码补全不应只做“续写”,还应进一步优化整体体验。


基于此,我们推出了更智能的代码补全功能 Cue。Cue 支持多点编辑,不再局限于续写,而是可以在多行中同时进行删除、替换与插入;同时具备光标预测能力,例如当用户在某一行引入方法时,它会提示在文件开头补充相应的 import;此外还能跨文件编辑,智能识别需要变更的目标文件,从而突破“仅限当前文件与当前行”的限制。



与 Apply 相比,Cue 的挑战更大,因为它需要理解更隐蔽的用户意图。用户可能连续输入大量字符或频繁移动光标,这些操作往往暗含需求但不直接显现。为此,我们通过分析用户的编辑历史来推断真实意图;在此基础上,Cue 还需要支持仓库级的跨文件编辑。我们基于 RAG 技术实现上下文感知,判断与当前编辑内容相关的其他位置是否也应同步修改,从而提供更智能的补全能力。


随着模型能力的快速提升,我们来到了 Authentic Edit 的时代——其特点是模型可以自主完成文件级编辑。与此同时,我们也开始探索更适合这一范式的代码编辑方案。


随着模型能力的持续增强,Builder 这一产品形态应运而生。它是一种 Agentic 的代码编程助手,能够自主搜索整个代码仓库,自行决定需要编辑的文件,并可对不同文件或同一文件进行多次编辑,同时保持逻辑一致性。围绕这一形态,我们也提供了更契合的编辑能力。


具体而言,我们为 Builder 配备了更丰富的编辑工具集:Write to File(用于新建文件)、Delete File(用于删除文件)以及 Update File(用于编辑文件)。其中,Update File 无疑是最复杂的应用场景。


在 Builder 模式下,Apply 的局限被进一步放大。原因在于,Agentic 的一次任务往往涉及多次文件修改;如果每次都必须经过“Chat 模型输出”与“Apply 模型编辑”这两个阶段,系统开销会非常大。此外,这种双阶段叠加不仅增加资源消耗,也放大误差,导致整体编辑失败率偏高。另一个问题是 Apply 对长文件的处理能力不足,这在 Agentic 场景下尤为明显。



基于上述判断,我们在这一阶段转向了 Search/Replace 方案。该方案的核心机制相对简单:首先有一个原始文件,模型会明确告知需要查找并替换的旧内容,同时给出对应的替换内容。最后,系统根据这两部分信息执行查找与替换,从而得到编辑后的结果。该方案的优势也十分明显。一方面,它无需进行二次调用,从而避免了额外的开销和误差叠加。另一方面是该方案不受上下文窗口的限制。也就是说,在任意长度的文件中,模型只需输出需要查找的那一行内容,就能够被准确定位。


然而,这一方案并非完美,同样存在一些挑战。首先,对模型输出的要求较高。模型必须严格遵循指定格式,并确保 _old_str_ 与原文精确匹配。此外,工具调用通常使用 JSON 作为格式化方式,但在将 _old_str_ 等字符串写入 JSON 时,往往需要进行转译,否则会导致解析失败。而转译本身又是模型容易出错的环节。


其次,该方案在效率上也存在问题。当进行大规模变更时, _old_str_ 与 _new_str_ 可能会非常冗长,从而再次触发上下文窗口的限制。虽然可以通过拆分为多次编辑来解决,但效率会降低。我们也尝试过采用数组方式以提升效率,但数组格式对模型输出的规范性提出了更高要求。


第三,工程复杂度相对 Apply 方案更高。为了应对输出不确定性,需要引入更多防御机制,例如模糊匹配、相似度查找,以及在出错时进行自动修复和重试。


因此,这两种方案并非互相替代,而是适用于不同场景。在 Chat 模式下,我们更倾向于使用 Apply 方案,以提升用户体验;而在 Builder 模式下,则优先采用 Search/Replace 方案,因为其准确性更高,且不受文件长度限制。



以上是我们对 Agentic Edit 的探索。上图展示了一个 Builder 场景的 Showcase:需求是实现一个简易的太阳系行星运行页面。在此过程中,我会针对系统生成的不正确部分提出反馈;系统将依据这些反馈和我的需求持续改进,直至完成页面,并逐步完善相关展示功能。

总结与展望


本次分享回顾了 TRAE 编程助手 的三个发展阶段及对应的产品形态,并探讨了其背后代码编辑能力的演进过程:包括专注于完成代码编辑任务的 Apply 模型,提供更加即时和智能补全体验的 Cue 功能,以及充分利用大模型能力的 Agentic Edit 能力。面向未来,我们将从三方面继续探索:进一步提升编辑的准确性与效率;探索 Multi-Agent 协作框架;持续激发模型的思考与规划能力。感谢大家的聆听!

嘉宾介绍


冯绪,字节跳动 Trae 插件架构师,曾就职于腾讯,具备丰富的一线研发和实践经验。当前专注在 AI 编程助手的建设中,参与 AI 编程助手从 0 到 1 搭建以及 Apply 能力的建设。致力于探索大模型与编程工具的深度融合,在 AI Agent 架构设计、代码编辑技术优化等方向持续深耕,为提升开发者编程效率贡献技术力量。

2025-12-04 14:582

评论

发布
暂无评论

前端之算法(七)动态规划

Augus

算法 8月日更

网络攻防学习笔记 Day108

穿过生命散发芬芳

网络安全 8月日更

还在死磕 Ajax?那可就 out 了!

编程三昧

JavaScript 大前端 8月日更 Fetch

耗时24小时整理了网络安全学习路线,非常详细!

网络安全学海

黑客 网络安全 信息安全 渗透测试 漏洞挖掘

架构1期模块五作业

五只羊

架构实战营

Ansible 管理 Windows 机器配置过程。

耳东@Erdong

windows ansible 8月日更

【设计模式】状态模式

Andy阿辉

C# 编程 后端 设计模式 8月日更

三分钟快速了解 Cglib 动态代理

4ye

Java 后端 cglib 代理模式 8月日更

云原生时代到来了么?

escray

学习 极客时间 如何落地业务建模 8月日更

高可用架构(下)

编号94530

数据库 架构设计 异地多活容灾 高可用架构

Obsidian一个不错的软件

IT蜗壳-Tango

8月日更

模块五作业

老实人Honey

架构训练营

分片上传Minio存储服务的问题集锦[推荐收藏]

liuzhen007

8月日更

简简单单实现 Python Web 的登录注册页面,还包含一半逻辑。

梦想橡皮擦

8月日更

【架构设计模块五】:设计微博系统中”微博评论“的高性能高可用计算架构

Ryoma

聊一聊这些年看过的动漫

箭上有毒

8月日更

基于AOP和HashMap原理学习,开发Mysql分库分表路由组件!

小傅哥

小傅哥 hashmap 分库分表 aop 数据散列

蔚来事故背后,“致命弯道”在辅助驾驶和自动驾驶之间

脑极体

敏捷实践 | 分不清Kanban和看板的只剩你了……

LigaAI

Scrum Kanban 敏捷开发 看板

iOS开发:Xcode自带的模拟器常用快捷键的使用

三掌柜

8月日更 8月

如何实现分布式锁,聊聊你的想法?

卢卡多多

redis 分布式锁 8月日更

从0开始的TypeScriptの十:泛型

空城机

typescript 大前端 8月日更

Magician has released a new version

Magician网络编程包

Java Web 网络编程 io nio

破解AI开课难题!2021 全国人工智能师资培训落地厦门大学

百度大脑

人工智能

Flink 和流式应用运维(十-上)

Databri_AI

flink API REST API

敏捷开发

LeifChen

Scrum 敏捷开发 迭代 8月日更

Go- 常量

HelloBug

常量 const Go 语言

Go- 变量

HelloBug

变量 Go 语言

JavaScript单元测试的“抹茶”组合:Mocha和Chai

devpoint

JavaScript 单元测试 8月日更

Linux之ab命令

入门小站

Linux

在线文字图标logo文章封面图生成工具

入门小站

工具

从补全到 Agentic Edit:Trae 在代码编辑上的落地与进化_AI&大模型_InfoQ精选文章