前言

大模型的发展,已从最初的对话聊天功能,逐渐演变为能够自主执行任务的智能体。

这类智能体的工作流程通常呈现循环结构,包括收集上下文、执行任务与结果验证。单个任务往往需要多次循环,而大模型的每次输入都包含上下文、可用工具、历史执行结果等多种信息。

随之而来的挑战是,随着信息量增加,上下文不断膨胀。然而,大模型的上下文窗口存在限制,并且在处理较长信息时,其注意力效果也会下降。

因此,智能体上下文管理的核心在于:如何在有限的上下文窗口内,传递必要且最精简的信息,以保障智能体的有效运行。良好的上下文设计,能够使智能体的执行更高效、更迅速,同时降低运行成本。

通常,智能体的上下文管理可通过以下方式实现。

卸载

对于过长的信息,不一次性塞入LLM的上下文中。

如把冗长的日志保存在文件系统中,只给LLM输入文件路径。Claude推出的Skill,一个Skill分为元数据、主要内容、参考资料、脚本等,初次只把元数据输入LLM。或者Cursor中MCP,也使用了渐进式披露,LLM只会收到一小段静态上下文(包括工具名称),在任务需要时再去查找具体工具。

值得注意的是,不论是Manus或者是Cursor,在实践中都提到把信息存在文件系统中,如日志输出、历史聊天等,后续可以直接使用简单的搜索工具获取内容。

缩减

缩减分为压缩和总结。

压缩是可逆的,如果去掉代码中的长文段,只保留结构,如模型需要可以在文件系统中找回原文。

总结是不可逆的,Cursor中就有类似的机制,在上下文即将溢出或者手动执行总结指令时,会精简总结上下文,但有可能丢失部分信息。Manus的实践中,使用“填表”的方式让模型总结(如修改了什么文件、当前进度、下一步目标等),效果好于一段散乱的总结。

隔离

隔离通过多智能体协作实现上下文隔离。

通信模式:主Agent把任务分派到子Agent执行,子Agent执行完毕后只返回结果,不会污染主Agent的上下文,但缺点是可能使用更多的token,因为子Agent可能重新收集上下文。

共享模式:子Agent共享主智能体的上下文,适用于需要了解全局背景的复杂研究任务。

检索

检索分为RAG和简单搜索。

上面提到一些长信息会记录在文件系统中,提取信息时使用grep或者glob等简单文件搜索工具获取信息,cluade code和opencode就是使用这种模式。优点是简单快速。

RAG检索需要把代码构建为向量索引,好处是可以通过语义搜索,比如Cursor打开一个工程,能通过模糊的自然语言搜索代码,但缺点是构建向量数据库需要时间,也需要额外的数据库配置已经向量化模型。

缓存

利用大模型厂商(如 Anthropic, Google)提供的“输入缓存”功能,减少重复处理相同背景的成本和延迟。如Manus分享中,每次发送的工具都是同样的,尽量保证命中缓存以减少成本。

参考