DSH-Chain: Making DSH Remember Decision Rationale

前言

在 DeepSeek Harness(DSH)里长期跑任务时,常见痛点不是「结论忘了」,而是「当时为什么这么定」在上下文被压缩后一起消失。会话摘要往往只留结果,依据、犹豫和取舍理由很难在下一轮对话里自动回来。社区插件 canglight/dsh-chain(包名 dsh-chain-shared)面向这类问题:把判断存成结构化记录,每轮从磁盘重新渲染进系统提示,并用分级遗忘与检索把相关条目拉回当前轮次。下面介绍它是什么、能做什么,以及如何安装与使用。

这是什么

dsh-chain 是 maintainer canglight 维护的 DSH 记忆类插件(GitHub 仓库 canglight/dsh-chain,社区目录 SkillHub 条目)。官方 README 的定位是:给 DeepSeek Harness 用的思维链记忆插件——记的不是「发生了什么」,而是「当时为什么这么定」;每条记忆是一句判断,并附带依据、犹豫与结论,按时间衰减,只有被重新想起才会留住。

本仓库发布的是全会话通用版:任意会话里看到的都是同一套记忆链。README 明确说明:「每条会话各一套、互不串味」的隔离版不在这个包里。

当前 npm 包版本为 2.4.1(见仓库 package.json);功能说明以 README 与 CHANGELOG 为准。

核心功能

四个设计目标(README 对照)

问题 插件做法
上下文压缩后,决策理由丢失 判断存成 JSONL,每轮从磁盘重新渲染进系统提示,与对话历史无关
记了很多,用时想不起来 用当前用户话检索(jieba 分词 + 通用 IDF 等),命中则把判断行贴回提示词
记忆堆积成噪声 八个池分半衰期自动淡出;长期未想起的条目先淡、再归档
不知道自己记得什么、哪条还可信 元记忆工具 chain_about 回答「关于 X 我知道什么 / 多可信 / 变过几次」

八个记忆池与遗忘

记忆按池分层,各池有不同的宽限期、半衰期与归档策略。核心层(原则 / 人格)永不衰减;事实、铁律、经验、核心日常、片面日常、情绪、海马体等池各有时间表。权重衰减不只看时间:被检索命中的次数会拉长半衰期(README 给出公式 1 + 0.6·log2(1+次数),封顶 4 倍)。

核心池默认最多 32 条(CORE_MAX / 设置项 coreMax)。满了之后,再向核心层追加「原则/人格」会被拒绝,并提示改写到 AGENTS.md。标签若未命中任何池,不猜测,落入「海马体」并标注「未归类」,由夜巡审查。

每轮注入与字符预算

插件每轮向系统提示注入一段 ## 我的思维链(只对我可见),可包含当前情绪、各池摘要,以及「你这句话让我想起来」的检索结果。注入不是「取最近 N 条」,而是按 injectMaxChars(默认 24000 字符,约 8k token)装箱:常驻候选池按权重全局排序逐条装入;装不下的条数写在段标题里(另有 N 条未展开(chain_recall 可查)),核心段不参与装箱。README 称这样注入量相对稳定:例如 1000 条记忆时封顶约 24000 字符。

另有一块工作记忆(待办 / 承诺),由正则从用户话中识别,最多 3 条、3 天未提起过期,存在 working.json,不进记忆链与星云图。

八个工具与一个可视化 Tab

工具 作用
chain_append 写一条判断(judgement / evidence / hesitation / conclusion / tags / weight,可选 eventId)
chain_recall 按关键词 / 日期 / 权重查询;最多补带 2 条同 eventId 记录
chain_graph 导出 Mermaid 图谱
chain_touch 对已有记录标「确认」或「被推翻」
chain_mood 写当前情绪(单槽状态,会过期)
chain_patrol 手动跑夜巡并出报告
chain_about 只读查询「关于 X 我知道什么」(被想起次数、确认次数、生命周期等);调用不算「想起」
chain_conflict 比较指定 id 或同池矛盾候选

会话视图提供 「思维链」 Tab:3D 星云图,八个记忆池各成一簇(另有决策 / 元记忆虚拟区),可拖拽旋转、滚轮缩放、点节点看详情。

检索与可选语义路径

