dsh-journal:給 DSH 智能體加一套分級長期記憶

前言

DSH 的智能體默認只會活在一次會話裏。會話結束之後,那些關於用戶偏好、項目約定、上次進展的信息就全丟了,下一次又要重新問一遍。常見的解法是自己掛一個向量庫做檢索,或者把日誌塞進一個 JSON 文件,但前者運維重,後者記到最後往往變成一鍋粥——什麼都想留,最後什麼也找不到。

dsh-journal 走的是第三條路:不追求相似度檢索,而是給每條記憶打上分級,讓重要的留得久、不重要的按時淡出。下面介紹這個插件。

這是什麼

dsh-journal 是 Ghill-0131 維護的一個 DeepSeek Harness 插件,屬「記憶」分類,目前星標爲 0。它把一個純文本的 JSONL 文件包裝成宿主裏一等公民的 journal 工具,核心能力是分級長期記憶:每條記錄帶一個級別、一個過期時間和一個複覈日期,讓長期運行的智能體把對的東西留對的時間,其餘的自動交給時間處理。

一句話定位:它是一個小的、可人工審閱的、手工整理的日誌,更接近記事本而不是數據庫。

分級模型

插件的邏輯是:寫的時候要問的不是「這條重要嗎」,而是「這條屬於骨架還是文件」。等級直接決定生命週期:

級別 含義 生命週期
S 關係、情緒、共同經歷、承諾 永不自動刪除,釘住
A 持久事實、偏好、關鍵決策 365 天
B 項目上下文、任務進展 60 天
C 臨時細節、一次性操作 7 天

規則很簡單,但很實用:怎麼跟人說話歸 S,昨天排查的端口號歸 B,留給下個會話的交接說明歸 A,因爲它只需要活到被讀一次。

過期不會物理刪除。prune 是軟刪除,把過期行移進 archive/;被釘住的行豁免。

核心功能

插件暴露一個工具、八種動作:

動作 作用
add 寫入一條記錄(level、title、text 必填)
list 列出記錄,可按級別 / 狀態過濾
search 在標題、正文、標籤裏做子串搜索
digest 輸出 S + A 摘要,新會話最先該讀的內容
stats 各級別計數、文件大小、已過期但未清理的數量
review 把某條記錄的過期時間往後推
prune 軟刪除所有超期記錄
render 重寫 JOURNAL.md,生成可讀摘要

存儲只有一個文件:<root>/journal.jsonl,一行一個 JSON 對象。寫入走臨時文件再 rename,中途崩潰不會撕裂存儲;讀取時如果最後一行爲殘行則跳過,而不是讓調用失敗。記錄結構如下:

{
  "id": "j-20261104-140902-479d",
  "ts": "2026-11-04T14:09:02+00:00",
  "level": "B",
  "kind": "fact",
  "title": "short one-line title",
  "text": "the body; facts, not reflections",
  "tags": ["..."],
  "pinned": false,
  "status": "active",
  "expires_at": "2027-01-03T14:09:02+00:00",
  "reviewed_at": null,
  "source": ""
}

格式刻意保持樸素:任何能讀 JSONL 的腳本都能讀它,任何能寫一行的腳本都能往裏加。

安裝與啓用

這個插件的安裝方式和一般的 npm 依賴不同,需要特別注意。DSH 插件只有在以 link 形式安裝時才能拿到宿主包(@deepseek-ai/*);普通的 npm 依賴會導入失敗並被靜默跳過。README 給出的安裝步驟如下。

1、先把代碼放到一個穩定的位置,不要放在 profile 目錄裏,例如 D:\DSH-Plugins\dsh-journal\0.1.0\。

2、用真正的 junction 建立鏈接。跨盤 symlink 可能被建成壞鏈且不會報錯,所以這裏要用 junction:

New-Item -ItemType Junction `
  -Path   "$env:USERPROFILE\.dsh\profiles\desktop\node_modules\dsh-journal" `
  -Target "D:\DSH-Plugins\dsh-journal\0.1.0"

3、profile 的 package.json 裏兩個列表都要加上它:

// dependencies
"dsh-journal": "link:D:/DSH-Plugins/dsh-journal/0.1.0"

// dsh.profile.bundles
"dsh-journal"

此處要讓 Node 來改文件,不要做純文本替換:多一個逗號就會讓 profile 無法解析,harness 直接起不來。

4、重啓 harness。

配置寫在 bundle 層的 cordis.patch.yml 裏:

# key / 默認值 / 含義
# root:  D:/dsh-data/journal (Windows) 或 /dsh-data/journal
#        —— journal.jsonl 所在目錄
# toolName: journal
#        —— 該工具在模型工具集裏的名字

另外 JOURNAL_ROOT 環境變量可以覆蓋 root。

典型用法

下面是在 agent 循環裏的典型調用,直接來自 README:

journal action=digest                          # 每次新會話開始時跑一次
journal action=add level=S title="..." text="..."
journal action=search query=備考
journal action=prune dryRun=true               # 先看哪些會過期,不做任何改動

日常的節奏是:會話開始讀 digest 拿到該知道的部分;過程中把不斷產生的信息按級別寫進去;結束前跑一次 prune dryRun=true 確認沒有要提前 review 的內容,需要延長就 review,不需要就讓過期項自然歸檔。

適用場景與注意事項

適合那些需要跨會話延續上下文、但不想引入向量庫和檢索鏈路的 DSH 開發者。它的賭注是:一個寫下幾百條關鍵行、並按時遺忘其餘內容的智能體,勝過一個什麼都要存、再靠搜索找回來智能體。

要注意幾點:

  • 這是一個插件,以當前 dsh 進程的權限運行,安裝前應先檢查源碼與許可證(MIT)。
  • 它不是向量庫,不做相似度檢索,無法替代語義召回。
  • journal 工具會出現在模型的工具集裏,級別劃分是否合理、過期時間是否合適,需要結合實際任務調。
  • 依賴 Node >= 22.13。

結尾

dsh-journal 的價值不在於存儲量,而在於它給了智能體一套「該記什麼、記多久」的明確規則,並且整個存儲是純 JSONL,可以人工讀、可以腳本讀寫。如果你在用 DSH 做長期運行的助手,值得把它作爲第一個記憶層試一下。

  • 目錄頁:https://www.skillhub.cn/plugins/Ghill-0131/dsh-journal
  • GitHub:https://github.com/Ghill-0131/dsh-journal
羽毛球分组比赛记分
小程序二维码

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

小夜