
对话失忆?任务中断?上下文工程:大模型长期任务的破局之道
核心摘要
智能体需要上下文来执行任务。上下文工程,是一门将恰当信息精准填入智能体上下文窗口的艺术与科学。本文将当下主流智能体中常见的上下文工程策略归纳为几大类。
上下文工程的本质
安德烈·卡帕西(Andrej Karpathy)曾将大型语言模型(LLMs)比作一种新型操作系统。其中,LLM如同中央处理器(CPU),其上下文窗口则扮演着随机存取存储器(RAM)的角色,作为模型的工作记忆。 正如RAM容量有限,LLM的上下文窗口在处理多种上下文源时也面临限制。因此,正如操作系统需要精心策划哪些数据进入CPU的RAM,“上下文工程”也扮演着同样的角色。卡帕西对此的精辟总结是:
“[上下文工程是]…一种精妙的艺术与科学,旨在为下一步在上下文窗口中填入恰到好处的信息。”
那么,在构建LLM应用时,我们需要管理哪些上下文类型?上下文工程是一个涵盖以下几个方面的总称:
•指令:如提示、记忆、少样本示例、工具描述等。
•知识:如事实、记忆等。
•工具:来自工具调用的反馈。
面向智能体的上下文工程实践
今年,随着LLM推理与工具调用能力的飞跃,智能体热潮席卷而来。智能体通过LLM调用与工具调用的交替进行,常用于处理长期任务。
然而,长期任务和不断积累的工具调用反馈意味着智能体常常消耗大量tokens,这引发诸多问题:可能超出上下文窗口大小限制、导致成本/延迟激增,或降低智能体性能。德鲁·布伦尼格(Drew Breunig)精辟地概述了长上下文导致性能问题的几种具体方式:
•上下文中毒(Context Poisoning):当幻觉内容混入上下文时。
•上下文干扰(Context Distraction):上下文过多,干扰模型训练时。
•上下文混淆(Context Confusion):多余的上下文影响模型响应时。
•上下文冲突(Context Clash):上下文部分内容相互矛盾时。
基于此,Cognition公司强调了上下文工程的关键地位:
“‘上下文工程’…实际上是构建AI智能体的工程师们的首要任务。”
Anthropic也明确指出:
“智能体对话常跨越数百轮,需要精心的上下文管理策略。”
那么,如今人们如何应对这一挑战?我将现有方法归纳为四大类:写入、选择、压缩和隔离,并提供了一些具体示例。
1. 写入上下文
写入上下文指的是将信息保存在上下文窗口之外,以供智能体后续使用。
暂存器(Scratchpads)
人类解决任务时会做笔记,以备将来相关任务之需。智能体也在获得这一能力!通过“暂存器”进行笔记记录,是一种在任务执行期间持久化信息的方法。核心思想是将信息保存在上下文窗口之外,确保智能体随时可用。Anthropic的多智能体研究员案例就是一个清晰的例子:
“首席研究员(LeadResearcher)首先构思方案,并将其计划存入 记忆(Memory) 以持久化上下文,因为上下文窗口若超过20万tokens将被截断,而保留该计划至关重要。”
暂存器可通过多种方式实现:它可以是一个简单的工具调用,将内容写入文件;也可以是一个在会话期间持久存在的运行时状态对象中的字段。
无论是哪种方式,暂存器都让智能体能保存有用信息来完成任务。
记忆(Memories)
暂存器帮助智能体解决单个会话中的任务,而有时智能体需要跨多个会话进行记忆。Reflexion模型引入了在每次行动后进行反思并重用这些自生成记忆的理念。Generative Agents则定期从过去的智能体反馈集合中合成记忆。
这些概念已融入ChatGPT、Cursor、Windsurf等热门产品,它们都具备基于用户-智能体交互自动生成长期记忆的机制。
2. 选择上下文
选择上下文指的是将信息拉入上下文窗口中,以辅助智能体执行任务。
暂存器
如何从暂存器中选择上下文取决于其实现方式。若它是一个工具,智能体只需通过工具调用来读取;若它属于智能体运行时状态,开发者则可在每一步选择性地将部分状态暴露给智能体。这为后续向LLM暴露暂存器上下文提供了精细控制。
记忆
如果智能体能保存记忆,也必须能选择与当前任务相关的记忆。这有多种好处:
• 智能体可选择少样本示例(情景记忆)来模仿期望行为;
• 选择指令(程序记忆)来引导行为;
• 或选择事实(语义记忆)来提供任务相关上下文。
一个挑战是如何确保选出最相关的记忆。一些流行智能体只使用一组固定的文件,这些文件总是被拉入上下文。例如,许多代码智能体使用文件保存指令(“程序”记忆)或示例(“情景”记忆)。Claude Code使用CLAUDE.md
,而Cursor和Windsurf则使用规则文件。
然而,若智能体存储了大量的事实和/或关系(如语义记忆),选择会变得更难。ChatGPT就是一个很好的例子,它从大量特定于用户的记忆中进行存储和选择。
常用于记忆索引的向量(Embeddings)和/或知识图谱是辅助选择的常用技术。但记忆选择依然充满挑战。在AIEngineer世界博览会上,西蒙·威利森(Simon Willison)分享了一个记忆选择失误的例子:ChatGPT从记忆中提取了他的位置,并意外地注入到他请求的图像中。这种意料之外或不合时宜的记忆检索可能让一些用户感到上下文窗口“不再由自己掌控”!
工具
智能体使用工具,但若工具过多,可能会不堪重负,通常是因为工具描述重叠,导致模型在选择时混淆。一种方法是对工具描述应用RAG(检索增强生成),通过语义相似性为任务检索最相关的工具。最近的研究表明,这能将工具选择准确性提高3倍。
知识
RAG是一个核心的上下文工程挑战。代码智能体是RAG大规模生产应用的绝佳范例。来自Windsurf的瓦伦(Varun)很好地总结了其中的一些挑战:
“索引代码≠上下文检索…[我们正在做的是]索引和向量搜索…[通过]抽象语法树(AST)解析代码并沿着语义边界进行分块…
但随着代码库规模的增长,向量搜索作为检索启发式方法变得不可靠…我们必须依赖多种技术的组合,比如
grep
/文件搜索、基于知识图谱的检索,以及…一个重新排名步骤,根据相关性对[上下文]进行排序。”
3. 压缩上下文
压缩上下文旨在仅保留执行任务所需的tokens。
上下文摘要
智能体交互可跨越数百轮并调用大量tokens。摘要(Summarization)是一种常见的应对方法。使用过Claude Code的用户会发现,当上下文窗口超过95%时,它会运行“自动压缩(auto-compact)”,对用户-智能体交互的完整轨迹进行总结。这种压缩可采用递归或分层摘要等策略。
在智能体设计的特定节点添加摘要也很有用。例如,它可用于后处理某些工具调用(如消耗大量tokens的搜索工具)。又如,Cognition提到在智能体-智能体边界使用摘要,以减少知识交接时的tokens。若需捕获特定事件或决策,摘要可能充满挑战。Cognition为此使用了微调模型,这凸显了这一步骤需要投入的心血。
Cognition 是一家专注于人工智能软件开发的公司,尤其以其开发的 AI 软件工程师 Devin 而闻名。
上下文修剪(Trimming)
与摘要通常使用LLM提炼相关内容不同,修剪常用于过滤或“剪除”上下文。这可采用硬编码的启发式方法,如从消息列表中删除旧消息。德鲁还提到了Provence,一个专门为问答任务训练的上下文修剪器。
4. 隔离上下文
隔离上下文指的是将上下文进行分割,以帮助智能体执行任务。
多智能体(Multi-agent)
隔离上下文最流行的方式之一是将其分配给多个子智能体。OpenAI Swarm库的动机之一是“关注点分离”,即一个智能体团队可以处理子任务。每个智能体都拥有特定的工具、指令和独立的上下文窗口。
Anthropic的多智能体研究员案例为此提供了论据:许多拥有隔离上下文的智能体比单个智能体表现更优,主要是因为每个子智能体的上下文窗口可以专注于更狭窄的子任务。正如该博客所言:
“[子智能体]在各自的上下文窗口中并行运行,同时探索问题的不同方面。”
当然,多智能体也面临挑战,如tokens消耗(据Anthropic报告,可比聊天多达15倍)、需要精心设计的提示工程来规划子智能体工作,以及子智能体之间的协调。
利用环境进行上下文隔离
HuggingFace的深度研究员展示了另一个有趣的上下文隔离示例。大多数智能体使用工具调用API,返回可传递给工具(如搜索API)的JSON对象(工具参数),以获取工具反馈(如搜索结果)。HuggingFace使用了一个代码智能体(CodeAgent),它输出包含所需工具调用的代码,并在沙盒中运行。之后,从工具调用中选定的上下文(如返回值)再传递回LLM。
这使得上下文可以在环境中与LLM隔离。Hugging Face指出,这是一种隔离tokens密集型对象的绝佳方式:
“[代码智能体允许]更好地处理状态…需要将这个图像/音频/其他内容存储起来以备后用吗?没问题,只需将其作为变量分配到你的状态中,你便可随时使用。”
状态(State)
值得一提的是,智能体的运行时状态对象也是一种出色的上下文隔离方法。它与沙盒作用类似。状态对象可以设计一个具有特定字段(如Pydantic模型)的模式,上下文可以被写入其中。模式的一个字段(如messages
)可在每一轮暴露给LLM,而模式可在其他字段中隔离信息,以供更具选择性的使用。
结论
面向智能体的上下文工程模式仍在不断演进,但我们可以将常见方法归纳为四类:
•写入上下文:将其保存在上下文窗口之外,以帮助智能体执行任务。
•选择上下文:将其拉入上下文窗口中,以帮助智能体执行任务。
•压缩上下文:仅保留执行任务所需的tokens。
•隔离上下文:将其分割,以帮助智能体执行任务。
理解和运用这些模式,是当今构建高效智能体的核心所在。
本文转载自萤火AI百宝箱,作者: 萤火AI百宝箱
