深入解析claude agent 的context架构

1 阅读5分钟

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 的数据规模。