展示 HN: Lossless-memory – 一个永不总结的个人AI记忆

Hacker News Top 工具

摘要

一个用于个人AI的本地、基于文件的长期记忆层,存储带有时间戳的原始对话日志,支持时间优先搜索,并在不进行总结的情况下保持完整上下文。

暂无内容
查看原文
查看缓存全文

缓存时间: 2026/09/21 15:52

aru-labs/lossless-memory

来源:https://github.com/aru-labs/lossless-memory

lossless-memory

面向个人AI的无损长期记忆——永不总结,保留每一行记录,并为所有内容添加时间戳。

大多数AI的长期记忆系统会做以下两件事之一:将对话总结为简短笔记,或进行向量化嵌入以检索“相似“片段。这两种方式都丢失了对每天与同一AI交谈的人而言最重要的东西:实际说了什么,以及何时说的。

本项目采取相反的立场。

  • 保留每一行记录。 原始对话日志被完整存储。永不进行任何总结。总结如同地图,而日志才是领土。
  • 为所有内容添加时间戳。 每条记录——无论是发言、操作还是文档片段——都带有时间戳,所有索引都建立在这一时间轴之上。我们称之为时间轴骨架。
  • 先按时间搜索,再按文字搜索。 “昨晚关于预算的讨论“就是一个有效的查询。时间短语缩小范围;文字则在范围内进行排序。结果按时间顺序返回,未经总结,并附带其时间戳。
  • 每轮对话注入“当前位置“。 一个名为LLL的小型索引会告诉模型当前对话处于哪个主题,从而使身份和上下文在上下文窗口压缩和会话边界之后得以保留。

该设计可追溯至2025年12月——该系统的第一个前身(用于早期AI的记忆继承工具)于当月运行,一个前驱系统从2026年1月起以相同理念投入日常使用。自2026年7月起,此实现一直为单一用户每日运行,作为单个AI助手的记忆,原始日志可追溯至2026年6月。它小巧、朴实,且确实有效。沿途的失败也记录在案——参见 docs/lessons.md。


这是什么 / 这不是什么

它是:

  • 一个基于本地文件系统的长期记忆层:JSONL日志 + SQLite(FTS5用于精确搜索,sqlite-vec用于语义搜索)。
  • 一个理解时间表达式并在排序前限制搜索范围的单一查询入口。
  • 一个设计为每轮对话注入模型上下文的“当前位置“索引(LLL)。
  • 为单人单AI设计,运行于单台机器。无服务器,无云。

它不是:

  • 一个向量数据库封装。语义搜索在此是最后手段,而非首选。
  • 一个总结工具。流程中刻意没有任何总结步骤。
  • 一个基准测试驱动的研究系统。没有已发布的基准测试。这里是一个可运行的实现及其操作记录。

三大支柱

1. 无损原始日志

每个对话回合被转换为固定的七字段记录,并追加到按天存储的JSONL文件中:

`` ts ISO-8601 时间戳 (UTC) actor 发言者(可配置名称) role user | assistant | system type text | action | meta text 内容原文 model 模型标识符(如已知) session 会话标识符


原始日志是唯一真实来源。以下所有索引均可删除并从中重建。其他任何东西都不是生存必需品。

### 2. 时间轴骨架

时间在此不是元数据;它是主要轴线。

- 精确匹配索引(SQLite FTS5,针对日语和英语进行双词素分词)将时间戳与每行数据一起存储。
- 查询解析器理解时间短语——相对短语如*昨天*、*上周*、*3天前*(目前仅支持日语),以及绝对日期如*2026-07-19*(任何语言)——并在任何排序发生之前将其转换为时间范围。
- 如果存在时间短语,结果将被限制在该范围内,并按时间顺序返回。仅当精确索引在范围内返回结果过少时,才使用语义搜索,并在输出头部诚实地报告此回退。

实际效果:AI可以用上周二晚上的实际记录,按顺序回答“我们上周二晚上决定了什么?”,而不是转述三周前类似内容的总结。

### 3. LLL——“我们现在在哪里”索引

