上下文管理四种技巧
引言¶
权威性声明:本文的核心观点与技术策略深度提炼自 LangChain 官方博客文章 Context Engineering for Agents,旨在为技术从业者系统性地解析构建高级 AI 智能体(Agent)的关键技术。
核心问题与价值:著名 AI 专家 Andrej Karpathy 曾将大型语言模型(LLM)比作一种新型操作系统,其中 LLM 是 CPU,而其上下文窗口(Context Window)则是 RAM。正如操作系统需要精心管理内存(RAM)一样,我们在构建智能体时也必须高效地管理模型的"工作记忆"——上下文窗口。
为何上下文工程对智能体至关重要¶
AI 智能体的核心工作模式是在 LLM 调用和工具调用之间进行循环,利用工具的反馈来决定下一步行动。这个过程天然地会产生大量上下文信息。
随着任务的进行,来自工具调用的上下文会不断累积,迅速膨胀。这种"上下文溢出"会直接导致多种严重问题:
主要问题¶
- 超出上下文窗口限制:当 Token 数量超过模型上限时,程序会崩溃或丢失重要信息。
- 成本与延迟激增:更多的 Token 意味着更高的 API 调用成本和更长的响应时间。
- 性能下降:过长或混乱的上下文会严重影响模型的推理能力,具体表现为:
- 上下文污染(Context Poisoning):一个错误的幻觉信息进入上下文,并在其中被反复引用。
- 上下文干扰(Context Distraction):当上下文变得过长时,模型会过度关注上下文,而忽略了其在训练过程中所学的内容。
- 上下文混淆(Context Confusion):模型利用上下文中多余的内容生成低质量回复。
- 上下文冲突(Context Clash):上下文中积累的新信息和工具与该上下文中的其他信息发生冲突。
正如 AI 公司 Cognition 和 Anthropic 所强调的,上下文工程是构建 AI 智能体工程师的首要工作,也是处理长时程对话智能体所必需的核心管理策略。
上下文工程的四大核心策略¶
为了有效应对上述挑战,业界涌现出四大类上下文工程策略:写入(Write)、选择(Select)、压缩(Compress) 和 隔离(Isolate)。
策略一:写入上下文(Write Context)¶
"写入"是指将信息保存到上下文窗口之外的存储中,以便将来使用。
便笺(Scratchpads)¶
便笺是一种在单次任务会话中供智能体使用的"临时记事本"。它允许智能体在执行任务时记录中间思考、计划或重要发现,而无需将这些信息始终保留在昂贵的上下文窗口中。
例如,Anthropic 的多智能体研究系统中的 LeadResearcher 智能体会先将思考好的计划保存到内存中,以防上下文窗口被截断时丢失关键计划。便笺可以通过简单的工具调用(如写入文件)或更新一个持久化的运行时状态对象来实现。
记忆(Memories)¶
与便笺的"会话内"特性不同,记忆旨在实现跨会话的长期信息持久化。这使得智能体能够从过去的交互中学习和成长。
例如,Reflexion 模型在每次行动后进行自我反思并生成记忆,而生成式智能体(Generative Agents)则会定期从过去的反馈中合成新的记忆。如今,像 ChatGPT、Cursor 等主流产品都已经内置了基于用户交互自动生成和管理长期记忆的机制。
策略二:选择上下文(Select Context)¶
"选择"是指在需要时,从外部存储中精准地拉取相关信息并注入到当前上下文窗口中。
从便笺和记忆中选择¶
选择机制与写入机制相对应。如果便笺是工具,智能体可以通过调用读取工具来获取信息。如果记忆存储在数据库中,就需要一套高效的检索机制。记忆可以分为不同类型,以服务于不同目的:
- 情景记忆(Episodic Memories):如 Few-shot 示例,用于展示期望的行为模式。
- 程序记忆(Procedural Memories):如操作指令,用于引导智能体的行为。
- 语义记忆(Semantic Memories):如事实知识,为任务提供相关背景。
选择的挑战在于确保相关性。简单的实现是始终加载固定的规则文件,如 Claude Code 使用的 CLAUDE.md。而更复杂的系统则使用 嵌入(Embedding)或知识图谱(Knowledge Graph) 来索引海量记忆,并进行语义检索。
选择工具和知识(RAG)¶
当智能体拥有大量工具时,它可能会因为工具描述重叠而感到困惑。对工具描述应用 RAG(检索增强生成)是一种有效的解决方案,它能根据当前任务动态选择最相关的工具,有研究表明这能将工具选择的准确率提高 3 倍。
对于知识的检索,RAG 同样至关重要。例如,Windsurf 的代码智能体综合使用了文本搜索(grep)、AST(抽象语法树)解析、知识图谱检索和重排序等多种技术,以在大型代码库中实现可靠的上下文检索。
策略三:压缩上下文(Compress Context)¶
"压缩"是指在保留任务所需核心信息的前提下,尽可能减少上下文中的 Token 数量。
上下文总结(Context Summarization)¶
这种方法通常使用一个 LLM 来提炼和浓缩信息。例如,当 Claude Code 的上下文窗口使用率超过 95% 时,它会自动触发"auto-compact"功能,对整个用户-智能体交互轨迹进行总结。
总结可以应用于不同层面:
- 对整个对话历史进行递归或分层总结。
- 在特定节点对高 Token 消耗的工具输出(如网页搜索结果)进行后处理。
Cognition 公司甚至为其智能体专门微调了一个总结模型,用于在智能体之间交接工作时压缩知识,足见其重要性。
上下文裁剪(Context Trimming)¶
与使用 LLM 进行智能总结不同,裁剪通常依赖硬编码的启发式规则来过滤或"修剪"上下文。最常见的方法是简单地移除消息列表中最旧的消息。更高级的方法,如论文中提到的 Provence,是训练一个专门用于问答场景的上下文修剪器。
策略四:隔离上下文(Isolate Context)¶
"隔离"是指将上下文分解到不同的单元中,以降低单个上下文窗口的复杂性并实现关注点分离。
多智能体架构(Multi-agent)¶
将一个复杂任务分解给多个专职子智能体是隔离上下文最流行的方式。每个子智能体都有自己独立的上下文窗口、指令集和工具集,可以并行处理不同子任务。
Anthropic 的多智能体研究系统证明,这种架构的性能远超单个大型智能体,因为每个子智能体的上下文窗口都可以更专注于一个狭窄的子任务。当然,其挑战在于更高的 Token 总消耗量和复杂的任务规划与协调。
使用环境隔离上下文(Environments)¶
另一种隔离方法是使用沙箱环境。例如,HuggingFace 的 CodeAgent 并不直接调用工具 API,而是生成可执行代码。这些代码在一个隔离的沙箱中运行,只有必要的返回值才会被传回给 LLM。
这种方式非常适合处理和隔离高 Token 消耗的对象(如图片、音频文件),只需在沙箱中将其赋值给一个变量,即可在后续步骤中复用,而无需将庞大的数据本身放入 LLM 的上下文中。
利用状态对象隔离(State)¶
一个精心设计的运行时状态对象(State Object)本身就是一种强大的隔离机制。通过定义一个包含多个字段的模式(Schema),我们可以将提供给 LLM 的消息(如 messages 字段)与其他仅供程序逻辑使用的信息(如工具调用的原始 JSON 输出)分离开来。
这样,LLM 只看到它需要看到的信息,而其他上下文则被安全地隔离在状态对象的其他字段中。
总结¶
上下文工程的四大核心策略为构建高效的 AI 智能体提供了系统性的解决方案:
- 写入上下文:将信息保存到上下文窗口之外,如便笺和长期记忆。
- 选择上下文:在需要时,精准地从外部存储中拉取相关信息注入上下文。
- 压缩上下文:通过总结或裁剪,只保留对任务至关重要的 Token。
- 隔离上下文:通过多智能体、沙箱或状态对象等方式分解和管理上下文的复杂性。
通过合理运用这些策略,我们可以构建出既高效又稳定的智能体系统,在控制成本的同时确保任务执行的准确性和可靠性。
参考文献¶
- https://blog.langchain.com/context-engineering-for-agents/
- https://www.dbreunig.com/2025/06/22/how-contexts-fail-and-how-to-fix-them.html?ref=blog.langchain.com#context-poisoning
- https://github.com/langchain-ai/langgraph-supervisor-py
- https://github.com/langchain-ai/langgraph-swarm-py