chain_recall 与每轮「这句话让我想起来」共用检索:IDF 罕见词命中与字符二元组重合两路排名,再按 RRF 融合;没有词面证据的条目不进候选。若安装可选依赖 @huggingface/transformers(约 400 MB),可走语义检索;未安装时语义路径自动退回关键词路,不报错。

夜巡与自动唤醒

每天 18:00 后(可调 patrolHour),插件在满足条件时自动跑一次夜巡,报告写入 ~/.dsh/memories/.chain-shared/patrol/YYYY-MM-DD.md,含久未命中、疑似重复、矛盾候选、海马体待整理等小节。默认会通过 DSH HTTP 接口向最近说话的那个会话投递「请审核报告」消息;可在 ~/.dsh/memories/.chain-shared/settings.json 中设置 wakeSessionId 或 wakeEnabled: false。

安装与启用

插件以当前 DSH 进程权限运行,安装前应自行审阅 GitHub 源码 与 MIT 许可证。数据默认落在本地 ~/.dsh/memories/.chain-shared/,README 说明插件不联网、不发遥测。

依赖要求:Node ≥ 20、运行中的 DSH(任意 profile)。建议在插件目录内安装依赖(pnpm add link: 不会替插件安装其自身依赖):

  1. 将插件源码放到 ~/.dsh/plugins/dsh-chain-shared(来源见上述 GitHub 仓库)。
  2. 在插件目录执行:
cd ~/.dsh/plugins/dsh-chain-shared
npm install --registry=https://registry.npmmirror.com
  1. 挂进 profile 并重启 DSH(插件清单变更不热加载):
cd ~/.dsh/profiles/web
pnpm add link:~/.dsh/plugins/dsh-chain-shared

README 亦提到可用 dsh plugin add;具体参数以官方文档为准,勿在未核对前自行拼接命令。

可选:@deepseek-ai/schemastery 未装时插件仍可运行,但思维链画布右上角设置按钮可能无反应;@node-rs/jieba 未装时检索会静默降级。

如需限定记忆只对部分会话生效,可在启动 DSH 前设置环境变量 DSH_CHAIN_TARGET_SESSION_IDS(逗号分隔会话 id);缺省为空表示全会话共享。

首次安装时记忆库为空,需在对话中让模型写入,或调用 chain_append 写第一条。

典型用法

写入一条判断

在对话中让助手调用 chain_append,或自行通过工具接口写入。字段包括判断、依据、犹豫、结论、标签与权重;同一决策可用 eventId 串起前后条目。

按当前话召回

用户提问或陈述时,插件会用当前句做检索,把命中条目注入「你这句话让我想起来」段。需要主动查库时调用 chain_recall。

查看「关于某主题我知道什么」

调用 chain_about(只读),了解某主题相关条目的被想起次数、人工确认、是否被取代等,便于判断可信度。

调整池参数与注入预算

打开「思维链」Tab → 右上角 设置:可改八个池的宽限 / 半衰期 / 归档、injectMaxChars、coreMax、patrolHour。改完经插件接口 /chain-shared/api/settings 立即生效,并写入 ~/.dsh/memories/.chain-shared/settings.json。

手动夜巡

# 在插件或文档约定的方式下调用工具
chain_patrol({ apply: true })  # 手动跑夜巡;apply 为 true 时可显式执行权重归整(见 README)

唤醒行为自检(不发消息):

node lib/wake.mjs check
node lib/wake.mjs prompt --dry

适用场景与注意

更适合:希望 DSH 在多轮、长任务中保留决策理由而非仅结论;愿意通过工具或对话主动维护记忆;接受全会话共享一条链(单用户或多会话同一 harness 场景)。

不太适合(README 自述):指望「全自动记住一切」;不想让模型在提示词里看到自己的旧判断;需要强会话隔离(应使用隔离版而非本包)。

使用上需注意:写入依赖模型判断,可能漏记或记错;注入会把历史判断塞回系统提示,需自行评估隐私与提示词长度;核心层有上限,长期「我是谁」类规则仍建议配合 AGENTS.md。

结尾

dsh-chain 把 DSH 的记忆从「发生了什么」推进到「为什么这么定」:JSONL 持久化、按池遗忘、每轮字符预算注入、检索召回与 3D 星云浏览,再加夜巡报告与可选自动唤醒,适合在 Harness 生态里做长期决策链沉淀。

DSH 生态强调「一切皆插件」;SkillHub 为社区目录站点,与 DeepSeek / 幻方无官方从属关系。

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

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

Xiaoye