ACE 崩了,于是我重写了它:从 ace-wrapper 到 fast-context

💡 原文英文,约2000词,阅读约需8分钟。
📝

内容提要

ACE服务不稳定后,作者将ace-wrapper重写为fast-context,直接对接Windsurf的SWE-grep协议,并引入本地Semble缓存作为降级方案。本地缓存检索耗时30毫秒内,召回率94.6%,混合模式召回率达97.9%。远程仅用于验证扩展,失败时返回本地结果,避免工作流中断。

🔎

延伸解读

本地缓存为何成为第一道防线

文章中的基准测试显示,仅用本地Semble缓存时,召回率达到94.6%,p50延迟仅30毫秒;而仅用远程Windsurf时,召回率只有46.7%,且成功率仅52.5%。这组数据表明,本地缓存并非简单的备份,而是能独立承担大部分检索任务的主力。作者因此将本地缓存置于流程前端,远程仅用于验证和扩展,从而在远程不稳定时仍能保证工作流不中断。

混合模式如何提升检索质量

混合模式将本地Semble的候选结果与远程Windsurf的验证能力结合,NDCG@10从本地的0.854提升至0.890,召回率从94.6%提升至97.9%。远程不再从零开始搜索,而是基于本地提供的块候选和词法锚点进行确认,这减少了超时和限流的影响。文章强调,远程的价值在于验证而非首轮搜索,这种分工让整体效果更稳定。

凭证提取的兼容性设计

fast-context需要从Windsurf的state.vscdb中提取凭证,早期版本使用标准API密钥,新版则改用devin-session-token格式。作者在extract_key.py中实现了两种格式的自动适配:先查询windsurf.api_key,若不存在则搜索包含devin-session-token的行,同时支持环境变量覆盖。这种设计避免了因IDE升级导致的工具失效,体现了对上游变化的务实应对。

降级路径与工作流韧性

文章反复强调“永远保留降级路径”。在ace-wrapper时代,ACE服务一旦不可用,语义搜索便完全消失;而fast-context在远程失败时仍能返回本地Semble的块级候选,虽然质量可能下降,但工作流不会中断。基准测试中,混合模式的非空输出率为100%,远程单独仅为50%。这种设计将最坏情况从“无结果”变为“降级结果”,显著提升了日常开发的连续性。

❓

Q&A

fast-context 和 ace-wrapper 在架构上有什么本质区别?

ace-wrapper 是纯远程方案,本地只发送参数,完全依赖 ACE 服务;fast-context 是本地与远程协同工作,本地先运行 Semble 缓存检索和词法锚点,再交给远程 Windsurf SWE-grep 验证扩展,远程失败时返回本地结果。

为什么作者要引入本地 Semble 缓存?

因为远程 ACE 服务不稳定,而本地 Semble 缓存检索速度快(p50 30 毫秒)、召回率高(94.6%),能作为第一道防线处理大多数常见搜索,并在远程失败时提供降级路径,避免工作流中断。

fast-context 的混合模式在基准测试中表现如何?

在 40 个标注查询上,混合模式(Semble + Windsurf)的 NDCG@10 为 0.890,Recall@10 为 97.9%,非空输出率 100%;而纯远程 Windsurf 非空输出率仅 50%,纯本地 Semble 召回率 94.6%,延迟 30 毫秒。

fast-context 如何反解析 Windsurf 的 SWE-grep 协议?

Windsurf 使用 Connect-RPC + Protobuf,每个 RPC 帧有 5 字节头(1 标志字节 + 4 大端长度字节),且需要 Connect-Connect 帧。Protobuf 模式无公开定义,字段号需从抓包和 Wireshark 解密配置推断,作者手动实现了 ProtobufEncoder 来匹配线格式。

fast-context 如何处理 Windsurf 的凭证?

它从 state.vscdb(SQLite 数据库)中提取凭证:先查询 key='windsurf.api_key',若未找到则搜索包含 'devin-session-token' 的行,两种格式都支持,也可通过 WINDSURF_API_KEY 环境变量覆盖。

使用 fast-context 后,作者的工作流程有哪些变化?

AGENTS.md 从“用 ace 语义检索 → 读文件 → 用 rg 确认”变为:默认用 fast-context 混合搜索获取候选和行范围;若超时或无结果则用本地搜索;对候选块用 find-related;读文件后用 rg/ast-grep 确认证据。远程侧还有模型降级链,默认 MODEL_SWE_1_6_FAST,遇资源耗尽或限流自动降级到 MODEL_SWE_1_5。

作者从这次重写中总结了哪些设计原则?

始终保留降级路径,每个远程依赖都需要本地回退;纯 Python 更易维护,结构清晰比语言选择更重要;基准测试应与代码放在一起,用数据驱动优化;凭证提取应自动适应格式变化。

🏷️

标签

➡️

继续阅读