总结一下zed的访谈中提及的关键技术:
该模型使用"填充中间"技术,其中模型会根据前缀和后缀来补全文本
Zed 没有使用像 Claude 3.5 Sonnet 这样的大型模型,而是选择了一个较小的模型,以减少延迟并更好地控制基础设施
该模型使用代码片段重写,而不是生成编辑,因为对于较小的模型来说,生成编辑的效果不佳
该模型使用推测性解码来并行生成多个令牌,从而提高性能
最初,Zed 尝试使用提示工程,但发现它不可靠
然后,他们对模型进行了微调,但需要大量数据
使用较大的模型生成合成数据,并从 Zed 员工那里收集反馈。Zed收集了所有 Zed 员工的补全数据,以获得更多数据进行微调
Zed 公开了数据集和模型,希望社区能够做出贡献
使用直接偏好优化 (DPO) 来告诉模型不要执行某些操作,例如删除用户刚刚键入的内容
Antonio Scandurra 和 Nathan Sobo
2025年2月13日
目录
- 深思熟虑的整合
- 介绍 Zeta:Zed 的开源编辑预测模型
- 通过重写进行编辑
- 评估预测
- 提示工程
- 监督式微调
- 直接偏好优化
- 最小化延迟:推测性解码
- 最小化延迟:模型服务
- 结论
正文
Zed 以速度为核心。我们一直致力于打造即时响应的编辑体验。但什么比即时更快?一个能预测您下一步操作的工具。这就是为什么我们在 Zed 中引入了由我们新的开源模型 Zeta 驱动的编辑预测功能。
在您工作时,Zed 现在可以预测您的下一次编辑,您只需按 Tab 键即可应用它。一旦接受预测,您可以通过重复按 Tab 键执行多个后续编辑,节省时间和按键操作。我们收到了大量关于这项功能的请求,并且我们全心投入使其成为 Zed 体验的自然延伸。
您可以在此公测期间通过下载 Zed 并使用 GitHub 账号登录来免费使用 Zeta。编辑预测功能不会永远免费,但目前我们只是想分享并学习。
深思熟虑的整合
编辑预测将 Tab 键转变为一个神奇的通用键。但是 Tab 键的现有用途,如缩进行,会怎样呢?当既有编辑预测又有来自语言服务器的建议时会发生什么?我们不希望一个强大的新功能以牺牲 Zed 中现有编辑体验为代价。
Zeta 预测与语言服务器补全共存
当语言服务器补全可见时,Zed 不会预览预测的编辑,直到您按下 Option 或 Alt 键。一旦您按下修饰键,Zed 会预览编辑并隐藏菜单,以便不受阻碍地查看。在 macOS 上,您只需按 Tab 键确认,或通过释放 Option 键返回语言服务器补全菜单。
在 Linux 上,Alt+Tab 通常被窗口管理器保留,因此我们提供 Alt+L 作为替代默认设置。我们选择 L 是因为它在 QWERTY 键盘的主行上,并且在 Vim 中表示向右移动。如果您的 Linux 窗口管理器不使用 Alt+Tab,您也可以自由使用该绑定。
介绍 Zeta:Zed 的开源编辑预测模型
Zeta 源自 Qwen2.5-Coder-7B,是完全开源的,包括开放数据集。如果您正在开源仓库中工作,我们希望您通过为其数据集做贡献来帮助改进 Zeta。请在最初对我们耐心一些,因为我们将在发布前审核提交的数据,以确保每个人的安全和隐私。我们很高兴探索这一领域,并期待看到社区努力使编辑预测在各处变得更好,尤其是在 Zed 中!
相关视频
《Zed 的开源编辑预测是如何工作的》
Richard Feldman 和 Antonio Scandurra 讨论了 Zed 的新编辑预测功能在底层是如何工作的。这包括 Zed 团队如何开发并开源驱动它的微调 Zeta 语言模型背后的代码和数据集!
How Zed's Open-Source Edit Predictions Work
通过重写进行编辑
大多数编码模型是在"填充中间"任务上训练的。您给它们一个前缀和一个后缀,它们会生成中间的内容。
js
<|fim_prefix|>fn quicksort(array: &mut [T]) {
if array.len() <= 1 {
return;
}
let pivot = partition(array);
<|fim_suffix|>
quicksort(&mut array[pivot + 1..]);
}<|fim_middle|>
这适用于在光标处完成文本,但我们希望 Zeta 能预测任意位置的编辑,这不符合这种结构。
根据我们的经验,模型在生成细粒度编辑方面不是很擅长,但它们在重写较大代码块方面表现出色。所以我们从这里开始:给定最近编辑的列表和光标位置,我们要求模型重写光标周围的文本片段,将一个或多个编辑预测融入重写的文本中。
评估预测
在编写一行代码之前,我们创建了一组测试来检查我们的想法是否有效。测试大型语言模型的输出很棘手,因为即使输入完全相同,每次运行也可能得到略微不同的结果。可以通过使用温度为 0 并对支持它的提供商提供 RNG 的种子来缓解这个问题。
话虽如此,代码通常可以用许多不同但同样有效的方式编写。因此,即使 Zeta 的输出与我们预期的答案不同,它仍可能正在做我们想要的事------只是采取了不同的路径。这使得使用传统的单元测试方法在处理 LLM 时特别具有挑战性。
这导致我们采取了不同的方法------我们没有使用严格的断言,而是使用更大的 LLM 来评估 Zeta 的编辑。通过用简单的英语编写测试断言并让 Claude 检查结果是否符合我们的意图,我们可以验证 Zeta 正在进行合理的编辑,即使它的确切输出在不同运行之间有所不同。这比尝试对特定标记进行脆弱的断言要实用得多。
以下是我们评估套件中的一个示例:
提示工程
我们首先尝试通过使用 Qwen2.5-Coder-32B 并给它清晰的指令来指导我们想要预测的编辑类型,以使这些测试通过。这是我们使用的初始系统提示,您可以通过历史记录查看我们如何不断更改它以通过评估套件。
对于前 4-5 个评估,这出乎意料地效果很好。然而,一旦我们引入更多,我们开始注意到越来越难以一致地通过所有测试。更改提示使新的评估通过,但使旧的评估失败。总的来说,这感觉像是一个不稳定的过程,我们不确信这会导致系统足够稳健以在生产中使用。
此外,使用 32b 模型与我们严格的延迟要求不太兼容(稍后会详细介绍)。
监督式微调
在尝试了不同的方法后,我们决定使用 Unsloth 和 LoRA 进行监督式微调。我们的想法是教会 Zeta 两件关键事情:根据开发者最近的编辑来确定他们可能想要进行的下一步更改,然后实际干净地将这些更改应用到代码中,而不引入奇怪的副作用。
但我们遇到了典型的鸡与蛋问题------我们需要数据来训练模型,但我们还没有任何真实示例。因此,我们首先让 Claude 生成了约 50 个合成示例,将其添加到我们的数据集中。然后,我们使用该初始微调版本在功能标志后面部署了 Zeta 的早期版本,并开始收集来自我们团队使用的示例。
这种方法让我们能够快速建立起约 400 个高质量示例的坚实数据集,这大大改进了模型!然而,我们不断遇到会绊倒模型的边缘情况。最烦人的情况是当 Zeta 在更大文件中处理一小段代码时------它有时会混淆并进行与用户尝试执行的操作无关的随机删除或插入,而且添加更多示例似乎并不能使模型避开这些错误。
直接偏好优化
为了处理这些边缘情况,我们使用直接偏好优化(DPO)进行了另一轮处理。这种技术让我们超越了仅仅向模型展示什么是好的编辑------我们还可以教它避免什么编辑。通过 DPO,我们可以通过提供正面和负面示例来微调 Zeta,帮助它学习有用和问题编辑之间的微妙差异。
我们发现,仅约 150 个精心选择的示例就足以显著改善 Zeta 在棘手情况下的行为。当然,我们认为通过用更多样化的示例扩展我们的训练数据,可以使其变得更好,我们很高兴继续推进这一领域的边界。
最小化延迟:推测性解码
与 Zed 中的每个功能一样,延迟是编辑预测的关键因素。当我们开始时,我们设定了积极的性能目标:在中位数情况下(p50)预测应在 200 毫秒内交付,在第 90 百分位(p90)情况下应在 500 毫秒内交付。挑战在于,重写完整片段虽然能够实现多位置编辑,但需要生成比简单的填充中间方法多得多的标记。最初,这使我们远超出了延迟预算。
然而,关于编辑预测如何工作,有一个引人入胜的见解。当我们重写文本片段时,输出通常与输入非常相似,变化集中在特定位置。这种模式让我们能够通过使用输入作为参考来并行生成标记------这是一种称为推测性解码的技术。我们使用 n-gram 搜索来识别输入中有前途的起点,在那里我们可以开始并行标记生成,在不牺牲质量的情况下给我们带来显著的加速。
最小化延迟:模型服务
为了使编辑预测感觉灵敏,我们需要同时解决多个延迟挑战。如上所述,我们通过推测性解码解决了模型执行时间问题,但大规模服务模型带来了它自己的一系列障碍。这是迄今为止我们团队面临的计算强度最高的问题。
在启动前几周,我们进行了一个简短的竞争过程,最终我们对 Baseten 印象深刻。他们的性能工程师迅速优化了我们的开源模型以在其灵活的基础设施上运行,实现了我们的目标延迟,同时让我们保留了对部署细节的完全可见性,无论是对 Zed 团队还是整个 Zed 社区。我们计划跟进一篇关于他们优化我们模型时学到的经验的客座文章。
延迟不仅仅是计算的函数;网络传输时间是感知速度的关键驱动因素。为了配合物理定律,我们正在北美和欧洲启动 GPU,我们希望很快添加更多区域。我们还使用 Cloudflare Workers 在位于尽可能靠近您的数据中心处理您的请求。
结论
还有很多需要探索的地方来使编辑预测更强大。我们将快速跟进更多实验。我们计划向模型发送更多类型的上下文,并继续我们的微调实验,我们将在 Zeta 数据集成长和发展时分享更新。
自去年秋季推出 Zed AI 以来,我们学到了很多。世界正在快速变化,我们正在探索和学习构建开发者喜爱的功能,这让我们乐在其中。我们也很高兴以 Zed 的方式构建 AI。从早期开始,即使在困难的情况下,我们一直是开放构建软件方法的支持者,在使用 AI 方面,我们没有理由改变这种方法。我们希望您能作为用户、贡献者或员工加入我们,一起努力打造一个光明的未来。