前言¶
在 DeepSeek Harness(DSH)裏做智能體,最常見的問題是:跨會話之後,上次交代的邊界、偏好、約定就沒了。模型記不住你之前的約定,只能每次重新說一遍。另一種情況是,插件把一摞舊事全塞進上下文,模型開始在不相關的地方亂套用,反而更笨。
還有一點是黑盒:你不知道它爲什麼想起那一條,也沒法糾正。
潮汐記憶(dsh-tide-memory)就是爲解決這些具體問題設計的。它給 DSH 的會話提供一份長期記憶,並且明確:證據夠不夠決定它進不進上下文,鮮活度只決定它排多前。
是什麼¶
這是一個 DSH 插件,由 MingHuanYue 維護,分類屬於「記憶」。它的核心價值是:讓記憶「會淡忘、會過時、看得見」,並且有圖形設置頁。
插件通過一個簡單的記分邏輯來決定哪些記憶進入上下文,哪些留在冷宮。它不依賴任何雲端服務,所有計算都在本地完成。
它解決的三個問題¶
- 忘了該記的 —— 跨會話之後,邊界、偏好、約定全沒了。
- 記得太多反而更笨 —— 把舊事全塞進提示詞,模型在不相關的地方亂套用。
- 記憶是個黑盒 —— 不知道它爲什麼想起那一條,也沒法糾正。
設計取捨¶
潮汐記憶與常見做法的差異體現在三條設計取捨上。
| 取捨 | 潮汐記憶 | 常見做法 | 爲什麼 |
|---|---|---|---|
| 進不進 | 證據分 C = s/(s+2),低於閾值(默認 0.35)根本不進 | 按相似度 top-k 全塞 | top-k 總會給你 k 條,哪怕一條都不相關 |
| 淡忘 | 事件半衰期 30 天,帶情緒 7 天,事實類永不衰減 | 無衰減 / 全部按時間排 | 情緒濃的事該記得更久,畫像和約定不該淡 |
| 過時 | 標 supersededBy,新舊都留,可回看 | 直接覆蓋或刪除 | 「他以前住哪」也是信息,刪了就沒了 |
此外,它不使用 900KB 的用戶詞典。分詞靠二元組 + 單字(二元組權重 1、單字 0.5),idf 用記憶庫自己的 df 現算。這樣換領域也不會水土不服。
安裝與啓用¶
從 GitHub 安裝(推薦):
dsh plugin --profile desktop add github:MingHuanYue/dsh-tide-memory # 桌面端
dsh plugin --profile web add github:MingHuanYue/dsh-tide-memory # 命令行 web 端
從 npm 安裝:
dsh plugin --profile desktop add dsh-tide-memory
本地源碼安裝(調試用):
dsh plugin --profile desktop add file:D:/path/to/dsh-tide-memory
安裝完成後,重啓 DSH,設置頁裏纔會出現「潮汐記憶」。
使用方式¶
給模型工具¶
潮汐記憶提供四個工具接口,模型會根據上下文主動調用。
tide_remember—— 記一條:text / kind(event 或 fact)/ imp 0~1 / emo 0~1 / keystide_recall—— 按線索找:query / limittide_forget—— 標過時(不是刪除)tide_stats—— 庫裏現在多少條、多少還活着
圖形界面¶
在 DSH 的設置頁中找到「潮汐記憶」:
- 記憶庫下拉:每個工作區一個庫,顯示條數和最近一條的時間
- 手動記一條:選「事件/事實」和重要度
- 搜索 + 過濾:還在的/事實/事件/釘住的/已過時/全部
- 每條卡片:類型、鮮活度百分比與色條、被想起次數,按鈕有釘住 / 改 / 標過時 / 刪
- 看它怎麼想起來的:最近幾輪注入的 trace,每條的 C(證據)、P(排序分)、act(鮮活度)
- 設置區:開關、事件半衰期、情緒半衰期、每輪最多幾條、證據閾值、字數上限
記憶存在哪裏¶
數據保存在 $DSH_HOME/tide-memory/ 下:
$DSH_HOME/tide-memory/
├── config.json # 全局設置
├── trace.jsonl # 注入日誌(「怎麼想起來的」)
├── stores/<key>.jsonl # 每個庫一行一條
└── cold/<key>.jsonl # 冷宮:淡到快沒了又沒被想起的(沒刪,能翻回來)
一條記錄的 JSONL 格式示例:
{"id":"ly3k9x","t":1761215000000,"last":1761215000000,"kind":"fact",
"text":"主人不喜歡別人替他做決定,什麼事都要先問一句",
"keys":["決定","邊界"],"imp":1,"emo":0.5,"hits":3,"pinned":false,"supersededBy":null}
這是純 JSONL 文件,可以 grep,也可以寫腳本搬運。
打分邏輯¶
插件使用以下公式計算活躍度、證據分和排序分:
act = kind 是 fact ? 1 : 0.5 ^ (天數 / 半衰期)
C = s / (s + 2) // s = 命中詞的 idf × 詞權重 之和
P = C × (0.55 + 0.25·act + 0.15·imp + 0.05·emo)
- C 低於閾值 → 不進上下文(默認 0.35:一條明確命中就過半,兩條更穩)
- 進的那幾條按 P 排序,最多 6 條 / 800 字
- act 低於 0.05 且從未被想起的事件 → 挪進冷宮
調閾值是這套東西最有效的一個旋鈕:覺得它亂想起來就調高,覺得它太健忘就調低。
排障¶
裝完起不來¶
先看 profile 的 package.json 有沒有被工具寫成帶 BOM 的 UTF-8。
$p = 'D:\nodejs-data\dsh-home\profiles\desktop\package.json'
[System.IO.File]::WriteAllText($p, [System.IO.File]::ReadAllText($p), (New-Object System.Text.UTF8Encoding($false)))
設置頁沒出現「潮汐記憶」¶
重啓 DSH;還沒出現就執行 dsh --profile desktop --dump-config,看 bundle 名單裏有沒有 dsh-tide-memory。
從 GitHub 裝報 exit code 128¶
這通常是 pnpm 把 github: 解析成 SSH 了。執行:
git config --global url."https://github.com/".insteadOf "git+ssh://git@github.com/"
權限與隱私¶
- 只讀寫
$DSH_HOME/tide-memory/下的自己的 JSONL 文件,不碰別的目錄。 - 不聯網:沒有云端、沒有 embedding 服務、沒有 key。分詞和檢索全在本地算,一次幾十毫秒。
- 記憶只有兩個來源:模型主動調
tide_remember,或者你在設置頁手動記一條。 - 每輪注入了哪幾句,會同時寫進
trace.jsonl,設置頁裏能直接看(C / P / act 三個數)。 - 想清空:刪掉
stores/下對應的*.jsonl,或者在設置頁逐條刪。卸載插件不會刪數據,重裝還在。
兼容性¶
- DSH >= 0.1.7-rc.1(見
package.json的engines.dsh) - Node >= 22
- 圖形界面掛在設置頁,桌面端和 web 端都能用(client 走
dsh.client聲明,platform: web) - 記憶庫按工作區分桶:同一個工作目錄下的會話共用一個庫,換項目不串味
- 已知顯示層小瑕疵:設置頁的庫下拉里偶爾會出現一行
ws-xxx__的重複名,是文件名把中文折成了下劃線(同一份數據),不影響讀寫,重啓後按 safeKey 歸併就沒了。
適用場景與注意¶
潮汐記憶適合需要長期記憶且希望對記憶內容有可見、可控能力的 DSH 用戶。它適合需要區分事件、事實,並希望記憶隨時間自然衰減的場景。
使用前請檢查插件源碼與許可證。插件以當前 DSH 進程的權限運行,請確保工作目錄和 $DSH_HOME 的讀寫權限正確。
小結¶
潮汐記憶通過證據閾值控制哪些記憶進入上下文,通過半衰期和標記機制實現淡忘與過時,通過 JSONL 文件和設置頁讓記憶過程可見、可查。它不依賴任何外部服務,所有計算在本地完成,適合需要長期記憶且希望對記憶內容有可見、可控能力的 DSH 用戶。
- 插件目錄:https://www.skillhub.cn/plugins/MingHuanYue/dsh-tide-memory
- GitHub:https://github.com/MingHuanYue/dsh-tide-memory