記憶圖
記憶圖(Memory Graph)是 Luker 最核心的獨有功能之一,專門解決角色扮演中最常見的痛點——角色失憶。
LLM 的上下文視窗是有限的,當對話超過幾百輪後,早期的重要資訊(角色關係、關鍵事件、世界設定)會被截斷丟失,導致角色「忘記」之前發生過的事情。記憶圖透過將對話中的關鍵資訊自動提取為結構化的知識節點,並在需要時智慧召回注入到提示詞中,讓角色能夠跨越數百輪對話持續記住重要的人物關係、事件經過和世界設定。
與簡單的關鍵詞搜尋或向量檢索不同,記憶圖透過圖結構和多層演算法,確保召回的記憶既語義相關又覆蓋全面,避免只想起「最像」的內容而遺漏其他重要資訊。
運作原理
記憶圖的工作流程可以概括為三個階段:自動提取 → 智慧召回 → 層級壓縮。
自動提取
每當 AI 生成回覆後,記憶圖會自動分析最新的對話內容,從中提取值得記憶的資訊。提取過程由 LLM 完成,輸出結構化的知識節點。
提取的資訊分為兩大層級和四種預設類型:
語義層節點(持久化的結構化知識,會被合併更新):
| 類型 | 說明 | 範例 |
|---|---|---|
| 角色狀態 | 角色的名字、身分、目標、關係、當前狀態 | 「艾琳是一名治癒師,目前受傷」 |
| 地點狀態 | 地點的名稱、控制者、危險程度、資源 | 「黑暗森林由精靈族控制,危險等級高」 |
| 規則約束 | 世界觀中的規則和限制 | 「魔法在聖域中無法使用」 |
事件層節點(劇情記錄,每次提取都建立新節點,不會合併):
| 類型 | 說明 | 範例 |
|---|---|---|
| 事件摘要 | 劇情中發生的重要事件 | 「主角在森林中遭遇了伏擊」 |
事件節點的特殊性
事件節點與其他類型有本質區別:
- 每次提取都建立新節點:標題自動遞增,不會像角色狀態那樣合併到已有節點,因為事件是時間線上的獨立記錄
- 始終注入最高層時間線:事件節點被視為核心故事線上下文,最高層級的時間線摘要會始終注入到提示詞中,確保 AI 對整體劇情走向有感知
- 壓縮後的底層事件被隱藏:當事件累積過多時,舊事件會被壓縮為更高層級的摘要。被壓縮的底層事件節點不再常駐注入,但仍然保留在圖中,可以透過召回機制在需要時被重新發現
簡單來說:AI 始終能看到「大事記」(最高層摘要),但具體的細節事件只有在對話涉及到時才會被召回補充。
你可以透過「提取間隔」設定項控制提取頻率——例如設為 2 表示每隔 2 輪 AI 回覆才觸發一次提取,減少 LLM 呼叫開銷。
智慧召回
當你發送新訊息觸發 AI 生成時,記憶圖會根據當前對話上下文,從已累積的記憶中召回最相關的內容,並注入到提示詞中供 AI 參考。
記憶圖支援多種召回方式:
| 召回方式 | 說明 |
|---|---|
| LLM 召回 | 讓 LLM 直接從記憶庫中選擇相關節點,支援多輪深挖 |
| 混合召回 | 結合向量檢索、圖擴散、詞彙匹配等多種訊號綜合評分 |
| 混合 + 重排序 | 在混合召回基礎上使用重排序模型進一步最佳化結果 |
| 混合 + LLM | 在混合召回基礎上讓 LLM 對候選節點進行二次篩選 |
預設使用 LLM 召回方式,你可以在記憶圖設定面板中切換召回方式。
層級壓縮
隨著對話推進,事件記憶會不斷累積。記憶圖會自動將舊的事件節點進行層級壓縮——將多個相關事件合併為一個更高層級的摘要節點,保留核心資訊的同時控制記憶總量。
壓縮是遞迴進行的:當某一層級的摘要節點數量也超過閾值時,它們會被進一步壓縮為更高層級的摘要,如此向上遞迴,直到節點數量降到閾值以下。例如,多個戰鬥事件先被壓縮為「森林戰役」,多個戰役又可能被壓縮為「北方遠征」。壓縮後的摘要節點仍然可以展開查看原始的子事件。
開啟與設定
基本開啟
- 在 Luker 擴充功能設定中找到「記憶圖」
- 打開「啟用記憶圖」開關
- 開始對話,記憶圖會自動運作
設定 LLM 預設
記憶圖的提取和召回需要呼叫 LLM,但可以使用與主對話不同的模型和預設。這意味著你可以:
- 主對話使用高品質模型(如 Claude Opus),記憶圖使用更經濟的模型(如 Claude Haiku)
- 為提取和召回分別指定不同的 API 連線和 Chat Completion 預設
相關設定項:
| 設定項 | 說明 |
|---|---|
| 提取 API 預設 | 提取使用的 API 連線預設(空 = 使用主連線) |
| 提取預設 | 提取使用的 Chat Completion 預設 |
| 召回 API 預設 | 召回使用的 API 連線預設 |
| 召回預設 | 召回使用的 Chat Completion 預設 |
調整召回行為
| 設定項 | 預設值 | 說明 |
|---|---|---|
| 啟用召回 | true | 是否啟用召回 |
| 召回方式 | llm | 召回方式:llm / hybrid / hybrid_rerank / hybrid_llm |
| LLM 召回最大迭代輪次 | 3 | LLM 召回的最大迭代輪數 |
| 召回查詢訊息數 | 2 | 召回時參考的最近訊息數 |
| 混合召回最大結果數 | 15 | 混合召回回傳的最大結果數 |
提取設定
| 設定項 | 預設值 | 說明 |
|---|---|---|
| 提取間隔 | 1 | 每隔多少輪 AI 回覆觸發一次提取 |
| 每批提取輪數 | 1 | 每批提取處理的回覆輪數 |
| 提取上下文輪數 | 2 | 提取時包含的上下文輪數 |
| 排除最近輪數 | 0 | 排除最近 N 輪不參與提取 |
注入方式
記憶圖支援兩種注入方式,你可以根據需要選擇:
常駐注入
你可以將某些類型的記憶設為常駐注入,使其始終出現在提示詞中,不依賴召回觸發。例如,「規則約束」類型的節點預設常駐注入,確保世界觀規則永遠不會被遺忘。
常駐注入透過將節點寫入世界書條目實現,隨世界書系統一起生效。
召回注入
其他類型的記憶(如角色狀態、事件摘要等)預設透過召回機制動態注入——只有與當前對話相關的記憶才會被注入,避免佔用過多上下文空間。
INFO
常駐和召回並不互斥。同一種節點類型可以同時開啟常駐注入和召回注入——常駐確保基礎資訊始終可用,召回則補充與當前上下文相關的更多細節。
召回注入的位置和角色可以設定:
| 設定項 | 預設值 | 說明 |
|---|---|---|
| 召回注入位置 | atDepth | 注入位置 |
| 召回注入深度 | 9999 | 注入深度 |
| 召回注入角色 | SYSTEM | 注入角色(system / user / assistant) |
設定注入方式
你可以在記憶圖設定面板中,為每種節點類型分別設定是否常駐注入、是否啟用召回。兩者可以同時開啟——常駐確保基礎資訊始終可用,召回則補充與當前上下文相關的細節。
如何選擇
- 規則約束等不隨對話變化的資訊適合常駐注入(預設已啟用)
- 角色狀態、事件摘要等動態資訊適合召回注入(預設行為)
- 如果你發現某些重要資訊經常被遺漏,可以在記憶圖設定面板中將對應節點類型設為常駐注入
結果複用
當你對同一輪對話進行 swipe(滑動切換)或重新生成時,記憶圖會自動複用上一次的召回結果,不會重複執行召回流程。這既節省了 LLM 呼叫成本,也保證了同一輪對話中記憶上下文的一致性。
查看記憶
你可以透過記憶圖的 UI 面板查看當前的記憶狀態:
- 圖視覺化:以圖形方式查看所有記憶節點和它們之間的關係
- 表格檢視:按類型查看所有節點的結構化欄位
- 搜尋功能:按關鍵詞搜尋記憶節點,支援按類型過濾
- 查看最近注入:查看最近一次注入到提示詞中的記憶內容
自訂記憶結構
角色卡可以自訂記憶圖的節點類型定義,為特定角色定製記憶結構。在記憶圖設定面板中,你可以新增、編輯或刪除節點類型,覆蓋預設的類型定義。例如,奇幻世界的角色卡可以定義「魔法」「陣營」等專屬節點類型,讓記憶圖更貼合角色的世界觀。自訂的節點類型會隨角色卡一起儲存和匯出。
世界書投影
記憶圖可以將記憶節點投影為世界書條目,透過世界書的關鍵詞匹配和掃描深度機制參與提示詞建構。投影分為兩種:
- 持久化投影:將常駐注入的節點寫入持久化世界書條目
- 執行時投影:將召回結果寫入臨時世界書條目,生成結束後自動清理
匯入匯出
記憶圖資料支援匯入匯出為 JSON 檔案。匯出資料包含所有節點、邊和中繼資料。
匯入時提供三種綁定模式:
| 模式 | 說明 |
|---|---|
| 恢復 | 保留匯出時的樓層編號,用於同一聊天的資料恢復 |
| 綁定到最新樓層 | 將所有匯入節點綁定到當前最新的 AI 回覆樓層 |
| 綁定到指定樓層 | 手動輸入目標樓層編號 |
變更回滾
記憶圖內建了完整的變更回滾機制。當你編輯、刪除訊息或進行 swipe 時,記憶圖會自動回滾到受影響訊息之前的狀態,確保記憶與對話歷史保持一致。
完整設定參考
點擊展開完整設定項列表
基礎設定
| 設定項 | 預設值 | 說明 |
|---|---|---|
| 啟用記憶圖 | false | 外掛總開關 |
| 提取間隔 | 1 | 每隔多少輪 AI 回覆觸發一次提取 |
| 最大處理輪數 | 900 | 最大處理輪數上限 |
向量與擴散設定
| 設定項 | 預設值 | 說明 |
|---|---|---|
| 嵌入向量來源 | transformers | 來自 Vector Storage 擴充功能設定(vectors.source) |
| 嵌入模型 | (空) | 來自 Vector Storage 擴充功能設定(依來源使用對應模型欄位) |
| 向量檢索 Top-K | 20 | 向量檢索回傳的 Top-K 數量 |
| 圖擴散步數 | 2 | 圖擴散步數 |
| 圖擴散衰減係數 | 0.6 | 圖擴散衰減係數 |
| 圖擴散 Top-K | 100 | 圖擴散 Top-K |
| 圖擴散傳送機率 | 0.0 | 圖擴散傳送機率 |
重排序設定
| 設定項 | 預設值 | 說明 |
|---|---|---|
| 啟用重排序 | false | 是否啟用重排序 |
| 重排序服務來源 | cohere | 重排序服務來源 |
| 重排序模型 | (空) | 重排序模型名稱 |
其他設定
| 設定項 | 預設值 | 說明 |
|---|---|---|
| 每分鐘請求限制 | 0 | 每分鐘請求限制(0 = 不限制) |
| LLM 可見最近訊息數 | 5 | LLM 生成時可見的最近訊息數 |
| 使用預設時包含世界書 | true | 使用預設時是否包含世界書 |
| 覆蓋世界書名稱 | (空) | 覆蓋世界書名稱 |
| 世界書條目排序基數 | 9800 | 世界書條目排序基數 |
| 工具呼叫最大重試次數 | 2 | 工具呼叫失敗最大重試次數 |
| 排除最近輪數的節點 | 2 | 召回時排除最近 N 輪的節點 |
技術深入
點擊展開技術細節
多階段混合召回管線
混合召回模式下,記憶圖執行一個包含 8 個階段的召回管線:
- 向量預過濾:從向量資料庫中檢索語義最相似的 Top-K 節點
- 實體錨點:從查詢文字中匹配已知實體名稱和別名
- 建構種子:合併向量命中和實體錨點作為擴散起點
- 建構鄰接表:建構圖的雙層鄰接表
- PEDSA 圖擴散:從種子節點出發,透過圖結構傳播能量,發現間接相關的記憶
- 混合評分:合併向量分數、擴散能量、詞彙匹配、錨點分數、時效性加成等多維訊號
- 認知管線(NMF / FISTA / DPP):三個演算法確保召回結果覆蓋全面且多樣
- 可選重排序:使用外部重排序模型進一步最佳化結果
認知層演算法
- NMF 話題再平衡:使用非負矩陣分解識別被低估的話題方向,提升其代表節點的分數
- FISTA 殘差發現:透過快速迭代收縮閾值演算法發現查詢中未被候選集覆蓋的語義方向,並進行補充搜尋
- DPP 多樣性取樣:使用行列式點過程從候選集中選出品質高且彼此多樣的子集,避免召回結果過於集中
PEDSA 圖擴散
PEDSA(Personalized Efficient Diffusion with Sparse Approximation)演算法使記憶圖能夠發現與查詢沒有直接語義關聯、但透過圖結構間接相關的重要記憶。它從種子節點出發,沿圖的邊關係多輪傳播能量,支援傳送機率(類 PageRank)和稀疏近似控制。
向量索引
記憶圖使用增量更新策略管理向量嵌入——透過雜湊比對檢測節點內容變化,只有內容實際改變時才重新生成嵌入向量。 在混合召回中,嵌入來源和模型會讀取 Vector Storage 擴充功能設定,因此可用來源會跟隨 Vector Storage 的能力(包括 Jina)。 當 Vector Storage 設定不可用時,記憶圖會回退到自身舊版的本地來源/模型欄位。
如需了解更多技術實作細節,請參閱原始碼。