dsh-memory-beta:为 DSH 补上长期记忆与带来源的知识库召回

前言

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
羽毛球分组比赛记分
小程序二维码

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

Xiaoye