前言¶
DeepSeek Harness(DSH)在长会话里会触发上下文压缩:把较早的消息压成摘要,给新对话腾出窗口。官方 BasicCompactionEngine 的替换区间起点与上一份摘要的 seq 对齐,实测中每代都在重写旧摘要,早期字面事实容易被磨平。若你关心「压掉的内容还能不能按原样找回」「摘要会不会越写越长、结构泄漏」,就需要在压缩策略上做选择。下面介绍社区插件 dsh-context-continuum(维护者 zongyanbai,分类:记忆):在不动官方压缩骨架的前提下,只改 summarize() 的产出形态,把「滚动重写的叙事摘要」改成「只追加的会话索引」,并附带锚点与原文回溯工具。
这是什么¶
dsh-context-continuum(npm 包名 @local/dsh-context-continuum,当前版本 0.1.0,MIT)是 DSH 压缩引擎的子类扩展:继承 BasicCompactionEngine,仅覆写 summarize(),缓存复用、模型回退、会话关联仍走官方路径。
机制要点:原文仍在 append-only 会话日志里;压缩时模型只写一个新条目,装配器把旧条目逐字搬运,不再每代重写整段摘要。维护者在同会话 A/B 实测(见仓库 docs/AB-report.md)中对比官方滚动摘要与本插件会话索引,例如早期字面事实存活率、摘要长度轨迹、官方叙事结构泄漏等差异——具体数字以该文档为准。
仓库 README 标明:征集协助中,三条桌面宿主实测缺陷已用日志取证(见 docs/DEFECTS.md),欢迎 issue / PR。使用前请自行阅读源码与许可证;插件在 DSH 进程权限下运行,社区目录 SkillHub 插件页 与 GitHub 无 DeepSeek / 幻方官方从属关系。
它解决什么问题¶
官方引擎压缩时,替换区间起点恰好是上一份摘要的 seq(README 称实测 9/9 次),同一段摘要会被反复改写。本插件针对的是替换区间起点错位带来的信息形态问题,而不是单纯指责「模型摘要写得差」。
核心功能¶
压缩策略¶
- 会话索引:新压缩只追加条目,旧条目逐字继承。
- 仍使用官方
compactIfNeeded等流程;不自行发ctx.llm.stream(),避免重做前缀缓存与回退逻辑。
Agent 工具¶
| 工具 | 用途 |
|---|---|
context_anchors |
查看被压内容:compactionId、被压 seq 区间、token 数、摘要模型 |
context_read |
按锚点取回被压缩区间的逐字原文(原文未删,仅被遮蔽) |
context_compact |
手动就地压缩 |
序号 T<n> 与第 n 个成功压缩事务一一对应;失败时不编号,以「无条目 + 失败原因」呈现。
主要源码模块(便于读代码)¶
| 文件 | 职责 |
|---|---|
src/engine.ts |
压缩后端 + 三个工具注册 |
src/indexlog.ts |
索引模板、旧条目继承、叙述正文丢弃、超量归档 |
src/artifacts.ts |
产物账本 |
src/anchors.ts |
锚点账本 |
src/trace.ts |
按锚点取回原文 |
src/tools.ts |
上述三个工具的对外实现 |
安装与启用¶
安装分三层,缺一层不生效:
| 层 | 位置 | 作用 |
|---|---|---|
| ① bundle patch | 本仓库 cordis.patch.yml |
置灰顶层 compaction-basic,insert 本插件 |
| ② profile 用户层 | 目标 profile 的 cordis.patch.yml |
新增 preset-continuum(由 standard 确定性变换) |
| ③ 依赖与解析 | profile 的 package.json + node_modules/@local/dsh-context-continuum |
让包可解析 |
README 给出 Windows 快速上手示例(请先备份 profile):
# 1. 备份 profile
$p = "$env:USERPROFILE\.dsh\profiles\desktop"
Copy-Item "$p\package.json" "$p\package.json.bak" -Force
Copy-Item "$p\cordis.patch.yml" "$p\cordis.patch.yml.bak" -Force
# 2. 接线(见上表 ①②)
# - package.json:bundles 数组加 "@local/dsh-context-continuum"
# - cordis.patch.yml:追加 preset-continuum 块
# 3. 依赖(Windows 用目录联接,不用符号链接 —— dsh 解析不了符号链接)
cmd /c mklink /J "$p\node_modules\@local\dsh-context-continuum" "<本仓库路径>"
# 4. 重启 DeepSeek Harness
# 5. 会话里选「continuum」这个 agent preset
第 5 步不能省略:插件不会改默认 preset;不选 continuum 时仍是 standard,工具不会挂上。
回退示例:
Copy-Item "$p\package.json.bak" "$p\package.json" -Force
Copy-Item "$p\cordis.patch.yml.bak" "$p\cordis.patch.yml" -Force
cmd /c rmdir "$p\node_modules\@local\dsh-context-continuum"
删目录联接请用 cmd /c rmdir,不要用 Remove-Item -Recurse(旧版 PowerShell 可能顺着联接删源目录)。
依赖侧:package.json 要求 Node >=22.19,peer 依赖 @deepseek-ai/dsh-* 等为 >=0.2.0-rc.1 <0.2.1;本地 typecheck 针对 @deepseek-ai/dsh-*@0.2.0-rc.2。
典型用法¶
- 按上文完成安装并在会话中选择 continuum preset。
- 长对话触发自动压缩后,用
context_anchors看每次压缩压掉了哪段 seq、用了哪个摘要模型。 - 需要核对被压掉的字面内容时,用
context_read按锚点拉原文。 - 需要主动腾窗口时,调用
context_compact手动压缩。
压缩相关参数可在配置中调整(摘自 README):
thresholdRatio: 0.5 # 触发阈值(官方默认 0.8;大窗口模型建议调低)
headroomTokens: 65536 # 生成余量
retainRatio: 0.16 # 保留最近 16% 原文尾巴
maxOverflowRetries: 1 # provider 报 CONTEXT_WINDOW_EXCEEDED 后强制压缩并重试
compactionRetries: 1
auto: true
改参数前注意 README 中的硬约束,例如 headroomTokens: 0 会导致条目不激活;retainRatio >= thresholdRatio 时没有可压区间;摘要体积不小于原文时引擎会拒绝并由归档机制处理(表层封顶 24 条)。
适用场景与注意¶
更适合:长会话、需要保留早期字面事实、希望通过锚点回溯「被压原文」的 DSH 开发者;愿意自行接线 profile、阅读 docs/DEFECTS.md 与 A/B 报告后再决定是否采用。
务必知晓:
- 已知缺陷(高/中优先级)包括:压缩误判任务信息为「信息不足」、
<think>可能泄漏进条目、压缩触发偏晚且不控制上下文总量——细节以docs/DEFECTS.md为准。 - 无
dsh plugin add一键命令;安装为手动 patch + 本地包解析,Linux/macOS 需自行对照 README 三层接线(联接方式与路径与 Windows 示例不同,以仓库文档为准)。 - 插件与宿主代码同权限运行;安装前请审查 GitHub 仓库 源码与 MIT 许可证。
维护者本地验证命令:
npm install
npm test # 101 项单测 / 10 个文件
npm run typecheck
npm run build # 产出 lib/;先删 lib/ 再构建,避免旧产物干扰
结尾¶
dsh-context-continuum 把 DSH 上下文压缩从「每代重写摘要」改为「只追加的会话索引」,并暴露锚点与原文读取工具,适合在官方压缩机制上做最小侵入的实验与对比。当前仍征集社区修复已知缺陷;更多信息见 SkillHub 目录页 与 GitHub:zongyanbai/dsh-context-continuum。