Claude Code 是怎么收集上下文的?
在看 Anthropic 的工程博客 《Building agents with the Claude Agent SDK》时,有一个问题特别关键:
Agent 在执行任务时,究竟是怎么获取上下文的?
很多人一开始的直觉是: 把所有相关数据都塞进模型上下文。
但在真实系统里,这基本不可行。日志、代码库、文档库都可能是 GB 级别。Claude 再大的 context window 也扛不住。
Anthropic 在这篇文章里给了一个很实用的框架,大致可以分成两类策略:
一类解决 怎么找到信息 另一类解决 上下文怎么不被撑爆
对应四种具体方法:
- Agentic Search
- Semantic Search
- Subagents
- Compaction
Agent 面临的两个现实问题
如果你自己做过 Agent,其实很快就会遇到两个问题。
第一个是 信息怎么找。
真实任务的数据源非常多,比如:
- 日志
- 文档
- 数据库
- 用户历史记录
- 代码仓库
Agent 必须从这些信息里找到真正有用的部分。
第二个问题是 上下文空间有限。
即使模型有几十万 token 的上下文,长时间运行的 Agent 还是会把它填满。
所以 Claude 的做法是: 把问题拆成两个层面。
先解决 信息怎么获取,再解决 上下文怎么管理。
Agentic Search:最简单也最可靠的方式
Anthropic 在文章里反复强调的一点是:
优先使用 Agentic Search。
它的思路其实很工程化:
不要提前把数据喂给模型。 而是让 Agent 自己去找。
比如一个很常见的场景:日志分析。
假设有一个 100MB 的日志文件:
log.txt
如果直接塞进上下文,基本等于把窗口炸掉。
但如果 Agent 运行:
grep error log.txt
只会返回包含 error 的行。
如果想看最新的日志:
tail -n 100 log.txt
甚至可以组合:
grep error log.txt | tail -n 10
这样 Agent 只会把真正相关的几十行数据带回上下文。
对模型来说,这些内容可能只有几 KB。
这种方式有几个很明显的好处:
首先是 精准过滤。 上下文只包含需要的信息。
其次是 可追溯性。 Agent 执行了什么命令,用户是能看到的。
最后是 组合能力。 Linux 的工具链本身就很强大,grep、awk、sed、tail 组合起来已经可以解决很多问题。
所以 Anthropic 的建议是: 如果能用 Agentic Search,就不要急着上复杂方案。
Semantic Search:当关键词不够用的时候
另一种常见方法是语义搜索。
流程大致是:
文档切块 → embedding → 向量数据库 → 相似度检索。
这种方法在知识库、FAQ、文档检索里非常常见。
和 Agentic Search 比起来,它更像是“按含义查找信息”。
举个简单例子。
如果用户问:
“系统为什么出现异常?”
日志里可能写的是:
error
failure
fault
关键词搜索不一定能全部匹配到。
但语义搜索通常可以把这些相关片段都找出来。
不过 Anthropic 也提醒了一点:
语义搜索虽然快,但问题也不少。
比如:
- 结果不透明
- 调试困难
- 数据维护成本高
所以他们的建议是:
先用 Agentic Search,只有在数据规模特别大或者需要语义匹配时,再考虑向量检索。
Subagents:用隔离解决上下文膨胀
当 Agent 开始处理复杂任务时,还有一个常见问题:
上下文越来越大。
Claude 的一个做法是使用 Subagents。
简单理解就是: 把任务拆给多个小 Agent。
每个子 Agent 都有自己的上下文窗口,可以独立处理信息。
例如邮件分析系统:
主 Agent 需要查历史邮件。
如果直接把几千封邮件都放进上下文,肯定会爆。
更好的方法是:
主 Agent 启动几个搜索 Agent。
每个 Agent 去查询邮件历史,然后只返回相关摘要。
最后主 Agent 只处理这些结果。
这样做有两个好处:
第一是 并行处理。 多个 Agent 可以同时运行。
第二是 上下文隔离。 每个子任务都在自己的上下文里完成。
主 Agent 只接收必要信息。
Compaction:让 Agent 可以长期运行
最后一个策略是 Compaction。
这个机制解决的是时间维度的问题。
如果一个 Agent 连续运行几个小时,对话历史会越来越长。
最终还是会触碰上下文限制。
Claude Agent SDK 的做法是:
当上下文接近上限时,自动对历史对话进行总结。
旧消息会被压缩成一段摘要,然后替换原始内容。
这样上下文就能持续保持在可控范围内。
从系统设计角度来看,这其实是一个 长期运行 Agent 的必要机制。
Claude Agent 的一个核心设计理念
看完这些策略,其实可以总结出 Claude Agent 的一个设计哲学:
上下文不应该一次性加载,而应该按需获取。
换句话说:
不要把所有数据喂给模型。
让 Agent 在需要的时候:
- 去搜索
- 去读取
- 去筛选
只把必要的信息带回上下文。
这样 Agent 才能处理远超 context window 的数据规模。