前言¶
DeepSeek Harness(DSH)把智能体能力拆成可插拔的插件;日常开发里,原生检索主要靠 glob 和 grep,本质是精确匹配。你只记得「大概是存储选型那段」,却想不起写在哪个文件,这类问题很难靠路径和关键词硬搜出来。web_search 查的是外网,也替不了你自己仓库里的设计记录。
同时,DSH 每次会话都是新的:上一周定下的偏好、本项目已经写死的约定,下一轮对话默认不知道。
下面介绍的 dsh-memory-beta(维护者 Chang-An2002)针对这两块空白:在工作区内做混合召回并返回 路径:行号 引用;用人类可读的 Markdown 做跨会话长期记忆,并在每次请求里把记忆注入系统提示词。插件当前版本 1.0.1,运行时依赖为 0,数据落在本机 ~/.dsh,不上传、无遥测。
这是什么¶
一句话定位:给 DSH 加一层长期记忆与带来源的知识库召回。
| 能力 | 说明 |
|---|---|
kb_search |
在工作区已索引文档里混合召回,返回带 路径:行号 的片段;证据不足时明确说「没找到」,并约束模型不要用训练知识补空 |
memory |
用户级(跨项目)与项目级(仅当前项目)长期记忆,存成可直接编辑的 Markdown |
| 记忆自动注入 | 可配置是否把长期记忆写入系统提示词,新会话开局即可带上约定与偏好 |
社区目录分类为「记忆」;仓库 GitHub 与 SkillHub 目录页 由社区维护,与 DeepSeek / 幻方无官方从属关系。DSH 生态理念是「一切皆插件」,安装前建议自行阅读源码与 MIT 许可证——插件以当前 DSH 进程权限运行,能读写的范围与进程一致。
核心功能¶
五个工具¶
| 工具 | 什么时候用 |
|---|---|
kb_index |
需要手动刷新索引时;非必须前置——kb_search 会检测过期并重建 |
kb_search |
答案应来自你自己的资料时 |
kb_stats |
核对「索引了哪些文件、是否过期」;只报告、不改动索引 |
memory |
action 为 read / write / forget,scope 为 user / project |
memory_search |
记忆条数变多后按内容检索 |
设计上值得先知道的三点¶
1. 记忆是 Markdown,不是数据库。 便于用记事本审阅、纠正,并可用 git 管理项目级约定;模型记错时你可以直接改文件,而不依赖专用工具。
2. 索引不是事实源。 原文始终在工作区;索引在 ~/.dsh/memory/index/ 下,可随时删除重建,索引里不保留原文之外的额外副本。
3. 零运行时依赖。 不引入 SQLite、原生模块或下载模型,装完即用。
检索与「没找到」¶
资料命中时,输出会标出来源章节与行号,便于回到原文核对。资料里没有时,插件会要求模型直接说明检索范围,而不是用通用知识填空——重点不是「总能给答案」,而是「能回到原文,回不去就说明白」。
kb_search 检索前会做索引过期检测(先比 mtime,再对变更文件算内容指纹,避免误报)。发现变化会先重建再检索,并在结果里写明;若关闭自动重建,则只提醒。kb_stats 使用同一套过期判断,但不会偷偷重建,避免报告与检索结论不一致。
可选 同义说法表 ~/.dsh/memory/synonyms.json:问法与文档用词不一致时,由你手写同义组做查询扩展,改完即生效,无需重建索引;表损坏时退回无同义表,检索照常。
安装与启用¶
装完后若提示词注入未生效,可先重启一次客户端。
Web(dsh web)¶
# 从 GitHub 安装
dsh plugin --profile web add github:Chang-An2002/dsh-memory-beta
安装后重启 dsh web 并刷新浏览器。本地开发可用 dsh plugin --profile web add link:<本地路径>。
桌面客户端(Electron)¶
桌面端使用 desktop profile,命令行 dsh plugin 按设计不操作该 profile。在桌面客户端会话里说:
把 dsh-memory-beta 装上
由内置 plugin_manager 在当前 profile 安装并写入 dsh.profile.bundles。
手动安装¶
在 profile 目录(~/.dsh/profiles/<profile>/)执行:
pnpm add github:Chang-An2002/dsh-memory-beta
并在该 profile 的 package.json 的 dsh.profile.bundles 数组中加入 "dsh-memory-beta"。
配置¶
写在 profile 的 cordis.patch.yml 中,例如:
- id: dsh-memory-beta
name: dsh-memory-beta
config:
maxPassages: 6 # kb_search 默认返回的片段数
injectMemory: true # 是否把长期记忆注入系统提示词
maxInjectedEntries: 40 # 注入的条数上限
maxInjectedChars: 3000 # 注入的字符预算
autoReindex: true # 检索前发现索引过期时,是否自动重建(关掉则只提醒)
典型用法¶
一轮常见对话:你问「这个项目为什么不用 SQLite 存记忆?」模型调用 kb_search,若 docs/DESIGN.md 等有记录,则按 路径:行号 引用理由(可审阅、git 友好、零依赖等)。若资料中没有 PostgreSQL 支持说明,模型应回答「在你给我的资料里没找到」,并说明检索范围。
记忆写入示例形态(项目级文件片段):
<!-- dsh-memory:project v1 -->
# 项目长期记忆:my-project
- `决定.存储` 记忆载体用 Markdown + JSON,不用 SQLite:必须可人工审阅与 git 管理。 <!-- @2026-10-09 src=model -->
用户级记忆:~/.dsh/memory/user.longterm.md;项目级:~/.dsh/memory/projects/<工作区键>.longterm.md。工作区键形如 my-project--f07f7b24,不含家目录前缀。
适用场景与注意¶
适合谁: 需要在 DSH 里反复引用本仓库文档、设计记录、部署说明,并希望跨会话记住稳定偏好与项目约定的开发者。
检索质量: 当前为 BM25 稀疏召回,无语义向量;问法与文档无共同词时可能召回为空,同义说法表是主要缓解手段。中文为字符二元组加停用词,非专业分词器。单次查询延迟随语料规模线性增长;语料很大时索引在内存全量驻留,开销会上升。
记忆: 不会自动去重或合并;注入有字符与条数预算,超出会列出未展开的键名。请定期打开 Markdown 审阅,必要时 memory action=forget 或直接编辑。
隐私与索引边界: 不上传内容。不索引 node_modules、.git、常见构建目录、锁文件、超过 512 KB 的文件、二进制与非 UTF-8、符号链接;工作区内的 .dsh-memory/ 不参与检索。团队共享记忆(工作区 .dsh-memory/project.md)在 README 中标注为尚未实现。
平台: CI 在 Ubuntu 与 Windows 上跑单元测试(Node 20 / 24);README 写明在真实 DSH 实例里目前仅在 Windows 验证过,Linux / macOS 实际行为未实测。
结尾¶
dsh-memory-beta 把「记得住人、能从自己的资料里召回带出处片段」接到 DSH 上,记忆与索引都可本地审阅,失败模式上优先保证「引不到就说清楚」而不是编造。
- 目录页:https://www.skillhub.cn/plugins/Chang-An2002/dsh-memory-beta
- 源码与完整说明:https://github.com/Chang-An2002/dsh-memory-beta