dsh-cue-bank:給 DeepSeek Harness 加一套跨會話的事件觸點記憶

前言

用 DSH(DeepSeek Harness)做日常開發,會話彼此隔離:上週談過的方案,今天開新會話再提同一件事,agent 記不起細節;同一個會話裏話題切走又切回來,中間的關鍵信息也已經滑出上下文。已有的補救手段各有侷限——dsh-session-query 提供的是被動查詢 API,需要有人調用;dsh-session-reference 要求用戶顯式 @ 引用;dsh-agent-instructions 只加載靜態指令文件。它們都不會在合適的時機主動把記憶送回來。

DSH 的理念是「一切皆插件」,跨會話記憶這類能力可以由社區插件補足。dsh-cue-bank 的思路是模仿人腦的事件記憶:人能隨時在任務間切換,靠的是給每個事件建立關鍵詞、視角、觸發物等多維觸點,觸點被當前情境激活後,再從長期記憶拉取事件細節。這個插件把同樣的機制搬到了 DSH 上。

這是什麼

dsh-cue-bank 是一個跨會話「事件觸點記憶」插件,維護者是 itr-del,當前版本 0.1.0,MIT 許可證。它爲 DeepSeek Harness 構建一個持久的事件觸點庫(關鍵詞 + 用戶慣用詞),並在檢測到話題切換時重新喚醒、注入相關記憶細節。

用兩句話概括它的行爲:

1、每輪對話結束,自動從文本中提取關鍵詞和用戶慣用詞,寫入全局觸點庫;
2、新消息與上一輪的關鍵詞重合度低於閾值時,判定爲話題切換,從庫中召回相關記憶,隨請求注入。

工作原理

寫入側:turn 結束自動建庫

插件監聽 agent/status=idle,在每輪 turn 結束時讀取本輪文本,提取三類觸點,upsert 進全局觸點庫(原子寫 JSON):

  • 對話級觸點:本輪關鍵詞(2~4 字中文 gram + 英文詞);
  • 任務級觸點:session 聚合關鍵詞,合併更新;
  • 用戶慣用詞:統計近 N 輪窗口內的高頻個人用詞,作爲第二類觸點單獨記錄。

觸點每次被命中會更新 lastTouchedAt 併合並關鍵詞,記憶隨使用漸進完善。

喚醒側:話題切換時注入

插件通過 systemPrompt.context() 註冊動態上下文。每次 prompt 組裝時,提取新消息關鍵詞,與上輪關鍵詞計算重合度;低於閾值(默認 0.25)判定爲話題切換,觸發觸點庫掃描,命中 top-N 後注入 <system-reminder> 記憶喚醒塊。注入內容帶來源標記(conversation / task)、命中觸點、最近提及時間和細節摘要;若命中用戶慣用詞,追加「用戶慣用詞」提示行。

兩個值得注意的設計:

  • 注入的是帶來源的 runtime-context 快照,隨請求發送,但不寫入持久 session 歷史。話題未切換時不注入,上下文保持乾淨。這是它與 dsh-agent-instructions(持久注入)的關鍵區別。
  • 插件是通用的:監聽全局 agent/created,對所有 agent 掛載喚醒/寫入鉤子,不限於飛書。userId 從 session id 提取(如 feishu:ou_xxxou_xxx),按用戶分片存儲。

匹配算法與成本

匹配支持三種模式:

模式 說明
keyword TF 加權窮舉,純本地,詞面重合準確、語義弱,零外部成本
vector 向量餘弦,語義匹配強,走 OpenAI 兼容 embedding 接口
auto(默認) 有 key 用向量,無 key 自動降級關鍵詞

