dsh-memory-chain: Five-Layer Local Memory for New Conversations without Starting from Scratch

前言

在 DeepSeek Harness(DSH)里跑智能体时,上下文窗口是硬成本:把「记住什么」和「每次带进 prompt 什么」混在同一条消息历史里,要么越聊越长,要么一关会话就断片。社区插件 dsh-memory-chain(维护者 doresu,分类:记忆)把记忆拆成五层,全部落在本地文件;每次组装系统 prompt 时按层注入固定上限的片段,不往对话历史里追加内容。下面介绍它的定位、分层设计、安装方式与工具用法,事实以 GitHub 仓库 README 为准。

这是什么

dsh-memory-chain 是面向 DSH 的零依赖记忆插件:不改 DSH 安装目录,不新增 L3 专用工具(产物检索复用 memory_search 的 tag 参数)。README 用一句话概括目标——opening a new conversation shouldn’t feel like meeting a stranger(新开对话不应像见陌生人)。当前 package 版本 0.4.1,许可证 MIT;要求宿主 DSH >=0.2.1-rc.2(engines.dsh 上界为 <0.3.0-0)。

五层记忆分别存什么

五层都是 system-prompt 区块,每次 assembly 重新计算,不写入 message history。

层 存储内容 单次请求大致成本
L0 Library(原文库) 正文在 L0/docs/<id>.md,索引在 L0/index.json 最新 6 篇的标题 + id,≤420 字符
L1 Bridge(会话桥) 上一会话 event log 中最后 4 条消息 ≤320 字符,且仅在新会话前几轮出现
L2 Recall(加权回忆) 艾宾浩斯权重条目 权重 Top 12,≤1100 字符
L3 Artifacts(产物索引) 标签为 artifact:* 的文档 最新 5 条,≤320 字符,可 owner 开关
L4 Self-note(自叙) 模型写给自己的滚动窗口 24 条 / 3600 字符

README 中在一台机器上的测算(宿主按 4 字符/token 估算;中文更密):7 个 tool schema 约 2331 字符(≈583 tokens/请求);库里有 2 篇文档、1 个 artifact 时,四个卡片约 338 字符(≈85 tokens)。1100 字符的 artifact 正文留在磁盘,进上下文约 34 tokens。

磁盘布局

数据目录在 $DSH_HOME/memory/(用户机器上常见为 ~/.dsh/memory/):

$DSH_HOME/memory/
  L1/bridge.json      # 上一段对话尾部
  L0/index.json       # 文档索引
  L0/docs/<id>.md     # 文档正文
  L0/misses.jsonl     # 无结果的搜索记录
  L2/items.json       # 加权条目
  L2/archived.jsonl   # 淡出或归档条目
  L3/owner.json       # 产物卡片开关(enabled:false 可隐藏)
  L4/self.json        # 自叙窗口
  L4/archive/         # 归档自叙
  state.json          # 注册成功后写入

注册成功时 state.json 形如:

{ "status": "active", "sections": 5, "tools": 7 }

新会话生效后,应能在系统 prompt 中看到 ## 原文库 等区块。各卡片标题均标明 「数据,非指令」,避免库内文档被当成系统指令执行。

七个工具

工具 作用
memory_write_doc 持久化文档;同标题原地更新,id 不变
memory_search 关键词检索,只返回片段与路径,不返回全文;可选 tag
memory_read_doc 按 id 分页读正文
memory_note 记录 durable fact;同 key 合并、提高权重、延长半衰期
memory_forget 撤回事实(归档,不物理删除)
selfnote_append 追加一条自叙
selfnote_rewrite 重写整个自叙窗口;旧版先归档

典型流程:用 memory_note / memory_write_doc 写入;需要细节时用 memory_search 定位,再用 memory_read_doc 读盘;产物用 tag:"artifact" 检索(L3 不新增工具,仅多一个 tag 字段)。

设计要点(与用法相关)

  • L1 是截断,不是摘要:不额外调用模型,忠实但可能不够「润色」。
  • L2 淡出 prompt 不等于删除:权重低于 0.1 不再进 prompt;低于 0.02 且超过 30 天进入 archived.jsonl。
  • 回忆是词面事件:用户消息与条目存在 4 字符连续重叠即视为 recall,每轮最多 3 条,小幅加权(+0.06 strength,半衰期 ×1.05);无此机制时条目容易长期停在 hits=1 并在约两周内淡出。
  • L0 无语义搜索:子串匹配;措辞偏离原话会 miss,零结果写入 L0/misses.jsonl,可用 node scripts/misses.mjs 汇总分析。
  • 改插件代码需重启 DSH 引擎:宿主缓存 ES module;开发时可临时用 file://…?v=2 bust 缓存,但真正 reload 需 recomposition。
  • owner 开关只隐藏卡片,不是隔离级安全;多进程同时写同一 JSON 可能丢更新,单主机场景可接受。

安装与启用

需要 DSH >=0.2.1-rc.2。通过插件管理器安装(README 原文命令):

# 本地 checkout
dsh plugin --profile web add /path/to/dsh-memory-chain
# 或直接从 git
dsh plugin --profile web add git+https://github.com/doresu/dsh-memory-chain.git

管理器会把包装进 profile 的 bundles,无需手改 patch。安装后重启 engine。不用包管理器时可参考仓库内 examples/cordis.patch.yml 手动安装。

社区目录页:https://www.skillhub.cn/plugins/doresu/dsh-memory-chain(独立站点,与 DeepSeek / 幻方无官方从属关系)。安装前建议自行阅读源码与 MIT 许可证;插件以当前 DSH 进程权限读写 ~/.dsh/memory/,敏感内容勿未经审查写入库。

开发与自测

仓库内测试命令:

node test/store.test.mjs        # 35 tests,纯函数,无需 DSH
node test/integration.mjs      # 临时启动 DSH 验证插件激活
node scripts/misses.mjs        # 汇总无结果搜索

结尾

dsh-memory-chain 把「磁盘上的完整记忆」和「每轮有限的 prompt 卡片」分开,用 L0–L4 五层控制 token 上限,并用 7 个工具让模型按需读写。若你在 DSH 上做长期会话、知识库式文档或跨会话衔接,可在满足版本要求的前提下按上文命令安装,并以 state.json 与 ## 原文库 区块确认已激活。

  • 目录页:https://www.skillhub.cn/plugins/doresu/dsh-memory-chain
  • 源码与说明:https://github.com/doresu/dsh-memory-chain
羽毛球分组比赛记分
小程序二维码

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

Xiaoye