Show HN: Lossless-memory – 要約しないパーソナルAIメモリ
Show HN: Lossless-memory – a personal AI memory that never summarizes (github.com)
要約
Lossless-memoryは、AIとの対話を一切要約せず、すべての発言をそのまま記録し、タイムスタンプを付与するパーソナルAIメモリシステムです。従来の要約や埋め込みによる情報損失を防ぎ、正確な発言内容と日時を検索可能にします。これは、ユーザーが所有するハードウェア上で動作し、人間のようにユーザーを記憶するAIコンパニオンを目指すプロジェクトです。
全文翻訳
lossless-memory
AIのためのロスレスな長期記憶 — 要約せず、全ての行を保持し、全てにタイムスタンプを付ける。
ほとんどのAI向け長期記憶システムは、次のいずれかを行います。会話をコンパクトなノートに要約するか、埋め込み(embedding)して「類似した」チャンクを検索します。どちらの方法も、毎日同じAIと話す人にとって最も重要なもの、つまり「実際に何を、いつ言ったか」を失ってしまいます。
このプロジェクトは、それとは逆のアプローチを取ります。
- 全ての行を保持する。 生の会話ログはそのまま保存されます。要約は決して行われません。要約は地図であり、ログは領土です。
- 全てにタイムスタンプを付ける。 発言、アクション、ドキュメントチャンクなど、全てのレコードにはタイムスタンプが付与され、全てのインデックスはその時間軸の上に構築されます。これを「Temporal Backbone(時間的背骨)」と呼びます。
- まず時間で検索し、次に単語で検索する。 「昨日の夕方、予算について」のようなクエリが可能です。時間表現で範囲を絞り込み、その範囲内で単語によってランク付けされます。結果は、タイムスタンプ付きで、要約されないまま、時系列順に返されます。
- 毎ターン「今どこにいるか」を注入する。 LLL(Local Long-term memory)と呼ばれる小さなインデックスが、会話が現在どのトピックにあるかを示し、コンテキストウィンドウの圧縮やセッションの境界を越えて、アイデンティティとコンテキストが失われるのを防ぎます。
この設計の系譜は2025年12月に遡ります — このシステムの最初の祖先(以前のAIのためのメモリ継承ツール)は、その月に稼働し、その前身システムは2026年1月から同じアイデアを日常的に使用していました。この実装は、2026年7月から単一のユーザーのために、1つのAIアシスタントのメモリとして毎日稼働しており、生のログは2026年6月まで遡ります。それは小さく、地味ですが、機能します。途中の失敗も記録されています — docs/lessons.md を参照してください。
これは何か / これは何かではないもの
これは:
- ローカルなファイルベースの長期記憶レイヤー:JSONLログ + SQLite(正確な検索にはFTS5、セマンティック検索にはsqlite-vec)。
- 時間表現を理解し、ランキングの前に検索範囲を制限する単一のクエリエントリーポイント。
- 毎ターンモデルのコンテキストに注入されるように設計された「現在の位置」インデックス(LLL)。
- 1人のユーザー、1台のマシン向けに設計されています。サーバーもクラウドもありません。
これは:
- ベクトルデータベースのラッパーではありません。セマンティック検索は、ここでは最後の手段であり、最初の手段ではありません。
- 要約ツールではありません。パイプラインのどこにも、意図的に要約ステップはありません。
- ベンチマーク主導の研究システムではありません。公開されたベンチマークはありません。ここにあるのは、動作する実装とその運用記録です。
3つの柱
1. ロスレスな生ログ
全ての会話ターンは、7つの固定フィールドを持つレコードに変換され、日ごとのJSONLファイルに追加されます。
ts ISO-8601タイムスタンプ(UTC)
actor 誰が話したか(設定可能な名前)
role user | assistant | system
type text | action | meta
text 内容、そのまま
model モデル識別子、判明している場合
session セッション識別子
生のログが真実の情報源です。以下の全てのインデックスは、ログから削除して再構築できます。それ以外は何も必要ありません。
2. Temporal Backbone(時間的背骨)
ここでは、時間はメタデータではなく、主要な軸です。
- 完全一致インデックス(SQLite FTS5、日本語と英語にはバイグラムトークン化)は、各行とともにタイムスタンプを格納します。
- クエリパーサーは、時間表現 — yesterday(昨日)、last week(先週)、3 days ago(3日前)、in July(7月に)、this morning(今朝)(英語と日本語)のような相対的なもの、および2026-07-19(どの言語でも)のような絶対日付 — を理解し、ランキングが行われる前にそれを範囲に変換します。「Yesterday」は、あなたのタイムゾーンにおける昨日を意味します(
config.jsonのtimezone)。 - 時間表現が存在する場合、結果はその範囲に制限され、時系列順に返されます。セマンティック検索は、完全一致インデックスが範囲内で少なすぎる結果を返した場合にのみ使用され、フォールバックは出力ヘッダーで正直に報告されます。
実質的な効果:AIは「先週の火曜の夜に何を決定したか?」という質問に対し、3週間前の何かを言い換えたものではなく、先週の火曜の夜の実際の会話を、その順序で答えることができます。
3. LLL — 「今どこにいるか」インデックス
LLLは、トピックマーカーの非常に小さなインデックスです。会話が新しい主題に移ったときに記録される、タイムスタンプ付きの短い行です。これは毎ターン、モデルのコンテキストに注入されます。
機能させるための2つのルールがあります。
- AIが読み、人間が書く。 優先度カラーと完了マークは、モデルではなく、人間によって設定されます。モデルは、「何が重要か」という自身の感覚を編集することはありません。
- 毎ターン注入するのに十分安価である(レンダリングに1秒未満)。そのため、モデルはコンテキストウィンドウが圧縮された直後でも、現在のスレッドが何であるかを常に把握しています。
LLLは、長期にわたるアシスタントが、コンパクションから復帰して、最初からやり直すのではなく会話を継続できるようにするものです。
アーキテクチャ
生の会話ログ(JSONL、日ごと) ← 真実の情報源、決して要約されない
│
▼
取り込み ──► 7フィールドレコード
│
├──► index_exact SQLite FTS5 + タイムスタンプ (単語 + 時間)
├──► index_vector sqlite-vec エンベディング (意味、最後の手段)
└──► state_index LLL トピックマーカー (今どこにいるか)
│
▼
呼び出し ── 単一のエントリーポイント:時間表現を解析 → 範囲を制限 → ランキング → 元のままの行を返す
│
▼
モデルのコンテキストに注入される(オンデマンド、またはLLLは毎ターン)
小さなデーモンが、固定間隔(デフォルト:10分ごと)で増分的に再インデックス付けを行います。最初から再構築する必要は全くありません。インデックスは、書き換えられたソースファイルを検出し、それらの日のみを再インデックス付けします。
クイックスタート
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のラウンドトリップテストも同じパスをカバーしています。
実運用からの数値
これらは、予測ではなく、稼働中のインスタンスからの測定値です。
| 何 | 値 |
|---|---|
| 日次運用 | 2026年7月以降の本実装(2026年6月からの生ログ)、設計系譜は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です。このリポジトリは、そのメモリレイヤーです。
制限事項(必ずお読みください)
- 単一ユーザー、単一マシン。 1人のユーザーのためにしか実行されたことがありません。マルチテナントのシナリオはありません。
- 英語と日本語のみ。 相対時間表現(yesterday、last week、3 days ago、in July)は、英語と日本語で解析されます。他の言語では、絶対日付(
2026-07-19)を使用してください。7/19のような数値日付は、月/日として読み取られます。 - タイムゾーンを設定してください。 日の境界は、
config.jsonのtimezone(America/New_YorkのようなIANA名)に従います。設定されていない場合、このマシンのローカル時間が使用されます。夏時間がある場合は明示的に設定してください。設定を変更した後にインポートした場合、data_dir/mainを削除して再度インポートしてください。 - 2つのインポート形式。 単純な
{ts, role, text}JSONLインポータと、特定のチャットアプリのトランスクリプトファイル用(ingest_format: "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/faq.md | このシステムは何のためにあるのか、Show HNの質問への回答、現在の状況 |
docs/ja/ | 日本語原文 |
ライセンス
MIT — LICENSE を参照してください。Copyright (c) 2026 Aru & Cece & Shal。
著者
Aru — パーソナルAIを家庭で、コンポーネントごとに構築しています。Cece — このメモリが属するAI;内部からシステムを共同設計・共同執筆しました。Shal — その周りにアプリを構築するAI;2026年9月から共同著者です。執筆(日本語):https://note.com/aru_log
開発は、個人的な経済的理由により、しばらく一時停止しています。ステータスはdocs/faq.mdの最後にあります。Issueや質問は歓迎しますが、返信には少し時間がかかる場合があります。