前言¶
在 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 生态遵循「一切皆插件」,可按需选用并自行审计插件行为。