作者:Chester Curme 和 Mason Daugherty

随着 AI 智能体可处理的任务长度持续增长,有效的上下文管理变得至关重要,以防止上下文腐化并管理 LLM 有限的记忆约束。

TheDeep Agents SDK是 LangChain 的开源、开箱即用的智能体框架。它提供了一条便捷路径来构建智能体,使其能够进行规划、生成子智能体,并借助文件系统执行复杂的长时间运行任务。由于这类任务通常可能超出模型的上下文窗口,该 SDK 实现了多种促进上下文压缩的功能。

上下文压缩是指减少智能体工作记忆中信息量,同时保留与完成任务相关的细节的技术。这可能涉及总结先前的交互、过滤过时信息,或策略性地决定保留什么、丢弃什么。

Deep Agents 实现了一个文件系统抽象,允许智能体执行诸如列出、读取和写入文件等操作,以及搜索、模式匹配和文件执行。智能体使用文件系统按需搜索和检索已卸载的内容。

Deep Agents 实现了三种主要的压缩技术,以不同的频率触发:

  1. 卸载大型工具结果:每当出现大型工具响应时,我们将其卸载到文件系统。
  2. 卸载大型工具输入:当上下文大小超过阈值时,我们将工具调用中旧的写入/编辑参数卸载到文件系统。
  3. 总结:当上下文大小超过阈值,且没有更多可卸载的上下文时,我们执行总结步骤来压缩消息历史。

为管理上下文限制,Deep Agents SDK 在模型上下文窗口大小的阈值比例处触发这些压缩步骤。(在底层,我们使用 LangChain 的模型配置档案来获取给定模型的 token 阈值。)

卸载大型工具结果

工具调用的响应(例如读取大文件或 API 调用的结果)可能超出模型的上下文窗口。当 Deep Agents 检测到工具响应超过 20,000 token 时,它会将该响应卸载到文件系统,并用一个文件路径引用以及前 10 行的预览来替代它。随后智能体可以按需重新读取或搜索该内容。

卸载大型工具输入

文件写入和编辑操作会在智能体的对话历史中留下包含完整文件内容的工具调用。由于这些内容已经持久化到文件系统,它们往往是冗余的。当会话上下文超过模型可用窗口的 85% 时,Deep Agents 会截断较早的工具调用,用指向磁盘上文件的指针替代它们,从而缩减活跃上下文的大小。

摘要

当卸载不再能腾出足够空间时,Deep Agents 会退回到摘要。这一过程包含两个组成部分:

  1. 上下文内摘要:由 LLM 生成对话的结构化摘要——包括会话意图、创建的产物以及后续步骤——用它替换智能体工作记忆中的完整对话历史。(参见 Deep Agents 的摘要提示词。)
  2. 文件系统保留:完整、原始的对话消息会作为规范记录写入文件系统。

这种双重方法确保智能体保持对其目标和进展的感知(通过摘要),同时保留在需要时恢复具体细节的能力(通过文件系统搜索)。参见此 trace中的示例,其中模型使用read_file工具来获取先前被卸载的消息。

这在实践中是什么样子

虽然上述技术提供了上下文管理的机制,但我们如何知道它们确实在起作用?在真实世界任务上的运行,如terminal-bench等基准测试所记录的,可能会零星触发上下文压缩,从而难以孤立地衡量其影响。

我们发现,通过在基准数据集上更积极地触发 harness 的各个特性,可以增强其信号,这一点很有用。例如,虽然在可用上下文窗口的 10 - 20% 时触发摘要可能会导致整体性能次优,但它会产生明显更多的摘要事件。这使得不同的配置(例如你的实现的各种变体)可以被比较。例如,通过强制智能体频繁进行摘要,我们能够识别出简单的改动对deepagents摘要提示词——我们在其中为会话意图和后续步骤添加了专门的字段——如何帮助提升性能。

图:Claude Sonnet 4.5 在 terminal-bench-2 上样本运行中的 token 使用量随时间变化(灰线显示所有运行;彩色线突出显示两个具体示例)。绿线显示在第 20 轮左右出现 token 急剧下降,此时一次摘要事件压缩了对话历史。橙线显示在第 40 轮左右出现较小的减少,此时一次大型文件写入工具调用被从上下文中逐出。通过在上下文窗口的 25% 处触发压缩(而非 Deep Agents 默认的 85%),我们生成了更多事件以供研究。

针对性评估

Deep Agents SDK 维护了一组针对性评估,旨在隔离并验证各个上下文管理机制。这些测试刻意保持小巧,使特定的失败模式变得明显且可调试。

这些评估的目标不是衡量广泛的任务解决能力,而是确保智能体的 harness 不会妨碍某些任务。例如:

  • 摘要是否保留了智能体的目标?一些评估刻意在任务中途触发摘要,然后检查智能体是否继续执行。这确保了摘要不仅保留智能体状态,还保留其轨迹。
  • 智能体能否恢复已被摘要掉的信息?在这里,我们在对话早期嵌入一个“大海捞针”式的事实,强制触发一次摘要事件,然后要求智能体在之后回忆该事实以完成任务。该事实在摘要后不存在于活动上下文中,必须通过文件系统搜索来恢复。

这些有针对性的评估充当上下文管理的集成测试:它们不能替代完整的基准测试运行,但能显著缩短迭代时间,并使失败可归因于特定的压缩机制,而非智能体的整体行为。

指导

在评估你自己的上下文压缩策略时,我们要强调:

  • 从真实世界的基准测试开始,然后对单个功能进行压力测试。先在具有代表性的任务上运行你的测试框架,以建立基线性能。然后,人为地更激进地触发压缩(例如,在上下文 10-20% 时触发,而不是 85%),以便每次运行产生更多压缩事件。这会放大单个功能发出的信号,使比较不同方法(例如你的摘要提示词的不同变体)变得更容易。
  • 测试可恢复性。上下文压缩只有在关键信息仍可访问时才有用。加入有针对性的测试,验证智能体在压缩后既能继续朝着原始目标推进,又能在需要时恢复特定细节(例如大海捞针场景:一个关键事实被摘要掉了,但之后必须被检索出来)。
  • 监控目标漂移。最隐蔽的失败模式是智能体在摘要后失去对用户意图的把握。这可能表现为智能体在摘要后的下一轮中停下来请求澄清,或者错误地宣布任务完成。偏离预期任务更细微的情况可能更难归因于摘要;在样本数据集上强制频繁摘要可能有助于暴露这些失败。

以下所有功能Deep Agents测试框架均为开源。试用最新版本,并告诉我们哪些压缩策略最适合你的用例!