让我们从一个简单的任务开始:安排一次会议。
当用户说:“嘿,看看明天能不能快速同步一下?”
一个仅依赖提示工程(Prompt Engineering)的AI可能会回复:“好的,明天可以。请问您希望安排在几点?” 这个回答虽然正确,但却机械且毫无帮助,因为它缺少对真实世界的理解。
现在,设想另一个AI。它在收到同样请求时,不仅看到了这句话,还能立刻访问一个丰富的信息环境:你的日历显示明天日程已满;与对方的邮件历史表明你们的沟通风格是非正式的;联系人列表将对方标记为重要合作伙伴;AI还拥有直接发送会议邀请和邮件的工具权限。
这时,它的回复会是:“嘿 Jim!我看了下,明天日程完全排满了。周四上午似乎有个空档,你看方便吗?如果可以,我就直接发邀请了。”
这种天壤之别,并非因为第二个AI的模型本身更“聪明”,而是因为它所处的“上下文”更完整。这种从优化单一指令到构建动态信息环境的范式迁移,正是当前AI应用开发领域最重要的进化——从提示工程到上下文工程(Context Engineering)。
什么是上下文工程?
Andrej Karpathy 提出了一个绝佳的比喻:大语言模型(LLM)就像一种新型的操作系统,而它的上下文窗口(Context Window)就是内存(RAM)。上下文工程的核心任务,就是高效地管理这块“内存”,在每一次运算前,都把最关键的信息放进去。
一个更工程化的定义是:上下文工程是一门设计和构建动态系统的学科,该系统能在恰当的时机,以恰当的格式,为大语言模型提供解决问题所需的恰当信息和工具。
它所管理的“上下文”,是一个立体的七维系统:
- 指令 (Instructions): 定义AI行为准则和身份的系统级提示。
- 用户输入 (User Prompt): 用户提出的具体问题或任务。
- 短期记忆 (State / History): 当前对话的交互历史,确保对话的连续性。
- 长期记忆 (Long-Term Memory): 跨越多次对话的持久化知识,如用户偏好。
- 检索信息 (Retrieved Information): 通过RAG等技术从外部实时获取的知识。
- 可用工具 (Available Tools): AI可以调用的函数或API列表。
- 结构化输出 (Structured Output): 对AI输出格式的定义,如要求返回JSON。
为何上下文如此关键?失败的四种模式
当一个 Agent 系统表现不佳时,根本原因往往是上下文管理出了问题。一个过长或质量低下的上下文,通常会导致以下四种失败模式:
- 上下文中毒 (Context Poisoning): 错误的或由模型幻觉产生的信息进入了上下文,污染后续决策。
- 上下文干扰 (Context Distraction): 过多无关信息淹没了核心指令,导致模型偏离任务目标。
- 上下文混淆 (Context Confusion): 上下文中一些模棱两可或不必要的细节,影响了最终输出的准确性。
- 上下文冲突 (Context Clash): 上下文中的不同部分存在事实或逻辑上的矛盾。
为了系统性地应对这些挑战,开发者们总结出了四种管理上下文的核心策略。
上下文工程的核心策略
1. 写入 (Write):将信息保存到外部存储
“写入”是为 Agent 提供一种记笔记的能力,将关键信息存储在有限的上下文窗口之外。
- 暂存区 (Scratchpads): 一种任务内的短期记忆。例如,
Anthropic
的研究显示,其LeadResearcher
Agent 在执行复杂任务前,会先将思考好的计划“写入”到外部内存,防止核心计划因上下文超长而丢失。 - 长期记忆 (Memories): 允许 Agent 跨会话记住信息。像
ChatGPT
的记忆功能,以及开发工具Cursor
和Windsurf
中,都包含了基于用户交互自动生成和保存长期记忆的机制。
2. 选择 (Select):按需将相关上下文拉入窗口
“选择”负责在恰当的时机,从海量外部信息中精准地挑选出当前任务最需要的部分,放入上下文窗口。
- 从特定文件中选择: 一些成熟的 Agent 会通过读取特定文件获取上下文。例如,
Claude Code
会读取CLAUDE.md
文件,而Cursor
则使用规则文件(rules files)来加载编码规范,这是一种高效的“程序化记忆”选择方式。 - 从工具集中选择: 当可用工具非常多时,利用 RAG 技术根据当前任务动态检索并“选择”最相关的几个工具,能将工具选择的准确率提高数倍。
3. 压缩 (Compress):保留精华,减少冗余
“压缩”旨在不损失关键信息的前提下,减少上下文占用的令牌(Token)数量。
- 上下文摘要 (Context Summarization): 当对话历史变得过长时,可以调用 LLM 对其进行总结。
Claude Code
的“自动压缩”(auto-compact)功能就是典型例子,当上下文使用率超过95%时,它会自动将完整的对话历史进行摘要。 - 上下文修剪 (Context Trimming): 一种基于规则的过滤。最简单的方法是直接移除最早的几轮对话,更高级的则可使用专门训练的“上下文修剪器”模型来识别并删除不重要的信息。
4. 隔离 (Isolate):拆分上下文以应对复杂任务
“隔离”的核心思想是“分而治之”,将一个大任务分解,让不同的上下文在隔离的环境中被处理。
- 多智能体 (Multi-agent): 将复杂任务分解给多个拥有独立上下文窗口的专家 Agent。
Anthropic
的研究发现,在研究任务中,多个并行工作的子 Agent 团队,其表现远超单个拥有巨大上下文的 Agent。 - 沙箱环境 (Sandboxed Environments): 对于代码执行类任务,可将执行过程隔离在沙箱中。
HuggingFace
的CodeAgent
就是一个例子,LLM 负责生成代码,代码在沙箱中运行后,只有最关键的执行结果被返回到 LLM 的上下文中,而非完整的执行日志。
实现上下文工程的利器:LangGraph 与 LangSmith
要实现上述复杂的策略,需要一个足够灵活和可控的框架。LangChain
生态系统中的 LangGraph
和 LangSmith
为此提供了强大的支持。
LangGraph 是一个用于构建可控 Agent 的低阶框架。它将 Agent 的工作流构建为一个状态图,其设计完美地匹配了上下文工程的需求:
- 状态对象 (State Object): 充当了完美的“暂存区”(写入)和上下文“隔离”区。你可以在状态中定义不同字段,一部分暴露给 LLM,另一部分则作为内部状态,按需“选择”性地使用。
- 持久化与记忆: 其内置的检查点(checkpointing)和记忆模块,可以轻松实现短期和长期记忆的“写入”与“选择”。
- 可定制的节点: 图中的每个节点都是一个可编程的步骤。你可以在节点中轻松实现“压缩”逻辑,例如在调用某个工具后立刻对结果进行摘要。
- 多智能体架构:
LangGraph
提供了如supervisor
和swarm
等库,原生支持构建复杂的多智能体系统,实现上下文的“隔离”。
LangSmith 则是一个可观测性(Observability)平台。它让你能够像调试普通程序一样,清晰地追踪 Agent 的每一步决策过程,精确地看到每一次 LLM 调用时其上下文窗口中到底包含了哪些信息。这为诊断和优化上下文工程提供了不可或缺的洞察力,并能通过评估(Eval)功能验证优化策略的有效性。
从提示工程的“炼金术”,到上下文工程的“系统科学”,这不仅是技术的演进,更是构建可靠、强大AI应用的必然路径。掌握这门技艺,以及 LangGraph
和 LangSmith
这样的工具,正在成为AI工程师的核心竞争力。