潮汐記憶:給 DeepSeek Harness 一份會淡忘、會過時、看得見的長期記憶

前言

在 DeepSeek Harness(DSH)裏做智能體,最常見的問題是:跨會話之後,上次交代的邊界、偏好、約定就沒了。模型記不住你之前的約定,只能每次重新說一遍。另一種情況是,插件把一摞舊事全塞進上下文,模型開始在不相關的地方亂套用,反而更笨。

還有一點是黑盒:你不知道它爲什麼想起那一條,也沒法糾正。

潮汐記憶(dsh-tide-memory)就是爲解決這些具體問題設計的。它給 DSH 的會話提供一份長期記憶,並且明確:證據夠不夠決定它進不進上下文,鮮活度只決定它排多前。

是什麼

這是一個 DSH 插件,由 MingHuanYue 維護,分類屬於「記憶」。它的核心價值是:讓記憶「會淡忘、會過時、看得見」,並且有圖形設置頁。

插件通過一個簡單的記分邏輯來決定哪些記憶進入上下文,哪些留在冷宮。它不依賴任何雲端服務,所有計算都在本地完成。

它解決的三個問題

  1. 忘了該記的 —— 跨會話之後,邊界、偏好、約定全沒了。
  2. 記得太多反而更笨 —— 把舊事全塞進提示詞,模型在不相關的地方亂套用。
  3. 記憶是個黑盒 —— 不知道它爲什麼想起那一條,也沒法糾正。

設計取捨

潮汐記憶與常見做法的差異體現在三條設計取捨上。

取捨 潮汐記憶 常見做法 爲什麼
進不進 證據分 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 / keys
  • tide_recall —— 按線索找:query / limit
  • tide_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
羽毛球分组比赛记分
小程序二维码

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

小夜