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(以頁面實時顯示爲準)。

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

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

小夜