Curated File Context Window
Nikola Balic (@nibzard)· best-practice
问题
代码Agent通常需要对多个源文件进行推理分析,但如果将所有文件全部塞入其prompt中:
- 会迅速超出token限制或推理预算。
- 引入干扰信息:无关文件(如其他模块的测试文件、资源文件、文档)会分散Agent的注意力。
- 导致Agent的输出速度变慢,且难以聚焦于当前的编码任务。
方案
维护一个经过净化、精心梳理的「主Context窗口」,仅纳入与当前任务直接相关的代码文件;同时让辅助子Agent负责收集并排序额外文件,且不污染主Context:
1. 识别核心文件
- 任务启动阶段,Agent确定需要修改的文件集合(例如,待重构的模块或待实现功能对应的文件)。
- 仅将这些文件(及所有显式依赖项)加载至主Context窗口。
2. 启动文件搜索子Agent
- 该子Agent在整个代码仓库中执行快速搜索(例如使用
rg工具或基于抽象语法树(AST)的简单启发式算法),查找与任务相关的符号、导入项或关键字。 - 随后返回一份按相关性排序的文件路径列表(示例:
UserController.java、UserService.kt、models/user.rs)。
3. 获取并汇总次要文件
- 对于排名前N的文件(例如N=5),仅加载简短的摘要或其中相关的函数/类定义,而非完整文件内容。
- 若这些摘要(或提取的代码片段)通过相关性阈值校验(例如与任务的符号重合度≥50%),则将其追加至主Context窗口。
4. 执行编码任务
- 依托紧凑、高信噪比的Context,Agent仅聚焦于经过精心筛选的文件集,开展代码生成或重构工作。
这种机制可确保Agent获取恰好所需的文件(不多不少),降低推理成本,同时通过剔除无关噪声信息大幅提升编码准确性。
如何使用
初始化
- Agent接收自然语言或结构化请求(例如:“为
UserController.java中的signup()方法添加校验逻辑”)。 - 自动解析请求以识别「主文件」(
UserController.java)。
子Agent工作流
- 通过Shell命令(例如:
rg "signup" -tjava)或轻量级索引查询调用搜索子Agent。 - 对每个匹配到的文件,执行代码片段提取(例如:仅解析方法签名或引用
User的类)。 - 将这些片段返回至主Agent;过滤出完全相关的代码(忽略冗长注释或无关类定义)。
上下文组装
- 构建最终prompt:
### 主文件:UserController.java (完整内容置于此处) ### 上下文片段: - UserService.java: validateUser(...)
- SignupDTO.java: 字段 + 注解
- ...
权衡
-
优点:
- 使Agent的prompt规模最小化,且精准贴合目标需求。
- 提升响应速度,减少无关代码引发的模型幻觉现象。
- 可适配大型代码仓库,因为始终仅需加载少量文件。
-
缺点/注意事项:
- 需要维护一个简单的文件搜索服务(例如
ripgrep或索引化AST)。 - 若子Agent的排序启发式算法不够优化,可能会遗漏边缘情况——关键文件可能被忽略。
- 若代码仓库结构变化频繁,子Agent的索引必须保持实时更新。
- 需要维护一个简单的文件搜索服务(例如
参考文献
关键词:
本方案灵感源自Claude Code最佳实践中的“精选上下文窗口”,已适配代码代理工作流;同时属于大规模单体仓库代码助手的通用实践,以Lyft内部代码AI为典型示例。
直译:
- 灵感源自Claude Code最佳实践中的“精选上下文窗口”;已针对代码代理工作流进行适配。
- 这是大规模单体仓库代码助手的通用实践(例如Lyft的内部代码AI)。
来源摘要
正在获取来源并生成中文摘要…