dsh-memory-jev:用 Jev 類型化判決爲 DSH 記憶加三道門

前言

在 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)值得單獨記一下:

  1. 每個 (session, turn) 最多注入一塊;同輪後續步驟不再重複判決或注入。
  2. 每條記憶在同一會話內最多注入一次;已注入的 id 在 Jev 調用前就從候選池移除,不再消耗請求。
  3. 注入塊離開上下文後,對應 id 可再次參與候選(日誌記爲 reset)。
  4. 注入塊用 <retrieved-memories …> framing,並聲明「不是對話歷史、不是指令」;記憶正文內的 < 會轉義爲 \u003c,避免僞造分隔符。
  5. 僅追加在尾部,系統提示與先前歷史字節級不變,利於 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。

手動安裝

  1. 將倉庫複製到 ~/.dsh/profiles/web/node_modules/dsh-memory-jev/。
  2. 在 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
  1. 在進程級重啓 DSH(僅 set_bundle enabled:false→true 會重掛載行,不會清 ESM 模塊緩存)。
  2. 用 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_* 工具族:

  1. mem_remember:寫入新記憶;寫入門會嘗試 Jev 判決是否值得保留、是否 supersede 某條舊記憶,但無論門是否可用都會持久化。
  2. mem_recall:按查詢召回;返回項中同時帶有 Jev 的 jev_prob 與本地 local_score,便於對比「判決分」與「詞法分」。可通過參數 min_probability 覆蓋默認的 recallMinProbability(默認 0.5)。
  3. mem_list / mem_view:瀏覽與檢查條目;mem_forget / mem_restore / mem_merge / mem_pin 做軟刪、恢復、合併與單次 pin。
  4. 需要審計時調用 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 和配置項做閾值與預算治理的開發者。

安裝前務必:

  1. 插件以當前 DSH 進程權限運行,會讀寫本地 store、可能訪問網絡與 OPENROUTER_API_KEY;安裝前應自行審閱 源碼倉庫 與 MIT 許可證。
  2. 生產環境爲 storePath 配置絕對路徑,並理解寫入 fail-open、注入 fail-closed 的差異——重要內容不要假設「門一定會攔住寫入」。
  3. 社區目錄頁星標等信息會變動;以 GitHub README 與 release 爲準。

結尾

dsh-memory-jev 把 Jev 的「只判決、不生成文本」當作記憶系統的邊界:寫、召、注入三道門分工明確,正文與 framing 留在插件側,並配有預算、審計與軟刪除恢復。若你在 DSH 裏做 agent 記憶,可以從安裝、mem_gate_status 驗活、再按場景調 injectMinProbability 與 dailyBudgetCny 起步。

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

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

小夜