dsh-context-continuum:用只追加的会话索引替代滚动叙事摘要

前言

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。

典型用法

  1. 按上文完成安装并在会话中选择 continuum preset。
  2. 长对话触发自动压缩后,用 context_anchors 看每次压缩压掉了哪段 seq、用了哪个摘要模型。
  3. 需要核对被压掉的字面内容时,用 context_read 按锚点拉原文。
  4. 需要主动腾窗口时,调用 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。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