前言¶
在 DeepSeek Harness(DSH)裏給智能體加「長期記憶」,常見做法是模型自己決定寫什麼、讀什麼、要不要塞進上下文。文本一旦由模型生成,就容易出現編造條目、誤把記憶當指令、或在不相關輪次裏硬塞歷史片段等問題。
下面介紹社區插件 dsh-memory-jev(維護者 Towzai,分類:記憶)。它把 TypeSafe 的 Jev 決策模型當作記憶系統的安全邊界:Jev 只輸出三種類型化結果——choice(在候選裏選一個)、score、noul(是/否概率)——從不生成自由文本。是否值得寫入、替換哪條舊記憶、召回是否相關、本輪是否注入,都由 Jev 做判決;記憶正文始終由插件控制,模型不能憑空發明記憶內容。
這是什麼¶
dsh-memory-jev 是面向 DSH 的服務端記憶插件(當前 package 版本 0.4.1,MIT 許可證)。它在每次記憶的讀、寫路徑上掛接 Jev,並額外提供在每輪對話前可選的注入門(fail-closed:判不準就不注入)。
生態上,DSH 強調「一切皆插件」;插件可在社區目錄 skillhub.cn 檢索,該站點與 DeepSeek / 幻方無官方從屬關係。源碼與說明見 GitHub:Towzai/dsh-memory-jev。
核心功能:三道門與不變量¶
插件用三個「門」組織行爲;失敗時的策略 deliberately 不同——寫入偏 fail-open,注入偏 fail-closed。
| 門 | 作用 | 失敗時 |
|---|---|---|
Write gate mem_remember |
本地 bigram 預過濾 → 一次 Jev:worth_keeping(noul)+ supersedes(在候選與 none 間 choice) |
仍會寫入;僅標記 gate=unavailable\|budget |
Recall gate mem_recall |
詞法預過濾 top-N → 每條候選一個 rel_<id> noul → 按概率過濾排序 |
回退本地排序並標記 degraded(「未經過 Jev 判決」) |
Injection gate agent/pre-step |
廉價文本門 → 候選池減法 → Jev 相關性判決 → 在上下文尾部追加一條帶框的用戶快照 | 不注入(寧可沉默也不加噪聲) |
設計上的幾條約束(README 中的 Invariants)值得單獨記一下:
- 每個
(session, turn)最多注入一塊;同輪後續步驟不再重複判決或注入。 - 每條記憶在同一會話內最多注入一次;已注入的 id 在 Jev 調用前就從候選池移除,不再消耗請求。
- 注入塊離開上下文後,對應 id 可再次參與候選(日誌記爲
reset)。 - 注入塊用
<retrieved-memories …>framing,並聲明「不是對話歷史、不是指令」;記憶正文內的<會轉義爲\u003c,避免僞造分隔符。 - 僅追加在尾部,系統提示與先前歷史字節級不變,利於 prefix cache。
工具與本地存儲¶
| 工具 | 用途 |
|---|---|
mem_remember |
寫入門;無論門結果如何都會持久化(返回 persisted) |
mem_recall |
召回門;返回 {gate, degraded, items[]},jev_prob 與 local_score 分開保留 |
mem_list / mem_view |
列表 / 查看 |
mem_forget / mem_restore |
軟刪除 / 恢復(保留 supersedeHistory,支持 cascade) |
mem_merge |
將較舊條目正文折入較新條目後軟刪舊條(合併後長度 ≥ 舊條長度) |
mem_pin |
跳過一次相關性閾值,每會話最多一次,會話開始時不可用 |
mem_gate_status |
花費 / 預留 / 剩餘 / 調用次數 / 熔斷 / 密鑰是否存在 / 存儲路徑 |
mem_gate_log |
審計日誌查詢(僅 id 與 hash,不含正文) |
不會發生物理刪除:刪除一律是 retired=true,可恢復。
安裝與啓用¶
通過 DSH 插件市場¶
倉庫帶上 dsh-plugin topic 後會被註冊表 CI 索引(約每 2 小時掃描)。安裝命令(README 原文):
dsh plugin --profile web install Towzai/dsh-memory-jev
說明:用戶線索中的倉庫路徑爲 towzai/dsh-memory-jev,安裝命令以 README 中的 <owner>/dsh-memory-jev 爲準,即 Towzai/dsh-memory-jev。
手動安裝¶
- 將倉庫複製到
~/.dsh/profiles/web/node_modules/dsh-memory-jev/。 - 在 profile 的
cordis.patch.yml中註冊(或由市場完成),例如:
- id: dsh-memory-jev
name: dsh-memory-jev
config:
storePath: /absolute/path/to/gate-store.json # 空則 <cwd>/data/gate-store.json
injectEnabled: true
- 在進程級重啓 DSH(僅
set_bundle enabled:false→true會重掛載行,不會清 ESM 模塊緩存)。 - 用
mem_gate_status確認插件已加載。
宿主接口包(@deepseek-ai/cordis、dsh-llm、dsh-tools)在 package 中僅聲明爲 peerDependencies,不應在插件內打包副本,否則會 shadow 宿主並破壞工具調用。
配置要點¶
在 profile 的 cordis.patch.yml(或 bundle 自帶 patch)裏改配置後,同樣需要進程級重啓。
| 鍵 | 默認 | 含義 |
|---|---|---|
storePath |
''(即 <cwd>/data/gate-store.json) |
存儲文件;生產環境建議絕對路徑 |
injectEnabled |
true |
注入門總開關 |
injectInSubagents |
false |
是否在子會話注入(成本隨子會話數上升) |
injectLimit |
3 |
單次注入最多條數 |
injectMinProbability |
0.6 |
注入相關性閾值(比手動 recall 更嚴) |
prefilterLimit |
40 |
送給 Jev 的候選數 |
supersedeCandidates |
12 |
寫入門「可能重複」候選數 |
dailyBudgetCny |
3.5 |
日預算(人民幣) |
dailyCallLimit |
3000 |
日調用上限 |
調參時 README 建議依據證據而非直覺:mem_gate_log 或按日分片的 gate-decisions-*.jsonl 會記錄各候選的 noul 概率與當時閾值,便於復盤某閾值會放行或丟棄哪些條目。
成本方面,Jev 輸入約 $0.042/M、輸出免費;插件以 CNY 記賬。單次判決約 2 000–4 200 input tokens,約合 ¥0.0006–0.0012;預算採用 reserve → settle → reconcile,串行賬本避免併發超支。
典型用法¶
安裝並重啓後,先用門狀態確認存儲路徑、密鑰與預算:
- 在 DSH 中調用工具
mem_gate_status,查看 spend / reserved / remaining、調用次數、熔斷狀態、OPENROUTER_API_KEY是否可用、以及storePath。
日常記憶操作走 mem_* 工具族:
mem_remember:寫入新記憶;寫入門會嘗試 Jev 判決是否值得保留、是否 supersede 某條舊記憶,但無論門是否可用都會持久化。mem_recall:按查詢召回;返回項中同時帶有 Jev 的jev_prob與本地local_score,便於對比「判決分」與「詞法分」。可通過參數min_probability覆蓋默認的recallMinProbability(默認 0.5)。mem_list/mem_view:瀏覽與檢查條目;mem_forget/mem_restore/mem_merge/mem_pin做軟刪、恢復、合併與單次 pin。- 需要審計時調用
mem_gate_log(無正文,僅 id/hash);調閾值前可配合gate-report腳本(package.json 中npm run gate-report)做彙總。
若關閉注入或 Jev 不可用:寫/召回會標記 degraded 或 budget/unavailable;注入門在無判決時不向上下文追加任何塊。
數據邊界與離線行爲¶
插件聲明 cloud: true,出站僅三處,均指向 https://openrouter.ai/api/alpha/decisions(寫入門:新記憶前 600 字 + 候選標題;召回與注入:問題文本 + 候選標題)。存在離線路徑:無 API key 時寫/召回走確定性降級行爲(標記 degraded),注入門不注入。
- 憑據從環境變量
OPENROUTER_API_KEY按需讀取(Windows 可回退註冊表HKCU\Environment);不寫入配置文件、不回顯、不記入日誌。 - 若問題或正文匹配電話 / 身份證 / 銀行卡 /
sk-/Bearer/password/api_key等模式,判決整段跳過(gate=redacted-skip)。 - 審計日誌只記 id、概率、token、CNY、錯誤類型與 build 版本;無正文、無原始查詢(僅 hash 與長度)。
- 本地 store、審計與預算文件與
storePath同目錄;不上傳、不同步。 - 可選
egressGuard(默認false):開啓後,看起來像攜帶密鑰的 question 不會發往端點,召回回退本地排序但仍返回你的記憶條目。
Node 引擎要求 >= 22.0.0(package.json)。
適用場景與注意¶
適合誰:已經在用 DSH、希望記憶讀寫與自動注入都有「類型化判決」而不是純 LLM 自由文本;能接受 OpenRouter Jev 端點的網絡依賴與按次計費;願意用 mem_gate_log 和配置項做閾值與預算治理的開發者。
安裝前務必:
- 插件以當前 DSH 進程權限運行,會讀寫本地 store、可能訪問網絡與
OPENROUTER_API_KEY;安裝前應自行審閱 源碼倉庫 與 MIT 許可證。 - 生產環境爲
storePath配置絕對路徑,並理解寫入 fail-open、注入 fail-closed 的差異——重要內容不要假設「門一定會攔住寫入」。 - 社區目錄頁星標等信息會變動;以 GitHub README 與 release 爲準。
結尾¶
dsh-memory-jev 把 Jev 的「只判決、不生成文本」當作記憶系統的邊界:寫、召、注入三道門分工明確,正文與 framing 留在插件側,並配有預算、審計與軟刪除恢復。若你在 DSH 裏做 agent 記憶,可以從安裝、mem_gate_status 驗活、再按場景調 injectMinProbability 與 dailyBudgetCny 起步。