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.javaUserService.ktmodels/user.rs)。

3. 获取并汇总次要文件

  • 对于排名前N的文件(例如N=5),仅加载简短的摘要或其中相关的函数/类定义,而非完整文件内容。
  • 若这些摘要(或提取的代码片段)通过相关性阈值校验(例如与任务的符号重合度≥50%),则将其追加至主Context窗口

4. 执行编码任务

  • 依托紧凑、高信噪比的Context,Agent仅聚焦于经过精心筛选的文件集,开展代码生成或重构工作。

这种机制可确保Agent获取恰好所需的文件(不多不少),降低推理成本,同时通过剔除无关噪声信息大幅提升编码准确性。

如何使用

初始化

  1. Agent接收自然语言或结构化请求(例如:“为UserController.java中的signup()方法添加校验逻辑”)。
  2. 自动解析请求以识别「主文件」(UserController.java)。

子Agent工作流

  1. 通过Shell命令(例如:rg "signup" -tjava)或轻量级索引查询调用搜索子Agent
  2. 对每个匹配到的文件,执行代码片段提取(例如:仅解析方法签名或引用User的类)。
  3. 将这些片段返回至主Agent;过滤出完全相关的代码(忽略冗长注释或无关类定义)。

上下文组装

  • 构建最终prompt:
    ### 主文件:UserController.java
    (完整内容置于此处)
    
    ### 上下文片段:
    
    
  • UserService.java: validateUser(...)
    • SignupDTO.java: 字段 + 注解
    • ...

权衡

  • 优点:

    • 使Agent的prompt规模最小化,且精准贴合目标需求。
    • 提升响应速度,减少无关代码引发的模型幻觉现象。
    • 可适配大型代码仓库,因为始终仅需加载少量文件。
  • 缺点/注意事项:

    • 需要维护一个简单的文件搜索服务(例如ripgrep或索引化AST)。
    • 若子Agent的排序启发式算法不够优化,可能会遗漏边缘情况——关键文件可能被忽略。
    • 若代码仓库结构变化频繁,子Agent的索引必须保持实时更新。

参考文献

关键词

本方案灵感源自Claude Code最佳实践中的“精选上下文窗口”,已适配代码代理工作流;同时属于大规模单体仓库代码助手的通用实践,以Lyft内部代码AI为典型示例。

直译
  • 灵感源自Claude Code最佳实践中的“精选上下文窗口”;已针对代码代理工作流进行适配。
  • 这是大规模单体仓库代码助手的通用实践(例如Lyft的内部代码AI)。

来源摘要

正在获取来源并生成中文摘要…

来源: Internal Practice

← 返回社区