Memory Portrait(dsh-memory-portrait):有證據、有版本、能解釋變化的記憶

前言

給智能體加長期記憶,常見做法是讓它在會話裏多記一點:每輪結束後把對話存成一段摘要,下次開聊時塞回上下文。這種做法的麻煩不在存儲,而在出問題之後——你看到記憶裏寫着一條判斷,卻不知道它從哪次對話來、和上一版有什麼差別、被哪一次改寫覆蓋了。模型「記錯了」的時候,通常沒有任何地方留下痕跡。

下面介紹的 bangbang-03/dsh-memory-portrait 就是針對這一層的插件。它不追求記住更多,而是把記憶做成一份可查看的畫像:每段判斷掛證據、版本之間可以 diff、源失效了沿派生鏈標髒。用作者自己的話說,「不是記住更多,而是讓你看見它怎麼理解你」。

這是什麼

Memory Portrait 是 DSH(DeepSeek Harness)的社區插件,維護者是 BangBang-03,npm 包名爲 @bangbang-03/dsh-memory,倉庫已改名爲 dsh-memory-portrait(安裝命令不變)。它解決的問題是:工作區級長期記憶的可解釋性與可控性——記憶從哪來、被誰改過、能不能撤回。

當前版本 0.6.7,許可證 MIT,零運行時依賴(dependencies 爲空,只用 fs 與迴環 HTTP)。官方描述裏明確列出的能力包括:索引簡報省 token、輪末本地召回、紅線 / 審批隊列 / 版本鏈 / 注入審計,且不 shell、不讀環境變量、不啓子進程、不出站、不加載動態代碼。

它屬於 DSH 生態的第三方插件。社區目錄是獨立站點,與 DeepSeek / 幻方沒有官方從屬關係。

記憶在什麼時機進出上下文

插件把記憶的通路拆成了幾條,觸發時機各不相同:

通路 觸發時機 做什麼
簡報 會話開始 briefMode: index 時一行一條索引;正文按需用 memory 工具取
memory 工具 任何時候 save / search / sessions / promote / list / get / update / forget / stats
輪末召回 turn/end 對當輪用戶消息做本地檢索,命中項在下一輪尾部注入;純本地,0 token
路徑召回 工具觸達 files 相關記憶在下一步尾部注入;優先級爲全路徑 > 目錄後綴 > 同名
自動提煉 輪次結束(可選) 把對話提煉成結構化記憶;captureMode: draft 時先進審批隊列
Dream / 畫像 啓動 + 輪末到期檢查 合併重複簇、報告矛盾、報告過期;畫像按小時自動刷新

簡報的排序不讀 useCount 與當前時間,日期戳只用 createdAt,並且會話級凍結。這樣做的目的很具體:同一會話的系統提示不會逐輪變化,prompt 前綴緩存不會因爲記憶更新而整段作廢。

畫像與賬本

「畫像」是主視圖,不是一句總結。配套機制保證它不會退化成模型隨手寫的小抄:

機制 作用
紅線 絕對禁令逐字置頂;模型不能刪除或歸檔;改稿留 20 版歷史,可回滾;保存前查衝突
審批隊列 captureMode: draft 時草稿對簡報 / 檢索 / 鏡像 / 導出都不可見,批准後才生效
版本鏈 supersedes 舊條歸檔不刪除,新舊互指;支持一鍵回滾
注入審計 每次進 prompt 的正文 hash + 記憶 id + 被預算擠掉的條目,append-only
派生鏈 記憶 → 畫像 → AGENTS.md 每層記錄源快照,源失效沿鏈標髒
整庫快照 每天首次寫入與每次 Dream 前各備份一次,輪轉 7 份
寫入安全 密鑰掃描脫敏(命中替換爲 [REDACTED:*]);非 user 來源命中注入模式時隔離成草稿

幾個刻意的取捨也寫在 README 裏:檢索用本地 BM25F + 精確短語 + 同義詞 + 路徑召回,不引入向量服務;索引簡報省 token,代價是模型要多一步 get;沒有常駐定時器;Dream 只報告矛盾、不自動歸檔,避免詞法誤報。

安裝與啓用

官方給出的安裝命令有兩種。web profile 用一條命令即可,/latest/ 永遠取最新穩定版,不需要 clone,也不需要 npm:

dsh plugin --profile web add "https://github.com/BangBang-03/dsh-memory-portrait/releases/latest/download/dsh-memory-latest.tgz"

npm 方式等價(npm 源與 Releases 同源;如果 npm view @bangbang-03/dsh-memory version 低於 Releases,用上面那條):

dsh plugin --profile web add @bangbang-03/dsh-memory

桌面端不能用 dsh plugin --profile desktop(desktop profile 由 Electron 獨佔),需要下載倉庫裏的 install.ps1,在任意目錄執行:

pwsh -File install.ps1 -FromRelease -Channel stable

腳本會下載最新穩定版 tarball、解包到 ~/.dsh/plugins/dsh-memory,再完成墊片 / profile 清單 / junction 三步。更新就是重跑同一條命令;回滾執行 pwsh -File uninstall.ps1(記憶數據保留,-PurgeStorage 纔會刪 ~/.dsh/storages/dsh-memory)。

