Deer-Flow 的上下文压缩策略
Deer-Flow 的上下文压缩策略
学习目标
- 理解 Deer-Flow 的三种压缩触发策略
- 掌握 keep policy 的设计
- 学会配置压缩参数
前置知识
本章涉及上下文压缩的通用原理,建议先阅读:
下文假设你已理解上述概念,直接聚焦 Deer-Flow 的具体实现。
项目实践
配置参数
Deer-Flow 在 config.yaml 的 summarization 部分配置压缩行为:
summarization: enabled: true # 总开关 # 触发类型:tokens / messages / fraction trigger_type: "tokens" trigger_threshold: 80000 # Token 阈值 keep_recent_messages: 5 # 保留最近 N 条消息不压缩三种触发策略
| 策略 | 配置 | 适用场景 |
|---|---|---|
| Token 阈值 | trigger_type: "tokens" + trigger_threshold: N | 精确控制 Token 使用 |
| 消息数量 | trigger_type: "messages" + trigger_threshold: M | 实现简单,不依赖 Token 计数 |
| 占比阈值 | trigger_type: "fraction" + trigger_threshold: 0.8 | 自适应不同模型的上下文窗口 |
压缩流程
SummarizationMiddleware 在中间件链中运行:
- 检查触发条件
- 如果未触发 → fast-path 直接返回
- 如果触发 → 选择保留策略(保留最近 N 条消息)
- 将更早的消息发送给压缩模型生成摘要
- 用摘要替换历史消息
- 中间结果(如报告内容)写入文件系统,不保留在对话中
问题与规避
压缩导致信息丢失
摘要无法保留原始对话的所有细节。
Deer-Flow 的规避:
- 保留最近 N 条消息不压缩
- 大型中间结果写入文件系统,通过路径引用而非内联
设计取舍
Token 阈值 vs 占比阈值
Token 阈值的优势是精确控制,但不同模型的上下文窗口不同,需要为每个模型配置不同的值。
占比阈值的优势是自适应——无论使用 128k 还是 200k 的模型,都在 80% 时触发压缩。但需要准确获取模型的最大输入 Token 数。
Deer-Flow 支持两种策略,由用户根据部署场景选择。
参考来源
docs/summarization.md— Deer-Flow 上下文压缩文档packages/harness/deerflow/agents/middlewares/summarization_middleware.py— 中间件源码