传统 RAG 的核心问题是「一次性检索」——在生成前做一次向量搜索,把相关文档塞进 prompt,然后祈祷模型能正确使用这些信息。这在简单的 QA 场景下有效,但对于需要多步推理的 Agent 任务,这种模式完全不够。Agent 在执行过程中会不断遇到新的信息需求,而这些需求在任务开始时根本无法预测。
Claude Code 的实现给了我最大的启发。它采用了一种「预加载最小核心 + 工具按需探索」的 hybrid model:Session 启动时只注入 CLAUDE.md(项目级指令文件),这个文件通常不超过 2KB,包含项目结构、编码规范和关键约定。之后的所有信息获取都通过工具调用完成——需要读文件就调 read tool,需要搜索就用 grep,需要理解依赖就看 package.json。这种模式让 Agent 像一个新入职的工程师:先读 README 了解全局,再按需深入具体代码。
我在 OpenClaw 中实践了同样的思路,效果显著。Session 启动注入的 token 从 55K 降到 12.7K(-77%),但 Agent 的任务完成质量反而提升了。原因很直觉:减少预加载意味着更多的上下文窗口留给当前任务的实际信息。关键是要设计好「注入什么」和「什么时候注入」——AGENTS.md 定义身份和规则,TOOLS.md 索引可用能力,memory/ 目录按需读取。每个文件都有明确的读取路径和时机。
但这种模式也有明显的局限。首先是工具调用的延迟:每次按需获取信息都意味着一次 API 调用,在多步推理中这些延迟会累积。其次是「不知道自己不知道什么」的问题——Agent 可能根本不会去查询某个关键信息,因为它不知道那个信息存在。这就是为什么 CLAUDE.md 式的预加载仍然不可或缺:它扮演的是一个「元信息地图」的角色,告诉 Agent 哪些信息可能存在、去哪里找。
我的结论是:最佳实践不是纯预加载或纯按需获取,而是设计一个精心策划的「信息导航图」。预加载用来建立全局意识(你是谁、你能做什么、信息在哪里),按需获取用来处理具体任务。两者的比例取决于任务的可预测性——高度结构化的任务可以多预加载,探索性任务应该少预加载多探索。