前言¶
在 DeepSeek Harness(DSH)中,随着会话轮次增加,每轮请求都需要重新发送完整的可见历史。这不仅增加了 Token 消耗,还会因为注意力机制必须处理整个 KV 缓存,导致解码速度下降。本插件旨在解决这一问题。
插件定位¶
dsh-history-fold 是一个 DSH 插件,用于将会话中最旧的部分可见历史折叠为单条消息,该消息由一个无损本地归档支持。它不生成模型的摘要,而是提供可恢复的提取式索引。
核心功能¶
- 默认惰性运行:安装后默认不读取、不写入、不记录日志,需配置后生效。
- 无损归档:在执行折叠操作前,会将所有被折叠的消息逐字写入本地归档文件。
- 无需修改 node_modules:使用与 DSH 内置压缩器相同的公共接口替换机制,升级 DSH 不会破坏此插件。
- 提取式索引:折叠后的消息包含索引而非摘要,指向具体的归档路径。
- 层级路径索引:当索引过长时,会自动生成多层索引文件(tier files),每层指向更早的层级,直至原始文本。
- 可恢复性:归档文件是可见历史的超集,包含所有模型推理过程,内容完全可还原。
安装与启用¶
使用官方命令安装,安装后必须重启 DSH。
dsh plugin add --profile web github:mili1360/dsh-history-fold
若希望从本地克隆安装:
git clone https://github.com/mili1360/dsh-history-fold.git
dsh plugin add --profile web ./dsh-history-fold
重启 DSH 后插件才会生效。
工作机制¶
当可见历史超过阈值(由 triggerRatio × contextWindow 或绝对 triggerSurfaceTokens 决定)时,插件会执行以下步骤:
- 选择节点:选取最旧的节点范围进行折叠,保留最近的节点,并将表面历史缩减至目标大小(默认约为
0.18 × contextWindow)。 - 归档写入:将折叠范围内的所有消息 verbatim(逐字)写入
$DSH_HOME/history-fold/archive/<session>.jsonl。如果写入失败,折叠操作将被放弃。 - 替换消息:使用
session.append('user/message', ...)替换原范围,surfaceOp设为replace,并保留时间线顺序。
折叠后的消息内容通常如下:
[dsh-history-fold] 614 earlier messages (surface seqs 223995..387899) were folded out of the
visible history so this session stays fast.
NOTHING WAS DELETED. Their full text is archived at:
/…/.dsh/history-fold/archive/session-….jsonl
To read any of it verbatim, search that file with the pwsh or grep tools...
(sampled: every 3th of 614 folded messages)
[0] user/message (plugin) seq=223995: ...
注意事项¶
- 版本要求:仅支持 DSH 0.2.0。
- 重启必要性:安装或更新后必须重启 DSH 进程。
- 数据安全:所有折叠内容均先写入本地磁盘,再从上下文中移除,确保数据不丢失。
- 许可证:MIT 许可证。
总结¶
该插件通过将最旧的历史折叠并归档,显著减小了每次请求的上下文体积,从而提升解码速度并降低 Token 成本。由于其无损归档和提取式索引的特性,历史内容在需要时依然可以被完整还原。