dsh-vcprag:DSH 记忆插件的混合检索与三层注入

前言

在 DSH 里做长期助手,常见做法是把手写笔记、偏好写进 system prompt,或靠某次对话前临时粘贴上下文。前一种会在内容变长时拖垮前缀缓存;后一种既难维护,也容易把无关段落一并塞进模型。社区里也有只靠关键词或只靠向量的记忆插件,前者对口语化查询不稳,后者又可能把元数据噪音一起 embed。

下面介绍的 dsh-vcprag(仓库 YumenoSayuri/dsh-vcprag)走另一条路:本地日记式语料、BM25 与向量双路召回、IDF 实词闸门,再把结果分三层注入 DSH,并用冻结策略减少动态层对缓存的干扰。

这是什么

dsh-vcprag 是 DeepSeek Harness 的记忆类插件,维护者 YumenoSayuri,在 SkillHub 插件目录 登记。package.json 标明当前包版本 0.4.2,许可证 MIT,要求 Node >= 20。

它解决的核心问题可以概括成三点:用可编辑的纯文日记积累记忆;用混合检索把与当前 query 相关的片段挑出来;用常驻 / 动态 / 工具按需三条通道注入,并在会话内尽量保持稳定以利前缀命中。

核心功能

混合召回与相关性闸门

召回并行两路:

  1. 词法:BM25;优先用 jieba 分词(可选依赖 @node-rs/jieba),缺失时自动退回中文 1-gram + 2-gram。
  2. 语义:embedding 向量通道,与词法结果经 RRF 融合。

相关性闸门采用余弦阈值与 IDF 实词双判据:查询里若没有可检索的实词,宁可一条都不注入。可选的「相关性裁判」用判断模型核对日记与 query 是否同一主题,默认关闭,失败会回退。向量通道异常时会降级为纯关键词,不中断对话。

日记式语料

默认格式为纯文本 .txt:[HH:MM] 时间锚、首段 > 摘要、末行 Tag: 标签,文件名建议带日期。也可切换为带 frontmatter 的 .md 以兼容旧语料。README 说明选择 .txt 是为了避免 frontmatter 元数据污染向量表示,并便于人直接改字。

数据分两层:diaryRoot 可写(新日记与子目录分类);corpusRoot 可选只读(旧 .md 语料)。两层若标题重复会跳过日记侧并提示;迁移完成后可将 corpusRoot 留空,只保留 diaryRoot。

三层注入

通道 默认注入位置 内容
常驻 systemPrompt.section() 长期偏好、事实、工具用法;可含「怎么写日记」规范
动态 system-prompt/assemble 上回填召回 本次 query 相关片段(有字数上限)
按需 ctx.tools.register() 六个记忆相关工具,由模型自行调用

常驻与动态各自可在设置里切换「系统提示词」或「对话消息」注入(默认:常驻走 system,动态走 message),以应对上游清空 system prompt 等场景。动态层在会话内冻结:首次召回后内容不变,直到用户新消息或 todo 勾选变化等条件才重新召回,编码类多轮对话更易保住前缀。

管理面板

插件在 DSH 原生右侧栏提供四页:记忆库、召回调试、索引、设置(可拖拽宽度、全屏)。入口:设置 → 插件 → 记忆召回。首次使用需在「索引」页执行一次「重建全量索引」;之后新日记会增量更新。

安装与启用

安装步骤以仓库 README 为准,不是单一的 dsh plugin add 命令。

1、将插件目录放到 profile 的本地模块路径,并在 package.json 中 link 登记:

cp -r dsh-vcprag ~/.dsh/profiles/<profile>/node_modules/@local/

在 profile 的 package.json 中:

  • dependencies: { "@local/dsh-vcprag": "link:.../dsh-vcprag" }
  • dsh.profile.bundles: 数组中加入 "@local/dsh-vcprag"

然后执行:

pnpm install

2、在 cordis.patch.yml 增加插件条目并填写路径与 embedding(示例字段如下,路径请换成你自己的):

- id: vcprag
  name: '@local/dsh-vcprag'
  config:
    diaryRoot: /path/to/your/diaries
    corpusRoot: ''
    dataDir: /path/to/your/.vcprag
    diary:
      format: txt
      folder: ''
      templateEnabled: true
      requireTag: true
      timePrefix: true
    embedding:
      enabled: true
      baseUrl: 'https://your-endpoint.example.com/v1'
      model: 'your-embedding-model'
      dimensions: 3072
      batchSize: 16
      concurrency: 2
      minIntervalMs: 700

Embedding 密钥使用环境变量 VCPRAG_EMBEDDING_KEY,不要写入配置文件。目录也可用 VCPRAG_DIARY_DIR / VCPRAG_CORPUS_ROOT / VCPRAG_DATA_DIR 给默认值。

3、(可选)在插件目录安装可选依赖以启用 jieba:

cd <插件目录> && npm install --omit=dev

不安装也能运行,分词会退回 1-gram + 2-gram;README 写明装上后约多 48 MB RSS、启动约多 90 ms,可在设置里把分词器设为 gram 省掉这部分成本。安装 jieba 后重启即可,不必为此重建向量索引。

典型用法

写日记

在 diaryRoot 下新建符合约定的 .txt,例如:

[21:14] 东京节点 443 端口处置与共管服务调整

> 一句话摘要,会作为高权重字段参与检索。

正文……起因、过程、结果、关键参数、复盘。

Tag: 东京节点, 443 端口, sing-box, 时区调整

requireTag、timePrefix 开启时,缺 Tag 或缺时间前缀会告警但仍可检索(摘要缺失时取正文前 160 字)。

索引与调试

完成配置并 pnpm install 后,打开 设置 → 插件 → 记忆召回。在「索引」页点击「重建全量索引」,再在「召回调试」页用真实 query 看闸门与排序是否符合预期,然后在正常对话中观察动态层是否按预期注入。

归档日记可通过工具 vcprag_forget 移入 已整理/(README 数据布局中有说明)。

适用场景与注意

适合谁:长期在 DSH 里写助手、希望记忆落在本地文件、既要关键词又要语义召回,并且关心 system 前缀缓存与上游清 system 行为的开发者。

权限与安全:插件与当前 DSH 进程同权限 运行,可读写你配置的 diaryRoot、dataDir,并会按配置调用 embedding 端点。安装前请阅读仓库源码与 MIT 许可证,自行确认 endpoint 与密钥管理是否符合环境要求。

生态说明:DSH 主张「一切皆插件」;SkillHub 为社区目录,与 DeepSeek / 幻方无官方从属关系,不要把它当作官方应用商店。

版本信息:本介绍依据仓库 README 与 package.json 整理;README 文首另写有 0.2.6 及 CHANGELOG 时间线,与包版本 0.4.2 并存时以你本地检出文件为准。

结尾

经过上面的步骤,你会得到一套以日记为源头、混合检索为中枢、三层注入为出口的 DSH 记忆方案:无关查询被闸门挡住,相关片段进入动态或工具通道,常驻事实与写作规范则稳定挂在 system 或消息流上。

进一步了解可访问 SkillHub 目录页 与 GitHub 仓库。GitHub 上公开星标约为 8(以页面实时显示为准)。

羽毛球分组比赛记分
小程序二维码

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

小夜