压缩把旧历史换成摘要,但日志不删
2026-08-28 · 7 分钟阅读
长会话迟早会撞上上下文上限。DSH 的处理方式是把较早的一段对话替换成一条摘要消息,近期历史不受影响,对话从摘要继续。
一个克制但重要的设计
最值得说的是:被遮蔽的内容仍保留在会话日志中,没有真的删掉。这带来一个明确的好处——回放会话时能确定性地重现同一份压缩后的对话。
换句话说,压缩改变的是「模型看到什么」,不是「历史记录是什么」。这两件事分开,回放和调试才有确定性可言。
怎么开启
- name: '@deepseek-ai/dsh-compaction-basic'
- name: '@deepseek-ai/dsh-command-compact'
这两行就够了:会话增长时自动压缩,/compact 收到请求后立即压缩并报告替换了多少历史项。
一个常见的误解
dsh-compaction 本身不执行任何压缩。它是给要自己实现后端的人准备的共享约定包——定义了压缩做什么、何时使用,以及如何实现后端。
所以单独挂它什么都不会发生。想要开箱即用的功能,应该选随附后端 dsh-compaction-basic。
未挂载后端时,不仅不会压缩,
/compact 也会失败。触发方式有几种
压缩可以由几种方式触发:
- token 压力自动触发 — 会话增长到一定程度自动进行
- 按需触发 — 通过
/compact命令 - 显式范围触发 — 针对指定范围压缩
结果会报告压缩了哪些历史、以及估算释放了多少 token。
自己实现后端
如果需要不同的摘要方式——固定模板或远程服务——就要继承提供的基类并实现三个操作:一个针对自动触发决定并执行压缩,一个按需压缩,一个压缩对话的显式范围。把类作为插件加载,它就成为该组合的压缩服务。
每个后端必须生成检查点标记。这个设计很实用:摘要消息带稳定标记,所以任何消费方都能在持久化或克隆后识别压缩历史,而不需要知道是哪个后端生成的。
标记从包根导出,也从一个无 Cordis 依赖的子路径导出——客户端和 wire 程序都能导入,不用为此拖进整个插件体系。
小结
理解压缩的关键是分清「模型可见的对话」和「持久化的日志」。DSH 让前者被压缩,后者保持完整,两者之间的映射通过检查点标记维持可识别性。