裝好後打開設置 → 記憶。宿主路由是 /memory/api,只監聽迴環地址;客戶端用 new URL("memory/api/…", document.baseURI) 解析,反代前綴或 dsh-app:// 外殼下也能到達。

兼容性

README 明確聲明瞭逐版本兼容性,未測試版本不冒充 compatible:

DSH 版本 狀態
0.2.0-rc.2 compatible
0.2.1-rc.3 compatible(當前桌面版)
0.2.1-rc.4 unknown(未測試)
0.2.2-alpha.2 unknown(未測試)

Node 要求 ^22.19.0 || >=24.0.0;DSH 範圍 >=0.2.0-rc.2 <0.2.1-rc.4。DSH STORE 會按 dsh.compatibility.dshReleases 的逐版本聲明判斷安裝資格。

配置與典型用法

面板裏能改的項都落在 ~/.dsh/storages/dsh-memory/settings.json,cordis.patch.yml 裏的 config 只是初值。常用開關如下(完整清單見 README 配置表):

鍵 默認 說明
enabled true 總開關
autoInject true 注入總閘:關掉後簡報 / 輪末召回 / 路徑召回都不進上下文,memory 工具照常讀寫
directory "" 數據庫位置,空 = ~/.dsh/storages/dsh-memory
disabledWorkspaces [] 停用自動記憶的工作區(絕對路徑),不注入、不自動提煉;事故排查時用它把一次性工作區摘出去
briefMode "index" index 一行一條;full 標題+正文摘錄;portrait 全局畫像全量 + 索引清單
briefingLimit 12 注入條數上限(1–50)
turnRecallLimit 3 每輪召回條數(1–10)
rewriteMode "direct" direct 直接落庫;draft 先存待審稿,面板批准後才生效
captureMode "direct" 同上,控制自動提煉的入口
autoCapture false 輪次結束自動提煉
autoDreamDays 7 啓動整理間隔;0 關閉
autoPortraitHours 6 自動刷新全局畫像的間隔;0 關閉
dedupe true 保存時合併相似記憶
qualityGate true 低分條目(<30)直接歸檔,不進簡報
redactSecrets true 寫入時密鑰掃描與脫敏
quarantineTainted true 非 user 來源命中注入模式時自動隔離成草稿
pathRecall true 路徑 JIT 開關
sessionSearch true 每輪用戶發言原文落 sessions.jsonl,action=sessions 溯源
compactionSalvage true 宿主壓縮上下文時,把摘要照錄進當天工作日誌
captureSubagents false 子代理會話是否參與自動提煉;默認否,避免把派活的中間過程寫成記憶
falsifierReviewDays 90 帶失效條件的記憶默認多少天后進複審隊列(1–3650)

HTTP 契約:/memory/api 前綴,成功 {ok:true,…},失敗 {ok:false,error,detail?};請求體超 4MB 回 413 payload_too_large;顯式傳入的 workspace 必須是已註冊工作區,否則回 400 invalid_workspace。

「只用工具」的用法是把 autoInject 關掉:上下文裏完全不出現記憶,memory 工具仍然可以手動讀寫。排查事故時,用 disabledWorkspaces 把出問題的一次性工作區摘出去,也是同一思路。

如果你之前用的是 WorkBuddy / Qoder / Claude Code / Codex / Windsurf,可以在設置 → 記憶 → 從本機既有記憶導入裏做只讀掃描,按來源打標籤;也可以直接粘貼 /export 的 JSON 或 Markdown。導入有新增時會後臺觸發一次畫像重寫(feedPortrait: false 可關)。

適用場景與注意

適合這幾類人:已經在用 DSH 的工作區需要長期記憶、希望知道記憶從哪來的人;把記憶當作會變化的工程產物而不是黑盒的人;對「自動多記一點」不放心,想保留否決權的人。不適合想要語義檢索的人——本地 BM25F 的語義泛化弱於 embedding,插件爲此換來的是零依賴和不出站。

幾點需要留意:

  1. 插件以當前 dsh 進程的權限運行,裝之前先讀一遍源碼、確認許可證(MIT)與信任模型是否符合預期。
  2. 版本兼容性是逐版本聲明的,0.2.1-rc.4 與 0.2.2-alpha.2 狀態爲 unknown,升級 DSH 前先對照 README 的兼容表。
  3. npm 包名(@bangbang-03/dsh-memory)與倉庫名(dsh-memory-portrait)不一致,裝錯或找不到包時先確認用的是哪個名字。
  4. 數據默認落在 ~/.dsh/storages/dsh-memory,導出與鏡像(.dsh-memory/MEMORY.md)是另一條通路,兩者不要混用。
  5. 該項目是社區維護,與 DeepSeek / 幻方無官方關係,安裝資格判斷由 DSH STORE 按聲明執行。

結尾

Memory Portrait 的價值不在於記得更多,而在於每一條被記住的東西都有來源、有版本、能解釋、能撤回。如果你的痛點是「記錯了找不到人」,可以從設置面板裏的審批隊列和注入審計看起。

  • 目錄頁:https://www.skillhub.cn/plugins/BangBang-03/dsh-memory-portrait
  • GitHub:https://github.com/BangBang-03/dsh-memory-portrait
  • 項目主頁:https://bangbang-03.github.io/dsh-memory-portrait/
羽毛球分组比赛记分
小程序二维码

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

小夜