Context Engineering · Anthropic · 2025-09-29
原文
ENGINEERING AT ANTHROPIC · 视觉化精读

Context Engineering:把上下文当作稀缺资源来管

Prompt engineering 关心「写什么」,context engineering 关心「整个回合里 LLM 的眼前应该装什么」。 当 agent 在循环里跑很久,token 会越积越多 —— 不是塞越多越好,而是要持续筛掉、精炼、按需取用。

Anthropic Applied AI 团队 · 2025 年 9 月 29 日 · 原文约 2,500 词 · 阅读约 12 分钟
TL;DR · 一句话核心

好 context engineering = 在 LLM 有限的注意力预算里,找到最小的、信号最高的那组 token, 让模型最有可能输出你想要的行为。

围绕这个目标,Anthropic 给出三层手段:精炼 system prompt / tools / examples、用 just-in-time 检索按需加载, 以及在长任务里用 compaction、note-taking、sub-agent 三种方式跨越 context 窗口的物理上限。

读者要 get 到的关键转变:从「写一份完美的 prompt」到「把每一回合送进模型的整体 context 当成一个产品来设计」。 模型再聪明,注意力预算依然有限;context 多 ≠ context 好。 — this site · 中文精读·非官方解读
n²
Transformer 里 token 之间的两两注意力关系。context 越长,每个 token 摊到的"专注力"越薄。
3
长任务跨越 context 窗口的策略:compaction、note-taking、sub-agent
1
跨所有手段的指导原则:do the simplest thing that works
01 · 范式转变

从 prompt engineering 到 context engineering:一次性写好 → 每一回合都重新决定

早期用 LLM 多是单回合的分类或生成任务,所以重心在「写一条好 prompt」。 但当 agent 开始跨多个回合、多个工具调用、长时间连续工作,挑战就变了 —— 要管理的不只是 system prompt,而是「整个时刻 LLM 眼前装着的东西」。

Anthropic 的定义很直接:context engineering = 在推理过程中持续策划那组让 LLM 看到的 token, 包括 system instruction、工具定义、MCP 数据、外部检索内容、过往消息历史 —— 所有可能进入 context window 的东西。

Prompt engineering 是离散的:写一次,调一调,定下来。 Context engineering 是循环的:agent 每跑一步都会产生新数据, 每一回合都要重新回答一个问题 ——「下一回合到底应该让模型看到哪些东西?」

· 之前 ·

Prompt Engineering
  • 关注什么:用什么词、怎么组织 system prompt
  • 动作形式:写一次 → 调几次 → 定下来
  • 典型场景:单回合分类、单次生成、chat 回复
  • 成败标准:prompt 本身是否够清晰、够具体

· 现在 ·

Context Engineering
  • 关注什么:整段 context 是不是该有的有、不该有的没有
  • 动作形式:每一回合都重新筛选、压缩、按需加载
  • 典型场景:跨多回合、多工具调用的 agent
  • 成败标准:能不能在有限 token 预算里维持目标对齐

· context window 里都装了什么

⚙️ System Prompt 角色定位 · 输出规范
🛠️ Tools 工具签名 · 调用契约
🔌 MCP / 外部数据 资源注入 · 实时拉取
📚 Examples 少量金句样例
💬 Message History 用户消息 · 工具结果
每跑完一步 → 产生新消息 / 工具结果 → 下一回合再决定哪些留、哪些删、哪些压缩
停一下:这张图就是 context engineering 看世界的方式。 所有这些组件加起来要塞进同一个 context window 里,每一回合的 agent 都要重新决定一次。 接下来你会看到,为什么这个「重新决定」不是可选项、而是必须做的事。
02 · 为什么 context 是稀缺资源

「注意力预算」不是比喻,而是 transformer 架构的硬约束

即使模型支持几十万、上百万 token 的窗口,context rot 依然存在 —— token 越多,模型在长程依赖上的精度就越软。这不是某个模型的毛病,是整个家族都有的现象。

像人一样,LLM 也有「注意力预算」。每塞进一个 token,就消耗一点这个预算 —— 于是模型在长 context 上不会突然崩,而是性能渐渐变软:召回不再准,长程推理不再稳。

