← 返回首页

压缩把旧历史换成摘要,但日志不删

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。

自己实现后端

如果需要不同的摘要方式——固定模板或远程服务——就要继承提供的基类并实现三个操作:一个针对自动触发决定并执行压缩,一个按需压缩,一个压缩对话的显式范围。把类作为插件加载,它就成为该组合的压缩服务。

每个后端必须生成检查点标记。这个设计很实用:摘要消息带稳定标记,所以任何消费方都能在持久化或克隆后识别压缩历史,而不需要知道是哪个后端生成的。

标记从包根导出,也从一个无 Cordis 依赖的子路径导出——客户端和 wire 程序都能导入,不用为此拖进整个插件体系。

小结

理解压缩的关键是分清「模型可见的对话」和「持久化的日志」。DSH 让前者被压缩,后者保持完整,两者之间的映射通过检查点标记维持可识别性。

压缩上下文管理