Skip to content

Latest commit

 

History

History
125 lines (84 loc) · 6.8 KB

File metadata and controls

125 lines (84 loc) · 6.8 KB

對話記憶與背版 — 設計

對齊 Letta 式記憶架構(blocks + archival)。本設計對齊 對話記憶系統—彙整與探討 共識摘要。 本專案預設專為小模型優化:背版與注入量從嚴控制,追求輕量、迅速、不過度消耗 context。

短期記憶是什麼(重要):短期記憶不是「把最近幾句對話原文塞進 context」。那樣會讓整段對話穿過一環又一環的程式、使用者端要等很久,且消耗大量 token。
短期記憶是:你記得對方「說了什麼」——就像和朋友聊了十分鐘,你記不住每一句話,但記得朋友說了什麼。本專案的做法是:每輪結束後用 deconstruct 抽出「關鍵事實/要旨」寫入 session/archival;回覆時只注入這些抽出來的條目(檢索到的幾條),不傳遞原始對話歷史。輕量、迅速,且真的像人類的「記得說了什麼」。

與「MD 對話紀錄 + 硬式檢索」的取捨:若依賴紀錄整份 MD 對話並對其做直接(硬式)檢索,對 AI 來說可行,但使用者端就是會等了又等——整段紀錄穿過管線、檢索與注入都重。本專案刻意以 MD 對話紀錄為回覆時的記憶來源,改為「抽出的要旨 → JSONL 條目 → 關鍵字檢索只注入少數幾條」;使用者端體感輕量、少等。若之後接回 OpenClaw,可讓 Chatmery 當記憶後端(提供要旨與檢索結果),由 OpenClaw 決定是否另存 MD 供其他用途。


目標

  • 每次對話,都為該對話主體(subject)累積記憶點(事實、偏好、發生過的事、對使用者的印象)。
  • 背版 = 該主體的動態「背景」:身份 + 人設摘要 + 與使用者的關係;隨對話越長越豐富。
  • 整合到回覆流程:組 prompt 時把「當前背版 + 精選記憶」當 context,使回覆一致、有延續性,越聊越立體。

一、概念對照(Letta → 本設計)

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。


五、長期記憶(archival)

  • 儲存:每條記憶 = 內容(文字)+ 可選 tag(如 factpreferenceeventuser_xxx)+ 時間戳;依 subject_id 分區。
  • 寫入:對話回合結束後,由規則或 LLM 從本輪對話抽出 1~3 條「值得長期記的」寫入該主體的 archival。
  • 檢索:回覆前用使用者輸入或最近一句做 query,語意搜尋該主體的 archival,取 top-k(如 3~5 條)併入背版或 prompt。

六、與實作的接點

項目 接法
組 prompt 傳入參數:backstory stringmemorySnippets []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