前言¶
在 DeepSeek Harness(DSH)里做多轮、多会话协作时,模型默认不会记住上次会话里已经拍板的事实、偏好或踩过的坑。常见做法是往 system prompt 里塞长摘要,或依赖会每轮自动注入检索结果的记忆插件——上下文变长、KV 缓存也更容易被搅动。下面介绍社区插件 dsh-recall(维护者 KarBurKi,分类:记忆):用本地 JSONL 存卡片、提供一组显式工具,由模型在需要时查和写;检索命中不会自动进 prompt,只在用户/session 侧写了规矩文件时才做可选注入。
这是什么¶
dsh-recall 面向 DSH 的跨会话记忆:数据落在 ~/.dsh/recall/<scope>.jsonl(同名 .md 供人读),按当前工作区目录名自动隔离 scope,也可写入 global 库。README 将其与 dsh-meow-memory 对比——后者约 4,452 tok/请求且含首轮注入与关键词命中;本项目 README 估算固定开销约 1,170 tok/请求,另加 0~750 tok(视私密本内容,见仓库成本表)。当前 package 版本为 0.11.0。
生态上 DSH 主张「一切皆插件」;SkillHub 目录页 与 GitHub 仓库 由社区维护,与 DeepSeek / 幻方无官方从属关系。
核心功能¶
七个显式工具¶
插件在宿主侧注册工具(改 lib/index.js 后需重启 DSH 桌面端,README 说明 recall 不走客户端 HMR):
| 工具 | 作用概要 |
|---|---|
mem_save |
写入一条记忆,可选 kind(fact/pref/lesson/task/proj)、手写 keywords、goal;自动记出处会话 |
mem_find |
BM25 检索或留空 query 按时间倒序;默认同时查当前工作区与 global |
mem_forget |
按 mem_find 返回的 id 删除 |
mem_brief |
同步「其他会话自上次游标以来写了什么」,并推进全局同步点 |
mem_source |
沿记忆出处解压会话日志,取最相关的用户/助手正文片段 |
mem_wall |
会话间留言板(写 say / 读墙,to 可指定对象) |
mem_private |
当前会话私密本:写或不传参读取 |
scope 缺省为当前工作区目录名;跨项目共用记忆可传 global。
不自动注入检索结果¶
每轮不会把 mem_find 的命中塞进 prompt,因此 README 强调不碰 KV 缓存、不污染上下文。会进入 system prompt 的,是私密本里的 _额外规则 与 _次要规则(0.9.0 起,两层都空则不出该节);卡片摘要本身要靠工具主动查。
检索与写入规则¶
- 中文 bigram + ASCII 词,BM25,时间半衰(半衰期 60 天);
keywords需手写,正文/关键词/目标句分字段加权。 - 写入闸门:正文短于 12 字,或以
-、反引号、#开头的清单/标题行会拒收。 - 近乎重复(重叠系数 ≥0.9)自动合并;关键词撞上多条旧卡且正文不像时只提醒,不自动作废。
- 写入时尽量带上会话 uuid(
〔s:xxxxxxxx〕),便于mem_source回溯;取不到则不编造。
跨会话同步、墙与私密本¶
mem_brief:只汇总「写进记忆的事」;没调用mem_save的会话不会出现在摘要里。mem_wall:记忆存事实,墙存话;README 说明这是留言板而非实时聊天,对方可能下次开会话调mem_brief才看到。mem_private:每个会话对应[TheLifeofFish]/private/<s前8位>/下四本(_本子、_额外规则、_次要规则、_压缩存档);工具只认当前会话文件夹。宿主压缩对话时,插件监听compaction/summary,按规则把片段归档进_次要规则或_压缩存档,不调模型。
存储与依赖¶
纯文件存储,零运行时 import 核心包;改 JSONL 即改记忆,拷贝即可迁移。
安装与启用¶
安装前请自行审阅 GitHub 源码 与仓库内声明;插件以当前 DSH 进程权限读写 ~/.dsh/recall 与会话日志,安装等同于信任该代码。
方式一:本地 link(README 推荐自用)¶
将插件目录放到 ~/.dsh/plugins/dsh-recall,在 profile 的 package.json 里 link 依赖并追加 bundle,必要时在 profile 的 node_modules 建 junction(Windows 示例见 README),然后重启 DSH 桌面端:
"dependencies": {
"dsh-recall": "link:C:/Users/<you>/.dsh/plugins/dsh-recall"
}
dsh.profile.bundles 中追加 "dsh-recall",并按 README 同步 pnpm-lock.yaml 的 importers 段。
方式二:插件市场¶
若市场已收录,直接搜索 dsh-recall 安装;未收录时用方式一。
装完之后¶
在全局 ~/.dsh/AGENTS.md 增加 README 建议段落(约 75 tok),提示模型主动使用工具:
## 记忆(dsh-recall)
跨会话记忆在 `~/.dsh/recall/<工作区>.jsonl`(同名 `.md` 是人读版)。相关话题开工前先 `mem_find` 查一下;
定下来的事实/偏好/教训用 `mem_save` 记一行;记错用 `mem_forget`。没有自动注入,也没有后台整理。
典型用法¶
- 新会话开工:先
mem_brief看其他会话动向;话题相关时mem_find(query: "...")。 - 定结论:
mem_save(text: "...", kind: "fact", keywords: "别名, 英文缩写");需要细节时对返回 id 调mem_source。 - 跨会话留话:例如
mem_wall(say: "你那个 bili.py 建议加个超时,昨天卡了 20 分钟。", to: "7a595bba")(示例来自 README)。 - 记错:
mem_forget(id: "..."),id 来自mem_find结果。
关键词示例思路:同义词、缩写、英文写法写进 keywords,换说法检索仍命中;goal 仅在 kind: "task" 时描述「要达成什么」。
适用场景与注意¶
适合:希望记忆落盘、可手改 JSONL、按工作区隔离,且不愿每轮自动塞检索命中的人;需要会话间慢速留言、压缩后自动归纳规矩到文件、又希望固定 prompt 开销可控的场景。
注意:
- 没有「后台整理」:不查就不进上下文,习惯要靠 AGENTS.md 与流程约束。
mem_brief看不见未写记忆的会话活动;墙消息非即时。- 私密本靠工具隔离,同一用户仍可直接读文件——README 将其视为违规而非技术边界。
- 中文检索按 bigram,README「已知取舍」一节说明了虚字过滤与钩子误判可能;自动归档质量取决于摘要与规则,不是模型重写。
- 同类对比与 design 细节见仓库 docs/设计取舍.md。
结尾¶
dsh-recall 把跨会话记忆收成「JSONL 即库 + 七个工具 + 可选规矩注入」,默认不为检索付每轮上下文税。目录与源码:
- https://www.skillhub.cn/plugins/KarBurKi/dsh-recall
- https://github.com/KarBurKi/dsh-recall