根本原因来自 transformer 架构:每个 token 都要和其它所有 token 互相 attend。 于是 n 个 token 就有 n² 对关系。context 一长,模型就要把固定容量的注意力摊薄到更多对关系上 —— 加上训练数据中长序列本来就少,模型对「跨 context 的依赖」积累的经验就更少。

位置编码插值(position encoding interpolation)这类技巧能让模型适配更长窗口, 但代价是位置感稍微变模糊。所以「长 context 模型」不是免费午餐,而是一条性能渐变曲线而非悬崖。

illustration · 一张图说清楚"为什么注意力被摊薄"

· n² 注意力关系

每加一个 token,都让所有已有 token 多一份"分心"

下面两张小图:左边是 4 个 token 之间的全连接(4×4),右边是 8 个 token(8×8)。 token 数量翻一倍,关系数量翻四倍 —— 注意力是按平方变稀的。

n = 4 · 6 对关系 每个 token 都看其它 3 个 n = 8 · 28 对关系 每个 token 都看其它 7 个

· context rot 曲线

召回率不会突然崩,而是慢慢变软

needle-in-a-haystack 类基准发现:随着 context 变长,模型从其中精确检索信息的能力逐步下滑。 不同模型曲线斜率不同,但都是下滑的

100% ~70% ~40% 召回 中等 长 → context length 陡的模型 缓的模型
所以 context 不是越多越好。每一个进入 context 的 token,都要"对得起"它消耗的注意力预算。 下一节会把这条原则落到三个具体组件上:system prompt、tools、examples。
03 · 有效上下文的解剖

找到「最小、信号最高」的那组 token —— 三个组件,一条共同原则

Anthropic 把指导原则一句话讲清楚:找出最小的、信号最高的 token 集合,最大化你想要的行为出现的概率。 听起来像废话,但落到 system prompt、tools、examples 三件事上,每件都有具体可操作的标准 —— 也都有典型反例。

component 01

System Prompt:找到「刚刚好」的高度

清晰、直接的语言,把行为讲到一个 Goldilocks zone —— 既不是把所有 if-else 硬编码成规则,也不是只甩高层口号。

反例 A 太具体:把每种 case 写成 if-else 规则,模型脆、维护贵
反例 B 太抽象:只给「请专业地回答」之类口号,模型猜不到你想要啥
推荐 用 XML / Markdown 分块(background / instructions / tool guidance / output spec)
component 02

Tools:自洽 · 容错 · 用途无歧义

工具是 agent 跟世界的「契约」。Tools 要 token 高效, 也要让 agent 在「该用哪个工具」时不犹豫。

最常见错 tool set 膨胀:功能重叠、决策点模糊 ——「人都不知道选哪个」时,agent 也别想做对
底线 tool 要像好代码:self-contained · robust to error · 用途清晰
推荐 给一组 minimal viable tools,参数描述要 unambiguous,配合模型的强项
component 03

Examples:少而精的「一图胜千言」

Few-shot 仍然强烈推荐,但不是把所有边界情况列成清单。 examples 是给 LLM 的「图画」,多样、典型、能 portray 期望行为就够。

反例 laundry-list 反模式:把每条 edge case 写成 if-else 塞进 prompt,又长又乱
推荐 挑一组 canonical examples,覆盖典型场景而不是穷举规则
起点 先用最小 prompt + 最强模型跑,看哪些失败模式 → 针对性补例子
spectrum · system prompt 的「右高度」

· system prompt 的 Goldilocks 谱系

×
×
太具体
刚刚好
太抽象
左端 · 脆性 if-else

把每种情况都硬编码成规则。表面看可控,实际上极易失效,每个新边界条件都得加一条规则,最终维护成本爆炸。

中间 · 刚刚好

具体到能有效引导行为,灵活到允许模型用启发式自己决策。组织成 background / instructions / output 等清晰段落。

右端 · 空泛口号

只甩「请专业地、按最佳实践回答」这种话。没有提供具体信号,错把"模型应该懂"当成了真的懂。

注意一个细节:「最小」不等于「短」。 你仍然需要把行为完整说清楚,只是别加冗余的、对结果没贡献的 token。 最佳起点:最强模型 + 最小 prompt,跑出失败模式,再针对性地加例子和指令。
04 · 上下文检索策略

不要把所有数据预先塞进来 —— 让 agent 自己去拿

