dsh-recall:按工作区隔离的 JSONL 跨会话记忆

前言

在 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`。没有自动注入,也没有后台整理。

典型用法

  1. 新会话开工:先 mem_brief 看其他会话动向;话题相关时 mem_find(query: "...")。
  2. 定结论:mem_save(text: "...", kind: "fact", keywords: "别名, 英文缩写");需要细节时对返回 id 调 mem_source。
  3. 跨会话留话:例如 mem_wall(say: "你那个 bili.py 建议加个超时,昨天卡了 20 分钟。", to: "7a595bba")(示例来自 README)。
  4. 记错: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
羽毛球分组比赛记分
小程序二维码

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

小夜