向量模式默認使用 SiliconFlow 的 BAAI/bge-m3。README 特別說明:DeepSeek 官方 API 不提供 embedding 端點(引用 deepseek-ai/DeepSeek-V3 的 issue #806),所以向量模式走 OpenAI 兼容接口。

成本方面,庫向量在寫入時預計算並緩存,喚醒時只編碼 1 條 query,不重複計費。按 bge-m3 / SiliconFlow 的 2026-08 行情,單次喚醒約 ¥0.000025,約每 1 萬次話題切換 ¥0.25;關鍵詞模式零外部成本。

安裝與啓用

一鍵安裝(推薦),安裝器通過 package.json 的 dsh.bundle manifest 解析插件(cordis.patch.yml),掛載到指定 profile:

dsh plugin --profile web add github:itr-del/dsh-cue-bank

也可以從 npm 安裝(README 稱已發佈到 npmjs.com/package/dsh-cue-bank):

dsh plugin --profile web add dsh-cue-bank

如果想手動掛載,先在 profile 的 package.json 加依賴:

"dependencies": {
  "dsh-cue-bank": "^0.1.0"
}

再在 profile 的 cordis.patch.yml 插入 id: cue-bank 的配置塊(含 storageRoot、matchMode、embedding、topic、inject 等默認配置,完整 YAML 見 README)。

然後安裝依賴並重啓:

cd ~/.dsh/profiles/web && pnpm install

重啓 dsh web 後生效,插件在啓動時加載。

啓用向量模式只需設置環境變量(或配置 embedding.apiKey),無需改代碼:

export SILICONFLOW_API_KEY=...

完全不設該 key,matchMode: auto 會自動降級爲純關鍵詞本地匹配;也可以把 embedding.baseURL 改爲自託管端點,實現完全本地運行。

配置

常用可調項(默認值):

默認 說明
storageRoot '' 空 = $DSH_HOME/storages/cue-bank
matchMode auto auto / keyword / vector
topic.switchThreshold 0.25 關鍵詞重合度低於此值視爲話題切換
topic.scanEveryTurn false 每輪都掃描(靈敏但開銷大)
inject.maxCues 3 最多注入幾條記憶
inject.maxDetailChars 400 單條細節截斷長度
extract.userIdiomWindowTurns 10 慣用詞統計窗口(輪)
dbg false 調試日誌

觸點庫默認存於 $DSH_HOME/storages/cue-bank/users/<userId>.json,跨 profile、跨會話共享。單用戶觸點上限 200 條(LRU 淘汰),慣用詞上限 50 條。完整配置表見 README。

測試與驗證

倉庫自帶四組測試,README 給出的結果:

node test/keywords.test.js      # 22/22 通過
node test/store.test.js         # 16/16 通過
node test/embedding.test.js     # 18/18 通過(不髮網絡請求)
node test/integration.test.js   # 13/13 通過

覆蓋寫入建庫、話題切換喚醒、同話題抑制、無關話題抑制、慣用詞提取與參與喚醒。另外在真實 dsh 進程(headless profile)裏驗證過:插件加載無報錯,turn 結束自動寫入全局觸點庫。向量模式未配置真實 key,用本地 mock 的 OpenAI 兼容服務器驗證了代碼路徑,包括 API 調用契約、餘弦相似度判定、無 key 自動降級和超時中止。

與官方插件的差異

README 自述與 dsh 官方插件(dsh-session-querydsh-session-referencedsh-compactiondsh-agent-instructionsdsh-spill)核心能力幾乎不重複,估計重複度 10-15%,方向相反:官方插件是「被動查詢」,cue-bank 是「自動記憶 + 主動喚醒」。官方清單裏沒有的獨有能力包括:turn 結束自動建庫、話題切換閾值觸發、無需用戶提及的動態注入、用戶用詞畫像、結構化全局存儲。

適用場景與注意

適合的人羣:長期使用 DSH、跨多個會話工作、話題經常切走又切回來,希望 agent 記得「之前聊過什麼」以及「自己慣用哪些表述」的用戶。不配置 embedding key 就是純本地運行,維護成本很低。

使用前注意幾點:

1、插件以當前 dsh 進程權限運行,安裝前建議先讀一遍源碼和許可證(本項目爲 MIT);
2、向量模式(matchMode: auto 且設置了 SILICONFLOW_API_KEY)會把對話文本編碼後發送到 https://api.siliconflow.cn/v1(默認第三方 OpenAI 兼容端點),寫入時的庫向量也經該端點預計算。介意數據出本地的話,不要設置該 key,或改用自託管端點;
3、觸點庫有容量上限(觸點 200 條 LRU 淘汰、慣用詞 50 條),不適合當作全量歸檔來用。

結尾

dsh-cue-bank 把「被動查詢歷史」變成「在話題切換的時機主動把記憶送回來」,與官方插件方向互補,向量模式單次喚醒成本約 ¥0.000025,也可以完全本地運行。項目主頁:https://github.com/itr-del/dsh-cue-bank;社區目錄頁:https://www.skillhub.cn/plugins/itr-del/dsh-cue-bank(該目錄爲獨立社區站點,與 DeepSeek / 幻方無官方從屬關係)。

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

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

小夜