dsh-persona:多角色兩檔長期記憶與每輪復盤

前言

在 DeepSeek Harness(DSH)裏做多項目、多場景對話時,常遇到兩類問題:全局記憶混在一起,換目錄或換「人設」後上下文對不上;若在會話中途不斷改系統提示裏的記憶,還會打穿供應商的前綴緩存,成本上升。社區插件目錄裏歸類爲「記憶」的 dsh-persona 走另一條路——按角色槽位隔離存儲,會話開始時把記憶凍結進提示詞,並在回合結束後用獨立復盤寫入。下面介紹它是什麼、怎麼裝、日常怎麼用,以及使用時要注意的點。

這是什麼

dsh-persona 由維護者 TBAOT 發佈,是面向 DSH 的「角色記憶」插件:每個角色有兩檔長期記憶(用戶畫像 user + 角色筆記 memory),在會話開始時一次性注入提示詞;支持 add / patch / remove 維護條目,並有硬字符上限,寫滿會拒絕並要求合併。多個角色通過槽位與工作區綁定各自獨立,未綁定工作區可回退到默認桶或經面板認領。

許可爲 MIT;package.json 中版本爲 0.4.4,引擎要求 dsh 爲 >=0.2.1-rc.2 <0.3.0、node 爲 >=20.18。

核心功能

兩檔記憶與凍結注入

數據落在 <DSH_HOME>/personas/<角色>/memory/(DSH_HOME 默認爲 ~/.dsh):

  • user.md:用戶畫像(默認上限 1375 字符)
  • memory.md:角色筆記(默認上限 2200 字符)
  • topics/:預留,供按需讀取的細節

條目爲普通 Markdown,條目之間用單獨一行 § 分隔。記憶在會話開始時讀一次,整個會話內不再變更,以便系統提示前綴穩定、利於前綴緩存命中;本會話復盤寫入的內容,下一個會話纔會出現在注入裏。工具返回仍顯示實時用量。

槽位、面板與工作區綁定

包裝聲明 4 個槽位(slot-1…slot-4)。裝好並在 profile 的 dsh.profile.bundles 中啓用後,左欄底部出現「角色」面板:

  • 左側:角色列表(名字、槽位 id、綁定工作區數量)
  • 記憶:兩檔編輯器與用量
  • 復盤記錄:最近 30 條
  • 工作區:從應用已有工作區選擇綁定,或手動填寫必須真實存在的子目錄路徑

工作區 → 角色 映射寫在 <DSH_HOME>/personas/index.json。會話歸屬由工作目錄決定,無需在新建會話時選預設;改名不丟記憶(目錄跟槽位走)。

每輪復盤(自動寫)

回合關閉後異步跑一次模型,讀對話摘要與當前記憶,返回結構化改動寫入同一存儲:不阻塞當輪迴復,不改當輪已凍結的快照。每次操作記在 <角色>/review/log.jsonl;單條超限只拒那條;JSON 解析失敗記 parse-failed,不重試。模型來源順序:插件配置的 provider + model → 平臺默認 → 皆無則跳過並警告。

復盤相關配置示例(摘自 README):

- id: persona-review
  name: dsh-persona/review
  config:
    personaId: default
    enabled: true
    everyTurns: 1
    maxTokens: 1200
    dryRun: false
    provider: wb-proxy
    model: deepseek-v4.1-flash

memory 工具

模型通過 memory 工具維護記憶,須指定 target 爲 user 或 memory:

操作 行爲
add 追加;與已有條目完全重複會被拒絕
patch 用 old_text 定位唯一片段並替換
remove 用 old_text 定位並刪除整條

一次調用可帶多條 operations,按順序執行,最終結果須在上限內,否則整批拒絕。寫入前會檢查不可見 Unicode 與疑似密鑰/私鑰。

未綁定工作區與「未認領池」

會話 cwd 不屬於任何角色工作區時,回退到配置中的 personaId(默認 default),記憶與復盤落在 personas/default/;該桶不在名冊裏,未綁定項目共用一份。面板顯示爲「未認領池」,可一鍵 adopt 到當前角色(POST /dsh-persona/api/adopt)。要避免混用,請在工作區面板完成綁定或認領。

角色私有技能

可將技能放在 <DSH_HOME>/personas/<角色>/skills/(目錄式 SKILL.md 或平鋪式 .md)。會話開始時僅把本角色目錄下的技能索引注入該會話提示詞;共享技能仍放 ~/.dsh/skills 或 ~/.agents/skills。

從 dsh-soul-md 遷移

若曾使用 dsh-soul-md,可用倉庫腳本遷移(源數據不動,可重複運行):

node scripts/migrate-soul-md.mjs --persona slot-1 \
  --patch ~/.dsh/profiles/<profile>/cordis.patch.yml

安裝與啓用

README 註明:npm 上的 dsh-persona 爲他人佔用名(0.0.1,描述爲 name reserved),本倉庫未發佈到 npm,請從 git 安裝。

1、安裝插件(將 <profile> 換成你的 profile 名):

dsh plugin --profile <profile> add github:TBAOT/dsh-persona

本地開發時 README 還支持 dsh plugin --profile <profile> add link:<本地路徑>。

2、在對應 profile 的 dsh.profile.bundles 列表中加入 dsh-persona。

3、重啓 Harness。

卸載時從 bundles 移除並卸載包即可;<DSH_HOME>/personas/ 下數據不會自動刪除,需自行備份或清理。

主配置塊示例:

- id: persona-memory
  name: dsh-persona
  config:
    personaId: default
    userLimit: 1375
    memoryLimit: 2200
    inject: true
    userTitle: 用戶畫像 / USER PROFILE
    memoryTitle: 長期記憶 / MEMORY

一個 personaId 對應一份記憶;多角色獨立時,可爲每個角色在預設裏掛一行 dsh-persona 並設置不同的 personaId。

典型用法

1、安裝並加入 bundles 後,打開左欄「角色」,在空槽新建角色並命名。

2、在「工作區」裏把常用項目目錄綁定到該角色;之後該目錄及子目錄下的會話自動歸屬此角色,會話開始時會注入該角色的凍結記憶。

3、對話中模型可用 memory 工具更新畫像或筆記;同時可開啓 persona-review,讓每輪結束自動復盤寫入。觀察階段可設 dryRun: true,只記錄不落盤。

4、若有未綁定目錄的歷史會話,在面板「未認領池」查看並 adopt 到目標角色,或提前綁定工作區以免寫入 default 桶。

5、角色專屬工作流可把 SKILL.md 放進該角色 skills/ 目錄,無需改全局技能路徑。

適用場景與注意

適合:同一 DSH 上並行多個「角色」或項目線,需要隔離長期記憶、又希望控制提示詞前綴穩定;願意接受「當會話內新記憶下一會話才進注入」的折中。

隱私與權限:記憶爲本地明文文件,插件本身不聯網;注入內容與復盤調用會隨你配置的模型供應商出站。安裝前宜瀏覽 GitHub 倉庫 源碼與 MIT 許可證;插件以當前 DSH 進程權限運行,與任意社區插件一樣,信任邊界由你自行評估。

生態說明:DSH 奉行「一切皆插件」;SkillHub 目錄頁 爲社區站點,與 DeepSeek / 幻方無官方從屬關係。

結尾

dsh-persona 把「多角色 + 兩檔記憶 + 凍結注入 + 每輪復盤」收進一套本地文件與工作區映射裏,並附面板與 adopt 流程處理未綁定目錄。需要細節時,以目錄頁 dsh-persona 與倉庫 TBAOT/dsh-persona README 爲準。

羽毛球分组比赛记分
小程序二维码

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

小夜