跳转到内容

Deer-Flow 的上下文压缩策略

Deer-Flow 的上下文压缩策略

学习目标

  • 理解 Deer-Flow 的三种压缩触发策略
  • 掌握 keep policy 的设计
  • 学会配置压缩参数

前置知识

本章涉及上下文压缩的通用原理,建议先阅读:

下文假设你已理解上述概念,直接聚焦 Deer-Flow 的具体实现。


项目实践

配置参数

Deer-Flow 在 config.yamlsummarization 部分配置压缩行为:

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 在中间件链中运行:

  1. 检查触发条件
  2. 如果未触发 → fast-path 直接返回
  3. 如果触发 → 选择保留策略(保留最近 N 条消息)
  4. 将更早的消息发送给压缩模型生成摘要
  5. 用摘要替换历史消息
  6. 中间结果(如报告内容)写入文件系统,不保留在对话中

问题与规避

压缩导致信息丢失

摘要无法保留原始对话的所有细节。

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 — 中间件源码