對齊 Letta 式記憶架構(blocks + archival)。本設計對齊 對話記憶系統—彙整與探討 共識摘要。 本專案預設專為小模型優化:背版與注入量從嚴控制,追求輕量、迅速、不過度消耗 context。
短期記憶是什麼(重要):短期記憶不是「把最近幾句對話原文塞進 context」。那樣會讓整段對話穿過一環又一環的程式、使用者端要等很久,且消耗大量 token。
短期記憶是:你記得對方「說了什麼」——就像和朋友聊了十分鐘,你記不住每一句話,但記得朋友說了什麼。本專案的做法是:每輪結束後用 deconstruct 抽出「關鍵事實/要旨」寫入 session/archival;回覆時只注入這些抽出來的條目(檢索到的幾條),不傳遞原始對話歷史。輕量、迅速,且真的像人類的「記得說了什麼」。
與「MD 對話紀錄 + 硬式檢索」的取捨:若依賴紀錄整份 MD 對話並對其做直接(硬式)檢索,對 AI 來說可行,但使用者端就是會等了又等——整段紀錄穿過管線、檢索與注入都重。本專案刻意不以 MD 對話紀錄為回覆時的記憶來源,改為「抽出的要旨 → JSONL 條目 → 關鍵字檢索只注入少數幾條」;使用者端體感輕量、少等。若之後接回 OpenClaw,可讓 Chatmery 當記憶後端(提供要旨與檢索結果),由 OpenClaw 決定是否另存 MD 供其他用途。
- 每次對話,都為該對話主體(subject)累積記憶點(事實、偏好、發生過的事、對使用者的印象)。
- 背版 = 該主體的動態「背景」:身份 + 人設摘要 + 與使用者的關係;隨對話越長越豐富。
- 整合到回覆流程:組 prompt 時把「當前背版 + 精選記憶」當 context,使回覆一致、有延續性,越聊越立體。
| Letta 概念 | 本設計對應 |
|---|---|
| Subject | 一個對話主體 = 一個 subject(subject_id,如單一 agent 或 per-user)。 |
| Memory blocks | 該主體的背版:identity、summary、relationship 等命名區塊;可隨對話更新。 |
| Archival memory | 該主體的長期記憶:具體事件、說過的話、使用者偏好;語意檢索後塞進 prompt。 |
| 每次對話 | 1) 用背版 + 精選記憶當 context 回覆;2) 回合結束後寫入本輪精華 → 背版隨之變豐富。 |
使用者發起對話
↓
讀取該主體的背版(blocks:身份 + 人設摘要 + 與使用者的關係摘要)
↓
(可選)archival 語意搜尋:用「使用者本句或話題」拉出幾條相關記憶
↓
組 prompt:背版 + 精選記憶(抽出的要旨,非原文輪次)+ 使用者本句
↓
回覆(本地或遠端模型)
↓
本輪結束後:將「值得長期記的」寫入該主體的 archival(或更新某 block)
→ 下次對話時,背版/檢索結果更豐富 → 越聊越立體
為何需要:與同一主體對話次數變多時,若只靠固定模板或無記憶回覆,會重複、像複讀機;對話模型需要「這個主體是誰、和使用者發生過什麼」才能給出延續、提過的事等延伸內容。
如何延伸:
| 機制 | 作用 |
|---|---|
| 背版+檢索注入 | 每次回覆前讀該主體背版+語意檢索 archival 取 top-k → 送進模型;模型看到個人史與前情,回覆自然延伸。 |
| 對話結束寫入 | 本輪精華寫入該主體的 archival(consolidation、節流);下次對話檢索得到,形成「越聊越有料」。 |
| 模板/fallback | 僅作 fallback(模型未開、失敗、超時時使用);延伸靠背版+archival。 |
結論:延伸機制 = 背版+archival+檢索+寫回。
| 區塊名 | 內容 | 來源/更新 |
|---|---|---|
| identity | 角色、場所、基本人設(1~3 句) | 可先固定或從設定讀取。 |
| summary | 該主體的當前摘要(最近關係、重要事件、個性要點) | 由系統或 LLM 定期整理;或每 N 次對話後更新。 |
| relationship | 與當前使用者有關的記憶(喜好、做過的事、承諾) | 每次與該使用者對話後可追加或更新。 |
背版總長度需控制(例如每塊數十字~百字),以便塞進小模型 context;archival 則不限條數,用檢索取 top-k。
- 儲存:每條記憶 = 內容(文字)+ 可選 tag(如
fact、preference、event、user_xxx)+ 時間戳;依subject_id分區。 - 寫入:對話回合結束後,由規則或 LLM 從本輪對話抽出 1~3 條「值得長期記的」寫入該主體的 archival。
- 檢索:回覆前用使用者輸入或最近一句做 query,語意搜尋該主體的 archival,取 top-k(如 3~5 條)併入背版或 prompt。
| 項目 | 接法 |
|---|---|
| 組 prompt | 傳入參數:backstory string、memorySnippets []string;組 system 時帶入。 |
| 口吻/例句 | 若有對話池或口吻範例,背版/記憶負責「是誰、發生過什麼」;口吻負責語氣;兩者一併組 prompt。 |
實作時可新增:記憶寫入/檢索 API(依 subject_id)、背版讀取/更新 API,在對話處理流程內掛接「讀背版 + 讀記憶 → 回覆 → 寫入記憶點」。
| 階段 | 內容 | 背版效果 |
|---|---|---|
| 1 | 固定背版(identity)只讀,每次回覆時帶入 context。 | 回覆有人設,背版尚不隨對話成長。 |
| 2 | 增加 archival:每次對話後將本輪精華寫入;回覆前語意搜尋拉 3~5 條當 context。 | 背版隨對話累積記憶點,越聊越立體。 |
| 3 | 增加可更新 block(summary/relationship):每 N 次對話或定時,由 LLM 或規則整理 archival 寫回 blocks。 | 背版成為「會長大」的摘要,token 可控、脈絡更清晰。 |
| 依賴 | 說明 |
|---|---|
| Embedding + 向量庫 | 語意檢索 archival;可本地(e.g. bge-m3)或雲端。 |
實作時可新增:記憶寫入/檢索 API(依 subject_id)、背版讀取/更新 API。
對話記憶與背版設計 v1