本文作者:江波,TRAE 技术专家
概述
cue 是 TRAE 开发的最新且最复杂的 AI 开发工具功能之一。它将代码补全能力扩展到光标之外,覆盖整个工作空间。该功能能够理解开发者的意图,并在后台工作,提供有助于更快、更全面地完成任务的编辑建议。
核心挑战
构建 cue 面临三个主要的研究挑战:
理解用户意图 - 确定用户试图完成什么任务
挑战:
- Non-linear Editing Histories: 开发者的编码工作流通常是非线性且复杂的。他们可能复制代码块、粘贴到其他地方并立即大幅修改。他们还可能连续快速编辑,频繁在文件或函数间切换,或在实验不同实现时撤销和重做更改。这些非线性工作流会创建混乱的更改轨迹,可能误导试图推断开发者真实意图的模型。
- Unintended Biases: 通过在给定任务中拆分差异块来简单采样训练数据,可能会在模型中引入意外偏见。例如,模型可能学会避免触及代码库中已包含最近更改的部分,但这些区域可能正是需要进一步编辑的地方。
- Intention Hallucination: 模型可能会产生意图幻觉,建议与用户最近编辑不直接相关的更改。这发生在模型试图过于主动时,旨在覆盖所有可能的相关编辑(高召回率),这可能导致嘈杂和破坏性的建议。相反,如果模型过于保守——只关注高度确信的建议(高精度)——它可能变得被动,错过协助开发者的机会。
解决方案:
-
Simulating Common Editing Scenarios/模拟常见编辑场景: 通过分析提交消息、初始提交状态和最终提交状态,开发相关算法来模拟反映常见开发者行为的现实编辑场景。
-
Optimizing Diff Granularity/优化差异粒度: 教会模型读取细粒度编辑事件,同时仔细优化提示中呈现的差异粒度。如果模型看到过于细粒度的差异,可能会被用户编辑历史中的噪音分散注意力。如果看到过于粗粒度的差异,则难以区分新更改和旧更改。
-
Avoiding Undoing User's Recent Changes/避免撤销用户最近的更改: 发现模型有时强烈倾向于撤销用户的最近更改,这可能导致令人沮丧的体验。通过仔细策划训练数据来阻止这种行为。
确定更改位置 - 决定在哪里进行更改
挑战:
-
可扩展性: 定位机制需要具备可扩展性,能够高效处理大型代码库而不消耗过多资源。
-
速度: 需要极快的速度来支持高度交互的使用模式,在用户进行新更改时提供即时建议。
-
相关性: 必须准确识别相关位置,既不让用户被不必要的建议淹没,也不遗漏重要建议。
解决方案:
-
Fast Localization with a Trained Retriever: 通过将检索基础设施与专门设计用于识别可能需要更新的代码位置的检索器模型相结合,实现了速度和准确性的平衡。
-
Efficiency and Scalability: 这种方法高度可扩展,可以在包含数万个文件的大型单一代码库上运行,而不会显著降低性能。
-
Editing Surrounding Code: 用户光标周围的代码总是被添加到候选位置列表中并首先处理,确保即时且上下文相关的建议。
确定如何编辑 - 准确高效地执行更改
挑战:
-
Complex Edits Beyond Cursor Insertions: 现有模型不擅长进行超出用户光标旁简单插入的大规模更改。
-
Latency Constraints: 生成这些编辑应该快速,允许实时建议而没有显著延迟。
-
Codebase Awareness: 推荐内容需要匹配项目的编码标准、约定,并正确使用自定义 API,需要模型了解整个代码库上下文。
解决方案:
-
新颖的 Diff 格式(WIP): 教会模型一种专门的 diff 格式,既紧凑又能明确应用于原始代码。这种格式允许模型简洁地表示复杂编辑,最小化生成的 token 数量,并实现大文件的高效处理。这将延迟从几秒钟减少到几百毫秒。
-
代码库感知建议: 利用强大的检索增强生成(RAG)基础设施,为 cue 添加代码库特定的上下文。通过检索代码库的相关部分,模型可以提出与项目特定编码标准一致且正确与自定义 API 交互的建议。
技术成果
通过解决这三个核心 AI 挑战,cue 实现了:
-
准确的意图理解: 在混乱的编辑历史中捕获开发者意图
-
高效的位置识别: 在庞大代码库中准确定位相关更改位置
-
快速准确的编辑生成: 以最小延迟生成准确且上下文适当的编辑
核心技术特性
技术实现要点
- 专门训练的 Locator 模型: 用于快速识别需要更新的代码位置
- 检索增强生成(RAG): 基于实时代码库索引的上下文感知编辑
- 新颖的 Diff 解码方案: 高效表示复杂编辑,将延迟从几秒降至几百毫秒
- 编辑历史分析: 从最近的编辑历史中推断用户意图
支持的应用场景
-
重构操作: 字段添加、方法签名更改、类重命名等
-
依赖更新: 自动识别和更新相关文件中的依赖关系
-
API 变更传播: 跨文件更新 API 调用和实现
-
迭代开发支持: 在代码迭代过程中提供实时建议
未来更新
尽管我们已经在 cue 实现了不错的效果,但依然有很大的改进空间。
更大范围的修改
-
仓库级范围编辑能力:增强模型理解更广泛上下文和依赖关系的能力,使其能够协助处理更大的 PR 和重大重构任务
-
理解复杂依赖关系: 提高模型理解和导航跨多个文件和模块的复杂代码依赖关系的能力
-
批量编辑支持: 使功能能够同时一致地建议和应用跨多个文件的更改,减少重复任务的时间
知识更新以及基于用户真实反馈信号的 RL
-
更高效的知识更新: 快速的框架、API 更新以及知识点的迭代,除了传统 RAG 方式以外,可以通过线上用户数据的挖掘快速刷新
-
用户真实反馈的强化学习: 用户的采纳、拒绝、采纳后编辑等存在大量的数据积累,构建基于用户反馈信号的强化学习能够持续的提升模型在 cue 场景的准确率
与 Chat 和 Agent 更好集成
-
增强上下文理 解: 聊天功能可以提供额外的上下文,使下一次编辑建议更精确,特别是当可能有多个潜在编辑时
-
交互式问题解决: 开发者可以使用聊天询问解释、请求替代解决方案或澄清建议背后的意图
-
统一开发环境: 结合这些功能创建更智能和支持性的环境,进一步减少摩擦并提高生产力
总结
cue 代表了开发者 AI 工具的重大进步,通过解决三个核心 AI 挑战(理解意图、定位更改、执行编辑),创造了一个能够理解代码变更连锁反应的智能助手。它不仅减少了手动工作,还提高了开发效率,让开发者能够专注于问题解决而非繁琐的代码更新任务。
随着功能的不断完善和与其他工具的深度集成,cue 正在重新定义开发者 AI 的可能边界,成为现代软件开发工具包中不可或缺的一部分。
推荐阅读
TRAE cue 迎来月度最大更新,模型能力以及时延大幅优化