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
相關
- 專案
- 專案
- 專案
- 專案
- 專案