前言¶
在 DeepSeek Harness(DSH)里做多轮开发,常见问题是:上一轮已经想清楚的结论,下一轮要从零复述;或者助手「记得」某件事,但经过摘要压缩后细节跑偏,甚至把已被推翻的旧方案当成现行做法。社区插件目录里归类为「记忆」的 dsh-kb(维护者 MyRemme,仓库 MyRemme/dsh-kb)针对的是后两类失败——失真与腐烂——而不只是「忘了就再搜一次」。下面介绍它的设计取舍、安装方式与典型用法。
这是什么¶
dsh-kb 是 DSH 的本地长期记忆库:把每次会话里「想明白的事」写成不可变事实卡,用骨架树做分类、关系图做脉络、FTS5 中文 bigram 做检索。数据落在单个 SQLite 文件里,只依赖 Node 内置的 node:sqlite 和 node:zlib,无额外原生服务。npm 包名为 @myremme/dsh-kb(CLI 命令 dsh-kb),当前资料中版本为 0.8.0,许可证 MIT,要求 Node >= 22.19.0,DSH 引擎 >= 0.2.0-rc.1。
设计上的核心分工是:fact 表是唯一真相;树、图、全文索引都是可重建的投影。作者 README 中明确:这套设计权重是 失真和腐烂 > 召回率——召回差一点可以换词再查,记错了会按错误结论去干活。
核心功能¶
事实卡与三种投影¶
一行 fact 对应一条不可变事实卡。在此基础上插件维护:
- node 骨架树:多归属、摘要作缓存;
- edge 关系图:一跳扩展、演化链(含 supersedes 等);
- FTS 索引:bigram + 覆盖率精排,中文双字词可检(README 说明 FTS5 的 trigram 分词对 ≥3 字符才建索引,故需 bigram 预分词)。
长期记忆的三种失败方式及对应机制(资料原文表格):
| 失败 | 表现 | 防它的机制 |
|---|---|---|
| 遗忘 | 问「上次那个怎么弄的」,答不上 | 索引 + 检索 |
| 失真 | 记得但记错;摘要偏离原意 | 卡不可变 + 回指原文 + 摘要可重算 |
| 腐烂 | 旧结论仍被当成现行方案 | status + supersedes 边 + 时间衰减 |
给模型用的工具¶
插件向 DSH 注册以下工具(并在系统提示中注入记忆纪律,规定何时必须查、何时必须写):
| 工具 | 作用 |
|---|---|
kb_search |
检索;用户说「之前/上次/我们说过/继续」时优先调用 |
kb_add |
写一条卡;一个可独立陈述的结论 = 一条卡 |
kb_tree |
查看骨架树:每枝卡数、最近更新、代表卡 |
kb_stats |
健康度:卡数、类型分布、路径分布、边数 |
kb_ingest |
增量吸收本机会话(幂等,可反复跑) |
界面与 CLI¶
两套界面共用同一份数据:
- DSH 侧边栏 「记忆」 面板:树 / 搜索 / 图谱三视图。
- 静态 HTML:
npx dsh-kb export产出单文件,不依赖服务,适合快照或面板异常时核对数据。
给人和脚本用的是 dsh-kb CLI(见下文典型用法)。资料中还提到十个原生工具、十九个 /api/dsh-kb/* 端点,以及可投影成可 git 的 Markdown 目录树(package.json 描述),细节以仓库文档为准。
从会话 ingest 的规则¶
kb_ingest 读取 $DSH_HOME/sessions/<cwd-tag>/<session-id>/session.v*.jsonl.zstd。README 强调两点:
- 文件是多帧 zstd;Node 的
zstdDecompressSync一次只解第一帧,插件需按 magic 扫帧边界逐帧解。 - 事件流中用于抽取的主要是:
sessionheader、session/title、compaction/summary、user/message;过程类事件(如tool/call)不作为知识来源。
抽取只做「已经写在会话里的事实」;「为什么」必须由模型当场用 kb_add 写下,否则容易变成幻觉。README 给出的实测数据:219 个会话 / 225 MB 压缩 / 6.9 秒 / 676 张卡 / 零错误(来源:项目 README,非第三方评测)。
检索打分(纯算,不用 LLM):召回走 FTS5(bigram) AND → 不足退 OR → 子串 LIKE → 图 1 跳扩展;精排为词覆盖率、标题命中、路径对齐、新颖度等加权,并乘以 status、confidence、kind_bonus。
安装与启用¶
在 DSH profile 目录安装(资料原文命令):
cd ~/.dsh/profiles/desktop
pnpm add dsh-kb
装完后插件自带 cordis.patch.yml,重启 dsh 即生效。也可手动插入配置:
- insert:
- id: dsh-kb
name: dsh-kb
config:
enabled: true
dbPath: "" # 留空 → $DSH_HOME/kb/kb.db
maxResults: 6
promptSection: true
环境变量:DSH_HOME(默认 ~/.dsh)、DSH_KB_HOME(默认 $DSH_HOME/kb)。
典型用法¶
初始化与从会话吸收¶
npx dsh-kb init
npx dsh-kb ingest [--limit N] [--rescan] # 扫 ~/.dsh/sessions/*.jsonl.zstd
在 DSH 会话里,模型可在适当时机调用 kb_ingest 做增量吸收,或依赖上述 CLI 批量处理。
检索与写入¶
npx dsh-kb search "中文分词 方案" -k 6
npx dsh-kb search "zstd" --path topic/dsh --json
npx dsh-kb add --title "结论" --body "正文" --path topic/dsh --kind decision
模型侧与用户说「继续上次话题」时,应对齐 README 建议:先 kb_search,再按需 kb_add 沉淀新结论。
浏览与维护¶
npx dsh-kb tree topic --summary
npx dsh-kb stats
npx dsh-kb show f_0d06e6d4155a92
npx dsh-kb forget f_0d06e6d4155a92 # 标记失效,不删
npx dsh-kb reindex
维护纪律(README):一条卡是否合格,取决于「下次会话在不知道上下文的情况下读到它,能不能直接照做」;库是否健康,则看能否回答「是什么」「为什么」「何时放弃、换成什么」「继续上次能否找回原话(source_ref)」。
适用场景与注意¶
适合谁:长期在 DSH 上做同一仓库或同一主题迭代、希望结论可审计、可迁移(SQLite 文件备份即可)、且不愿引入向量库或外部记忆服务的开发者。
生态背景:DSH 的理念是「一切皆插件」;社区目录页 skillhub.cn/plugins/MyRemme/dsh-kb 为独立站点,与 DeepSeek / 幻方无官方从属关系。
安全与权限:插件以当前 dsh 进程权限运行,会读写 $DSH_HOME 下的会话与知识库路径。安装前请自行查看 GitHub 源码 与 MIT 许可证,确认符合你的环境策略。
不是万能记忆:纯树或纯向量方案的局限,README 已有讨论;本插件刻意不指望 ingest 推断「为什么」,需要你在对话里显式写入 decision 类事实卡。
结尾¶
dsh-kb 把「谁做真相、谁做索引」讲清楚:fact 账本不可变,树和图随时可重建,检索针对中文 bigram 做了落地实现,并与 DSH 会话 jsonl.zstd 格式对齐。若你要在 Harness 里建立可回溯、可失效标记的本地记忆,可从 profile 里 pnpm add dsh-kb 起步,用侧边栏或 CLI 验证数据是否符合你的维护纪律。
- 目录页:https://www.skillhub.cn/plugins/MyRemme/dsh-kb
- GitHub:https://github.com/MyRemme/dsh-kb