过去主流是预计算的 embedding 检索:先把可能用到的文本 chunk 化、向量化、丢进 context。 但越来越多团队转向 just-in-time:只放轻量的「文件名 / 路径 / 链接 / 查询」,需要时再让 agent 用工具去取。 这对应了人类的认知习惯 —— 你不会背下整本字典,你会去查。

strategy 01

Pre-computed Retrieval

推理之前先把可能相关的内容 embed、检索、塞进 context。 速度快,但容易塞进无关或过期内容,且对索引质量极度敏感。

适合 内容相对静态、问题模式可预测(例如 RAG over 文档库 / FAQ)
strategy 02

Just-in-time(按需加载)

只在 context 里放轻量标识符:文件路径、查询语句、URL。 运行时让 agent 用工具动态加载具体内容,看完就放下。 Claude Code 用这种方式分析大型数据库 —— 写 query → 存结果 → 用 head/tail 做局部分析。

额外好处 路径 / 命名 / 时间戳本身就是元数据,file 在 tests/ 还是 src/core_logic/ 暗示完全不同的用途
strategy 03

Hybrid(混合)

预先放一部分高频关键资料保证速度,再把其余交给 agent 自主探索。 Claude Code 就是这么做:CLAUDE.md 一上来就在 context 里,glob/grep 等原语用于 just-in-time 找文件。

适合 内容动态性中等、有明显「常用 vs 偶用」边界(法律 / 金融 / 大代码库)
flow · just-in-time 三步:保留指针 → 工具调用 → 结构化产出

· just-in-time 是怎么跑起来的

关键在于:不预先加载完整对象,只保留指针 + 元数据 + 一组好工具, 让 agent 像人翻文件夹一样渐进披露地拼出理解。

STEP 1 · 保留指针
Context 里只放轻量标识符

文件路径 / 查询 ID / URL / cache key —— 体积小,但带着语义。

src/core_logic/router.py · q_2024_users · s3://reports/q3.csv
STEP 2 · 工具调用
需要时才动态加载

用 read / grep / head / tail / SQL 等工具按需取一个切片,看完即弃。

grep "def route" router.py · head -n 20 q3.csv
STEP 3 · 渐进披露
每一步又给下一步指引

file 大小暗示复杂度、命名暗示用途、时间戳暗示新旧 —— 像人一样层层探索。

→ 决定下一个该读哪个文件 / 跑哪条 query
权衡:runtime exploration 比预计算慢;如果工具设计不好,agent 会乱用工具、追死路、错失关键信息。 所以工具和启发式要被认真设计 —— 这是 just-in-time 唯一不便宜的地方。

Anthropic 的判断是:随着模型越来越聪明,context 设计会越来越「让模型自己拿」, 人类预先策划的部分会越来越少。但在那之前,「do the simplest thing that works」依然是最稳妥的建议。

05 · 长任务的三种破局

当任务跨越数小时、跨越 context 窗口,靠什么维持连贯?

长任务(大代码库迁移、多小时研究、长程 agent 训练)会让 token 数远超 context 窗口。 等更大的窗口能解决吗?大概率不能 —— 即使窗口再大,context pollution 和「越长越软」的问题依然存在。 Anthropic 给出三种实战策略,配套相应的适用场景。

Compaction · 把对话浓缩成摘要,重启一个 context

当对话快撑爆 context 时,把消息历史交给模型自己总结,再用这份摘要重启一个新 context。 Claude Code 的实现:保留架构决策、未解决 bug、关键实现细节,丢掉冗余的工具输出 —— 然后把最近读过的 5 个文件也带着,继续走。
claude code 的实践 压缩的艺术在于留什么 vs 丢什么:太狠会丢掉「当时不重要、后来才显出关键」的细节。 建议先把召回率调到最大,再迭代精度,逐步剪掉冗余。 最轻量、安全的一种压缩:清掉过往 tool 调用的 raw 输出 —— 已经在消息历史里看过的工具结果,没必要再看一遍。
old context (full) → 即将撑爆 压缩 summarize new context (compact) 摘要 · 关键决策 最近 5 个文件 未解决 bug …继续工作 → 继续 · 用户无感
压缩 = 高保真摘要 + 重要工件,重启 context

