アイデアは単純に見えます。すべてのメモをフォルダに入れて、そこにエージェントを送り込み、すべてを覚えているアシスタントを手に入れる。実際には、エージェントは違うものを見つけ、ドキュメントを混同し、5分前に言ったことを忘れてしまいます。理由はそのメモリの構造にあります。
エージェントには記憶がない
モデルはコンテキストウィンドウのみを持ち、それは1つのセッションだけ持続します。そこには現在の会話のメッセージとファイル、ルール、スキル、およびツールが保持している場合は過去のセッションからの短いメモが含まれています。他のすべてはモデルにとって存在しません。
一般的にエージェントの記憶と呼ばれるものは、外部ストレージと必要なピースを取り出してコンテキストに置くメカニズムの2つの部分で構成されています。このメカニズムはRAGと呼ばれます。
RAGとは何か
RAGはRetrieval-Augmented Generationの略です。名前の中に3つのステップがあります:
- Retrieval — ストレージ内で質問に適したフラグメントを見つけます。
- Augmented — それらをクエリに追加します。
- Generation — 追加されたテキストに基づくモデルからの応答を取得します。
これはコンテキスト制限を回避する方法です。本全体またはメモのベース全体をクエリに挿入することはできません。フィットしないか、非常にコストがかかります。RAGはモデルにエッセンスのみを渡します。
ステップバイステップでの動作方法
データの準備。 テキストは小さなフラグメントに切り分けられ、チャンクと呼ばれます。各チャンクは埋め込みモデルを通過し、長い数字のセット(エムベディング)に変換されます。数字はテキストの意味を表します。エムベディングはベクトルデータベースに格納されます。
クエリの処理。 ユーザーのクエリも埋め込みに変換されます。データベースはそれを保存されたものと比較して、最も類似したものを見つけます。これはセマンティック検索です。単語ではなく意味による一致です。
コンテキストの構築。 見つかったチャンクのテキストがクエリに挿入され、モデルに送られます。
エージェントの記憶ツールはすべてこれら3つのステップに基づいています。詳細が異なります。
RAGはボタンではなく開発
1つのファイルに「Claude Code用RAG」の完成したバージョンはありません。これは別のエンジニアリング分野であり、2つの道があります。パイプラインを自分で構築するか、既製のソリューションを接続するかです。以下が両方です。
自分で構築する:基本
最も便利なのはフレームワークLlamaIndexから始めることです。これは各RAGタスク用の既製モジュールのセットです。パイプライン全体を単独でカバーすることも、別のステップでより強力なツール同士を接続することもできます。3つのステップがあります。チャンキング、埋め込み、ベクトルデータベースです。
チャンキング
検索はチャンク単位で行われるため、切り分け方がすべてを決めます。主な戦略:
- サイズによる。 テキストは意味を無視して400~512トークンごとに切り分けられます。高速で予測可能ですが、文や表が切り分けられる可能性があります。オーバーラップが救います。1つのチャンクの末尾の10~20%が次のチャンクの開始に繰り返されます。
- 再帰的。 自然な境界で切り分け、最初に段落で切ります。独自の区切り文字を設定できるため、このメソッドはコードにも適しています。
- 文による。 制限に達するまで完全な文を収集します。思考が中断されませんが、長い文は非常に大きなチャンクを生成します。対話と質問・答え形式に適しています。
- ページ単位。 1ページは1チャンクです。PDFレポートとプレゼンテーション、テーブルをキャプションの近くに保つことが重要な場合に適しています。
- セマンティック。 各文の埋め込みを計算し、隣接する文の意味が異なるところで切り分けます。より正確ですが、各埋め込みモデルの呼び出しには時間とコストがかかります。
- モデルの力による。 ドキュメントが言語モデルに渡され、モデルが境界がどこかを決定し、同時に各チャンクの簡潔な説明も書きます。最も高価で遅い方法です。
- 後処理チャンキング(late chunking)。 モデルは最初にドキュメント全体を処理して、各単語が全テキストのコンテキストを取得し、その後でテキストをチャンクに分割します。これは通常の切り分けの上にある追加レイヤーです。長いコンテキストウィンドウを持つ埋め込みモデルが必要です。
選択方法。 10~20%のオーバーラップで400~512トークンの再帰的な切り分けから始めます。分析では、単純な512トークンの再帰的な切り分けが複雑なメソッドを回答精度で上回ります。セマンティックチャンキングとモデルチャンキングは、分析タスク用の大規模ベースで意味があります。
通常、2つのことがより多くの利益をもたらします:
- チャンクのメタデータ(タグ、日付、ドキュメントタイプ)とそれによるフィルタリング;
- 切り分け前のソースのクリーニング。
ツール。 シンプルなパイプラインにはLlamaIndexで十分です。より多くの戦略と速度が必要な場合は、Chonkieライブラリをご覧ください。PDFとOfficeファイルには次のものが有用です:
- pytesseract, pdf2image, PIL — スキャン認識の基本的なツール。
- LlamaParse — LlamaIndexエコシステムのパーサー、テーブルと複数列レイアウトを保存します。
- Unstructured — PDF、Word、PowerPoint、HTMLおよびメールからテキストを抽出し、見出しとリストを保存します。
- Docling — 同様のタスク用の幅広いフォーマット対応ツール。
- pdfplumber — 単語の座標を含むテキストを返すため、引用がドキュメントのどこから来たのかを表示できます。
LlamaIndexにはMarkdownメモ用のパーサーがあり、チャンクメタデータ内の見出し構造を保存します。
エムベディング
このステップで立ち止まる必要はありません。埋め込みモデルはたくさんあり、個人用ベースではそれらの違いは小さいです。paraphrase-multilingual-MiniLM-L12-v2やnomic-embed-textのようなローカル多言語モデルが適しています。
別のケースはマルチモーダルモデル、例えばGemini Embedding 2です。テキスト、画像、オーディオ、ビデオ、PDFを1つの意味空間に変換し、各形式用に個別のチェーンを構築する必要がありません。モデルは有料です。
ベクトルデータベース
ここで埋め込みが格納され、検索が行われます。データベースはローカル型とクラウド型があります。ローカルはベクトルをRAMに保持するため、ディスクへの保存を設定する必要があります。そうしないと、再起動後にすべてを再計算する必要があります。クラウドではプロバイダーがこれを管理します。
- Pinecone — クラウド、管理不要。ハイブリッド検索とメタデータフィルターがあります。有料、ローカルにはインストールできません。
- Qdrant — オープンソースで高速、高度なフィルタリング機能。ローカルインストール用の良い選択肢。
- Chroma — 軽量、1つのコマンドでインストール。プロトタイプと小規模個人用ベースに適しています。
- Milvus — 非常に大量のデータ用、ローカルとクラウドで動作します。
- pgvector — PostgreSQL拡張機能。データがPostgresにある場合に便利です。
その後、パイプラインをエージェントと共に構築できます。ステップと用語を既に知っており、何を得たいかを説明できます。
その他のRAGの種類
Graph RAG
通常のRAGはテキストを独立した部分に切り分け、それらの間の関連を失います。グラフ版はテキストから実体と関連性を抽出し、グラフデータベースに保存します。エージェントはフラグメントだけでなく、それが何に関連しているかも見ます。このアプローチは、書籍、記事、トランスクリプト、個人ノートなどの接続されたテキストにはよく機能します。バラバラなテーブルにはあまり適していません。
Obsidianユーザーへの重要な注意:[[note]]形式のリンクはグラフパイプラインに何ももたらしません。それにとっては単なるテキストであり、関連性は自動で構築します。
ツール:フレームワークとしてMicrosoft GraphRAG、グラフデータベースとしてNeo4j、可視化としてGephi。深く学ぶにはEssential GraphRAGという本があります。
エージェンティックRAG
これはあらゆるパイプラインの上にある拡張機能です。エージェント自体が検索を制御します。クエリを解析し、ツールを選択し、見つけたものを評価し、データが不足している場合は別の表現で検索を繰り返します。答えに必要なコンテキストが得られるまでサイクルが続きます。
ツール:シンプルなケースにはLangChain、ループ、分岐、自己検証が必要な場合はLangGraph。
階層型RAG
ドキュメントは大きな親フラグメントに分割され、それが小さな子フラグメントに分割されます。ノイズが少ないので小さいもので検索し、モデルは親フラグメント全体を返します。これにより古いジレンマが解決されます。小さいチャンクは正確ですがコンテキストに乏しく、大きなチャンクはその逆です。
LlamaIndexにはこれ用のRaptorPackがあり、HierarchicalNodeParserとAutoMergingRetrieverのペアもあります。最初のものはドキュメントを複数のレベルに切り分け、2番目のものは見つけた小さなピースを親フラグメントにマージします。
既製ソリューション
記載されたほとんどすべてのツールはMCPを通じてエージェントに接続されます。
- Mem0 — ターンキーパイプライン、クラウドまたはローカル。ベクトル検索、グラフ、メタデータを組み合わせ、結果を再ランク付けできます。メモリは自動的に充実します:システムはセッションから重要な事実と解決策を抽出します。グラフ部分はベクトル部分よりもかなりシンプルです。
- QMD — Markdownノートのローカル検索。ローカルモデルがクエリを拡張し、その後、単語検索と意味検索が並行実行され、結果が統合され再ランク付けされます。チャンキングはMarkdown構造を考慮します。メモリ集約的です。
- OpenViking — メモリをファイルシステムとして保存し、viking://形式のアドレスを使用します。各レコードに3つの詳細度レベルがあります:短い要約、概要、完全なテキスト。検索はまず適切なディレクトリを選択し、その後より深く進むため、検証が容易です。
- Graphiti — グラフデータベースの上のレイヤーで、事実を時間に紐付けます:エンティティがいつ現れたか、関係がどのように変化したか、事実がいつ古くなったか。常に変化するデータに便利です。例えば、プロジェクト履歴などです。
- Hindsight — 4つのタイプのレコードを持つグラフメモリです:世界に関する事実、エージェントの経験、信頼度評価付きの意見、観察。意味、単語、グラフ、時間で検索できます。インストール直後に動作し、プラグインとしてClaude Codeに接続できます。
- Cognee — カスタマイズ可能なナレッジエンジン:ベクトル、グラフ、メタデータを使用します。数十の形式を受け入れ、独自にエンティティグラフを構築し、いくつかのコマンドで立ち上げられます。
始め方
- 最小限のパイプラインを構築する:再帰的なチャンキング、ローカル埋め込みモデル、ChromaまたはQdrant。
- 実際の10個の質問でテストする。
- メタデータとフィルターを追加する。
- 具体的な検索エラーが見える箇所でのみ複雑化させる。
この記事のツールのほとんどは、ローカルインストール時に無料です。