前言¶
在 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 相關的片段挑出來;用常駐 / 動態 / 工具按需三條通道注入,並在會話內儘量保持穩定以利前綴命中。
核心功能¶
混合召回與相關性閘門¶
召回並行兩路:
- 詞法:BM25;優先用 jieba 分詞(可選依賴
@node-rs/jieba),缺失時自動退回中文 1-gram + 2-gram。 - 語義: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(以頁面實時顯示爲準)。