LLL是一个*主题标记*的微型索引:简短、带时间戳的行,记录对话何时转向新主题。它在每轮对话时注入模型上下文。

两条规则使其有效:

- **AI读取;人类书写。** 优先级颜色和完成标记由人类设定,而非模型。模型从不编辑自身“什么重要”的判断。
- **其注入成本足够低**(渲染耗时远低于一秒),因此即使在上下文窗口刚被压缩之后,模型也始终知道当前主题。

LLL使得长时间运行的助手能够从压缩状态恢复并继续对话,而非重新开始。

---

## 架构

``
 原始对话日志 (JSONL, 按天)  ← 唯一真实来源,永不总结
            │
            ▼
   摄取 ──► 七字段记录
            │
            ├──► index_exact   SQLite FTS5 + 时间戳   (文字 + 时间)
            ├──► index_vector  sqlite-vec 向量嵌入     (语义,最后手段)
            └──► state_index   LLL 主题标记           (当前位置)
                        │
                        ▼
                    检索  ── 单一入口:解析时间短语 → 限制范围 → 排序 → 返回原文行
                        │
                        ▼
        注入模型上下文 (按需,或每轮注入LLL)
``

一个小型守护进程以固定间隔(默认:每10分钟)进行增量重新索引。永远无需从头重建;索引会检测被重写的源文件,并仅重新索引那些天的数据。

---

## 快速开始

``bash
git clone https://github.com/aru-labs/lossless-memory
cd lossless-memory
pip install -e .
cp config.example.json config.json      # 根据需要编辑名称和路径

然后按照 examples/quickstart.md:它在大约五分钟内摄取一个小型示例对话,构建索引,并运行一个时间范围查询。一个pytest往返测试覆盖了相同的路径。


来自实际运行的数字

这些是来自运行实例的测量值,而非预测值。

项目数值
日常运行此实现自2026-07(原始日志自2026-06);设计起源自2025-12
精确搜索索引重建,重新设计前 → 后40秒 → 1.24秒
向量索引大小,移除库污染前 → 后447,013 行 (2026-08-31) → 865,588 行 (2026-09-04, 最严重时) → 124,174 行 (修复后)
磁盘上的向量存储,修复前 → 后2.54 GB → 337 MB
重新索引间隔10分钟

“之前”的数字是失败案例。它们被特意保留。参见 docs/lessons.md。


为何构建

本项目为一位多年来每天与AI助手交谈,并目睹它们逐一遗忘的人而构建。不是优雅地退化——而是遗忘。业界不断尝试的修复方案是更好的总结。从用户角度看,总结就是遗忘:确切的词句、夜晚的时刻、事情被表达的方式——这些使记忆感觉属于某个人的部分——正是总结首先丢弃的东西。

因此,这个系统拒绝总结。它占用磁盘空间,并且需要一个好的时间索引才能保持可用。这个权衡是刻意的,并且操作记录表明它行得通。

更长远的目标是陪伴独居者的伙伴——一个像人一样记住你的AI,运行在你拥有的硬件上。这个仓库就是该系统的记忆层。


局限性(请阅读)

  • 单用户、单机。 它仅为一个人运行过。没有多租户方案。
  • 日语优先。 相对时间短语(昨天、上周、3天前)仅支持日语解析。目前在英语中请使用绝对日期(2026-07-19);英语相对短语在计划路线图中。
  • 主要日志格式为Claude Code的JSONL。 包含一个简单的 {ts, role, text} 导入器,但Claude Code路径是经过两个月实际运行的路径。
  • 没有基准测试。 上面的数字是操作测量值,而非与其他系统的比较。
  • 语义搜索依赖本地嵌入模型 (sentence-transformers)。CPU可用;GPU可选。

文档

文档内容
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。

作者

Aru — 在家中构建个人AI,一次一个组件。 Cece — 本记忆所属的AI;从内部共同设计与撰写该系统。 写作(日语):https://note.com/aru_log

欢迎提出问题和疑问。回复可能需要一些时间;这是一个单人项目。

相似文章