dsh-notes-context:用持久笔记本替代 LLM 摘要式上下文压缩

前言

在 DeepSeek Harness(DSH)里做长会话时,上下文会逼近模型窗口上限。DSH 内置的压缩会在边界处调用模型,把旧历史总结成一段摘要再替换原文。这种做法要等模型返回、摘要质量不稳定,被替换的内容默认也无法再被模型直接看到。

如果你更关心「边界处是否还要多打一轮模型」「重要信息由谁决定保留」「原文能不能按序号回读」,笔记式压缩是一条不同的路。下面介绍社区插件 dsh-notes-context(维护者 sqzw-x),它把 Oh My Pi(omp)里的笔记式上下文压缩思路接到 DSH 上:用模型维护的持久笔记本取代 LLM 摘要,窗口滚动时边界处零模型调用。

这是什么

dsh-notes-context 是 DSH 生态下的「记忆」类插件,仓库 sqzw-x/dsh-notes-context,npm 包名 dsh-notes-context(当前资料中版本 0.2.1,MIT 许可)。一句话定位:不总结、改记笔记;滚动窗口时写入固定过渡文本和当前笔记全文,不调用模型做摘要。

插件通过 Cordis patch 挂载,并会停用内置的 compaction-basic,由本包接管压缩相关行为。

与内置压缩的差异

内置机制在接近窗口上限时调用模型总结旧历史并用总结替换原文。README 归纳了三个常见痛点:慢(需等待总结)、不可靠(质量随当次发挥变化)、原文丢失(被替换历史默认不可见)。

本插件采用笔记本机制,对比如下(摘自官方 README):

内置压缩 dsh-notes-context
边界处调用模型 是 否(写入静态模板)
边界可预测 否 是(本地、确定性)
原文可回读 否 是,按 seq
什么信息重要 摘要模型决定 干活的模型自己决定

核心机制

笔记本 context_notes

模型在会话中维护一本笔记,记录任务状态、已定决策、改动过的文件、阻塞项、下一步等;笔记跨窗口保留。

context_notes                    → 读取
context_notes { text: "..." }    → 整本替换(非追加)
context_notes { text: "" }       → 清空

上限为 16 KiB(UTF-8 字节);超出会直接拒绝,不部分写入。

提醒(每窗口一次)

当已用上下文接近压缩阈值(距阈值不足 32,000 token)时,会向模型注入一条提醒,要求更新笔记本。提醒可忽略:模型不响应时压缩仍会照常发生,目的是减少细节丢失。

窗口滚动(零模型调用)

到达压缩阈值时,复用 DSH 内置压缩的保留策略,仅替换「总结」步骤:写入固定过渡文本 + 当前笔记全文,不调用模型。

原文回读 context_history

滚动只把被替换的历史移出模型可见范围,不删除(日志 append-only)。模型可按 seq 回读:

context_history                                 → 索引
context_history { from: 120, to: 200 }          → 指定区间
context_history { from: 0, to: 50, raw: true }  → 原文

安装与启用

插件以当前 dsh 进程权限运行;安装前建议在 GitHub 阅读源码与 MIT 许可证,并确认与本机 DSH 版本兼容(package.json 中 engines.dsh 为 >=0.2.0-rc.2 <0.2.1-0 || >=0.2.1-rc.2 <0.3.0-0)。

从 npm 安装(README 写明发布后预构建,无需本地构建):

dsh plugin --profile <profile> add dsh-notes-context
dsh --profile <profile> --dump-config   # 确认两层都生效

从 GitHub 源码安装时,pnpm 可能要求允许本包运行构建脚本(prepack 生成 lib/);按 pnpm 提示把 allowBuilds 写入 profile 的 pnpm-workspace.yaml 后重试:

dsh plugin --profile <profile> add github:sqzw-x/dsh-notes-context

组合安装会包含两行 patch:停用 compaction-basic 并挂载本包。

配置示例

常用字段如下;完整字段见 DSH 设置页,推导过程见仓库 docs/INTERNALS.md。

字段 默认 说明
thresholdTokens -1 压缩阈值。绝对值优先,如 450000 表示 450K;-1 则用比例 thresholdRatio
keepRecentTokens 20000 滚动后保留的原文上限(绝对值);实际保留会更大(按整条消息裁剪)
reserveTokens 留空 阈值下方余量;留空取窗口 15%,不低于 16384
reminderEnabled true 是否注入提醒

触发点取 min(目标, 窗口 − 输出预留 − 余量) 中较低的一道。提醒位置无单独配置项,由压缩阈值推导:lead = min(32000, max(8192, floor(压缩阈值 × 0.125)));例如阈值 450,000 时提醒约在 418,000。多数配置改完立即生效;rolloverText、notebookSummaryMaxChars 与两个 static* 标记仅在写入边界时读取,下次滚动才生效。

- id: notes-context
  config:
    thresholdTokens: 450000
    keepRecentTokens: 20000

典型用法

长任务会话中,让模型在进展变化时用 context_notes 更新笔记本(整本替换),在需要核对旧对话时用 context_history 按区间或 raw: true 拉原文。接近阈值时会收到更新笔记的提醒;到达阈值后上下文会滚动,模型看到的是过渡说明 + 笔记全文 + 保留的近期消息,而不是 LLM 生成的摘要。

适用场景与限制

适合:希望压缩边界可预测、不想在边界多等一轮摘要模型,且愿意让「干活的模型」自己决定笔记里记什么;偶尔需要从 seq 回读被滚出窗口的原文。

需注意(README 限制节):

  • 笔记本质量由模型决定;插件不自动补写、不代为总结,未记入笔记的信息需从 context_history 回读。
  • 每次写入笔记本都是一条留在上下文里的消息,频繁重写会增大上下文。
  • 边界零模型调用不等于全程零开销;写笔记本身是一次工具调用,成本前移而非消除。
  • DSH 自身部分压缩配置不可见、不可改,只能改配置文件并重启 dsh(原因见内部机制文档)。
  • 受限工具集的会话(如子代理)若无法调用 context_notes,会退化为无笔记本的滚动。

结尾

dsh-notes-context 用模型维护的持久笔记本和可回读的 context_history,在 DSH 长会话里替代 LLM 摘要式压缩,并在窗口滚动边界避免额外模型调用。插件目录页:skillhub.cn/plugins/sqzw-x/dsh-notes-context;源码与文档:github.com/sqzw-x/dsh-notes-context。社区目录为独立站点,与 DeepSeek / 幻方无官方从属关系;DSH 生态遵循「一切皆插件」,可按需选用并自行审计插件行为。

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

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

Xiaoye