前言

在 Agent 开发中,对话历史会不断累积并快速耗尽上下文窗口。一个常见且棘手的问题逐渐浮现:随着任务推进,对话历史的不断累积会迅速耗尽上下文窗口,导致信息丢失甚至任务中断。

特别是在 DeepAgents 这类复杂智能体中,中间消息和上下文信息更是急剧增加,进一步加剧了上下文窗口的压力。

今天要介绍的 Summarization(摘要中间件),正是为解决这一痛点而生的利器。

相关代码已开源在:我的ai-demo代码库,当然本示例也用到了多agent技术、tool技能来分工协调完成复杂任务


什么是 Summarization 中间件?

Summarization 中间件继承自 AgentMiddleware 基类,通过覆写 before_model hook 方法,在信息进入模型前执行压缩处理。

简单来说,它就像一位"记忆管家",帮助 Agent 智能管理对话历史——自动判断何时需要压缩、如何压缩、保留哪些关键信息。


适用场景

1. 长文本处理

当模型需要阅读并分析长文档、多页网页时,工具返回的内容可能一次就占满上下文。Summarization 可以在每次工具调用前对已积累的内容做摘要,防止溢出。

2. 多轮次对话

在客服、咨询等场景中,对话轮次可能多达几十轮。Summarization 可以将早期的寒暄或确认信息压缩,让模型聚焦当前核心问题。

3. 高冗余工具调用

某些工具(如搜索引擎、爬虫)返回的信息往往包含大量无关内容(广告、导航栏等)。Summarization 可以提炼关键信息,减少噪声。


快速上手

安装依赖

pip install langchain langchain-agents langchain-deepseek dotenv tavily

核心配置参数

SummarizationMiddleware 有三个关键配置:

参数 说明 示例
model 指定用于生成摘要的模型 deepseek_model
trigger 触发摘要的条件 ("messages", 5) 表示消息数 > 5 时触发
keep 摘要后保留的最新消息数量 ("messages", 3) 保留最近 3 条

工作原理详解

以两次连续提问为例:

┌─────────────────────────────────────────────────────────────────┐
│                     消息流转过程                                  │
├─────────────────────────────────────────────────────────────────┤
│  第1次提问                                                       │
│  ┌──────────────┐                                                │
│  │ HumanMessage │  ← 用户提问                                    │
│  └──────────────┘                                                │
│         ↓                                                       │
│  ┌──────────────┐                                                │
│  │ AIMessage    │  ← 模型决定调用工具                             │
│  └──────────────┘                                                │
│         ↓                                                       │
│  ┌──────────────┐                                                │
│  │ ToolMessage  │  ← 工具返回结果                                 │
│  └──────────────┘                                                │
│         ↓                                                       │
│  ┌──────────────┐                                                │
│  │ AIMessage    │  ← 模型返回最终答案                             │
│  └──────────────┘                                                │
├─────────────────────────────────────────────────────────────────┤
│  第2次提问                                                       │
│  ┌──────────────┐                                                │
│  │ HumanMessage │  ← 用户第二次提问                               │
│  └──────────────┘                                                │
│         ↓                                                       │
│  ┌──────────────┐                                                │
│  │ AIMessage    │  ← 模型决定再次调用工具                          │
│  └──────────────┘                                                │
│         ↓                                                       │
│  ┌──────────────┐                                                │
│  │ ToolMessage  │  ← 工具返回结果                                  │
│  └──────────────┘                                                │
│         ↓                                                       │
│  ⚡ 触发阈值!7 > 5,此时 Summarization 开始工作                    │
└─────────────────────────────────────────────────────────────────┘

触发摘要后发生了什么?

┌─────────────────────────────────────────────────────────────────┐
│                     Summarization 工作流程                        │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  1️⃣ 检测消息列表,发现 7 条消息 > 阈值 5,触发摘要               │
│                                                                 │
│  2️⃣ 保留最新 3 条消息:                                         │
│     ┌─────────────────────────────────────────────────────┐    │
│     │ • ToolMessage(工具返回结果)                        │    │
│     │ • AIMessage(引发调用的AI消息)                      │    │
│     │ • HumanMessage(用户最新提问)                      │    │
│     └─────────────────────────────────────────────────────┘    │
│                                                                 │
│  3️⃣ 将前 4 条旧消息发送给摘要模型生成总结                        │
│                                                                 │
│  4️⃣ 重组消息列表(4条):                                       │
│     ┌─────────────────────────────────────────────────────┐    │
│     │ • HumanMessage(生成的摘要)  ← 新增                 │    │
│     │ • HumanMessage(最新提问)                          │    │
│     │ • AIMessage(调用工具)                              │    │
│     │ • ToolMessage(工具返回)                           │    │
│     └─────────────────────────────────────────────────────┘    │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

生成的摘要示例

{
  "type": "HumanMessage",
  "content": "Here is a summary of the conversation to date:\n\n## SESSION INTENT\n用户询问DeepSeek公司最新资讯,要求回复不超过50个字符。\n\n## SUMMARY\n用户要求获取DeepSeek公司最新动态,且回复需极度精简(最多50字符)。已通过互联网搜索获取到DeepSeek最新资讯:DeepSeek于2026年4月24日发布了V4模型预览版,该模型为开源模型,性能强劲,与华为合作使用Ascend 950芯片。\n\n## NEXT STEPS\nNone(已提供资讯并完成回复)"
}

实际效果对比

使用前(无 Summarization)

消息数量: 50+ 条
Token 消耗: ~128,000
问题: 上下文窗口溢出,模型无法正常响应

使用后(带 Summarization)

消息数量: 4 条(触发摘要后)
Token 消耗: ~1,700
效果: 上下文清爽,模型响应正常

最佳实践建议

  1. 合理设置阈值

    • 高频工具调用场景:设置较低的触发阈值(如 3-5)
    • 低频对话场景:可以适当提高阈值
  2. 选择合适的摘要模型

    • 优先使用与主模型能力相近的模型
    • 成本敏感场景可选择更轻量的模型
  3. 保留策略

    • 保留数量建议为触发阈值的 50%-60%
    • 确保关键上下文(如用户意图)不被丢失

总结

Summarization 中间件是 DeepAgents 提供的一个非常实用的工具,它通过智能压缩对话历史,有效解决了上下文窗口限制的问题。无论是处理长文档、多轮对话还是高冗余的工具调用,它都能发挥重要作用。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