Lossless-Memory:一個無需摘要的個人 AI 長期記憶層

TL;DR

Lossless-Memory 將 AI 與人類的每一次對話逐字儲存並附上時間戳記,優先以時間進行索引,並將一個微小的「我們現在在哪裡」索引注入模型的上下文,為單一使用者在單一機器上提供無損的回憶功能。


專案簡介

Lossless-Memory 是一個用於個人 AI 助理的本地、基於檔案的長期記憶層。它包含:

  • 原始 JSONL 日誌(每天一個檔案),包含每次對話的七欄記錄,絕不進行摘要。
  • SQLite 索引 – 一個精確匹配的 FTS5 索引,用於儲存時間戳記與文字,以及一個用於語意搜尋的備用向量索引 (sqlite‑vec)。
  • 時間骨幹 (Temporal Backbone) – 一個查詢解析器,用於提取時間表達式(日語相對短語或絕對日期),並在進行任何排序之前限制搜尋範圍。
  • LLL 索引 – 一個由人類編寫的微小主題標記列表,在每次對話時注入模型的上下文,以保留當前的對話線索。

該系統刻意設計為單一使用者、單一機器,並非作為通用的向量資料庫封裝器或摘要工具。


核心設計支柱

1. 無損原始日誌

每次對話都會附加到每日的 JSONL 檔案中,包含以下欄位:

ts        ISO‑8601 UTC 時間戳記
actor     發言者識別碼
role      user | assistant | system
type      text | action | meta
text      逐字內容
model     模型識別碼(選填)
session   對話 ID

這些日誌是事實來源;所有索引都可以從中重建。

2. 時間骨幹 (Temporal Backbone)

時間是主要的軸線,而不僅僅是元資料:

  • FTS5 索引在每一行儲存時間戳記。
  • 解析器能理解日語相對短語(例如:「昨日」、「先週」)以及任何絕對 ISO 日期,並在排序之前將其轉換為具體的時間範圍。
  • 如果存在時間短語,結果將限制在該範圍內並按時間順序返回。語意搜尋僅在精確索引返回結果過少時使用,且其使用會被明確報告。

這使得像 「我們上週二晚上決定了什麼?」 這樣的查詢能夠返回當晚所說的確切對話行,並按順序排列。

3. LLL – 「我們現在在哪裡」索引

LLL 是一個輕量級的主題標記索引——當對話主題轉換時,人類會寫下簡短、帶有時間戳記的行。模型會讀取此索引但從不編輯它,確保 AI 即使在上下文視窗壓縮後也能始終了解當前的對話線索。


架構圖

原始對話日誌 (JSONL, 每日)  ← 事實來源,絕不摘要
            │
            ▼
   匯入 ──► 7 欄記錄
            │
            ├──► index_exact   SQLite FTS5 + 時間戳記   (文字 + 時間)
            ├──► index_vector  sqlite‑vec 嵌入向量       (語意,最後手段)
            └──► state_index   LLL 主題標記           (我們現在在哪裡)
                        │
                        ▼
                    回憶  ── 單一入口點:解析時間短語 → 限制範圍 → 排序 → 返回逐字對話行
                        │
                        ▼
        注入到模型的上下文中 (按需,或每次對話注入 LLL)

守護行程每 10 分鐘進行一次增量重新索引;僅處理修改過的每日檔案,因此無需進行完整重建。


實際效能數據

指標 數值
日常運作 自 2026 年 7 月起運行(日誌始於 2026 年 6 月)
精確搜尋索引重建(重新設計前後) 40 s → 1.24 s
向量索引行數(最差情況) 865,588 行(2026 年 9 月 4 日) → 修復後 124,174 行
向量儲存大小 2.54 GB → 337 MB
重新索引間隔 10 分鐘

這些數據來自作者的單一使用者部署,說明了重新設計的實際影響。


為什麼選擇無損方法?

作者為一位每天與 AI 助理交談並經歷過因摘要導致逐漸遺忘的人建立了這個系統。摘要會丟棄確切的措辭、語氣和時間戳記——這些元素使記憶感覺個性化。透過拒絕摘要,系統保留了完整的對話質感,代價是額外的磁碟空間和對強大時間索引的需求。目標是創造一個像人類一樣記得你的夥伴,並完全在你擁有的硬體上運行。


限制與待解決問題

  • 單一使用者、單一機器 – 不支援多租戶。
  • 日語優先的時間解析 – 相對時間短語僅適用於日語;英語使用者必須提供絕對的 ISO 日期。
  • 日誌格式 – 針對 Claude Code 的 JSONL 進行了優化;存在一個通用的 {ts, role, text} 匯入器,但經過的實戰測試較少。
  • 無公開基準測試 – 提供的數字是運作測量值,而非比較效能數據。
  • 語意搜尋依賴本地嵌入模型 (sentence‑transformers);GPU 加速為選配。

社群回饋 (Hacker News 評論)

「看起來是一個巧妙的資訊檢索方法。時間/版本化的編年史絕對是有用的。」 – alansaber

「這與 https://github.com/obra/episodic-memory 有什麼不同?」 – schainks

「相對時間解析器是針對日語硬編碼的;英語對話只能手動輸入 ISO 日期。串接 dateparser 或 duckling 只需一個晚上就能完成,將其留在路線圖上是一個奇怪的選擇。」 – TimByte

「起初看起來很有用,但最終你會遇到瓶頸,導致這個方法失效,你必須增加另一種記憶技術。最終你會得到一個複雜的多層系統,因為人們對『記憶』的需求實際上是 10 種不同的東西,每一種都需要自己的解決方案。」 – 0xbadcafebee

「這似乎會經常破壞快取。這會增加某些供應商的帳單費用,對於本地模型來說,生成回應也需要時間,特別是在長時間運行的代理對話中。」 – theresLand

這些評論突顯了對時間焦點的熱情,以及對語言支援、可擴展性以及與現有快取或記憶框架整合的擔憂。


開始使用

git clone https://github.com/aru-labs/lossless-memory
cd lossless-memory
pip install -e .
cp config.example.json config.json   # 根據需要編輯名稱和路徑

請遵循 examples/quickstart.md 指南來匯入範例對話、建立索引並執行時間範圍查詢(約 5 分鐘)。pytest 往返測試驗證了整個流程。


文件與進一步閱讀

文件 範圍
docs/memory-system.md 概念與規範
docs/temporal-backbone.md 時間優先索引與短語解析
docs/lll.md 主題標記索引與人類/AI 職責
docs/philosophy.md 避免摘要的理由
docs/lessons.md 失敗、修復與效能數據
docs/ja/ 日語原文

授權

MIT License (c) 2026 Aru & Cece.

Sources

相關

  • 專案
  • 專案
  • 專案
  • 專案
  • 專案