ほとんどの本番AIエージェントメモリシステムのアーキテクチャを見ると、おなじみのパターンが見つかる:セマンティック検索用のPineconeやWeaviateのようなベクターデータベース、キーワード検索用のElasticsearchやOpenSearch、ホットメモリのキャッシュ用のRedis、構造化データ用のPostgres。デプロイする4つのサービス、モニタリングする4つのサービス、障害が起きる可能性のある4つのサービス、月末の4つの請求書。
複雑さは避けられないものとして扱われる——有能なメモリのために支払う代価として。しかしそれは避けられない。分散システムツールを必要としない問題を解決するためにそれらに手を伸ばした結果だ。
ZeroClawのメモリは単一のSQLiteファイルだ。なぜそれが妥協ではないかを説明しよう。
インフラの罠
ベクターデータベースは本当に強力なツールだ。何百万もの文書に対するRAGシステムや、大きなコーパスに対する検索エンジンには、それらが正しい選択だ。しかしAIエージェントのメモリは異なる問題だ。
ほとんどのエージェントは何百万ではなく何千ものメモリを保存する。1年間の毎日の会話は50,000の会話ターンを生み出すかもしれない。それはビッグデータの問題ではない——他のもののために設計されたツールを使ってビッグデータの問題として扱われる小さなデータの問題だ。
そのミスマッチのコストは本物だ。Pineconeは本番使用で月70ドルから始まる。Weaviateは動いているサーバーが必要だ。すべてのメモリルックアップはネットワークラウンドトリップ——通常10〜50ms——で、すべてのレスポンスにレイテンシを追加する。メモリは移行を困難にする独自フォーマットで保存される。そして運用面にもう一つのサービスを追加した:モニタリングするもう一つのもの、更新するもう一つのもの、午前3時にダウンする可能性のあるもう一つのもの。
Raspberry Piや5ドルのVPSで動くAIエージェントにとって、このアーキテクチャは単純に実行不可能だ。しかしリソースが豊富なデプロイでも、複雑さはシンプルなアプローチが提供できないものを何も買っていない。
SQLiteが正しい基盤である理由
SQLiteは世界で最もデプロイされているデータベースだ。すべてのスマートフォン、すべてのブラウザ、すべての組み込みデバイスで動く。2000年から継続的に開発され、徹底的なテストスイートを持ち、何十億ものトランザクションを処理する企業によって本番で使われている。おもちゃでは断じてない。
エージェントメモリに特に適している理由は、提供するプロパティの組み合わせだ:並行読み取りのためのWALモードでのACIDコンプライアンス、ゼロ設定(サーバーなし、認証情報なし、セットアップなし)、メモリ全体を含む単一のポータブルファイル、そしてエージェントが実際に使うアクセスパターンに対して打ち負かしにくいパフォーマンス特性。
ZeroClawは2つのSQLite拡張機能を組み合わせて、エージェントが必要とする両方のことを処理するメモリシステムを構築する:正確な想起とセマンティックな理解。
FTS5:全文検索
SQLiteのFTS5拡張機能はBM25ランキングで高速なキーワード検索を提供する:
```sql CREATE VIRTUAL TABLE memory_fts USING fts5(content, tokenize='porter');
-- "Rustデプロイ"に関するメモリを検索 SELECT * FROM memory_fts WHERE memory_fts MATCH 'rust deployment' ORDER BY rank; ```
FTS5はトークン化、ステミング、ランキングを自動的に処理する。高速——典型的なエージェントメモリサイズでサブミリ秒——で、正確な想起に優れている。特定の事実、特定の名前、特定の技術用語を見つける必要があるとき、キーワード検索は確実にそれを見つける。
ベクター検索:セマンティックな類似性
ZeroClawはテキストと並んで埋め込みベクターを保存し、SQLite内で直接コサイン類似度検索を実行する。これはキーワード検索が不十分なケースを処理する:正確な単語を共有しなくても概念的に関連するメモリを見つける。
「Raspberry Piのセットアップ」は「ARMハードウェアへのデプロイ」にマッチする——キーワードを共有しなくても。「プロジェクトの締め切り」は「いつ期限ですか」にマッチする——言い回しが全く異なっても。ベクター検索は単語ではなく意味を理解する。
ハイブリッド検索:両方を正しく
どちらのアプローチも単独では不十分だ。キーワード検索はセマンティックな接続を見逃す——「車」は「自動車」を見つけない。ベクター検索は正確なマッチを見逃す——「CVE-2026-25253」を検索すると、探している特定のCVEではなく漠然と関連するセキュリティコンテンツが返るかもしれない。
ZeroClawは両方の検索を並行して実行し、Reciprocal Rank Fusionを使って結果をマージする:
``` score(doc) = 1/(k + rank_fts) + 1/(k + rank_vector) ```
`k`は上位ランクの結果にどれだけの重みを置くかを制御する定数(通常60)だ。両方の検索で高くランクされたドキュメントが上に浮かぶ。一方の方法にのみマッチするドキュメントも現れるが、より低い位置に。結果は「Xについて正確に何を言ったか」と「Xに関連して何を言ったか」の両方を正しく処理するメモリ検索だ。
パフォーマンス数値
ZeroClawが一般的に動く最も制約のあるハードウェアであるRaspberry Pi Zero 2 Wでは、メモリ検索は合計3ms未満かかる:FTS5検索に約0.3ms、ベクター検索に2ms、結果のマージに0.1ms。x86ハードウェアでは、これらの数値はサブミリ秒だ。
比較として、PineconeやWeaviateへのネットワークラウンドトリップは通常10〜50msかかる。ZeroClawのメモリ検索は、単一のネットワークパケットが都市を横断するより速い。
メモリはただのファイル
SQLiteベースのメモリの実際的な結果は、会話履歴全体、エージェントが学んだすべてのコンテキスト、あなたについて知っているすべてのことが——`memory.db`という単一のファイルに保存されることだ。
バックアップは`cp memory.db memory.db.bak`だ。新しいマシンへの移動はファイルをコピーすることだ。検査は任意のSQLiteクライアントで開くことだ。エクスポートツールなし、移行スクリプトなし、APIコールなし。ファイルであり、ファイルは存在する最も移植性が高く、最もよく理解され、最も耐久性のあるデータフォーマットだ。
これは見た目以上に重要だ。メモリがPineconeにあるとき、それはPineconeのフォーマットで、Pineconeのサーバーに、PineconeのAPIを通じてアクセス可能だ。Pineconeが価格設定、API、またはサービスを変更したとき、あなたのメモリは影響を受ける。メモリがマシン上のSQLiteファイルにあるとき、そのどれも適用されない。
インフラゼロ、コストゼロ、複雑さゼロ、そして外部データベースが匹敵できないパフォーマンス——なぜなら途中にネットワークがないから。AIエージェントのメモリにとって、それは妥協ではない——正しい設計だ。