Kanji
・クラウドエンジニア / フリーランス ・1993年生まれ ・愛媛県出身 / 東京都渋谷区在住 ・AWS歴5年 プロフィールの詳細
目次
日々の開発で AI コーディングエージェント(Google Antigravity、Anthropic Claude Code、AWS Kiro)を相棒として日常的にコワークさせる中で、僕が最も頭を抱え、何度も手戻りを経験したのが 「エージェントの長期記憶(Long-Term Memory)の劣化と、コンテキスト窓(トークン)の浪費」 でした。
最初は「LanceDB などのベクトルデータベースを用意して、エージェントが過去の決定やエラーをそこに放り込めば解決する」と思っていました。しかし、実際に運用を続けて記憶が数百件を超えたあたりから、現場で以下のような深刻な破綻パターンに直面しました:
本記事では、この課題を根本から解決するために構築した Gen 3 長期記憶アーキテクチャ──「Markdown SSOT(唯一の真実)」+「Hybrid GraphRAG(LanceDB + SQLite FTS5 + RRF + WikiLink CTE + Cross-Encoder)」 の全貌を詳しく解説します。
さらに、システムプロンプトや運用ルールを 「英語化」することでコンテキスト消費量を約 40〜50% 削減 しつつ、多言語 Embedding と Cross-Encoder によって日本語の自然言語クエリから高精度に知見を引き出す「バイリンガル・オーケストレーション」の実践手法、および Apple M5 Mac 実機における 554 チャンク実走ベンチマーク結果を公開します。
AIエージェントの記憶基盤は、これまで 3 つの世代を経て進化してきました。
.md
memory_save
grep
エージェントに「この修正の知見を覚えておいて」と指示し、エージェントが内部で db.save(content=...) を呼んでバイナリに格納する方式では、人間がその内容を Git の差分(PR)としてレビューできません。間違ったパラメータや時代遅れのワークアラウンドが保存されても、それを特定して削除する手段がなく、エージェントが過去のバグを再生産し続ける「ゴースト記憶」の温床となります。
db.save(content=...)
ベクトル検索は「なんとなく意味が似ている文章」を探すのには優れていますが、 「ポート番号 30001 」や「エラーコード AUTH_TIMEOUT_504 」のような完全一致が必須のキーワード検索には極めて弱い という致命的弱点があります。 データが 500 件を超えると、過去の膨大なタスクログや実験レポートが「開発」「設定」「エラー」といった類似ベクトルに引き寄せられて上位を埋め尽くし、肝心の最新設定が検索結果の 20 位以下に沈んでしまいます。
30001
AUTH_TIMEOUT_504
実際のソフトウェア開発における知見は、単体で完結することは稀です。「ある日発生した認証タイムアウト障害(Incident)」があり、その分析から「ポート固定と待機延長を決めたアーキテクチャ設計(ADR)」が生まれ、それに基づいて「エージェントの運用ルール(Rule)」が策定されます。 単なるフラットなベクトルDBでは、これら 3 つのドキュメントのリンク関係が完全に切断され、エージェントは背景の文脈を理解できません。
検索精度が低いため、開発者は「とりあえず上位 15 件くらいをプロンプトに入れよう」とします。しかし、1 チャンクが 400 トークンあれば、15 件で 6,000 トークン を消費します。 これは API コストを跳ね上げるだけでなく、LLM のコンテキスト窓を無駄な文章で埋め尽くし、プロンプトの指示に対する注意力を著しく低下させる「Lost in the Middle」を引き起こします。
長期記憶やエージェントルールを設計する上で、見落とされがちながら劇的な効果を発揮するのが 「内部プロンプト・ルールの英語化」 です。
現代の主要な LLM(Claude 3.5 Sonnet / Opus、GPT-4o、Gemini 1.5 Pro)が採用する BPE(Byte-Pair Encoding)トークナイザーは、英語の語彙をベースに最適化されています。
【日本語と英語のトークン消費量比較】 ● 日本語: 「エージェント長期記憶の運用ルールとナレッジ昇格ゲート」 ➔ 約 28 文字 / 22〜26 トークン (1文字あたり約 0.8〜1.0 トークン、平仮名・漢字交じりで最大 1.5 トークン) ● 英語: "Operational rules for Agent Memory Hub and knowledge promotion barrier" ➔ 74 文字 / 11 トークン (1単語あたり約 1.1〜1.2 トークン)
同じ設計規程やルールを記述した場合、 英語は日本語に比べてトークン消費量が約 40%〜55% で済みます 。
「ユーザーへのアウトプットは自然な日本語(です・ます調)で行うが、エージェントが参照する内部ルールや長期記憶のドキュメント(ADR・Rules)は英語(または日英併記のデュアル同期)にする」というアプローチを採用します。
┌─────────────────────────────────────────────────────────────┐ │ ユーザー (日本語対話) │ │ 「ポート固定とパスキー認証タイムアウトの対策を教えて」 │ └──────────────────────────────┬──────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────┐ │ AI エージェント (オーケストレーター) │ │ ・ユーザー向け返答: 自然な日本語 │ │ ・内部思考 (Thinking): 英語または簡潔な日本語 │ │ ・システムプロンプト / ルール (Rules): 英語 (トークン半減) │ └──────────────────────────────┬──────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────┐ │ 多言語 Embedding (multilingual-e5-small) │ │ 日本語クエリ ➔ 英語の ADR / Incident / Rules ドキュメントを │ │ 言語の壁を越えてベクトル類似度で正確にマッピング │ └─────────────────────────────────────────────────────────────┘
多言語モデル( Xenova/multilingual-e5-small )を活用することで、日本語で「パスキー認証のタイムアウト対策」と検索しても、英語で記述された WebAuthn timeout permanent fix の ADR を高い類似度で検出可能です。
Xenova/multilingual-e5-small
WebAuthn timeout permanent fix
これにより、 コンテキスト窓を最大 50% 節約しながら、ユーザー体験は完全な日本語対話を維持する という理想的な環境が実現します。
この課題を解決するために開発したのが、以下の Gen 3 アーキテクチャです。
AND
UI
DB
認証
LIKE
2 つの異なる検索スコア(コサイン類似度と BM25 スコア)を直接比較することはできません。そのため、順位に基づいた調和平均である RRF を用いて統合します:
R R F _ S c o r e ( d ) = 1 60 + R a n k v e c ( d ) + 1 60 + R a n k b m 25 ( d ) RRF\_Score(d) = \frac{1}{60 + Rank_{vec}(d)} + \frac{1}{60 + Rank_{bm25}(d)}
これにより、ベクトルとキーワードの「両方で上位にある文書」および「どちらかで圧倒的首位にある文書」がバランス良く上位 15 件に残ります。
上位候補に含まれるファイル(Stem ID)から、SQLite の再帰 CTE(共通テーブル式)を用いて graph_edges を走査します:
graph_edges
WITH RECURSIVE graph_cte(source, target, depth) AS ( SELECT source_file, target_link, 1 FROM graph_edges WHERE source_file IN ('incident-20261014-passkey-timeout') UNION SELECT e.source_file, e.target_link, g.depth + 1 FROM graph_edges e JOIN graph_cte g ON e.source_file = g.target WHERE g.depth < 2 ) SELECT DISTINCT source, target, depth FROM graph_cte;
この走査により、例えば「障害レポート」がヒットした際、そこに [[adr-20261015-agent-memory-hub-gen3]] という WikiLink があれば、その ADR のサマリチャンクが 自動的に追加候補としてマージ されます(実測 0.19 ms)。
[[adr-20261015-agent-memory-hub-gen3]]
マージされた 15〜20 件の候補ペア (Query, Candidate Document) を、Apple M5 に最適化された超軽量モデル hotchpotch/japanese-reranker-xsmall-v2 (ONNX INT8 arm64、わずか 37MB)に入力します。 Cross-Encoder は、Bi-Encoder(ベクトル類似度)とは異なり、クエリと文書の全文交差アテンション(Cross-Attention)を計算するため、ニュアンスの適合度を極めて精密に 0.0〜1.0 の確率値で判定します。
(Query, Candidate Document)
hotchpotch/japanese-reranker-xsmall-v2
スコア上位 3〜5 件のみを厳選 してエージェントに返却します。
記憶システムを導入しても、何でもかんでも保存してはすぐにゴミ屋敷化します。そこで「短期作業記憶」と「長期記憶 SSOT」の間に明確な ナレッジ昇格ゲート(Promotion Barrier) を設けます。
┌─────────────────────────────────────────────────────────────┐ │ ① 短期作業記憶: brain/<conversation-id>/ (エフェメラル) │ │ ・エージェントの思考ログ (thinking) │ │ ・試行錯誤のスクラッチコード (/scratch/) │ │ ・タスク一時成果物 (implementation_plan.md) │ └──────────────────────────────┬──────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────┐ │ ② ナレッジ昇格ゲート (タスク完了時・人間レビュー時) │ │ 【判断基準】 │ │ ・単なる作業ログか? ➔ 昇格せずセッション終了で破棄 │ │ ・恒久的な設計判断 (ADR) か? ➔ docs/adrs/ へ昇格 │ │ ・再発防止策 (Incident) か? ➔ docs/incidents/ へ昇格 │ └──────────────────────────────┬──────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────┐ │ ③ 長期記憶 SSOT: Git-Managed Markdown Vault (永続) │ │ ・docs/adrs/adr-YYYYMMDD-xxx.md │ │ ・docs/incidents/incident-YYYYMMDD-xxx.md │ │ ・docs/rules/rule-xxx.md │ │ ※ git commit 時に 0.2 秒で SQLite & LanceDB へ自動同期 │ └─────────────────────────────────────────────────────────────┘
README
view_file
brain/<conversation-id>/
docs/adrs/
docs/incidents/
本アーキテクチャの有効性を検証するため、過去の膨大な運用レポートや設計書を含む 実環境の全 554 チャンク を対象に、Apple M5 Mac(32GB RAM)上で実機ベンチマークを実行しました。
エージェントが一時的な作業ログを長期記憶に保存する基準と昇格ルール
rules/rule-agent-memory.md#1
agent-memory_JP.md#3
ポート 30001 パスキー認証
incidents/incident-20261014-passkey-timeout.md#2
WebAuthn パスキー認証タイムアウトの根本原因と再発防止策
incidents/incident-20261014-passkey-timeout.md#0
DB スキーマと UI 設計
incident
adr
rule
bge-reranker-v2-m3
当初、リランカーとして広く利用されている bge-reranker-v2-m3 (588MB)を検討していました。しかし、M5 実機テストにおいて、 15件の候補リランクに 2,480 ms(約 2.5 秒)を要し、ピークメモリが 2.6 GB に達する ことが判明しました。
対して、本採用とした hotchpotch/japanese-reranker-xsmall-v2 (ONNX INT8 arm64)は: - モデルサイズ : 37 MB( 1/15 に軽量化 ) - 推論速度 : 213 ms( 11.6 倍高速 ) - メモリ消費 : 648 MB
日本語および日英混合の技術文章において、上位 3 件をスコア 0.7 超で仕分ける圧倒的な識別精度を発揮し、対話型エージェントに組み込んでもストレスのない実用速度を達成しました。
AIエージェントの長期記憶を巡る議論は、「どのベクトルDBを選ぶか」というツール論に終始しがちでした。しかし、現場で格闘して見えてきた本質的な問題は、以下の 3 点にありました:
この Gen 3 アーキテクチャを導入したことで、僕の開発環境では、エージェントが過去の障害や設計判断を正確に踏まえた上でコードを自律生成できるようになり、プロンプトのトークン消費量も劇的に抑制することができました。
とはいえ、まだすべてが完璧なわけではありません。例えば、数千件規模に肥大化した際の Cross-Encoder のレイテンシ推移や、複数エージェントが同時に書き込みを行った際の競合調停など、実際の運用の中で見極めたい領域はまだ残っています。
AIエージェントとのコワークを次のステージに進めたいエンジニアにとって、僕のこの泥臭い試行錯誤と設計が、少しでも実用的なリファレンスになれば嬉しいです。
本記事で解説した 4大AIエージェント(Antigravity, Kiro, Claude Code, Codex)完全対応の AGENTS.md テンプレート、hooks.json、Gitガードスクリプト一式をGumroadにて配布準備中です。
本ブログで検証している自律型AIパイプラインと最新LLM推論を実践投入。機関投資家動向・テクニカル指標・マクロ環境を毎日自動スコアリングしています。
Claude Code / Antigravity 等のAIエージェント活用標準化、MCP/RAG長期記憶基盤の構築、AWS・Google Cloud のモダナイズ設計を支援します。