前言¶
給智能體加長期記憶,常見做法是讓它在會話裏多記一點:每輪結束後把對話存成一段摘要,下次開聊時塞回上下文。這種做法的麻煩不在存儲,而在出問題之後——你看到記憶裏寫着一條判斷,卻不知道它從哪次對話來、和上一版有什麼差別、被哪一次改寫覆蓋了。模型「記錯了」的時候,通常沒有任何地方留下痕跡。
下面介紹的 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,插件爲此換來的是零依賴和不出站。
幾點需要留意:
- 插件以當前 dsh 進程的權限運行,裝之前先讀一遍源碼、確認許可證(MIT)與信任模型是否符合預期。
- 版本兼容性是逐版本聲明的,
0.2.1-rc.4與0.2.2-alpha.2狀態爲 unknown,升級 DSH 前先對照 README 的兼容表。 - npm 包名(
@bangbang-03/dsh-memory)與倉庫名(dsh-memory-portrait)不一致,裝錯或找不到包時先確認用的是哪個名字。 - 數據默認落在
~/.dsh/storages/dsh-memory,導出與鏡像(.dsh-memory/MEMORY.md)是另一條通路,兩者不要混用。 - 該項目是社區維護,與 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/