Structured Note-taking · 写到 context 之外,需要时再读回

agent 自己定期把笔记写到外部文件(NOTES.md / to-do list / memory tool), 这些笔记在需要时被读回 context。开销极小,但能让 agent 跨几十个工具调用都不丢线索。
claude plays pokémon 没人告诉它"该怎么记笔记",agent 自己学会了:维护探索过的区域地图、记下解锁过的成就、 写战斗策略笔记 ——「过去 1,234 步我在 1 号路训练 Pikachu,已经升 8 级,目标 10 级」。

context reset 之后,它读自己的笔记继续多小时的训练 / 副本探索。 这种跨 summarization 的连贯性,纯靠 context 是做不到的。

Sonnet 4.5 公测的 memory tool 把这件事做成了正式能力 —— 一个文件式的外部存储,agent 可以在多 session 之间累积知识库。
context window · 工作中 — context reset — NOTES.md 已访问区域 未完成 to-do 关键策略 进度计数器 读回
外部 memory 文件作为 agent 的"记事本"

Sub-agent Architectures · 主代理协调,子代理深挖

主代理只维护高层计划;具体的脏活由专精的子代理带着干净 context window 去做。 子代理可能消耗几万 token 探索,但只把1-2k token 的浓缩结论返回给主代理 —— 实现 concerns 的清晰隔离。
multi-agent research system 主代理拿到的是「我已经搜了 X 篇文献,关键发现是 Y」这样的浓缩结论; 每个子代理的 raw 搜索过程对主代理不可见。 这种结构在复杂研究类任务上比单 agent 有明显提升。

代价:协调成本 + 子代理之间难以共享上下文。所以不适合需要密集回返讨论的任务。
Lead Agent 高层计划 · 整合 Sub-agent A 深度搜索 ~30k token Sub-agent B 数据分析 ~25k token Sub-agent C 代码读取 ~20k token ↓ 委派 ↑ 浓缩 1-2k
主代理只看浓缩结论,子代理隔离深度上下文
decision matrix · 三策略各自适合什么

· 三种长任务策略 · 适用场景对比

策略 核心动作 最适合的任务 失败模式
Compaction对话压缩
把消息历史摘要后重启 context,保留架构决策与最近文件 需要大量回返讨论的对话流(连续多轮 chat、需要保留上下文连续感的工作) 压缩太狠会丢掉「当时不显要、后来才关键」的细节
Note-taking结构化笔记
定期写笔记到 context 外的文件 / memory tool,再读回 有清晰里程碑的迭代式开发;跨 session 的训练 / 探索类任务 笔记结构差时检索不到;过期信息没及时更新
Sub-agents子代理架构
主代理协调 + 子代理带干净 context深挖,只回传浓缩结论 复杂研究 / 分析类任务,可并行探索且子任务相对独立 子代理之间难共享上下文;不适合需要密集互通的任务
读完这一节请记住:这三件事不是互斥的,可以叠着用 —— 在一个长程 agent 里同时有 compaction(防对话爆窗)、note-taking(跨 session 持久化)、sub-agent(并行调研)。 选择不是 either/or,而是按子任务挑工具
06 · 结语

当模型越来越聪明,工程师要做的事会变 —— 但「context 是稀缺资源」的事实不会变

Anthropic 把这篇文章定位成构建可靠 agent 的心智模型,而不是某种新框架。 所有具体技巧都会随模型迭代而进化,但底层判断不会:每一回合送进模型的 token 都不是免费的。

Context engineering 代表了一种根本性的视角转换: 从「精心写一条 prompt」转到「持续策划进入模型注意力的每一个 token」。 无论你在做长任务的 compaction、token-efficient tool 设计,还是 just-in-time 的环境探索 —— 指导原则都是同一个。

随着模型变强,需要的人工策划会变少,agent 的自主性会变高 —— 但即使能力再扩张,把 context 当成「珍贵且有限的资源」这一基本姿态依然是核心。

guiding principle

不管你在用 compaction 跨越窗口、用 token-efficient tool 优化效率, 还是让 agent just-in-time 去探索环境 —— 核心永远是同一句话

找到最小的、信号最高的那组 token,最大化你想要的行为出现的概率。

— Anthropic Applied AI · Prithvi Rajasekaran 等