一、什么是上下文工程 定义 在传统的提示词工程中,上下文 C 只是一个单一的字符串(即 C=prompt)。而上下文工程将 C 重新概念化为由多个信息组件(c1,c2,…,cn)动态组合而成的结构: C=A(c1,c2,…,cn) 这里的 A 是一个“组装函数”,负责调度这些由不同函数获取、过滤和格式化的组件。这些组件主要包括六个核心领域: cinstr (指令):系统指令和规则。 cknow (知识):通过RAG(检索增强生成)或知识图谱获取的外部知识。 ctools (工具):可用外部工具的定义和签名(用于函数调用)。 cmem (记忆):历史交互中保留的持久化信息。 cstate (状态):用户、现实世界或多智能体系统的动态状态。 cquery (查询):用户当下的直接请求。
在传统的提示词工程中,上下文 C 只是一个单一的字符串(即 C=prompt)。而上下文工程将 C 重新概念化为由多个信息组件(c1,c2,…,cn)动态组合而成的结构:
C=A(c1,c2,…,cn)
这里的 A 是一个“组装函数”,负责调度这些由不同函数获取、过滤和格式化的组件。这些组件主要包括六个核心领域:
上下文工程本质上是一个寻找最优上下文生成函数集合的数学优化问题。 我们的目标是找到一组理想的函数 F(包括检索、选择、组装等),以最大化模型输出的预期质量(Reward),同时受限于模型的最大上下文长度限制(∣C∣≤Lmax):
一句话总结就是
构建有效的context结构,在上下文中找到 最小的一组高信息密度 token,同时最大化模型产生目标结果的概率。
提示词工程 (Prompt Engineering): 它的核心在于“写(Writing)”和“组织(Organizing)”。主要关注如何遣词造句、如何设计 System Prompt、如何清晰地向大模型下达指令。这在早期的 AI 应用(如单轮对话、文本分类、内容生成)中是绝对的核心。
上下文工程 (Context Engineering): 它的核心在于“策展(Curating)”和“维护(Maintaining)”。它不仅包含提示词,还包揽了在模型推理期间进入上下文窗口的所有信息。
提示词工程 (Prompt Engineering): 视角相对静态。通常是面向“单次(One-shot)”任务进行优化,打磨一段完美的静态文本。
上下文工程 (Context Engineering): 视角是全局且动态的。它管理的是整个上下文状态 (Context State),其中包括:系统指令、工具定义、模型上下文协议 (MCP)、外部数据、以及不断增长的历史消息。
随着智能体的发展,prompt engineering这一范式正在逐步转变为context engineering。
当一个 Agent 在循环(Loop)中运行,执行多轮推理和长周期任务时,它会不断生成新的数据(比如工具调用结果、中间思考过程)。这些新数据必须被周期性地提炼和精简 (Cyclically refined),否则很快就会撑爆模型的注意力预算(Attention Budget)。提示词工程解决不了“历史消息越来越长”或者“外部检索数据太多”的问题,而这正是上下文工程要解决的命题。
上下文工程不再是“如何写好一句话来引导AI”,而是构建一套严密的、模块化的系统架构。它通过科学地调度指令、知识、工具、记忆和状态,让AI系统能够像人类一样,在复杂、模糊、动态且多模态的现实世界中,做出准确的响应。
正如上面所提到的,现实生活中有相当一部分问题需要模型结合实时信息进行回答,需要提供额外信息(这里可以是RAG、search工具等等)以供模型在新的知识上进行推理、回答,但是大量的信息会导致模型的注意力漂移,如何有效的管理上下文,如何组织最少的上下文来让模型完成目标任务十分重要,因此需要context-engineering。
大模型并不是全能的,它们在处理信息时面临着严苛的架构瓶颈。上下文工程是用来管理这些瓶颈的必要手段:
在商业和实际部署中,粗放的提示词和冗长的上下文会带来致命问题,必须通过工程化手段进行治理:
上下文工程不仅是为了“避坑”,更是为了“拔高”,它能让通用的 LLM 在垂直领域表现出专家级的能力:
传统的提示词工程往往把上下文当成一个“垃圾桶”,把所有可能相关的信息都塞进去。而上下文工程的核心哲学发生了转变:
<background_information>, <instructions>)
太具体 (Too specific): 包含死板的强制步骤、复杂的条件逻辑(如大量的 if-else 判断)和试图穷举所有极端情况的清单。这会过度限制 AI,使其缺乏灵活性。
恰到好处 (Just right): 设定明确的角色,提供灵活的响应框架(如:识别核心问题 -> 收集背景信息 -> 提供清晰方案 -> 确认满意度),并给出通用的行为准则(Guidelines)。这既给定了方向,又保留了 AI 自主推理和调用工具的空间。
太模糊 (Too vague): 只有两三句空泛的描述,缺乏具体的业务指导、框架或工具说明,导致 AI 无法提供有针对性的帮助。
不要给 Agent 塞一个臃肿庞大的工具集。如果连人类工程师都不知道某一步该用哪个工具,Agent 也会陷入选择困难并浪费上下文。
记忆系统通常设计为多层次的结构,模拟人类的记忆机制。这些层次包括短期记忆和长期记忆,分别用于处理当前任务的上下文和跨会话的知识。
短期记忆(Short-Term Memory):
短期记忆主要用于存储当前对话的上下文,它的存储空间通常是有限的。在LLM中,这相当于输入的上下文窗口(Context Window)。短期记忆的作用是保持当前任务的连贯性,使得模型在短时间内能够理解并生成与当前对话相关的内容。
长期记忆(Long-Term Memory):
长期记忆则存储那些跨多个对话会话、任务或用户交互的知识。它允许模型记住用户的历史记录、偏好设置、过去的决策等信息,以便在未来的对话中能够根据这些历史信息做出更加精确和个性化的响应。长期记忆往往存储在外部数据库中,如向量数据库或知识图谱系统。
记忆管理不仅仅是将信息存储起来,它还涉及信息的有效更新、检索和删除。一个高效的记忆管理系统需要能够根据任务需求选择性地保存或忘记信息,以确保系统的性能和效率。
信息存储与更新:
在记忆系统中,信息是动态更新的。例如,短期记忆会根据新的对话内容不断被更新,而长期记忆则根据用户的历史信息不断积累。为了避免记忆过载,系统会通过优先级算法来决定哪些信息需要被保存,哪些可以被遗忘。这种信息选择与更新的过程确保了模型的效率和信息的相关性。
信息检索:
存储在记忆系统中的信息需要能够被快速检索出来。在长期记忆中,信息往往以向量的形式存储,模型可以通过检索算法(如基于语义相似度的向量检索)从记忆中召回最相关的信息,补充当前对话的上下文。这种信息检索不仅限于简单的关键词匹配,而是通过复杂的检索机制来选择最相关、最具信息量的内容。
信息压缩:
记忆系统需要处理大量的信息,而过多的信息会导致存储空间的浪费并影响性能。因此,压缩技术在记忆管理中扮演着重要角色。通过对存储的信息进行摘要、过滤或重组,系统能够将最重要的部分保留,并去除冗余信息。例如,模型可以通过生成一个摘要来替代冗长的对话记录,或只保留与当前任务高度相关的部分信息。
检索增强生成(Retrieval‑Augmented Generation,RAG)是 上下文工程中最核心的架构之一。它通过将 LLM 与外部知识库、向量搜索和结构化检索系统结合,使生成结果能实时接入外部信息来源,从而解决 LLM 内部参数记忆的时效性和覆盖范围限制。
模块化RAG(ModularRAG)
模块化RAG的核心思想是将整个RAG过程分解为多个独立的、可插拔的模块。这些模块分别负责检索、文档增强、生成等不同任务,每个模块可以根据需求进行独立的优化和替换。这种结构提供了极高的灵活性,使得系统能够针对不同的任务需求进行定制化设计。
在模块化RAG中,每个模块的功能明确且独立:
优势:
挑战:
代理式RAG(Agentic RAG)
代理式RAG 引入了 智能体(Agent) 的概念,突破了传统RAG的静态执行流程,将任务拆分为多个子任务,由不同的智能体(agent)来执行。这种方法使得RAG不仅仅是检索和生成的组合,更像是一个 决策系统,它能够在多个步骤中做出智能决策、动态调整策略,并在需要时调用外部工具进行进一步的操作。
代理式RAG通常包括以下几个组件:
优势:
挑战:
很多人做 LLM 应用时,默认思路是:“模型上下文不够,就想办法塞更多内容进去。”
但真正做过复杂系统后会发现,问题往往不是塞得不够多,而是塞得不够准。模型的上下文窗口、本次调用的 token 成本、注意力资源、推理延迟,这些都是真实存在的工程约束。上下文越长,不代表效果越好。信息一旦太多,模型反而更容易抓不住重点,甚至把真正重要的内容淹没在无关细节里。所以,动态上下文管理的核心不是“扩容”,而是调度:在每一次调用模型之前,系统都要判断——这一次到底该给模型看什么,不该看什么,哪些要保留原文,哪些要压缩,哪些应该暂时放在外部,需要时再取回来。
多 Agent 最合理的默认结构不是“大家共用一个大脑”,而是不同 agent 之间有合理的分层。
主 Agent 持有的是高价值、低噪声的控制层上下文:用户目标、成功标准、边界条件、当前计划、已确认结论、依赖关系和最终产物的位置。
子 Agent 持有的是任务层上下文:某个子问题的任务说明、允许使用的工具、局部检索结果、临时工作笔记和中间探索轨迹。
主 Agent 负责想清楚“做什么”,子 Agent 负责想清楚“怎么把这件事做完”。这正对应了 OpenAI 所说的 manager pattern:中央 manager 统一编排,其他 agent 作为工具型 worker 被调用;也对应 Anthropic 的 orchestrator-worker 结构:lead agent 做规划和综合,subagents 在独立窗口里并行做深入探索。
这也是为什么 plan-and-execute 在多智能体场景里很自然。高层规划 agent 不应该被长文、日志、搜索结果和失败重试污染;它的上下文应该尽量干净,专门保留任务目标、决策依据和阶段状态。执行型 agent 则相反,它天生就该处理“脏信息”:读取大文件、跑多轮搜索、做批量筛查、看长日志、解析表格、比对多个候选结果。LangChain 的 subagent 文档把这种模式讲得很直接:subagent 是 stateless 的,每次调用都在干净窗口里工作,这样可以避免主对话的 context bloat;Deep Agents 文档甚至把它叫作 context quarantine。
所以,多 Agent 里的第一原则不是共享,而是先隔离,再选择性共享。
共享什么? 共享那些会影响其他 agent 判断的“稳定事实”。 比如:任务目标、业务约束、输入数据版本、已完成步骤、关键结论、artifact 链接、依赖关系、下一步动作、失败原因摘要。
不共享什么? 不共享那些只在局部探索中有价值的“过程噪声”。 比如:完整搜索日志、网页长摘录、原始工具返回、局部 scratchpad、试错路径、低置信度假设。
如果把后者也全量共享,系统很快就会退化成“所有人都在读彼此的施工现场”。而更成熟的做法,是让 agent 之间通过一个瘦身后的共享黑板协作:黑板上放状态和结论,不放整段原始过程。A2A 的设计理念也体现了这一点——agents 可以协同工作,但不需要互相暴露内部状态或内部逻辑。
跨 Agent 的信息传递,也最好不要理解成“把聊天上下文继续传下去”,而应该理解成移交一个任务包。
一个可落地的 handoff packet,至少应该包含这些内容:
因为 handoff 一旦只依赖自然对话历史,就很容易出现“指令漂移”——主 Agent 以为已经说清楚了,子 Agent 却抓错重点。
Anthropic 在他们的多 agent 系统经验里专门强调,lead agent 必须把 objective、output format、tool guidance 和 task boundary 写清楚,否则 subagents 会重复工作、漏掉关键维度,甚至做完全不同的问题。
传结论上下文,不传原始对话日志。 很多人第一次做多 Agent,会天然觉得“既然前面都聊过了,那就把完整历史传给下一个 agent 吧”。但这通常不是继承上下文,而是继承噪声。
OpenAI 的官方多 agent 文档已经把这件事说得很明确:主线程一旦被 exploration notes、test logs、stack traces、command output 之类的中间信息淹没,系统会出现 context pollution 和 context rot;因此更推荐把 noisy work 移出主线程,让 sub-agents 返回 summaries,而不是原始中间输出。
Anthropic 也同样把 subagents 的价值概括为 compression:它们在独立上下文里花更多 token 探索,再把高浓缩结论回流给 lead agent。
这就引出一个规范的返回格式设计:子 Agent 可以花数万 token 做探索,但最终只返回 1000–2000 token 的“高浓缩精华总结”。 这个总结最好不是一段松散自然语言,而是有固定结构。一个常见而稳定的格式是:
如果需要更强可组合性,还可以再加两个字段:“哪些内容已经验证过,不要重复做”;“哪些内容只是猜测,主 Agent 不要直接采用”。
这样主 Agent 在汇总多个 worker 结果时,就不会把低质量猜测和高质量结论混在一起。关于 context engineering 的 Survey 中也提到了这个风险:多 agent 系统里,一个核心问题就是 inter-agent dependency opacity——不同 agent 可能在不一致的假设上工作,或者拿着冲突数据继续往前推;如果没有额外验证层和约束层,错误会被放大。
从工程角度看,最稳妥的流转方式不是“消息传消息”,而是消息 + 产物引用。
也就是说,子 Agent 不一定把所有结果都塞回主 Agent 的 prompt。更好的做法常常是:
Anthropic 在公开总结里也提到过,某些结果可以绕过主协调器的长文本传输,直接写入文件系统,再把轻量引用返回给 coordinator,这样既减少“传话游戏”,又能降低上下文负担。
你可以把整个系统想成两层:消息层负责让 agent 之间传递意图、状态和简报;产物层负责保存长内容、原始证据和可复查材料。
消息层求短,产物层求全。
如果再往前走一步,多 Agent 系统其实需要一个明确的共享黑板模型。 但这里的“黑板”不要理解成所有内容都贴上去,而应该理解成一个只存全局稳定状态的共享面板。
它适合保存:
它不适合保存:
黑板不是共享上下文的垃圾桶,而是共享状态的控制面板。 一旦黑板开始堆原始材料,它就会反过来污染所有 agent。
当然,隔离带来的代价也很真实。如果上下文隔离做得太狠,系统会出现另一类问题:子 Agent 看不到必要背景,重复劳动变多,结果彼此冲突,或者主 Agent 失去对局部工作的真实理解。
Anthropic 也公开提到,当前很多多 agent 系统仍然是同步执行的:lead agent 等一批 subagents 全部完成后再继续,这样协调简单,但信息流会形成瓶颈,主 Agent 不能实时 steer 子 Agent,子 Agent 之间也无法动态协同;如果改成异步,并行度会上去,但状态一致性、错误传播和结果协调又会变难。
所以,一个成熟的多 Agent 上下文流转系统,通常还要补上四个防错机制:
如果说前面的章节讨论的是上下文工程的组成部分:系统提示、记忆、检索、工具、状态、压缩、路由与长期任务治理,那么这一章讨论的就是一个更底层、也更具有统摄性的原则:渐进式披露(Progressive Disclosure)。
把它放在最后,并不是因为它只是众多技巧中的一个补充项,恰恰相反,是因为当你把上下文工程一路分析到最后,会发现许多看似分散的方法,最终都在指向同一个判断:不要一次性把所有信息都塞给模型,而要只在合适的时机,向它暴露当下真正需要的信息。 Anthropic 在谈上下文工程时,把问题的核心表述为:在有限的注意力预算下,找到“最小但高信号”的 token 集合;而在谈 Agent Skills 时,又把 progressive disclosure 作为核心加载机制,强调仅在相关时才展开完整说明和更深层资源。两者放在一起看,几乎已经构成了同一思想在两个层面的表述:一个是原则层,一个是系统实现层。
“渐进式披露”并不是 AI 时代才出现的概念。它来自更早的交互设计领域。Jakob Nielsen 对它的经典定义是:把高级的、低频的、次级的功能延后到第二层界面中,只先展示最重要、最常用的选项。这样做的目的,是让系统更容易学习、更高效,也更不容易出错。NN/g 还特别指出,渐进式披露的价值不只是“隐藏复杂性”,更是在向用户传达一种优先级:凡是默认出现在第一屏的信息,都是当前最重要的信息。
如果把这个定义直接迁移到 LLM 系统里,意思就变成了:不要让模型在第一时间面对一个臃肿、混杂、平铺直叙的上下文大包,而是要让它先看到最关键的线索,再根据任务推进逐层展开更深的内容。 从“先展示主要按钮,再把高级设置藏到二级菜单里”,到“先给模型元数据,再按需加载详细说明和文件”,其结构是完全同构的。不同的只是交互对象从“人类用户”变成了“作为推理主体的模型”。
上下文工程之所以重要,不是因为今天的模型上下文窗口还不够大,而是因为上下文本身从来都不是越多越好,而是一种稀缺的注意力资源分配问题。Anthropic 在《Effective context engineering for AI agents》中强调,LLM 受限于有限的 attention budget,好的上下文工程意味着找到“最小可能的高信号 token 集”,从而最大化获得目标结果的概率。文章同时指出,随着上下文长度增加,模型并不是突然失效,而是会出现精度下降、长距离依赖变弱、相关性判断变差等渐进式退化现象;因此,上下文必须被看作一种边际收益递减的有限资源。
这意味着,一个成熟的 Agent 系统真正要解决的,不是“如何拥有更多上下文”,而是“如何避免让无关上下文污染当前决策”。 也正是在这个意义上,渐进式披露不再只是一个 UI 设计技巧,而变成了上下文工程的根本方法论:把上下文视为一系列可分层、可延迟、可条件触发的信息单元,而不是一次性整体注入的静态文本。 当前只暴露必要线索;当模型的下一步行动证明某部分信息确实相关时,再把那一层展开;如果仍不够,再继续向更细的文件、脚本、数据、状态读取。这就是从“prompt thinking”走向“context architecture”的关键一步。
很多人在第一次听到这两个词时,会把它们当成并列关系:上下文工程是一回事,渐进式披露是另一回事。更准确的理解应该是:上下文工程是总问题,渐进式披露是这个总问题的一种核心解法。
上下文工程关心的是:什么信息该进入模型、何时进入、以什么形式进入、如何在长任务中保留与裁剪。它研究的是上下文的整体组织。渐进式披露则给出了其中一个极其关键的答案:不要预先决定所有信息都该进入,而要让系统在运行过程中逐层揭示。 Anthropic 对 agentic search 的描述很清楚:越来越多团队正在从“预先检索完再一次性喂给模型”,转向“保留轻量标识符,如文件路径、查询、链接等,然后在运行时按需把数据加载进上下文”的 just-in-time 策略;而让 agent 自主导航和检索,又进一步“enables progressive disclosure”,也就是通过探索逐步发现相关上下文。
所以,从概念层级上说,上下文工程更像一门调度学,渐进式披露更像它的第一性原则之一。前者问的是“如何设计上下文系统”,后者回答的是“设计时应默认采用怎样的信息暴露哲学”。渐进式披露和前面提到的RAG、记忆、状态、工具、长上下文压缩等方法表面虽然不同,本质上都在试图做到同一件事——只在必要的时候,把必要的信息,交给模型。
渐进式披露经常和 just-in-time 一起出现,但两者并不完全相同。可以把它们理解为两个互补维度。
Just-in-time 更偏时间维度。 它关心的是:信息什么时候取进来。不是预先把“所有可能有用”的内容都塞进上下文,而是在推理进行到某一步时,才根据当前需要去检索、读取、执行。Anthropic 的表述就是:agent 维护的是轻量级引用,而不是完整数据本体;通过工具在运行时动态加载内容。
Progressive disclosure 更偏结构维度。 它关心的是:信息按几层来揭示。先给目录级线索,再给概要,再给细节,再给脚本或原始数据。它不是简单地“晚一点给”,而是要有明确的层级设计,让系统知道第一层应该只承载方向感,第二层承载任务说明,第三层才承载执行细节。Anthropic 在 Skills 架构里将这种思想制度化为三层:元数据先加载;完整 SKILL.md 只在相关时加载;更深层链接文件与资源只在需要时访问。
因此,可以把两者的关系概括为:JIT 解决“何时加载”,Progressive Disclosure 解决“按什么层级加载”。 在一个优秀的 agent 系统中,它们往往同时成立。系统不会一次性预装全部内容,这是 JIT;系统也不会在第一次命中时就把所有相关文件全读进来,而是先读最上层说明,再按引用深入,这是 Progressive Disclosure。两者结合,才真正构成现代上下文工程里的“按需上下文化”能力。
如果要找一个最能说明渐进式披露的具体系统,Anthropic 的 Agent Skills 几乎是现成的教材。Anthropic 在官方文档中把 Skill 定义为一种模块化能力包,里面可以包含指令、元数据,以及可选的脚本、模板和资源。Skill 的关键不在于它只是一个“提示词文件夹”,而在于它把知识、流程、代码和参考材料组织成一个可以被 Agent 按需发现和读取的文件系统对象。
更重要的是,Skills 的发现与加载本身就是渐进式披露。模型在启动时并不会把所有 Skill 的全部内容都装进上下文;它先只看到 name 和 description 这样的元数据,用来知道“有哪些能力存在”;只有当某个 Skill 与当前任务相关时,才进一步读取 SKILL.md 的完整说明;而如果 SKILL.md 又链接到更详细的参考文档、样例或脚本,模型也只会在需要时继续打开它们。Cookbook 和官方文档都强调,这种架构的好处在于“只为真正使用的内容付费”,未被访问的内容不占用上下文。
这件事的意义非常大。它表明上下文工程已经不再只是“怎么写 prompt”,而是发展成了怎么组织能力资产。 以前我们把专业知识灌进系统提示;现在更合理的做法是把它们整理成分层文档、样例、脚本和资源,让模型在真正需要时去发现、调用和执行。也就是说,Skill 并不是对上下文工程的替代,而是渐进式披露在工程系统中的制度化形态。
直觉上,很多人会认为“我多给点背景,模型总归更懂”。这在简单问答里有时成立,但在复杂 Agent 场景里,常常会变成灾难。因为上下文一旦变长,问题就不再只是“够不够”,而是“有没有把当前决策真正需要的信号淹没”。Anthropic 明确提醒,长上下文会带来 context pollution 和 relevance concerns,即便未来上下文窗口继续扩大,这类问题依然存在。
渐进式披露优于“全集合预装”的原因,至少有四个。
如果把它写成一个工程原则,可以表述为:
先向模型提供结构化的方向感,而不是全部内容本体。比如只暴露文件名、路径、更新时间、标题、摘要、标签、Skill 描述、工具 schema,而不先塞完整正文。Anthropic 特别提到,文件层级、命名约定、时间戳本身就是重要信号,它们能帮助 agent 判断下一步应读取什么。
SKILL.md 应该像 onboarding guide 的目录页,提供高层路线而非所有细节。Anthropic 的 best practices 也明确建议把 SKILL.md 视为 overview,像目录一样指向更详细材料,并在内容接近上限时把内容拆到独立文件中。
如果某段逻辑已经被封装为稳定脚本、查询模板或工具调用,优先让 Agent 直接执行,而不是把底层实现全部灌进提示。这样做既节省 token,也降低了模型在“读懂实现细节”上的注意力消耗。Skills Cookbook 反复强调,skills 的价值之一就在于可以携带经过验证的 helper scripts,减少从头生成代码的成本和错误率。
Anthropic 对 agentic exploration 的描述很重要:每一次交互都会产出新的上下文,进而影响下一步决策。文件大小暗示复杂度,命名暗示用途,时间戳暗示新旧,目录结构暗示角色。这意味着渐进式披露不是静态分页,而是边探索、边判断、边缩小范围的递归过程。