DeepAgents Summarization 中间件:让 Agent 学会整理记忆
前言
在 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
效果: 上下文清爽,模型响应正常
最佳实践建议
-
合理设置阈值
- 高频工具调用场景:设置较低的触发阈值(如 3-5)
- 低频对话场景:可以适当提高阈值
-
选择合适的摘要模型
- 优先使用与主模型能力相近的模型
- 成本敏感场景可选择更轻量的模型
-
保留策略
- 保留数量建议为触发阈值的 50%-60%
- 确保关键上下文(如用户意图)不被丢失
总结
Summarization 中间件是 DeepAgents 提供的一个非常实用的工具,它通过智能压缩对话历史,有效解决了上下文窗口限制的问题。无论是处理长文档、多轮对话还是高冗余的工具调用,它都能发挥重要作用。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)