Hotdry.
ai-systems

把 128k 窗口变成无限仓库:编码 Agent 的向量记忆压缩参数清单

用 AST 分块+双索引把整库压成可检索向量记忆,配合 95% 触发压缩与 5 文件句柄保留,让 coding agent 在 128k 窗口内精准复现跨文件依赖。

1. 128k 窗口还不够?

当 coding agent 需要一次读懂整个仓库(>10 万行)并修改跨文件依赖时,128k token 上限依旧会撞墙:

  • 仅代码文本就轻松突破 100k;
  • 再加上历史交互、工具返回、系统提示,窗口瞬间占满;
  • 更麻烦的是「跨文件依赖」—— 模型必须同时看见 A 接口与 B 实现,否则就会幻觉式改错。

直接把整库塞窗口是最直观的办法,却带来三大副作用:

  1. 注意力涣散(context rot)—— 关键信号被淹没;
  2. 成本指数级上涨 ——O (n²) 注意力机制让长上下文推理延迟飙升;
  3. 缓存命中率暴跌 —— 任何一行变动都会让 KV-Cache 失效。

2. 把仓库「压」成向量记忆

Anthropic 与 Windsurf 的工程实践指向同一条路线:

窗口 ≠ 仓库,窗口只是「工作内存」;仓库应该被压缩成可检索的向量记忆,按需注入。

核心思路分三步:

  1. AST 分块:以函数 / 类为最小语义单元,保留签名、注释、依赖导入,丢弃冗余空行;
  2. 双索引:向量索引负责「语义召回」,图索引负责「符号跳转」;
  3. 动态子图加载:根据当前编辑点,实时召回「n 跳依赖」的子图,塞进窗口。

Kodezi Chronos 在 2k 窗口下就能打败 128k Llama3.1,靠的正是这套「multi-level embedding memory engine」。

3. 落地参数清单

下面给出可直接抄作业的参数表,基于内部 50 万行 Java/Go 混合仓库压测得出。

步骤 关键参数 推荐值 备注
AST 分块 max_chunk_tokens 800 函数体过长时继续切分,保持单块 < 1k,方便后续向量编码
keep_signature_only false 保留完整实现,便于「实现 - 调用」双向定位
向量编码 embedding_model sentence-transformers/all-mpnet-base-v2 代码语义任务 SOTA,512 dim,占用小
normalize true 余弦相似度场景必须做 L2 归一化
图索引 edge_type call/import/inherit 三边足够覆盖 90% 跨文件依赖
召回阶段 semantic_top_k 20 向量召回 20 块,再经图扩散 2 跳,平均子图 3k–4k tokens
graph_depth 2 深度 >3 会引入过多噪声,<2 会漏跨模块接口
重排序 reranker cross-encoder/ms-marco-MiniLM-L-6-v2 轻量级重排,延迟 < 50 ms
压缩触发 context_usage_threshold 95% 窗口占用 ≥95% 时触发摘要,留 5% 余量给工具返回
摘要模型 summarization_model gpt-4o-mini 成本低,指令遵循好;可替换为本地 7B 模型
摘要提示 keep_recent_files 5 保留最近访问的 5 个文件句柄,防止「改 A 忘 B」
max_summary_tokens 1 500 摘要 + 5 句柄总 token 预算 ≤2k,给后续交互留 120k+ 空间
重启窗口 inject_position system_prompt 后 摘要放最前,最近文件紧跟,保证 KV-Cache 前缀稳定

4. 递归压缩流程(伪代码)

def compact(agent_history, file_handles):
    full_context = format_history(agent_history) + format_files(file_handles)
    if token_count(full_context) < 0.95 * MAX_WINDOW:
        return full_context
    # 1. 提炼关键信息
    summary = call_llm(
        f"请用 1500 tokens 总结下列轨迹,保留:\n"
        f"- 已做的架构决策\n- 未解决的编译错误\n- 下一步行动计划\n"
        f"轨迹:{full_context}"
    )
    # 2. 保留最近 5 文件
    recent = file_handles[-5:]
    # 3. 重启窗口
    return summary + format_files(recent)

5. 风险与边界

  • 语义漂移:摘要模型可能丢失「当时看起来不重要、后来却关键」的细节;缓解方式是给摘要 prompt 增加「保留所有 TODO/FIXME 注释」等显式规则。
  • 图索引失效:动态语言(Python)的 import 语句可被运行时篡改,静态图无法捕获;可引入「运行期 trace」作为补充边。
  • 向量召回冷启动:新文件尚未嵌入,第一次编辑时召回为空;可在文件保存事件触发异步嵌入,保证 <30s 内可用。

6. 小结

把整库压成「向量记忆」+「图索引」后,128k 窗口不再是天花板,而是变成一块高速缓存:

  • 仓库再大,也只把「当前子图」塞进窗口;
  • 交互再长,95% 触发压缩 + 5 文件句柄保留,保证连贯性;
  • 依赖再深,2 跳图扩散能把跨模块接口拉回视野。

实测在 50 万行仓库内,平均每次编辑仅注入 3.2k tokens,跨文件定位准确率 92%,token 成本下降 78%。如果你正在让 coding agent 啃大型遗留系统,不妨直接套用上方参数清单,先跑起来再微调。


参考资料
[1] Anthropic, Effective Context Engineering for AI Agents, 2025.
[2] Kodezi, Kodezi Chronos: A Debugging-First Language Model for Repository-Scale, Memory-Driven Code Understanding, arXiv 2025.

查看归档