RAGは死んだ。再び。(Claude Agent SDK + メモリ)

Anthropic・Claude・ダリオアモデイ
この記事は約9分で読めます。

Claude Agent SDKを活用し、複雑な構造のドキュメントから情報を正確に抽出するための多層メモリシステムの実装方法を解説する動画である。Milvusを用いたセマンティック検索と、ファイルシステムを直接操作するツールを組み合わせることで、画像や表を含むデータに対しても高度な情報検索と推論が可能になる仕組みを紹介している。

RAG is Dead. Again. (Claude Agent SDK + Memory)
Checkout Milvus (44k stars on GitHub): can do a lot more than coding. In this video, I show you how to build a dual...

多層メモリシステムを備えたAIエージェントの概要

Claudeはコーディング以外にも様々な用途で活用できます。この動画では、あらゆるドキュメントからの情報検索に使用できる多層メモリシステムをエージェントに提供するセットアップをご紹介します。このシステムはClaude Agent SDKの上に構築されていますが、Claude Codeと一緒に使用することも可能です。これは私のアジェンティック・ファイル検索のオープンソースプロジェクトのアイデアを活用しており、構造化されたドキュメントと非構造化ドキュメントの両方から情報を検索するのに役立つシンプルなツール群をエージェントに提供します。

どのように機能するかをお見せするために、フリーテキスト、表、画像が組み合わさった非常に複雑なレイアウトを持つ16種類のドキュメントを用意しました。ここで私は、複数の異なるドキュメントからの情報検索を必要とし、さらにエージェントがその結果について推論する必要がある複雑な質問をしています。その仕組みは次のとおりです。エージェントは最初に計画を立て、フォルダを読み込み、それに基づいて興味深いと思われるドキュメントを特定します。そしてそれらのファイルを解析し、個別に確認します。その後、セマンティック検索を行い、これらすべての分析と結果に基づいて、提供されたドキュメントにしっかりと基づいた回答を実際に導き出します。また、検索プロセス中に特定のソースを見逃した場合、戻って確認する機能も備えています。

情報検索の代わりに、このシステムをエージェントのメモリシステムとして使用することもできます。現在のところ、このエージェントはClaude Agent SDKによって駆動されていますが、MCPサーバーやスキルを作成するだけで、Claude CodeやCodexでも同じセットアップを使用できます。

メモリシステムの2つの構成要素

さて、このメモリシステムには2つの異なる構成要素があります。1つ目はセマンティック類似性に基づくものです。これには、高性能なベクトルストアであるMilvusを使用しています。これについては動画の後半で詳しく説明します。そして2つ目は、ファイルシステムを使用できるシンプルなツールです。これらのツールには、フォルダ内のドキュメントのスキャン、ドキュメントの読み取り、解析、そしてドキュメントの検索が含まれます。これらは、Claude Codeが特定のコードセグメントを検索する際に利用できるツールと考えてください。

さらに、もう一つ工夫をしています。画像が含まれているページについては、すべてスクリーンショットを撮ります。ドキュメントの解析はすべて、LlamaIndexのオープンソースプロジェクトであるLlamaParseを通じて行われています。そしてベクトルストアには、データに合わせて拡張できる高性能なベクトルストアであるMilvusを使用しています。

データ取り込みパイプラインとLlamaParseの活用

こちらがデータ取り込みのパイプラインですが、とても馴染みのあるものに見えるでしょう。標準的なパイプラインですが、1つだけ重要な違いがあります。ドキュメントの解析にはLlamaParseを使用しており、これはPDFファイル内の複雑な構造を処理するのに非常に優れています。ここでのアイデアは、テキストを処理できるだけでなく、画像の存在を検出し、それらについては実際にスクリーンショットを撮って個別に保存できるということです。

これは、すべてのページのスクリーンショットを撮る必要がないため非常に役立ちます。画像やグラフなど、実際に視覚的なコンテンツが含まれているページのスクリーンショットだけを撮ればよいのです。同時に、テキストベースの検索に不可欠となるすべてのテキストコンポーネントも保持します。その後、シンプルなチャンク化プロセスにかけます。今回はGeminiの埋め込みを使用しています。これは高次元の埋め込みであり、すべてがMilvusベクトルストアに保存されます。

スケーラブルなベクトルデータベースMilvus

保存しているデータ構造についてお話ししましょう。Milvus内に保存しているすべてのもののシンプルなスキーマがこちらです。これは素晴らしく、数十億のレコードにまで拡張できます。現時点では、ソースドキュメント、抽出されたテキスト、計算された埋め込み、そこから抽出された実際の画像ファイルへのパス、そしてメタデータに基づくフィルタリングに使用するいくつかの重要なメタデータを含めています。

では、なぜMilvusなのでしょうか。これはスケールを前提に構築された完全なベクトルデータベースです。CPUとGPUの両方のアクセラレーションをサポートしており、非常に魅力的な選択肢となっています。Milvus Liteを使用している場合は、すべてを含む単一のファイルを作成するだけで済みます。しかし拡張が必要な場合、これは完全に分散されたKubernetesネイティブアーキテクチャをサポートしており、水平方向の拡張が可能です。つまり、数十億のベクトルに対して何万もの検索クエリを実行できるということです。そして最高の利点は、Apache 2.0ライセンスの下にあることです。そのため商業目的で使用することができ、GitHubで4万以上のスターを獲得しています。ホスト型のソリューションが必要な場合は、Milvusを完全なマネージドサービスとして実行するZilliz Cloudがあります。使い方は非常にシンプルです。まずクライアントを作成し、コレクション名とベクトルストアの次元数を定義し、その後データ取り込みのためにデータを提供するだけです。彼らは今日の動画の親切なスポンサーでもあります。

エージェントが備える2種類のツール

エージェント自体には2つのツールセットがあります。1つはMilvusを利用したものです。これは基本的なセマンティック類似性によるウェブ検索であり、エージェントは視覚情報を含むページのスクリーンショットである画像も取得できます。もう一方は、ファイルシステムへのアクセスです。基本的には、エージェントがフォルダをスキャンし、さまざまなドキュメントをプレビューし、解析し、ドキュメント全体を読み取り、パターンを検索できるようにする一連のバッチツールです。これらのツールは、あらゆる種類の検索を行う際に非常に強力です。

ファイルシステムベースのツールを通じてすべてのドキュメントを読み取ることはかなりコストがかかります。そのため、事前フィルタリングとしてインデックス化されたパスを使用します。セマンティック類似性検索を使用して検索スペースを縮小し、最も関連性の高いチャンクを特定します。その後、これらのファイルシステムベースのツールを使用して、これらのチャンクが属するドキュメント全体を読み取ります。このプロセスにおいて、システムは十分に賢いため、最初の検索プロセスでドキュメントを見逃した場合、戻って特定のドキュメントを確認することができます。

検索パイプラインの仕組み

こちらが検索パイプラインです。ユーザーが質問をします。埋め込みを計算します。Milvusがコサイン類似性に基づく検索を行います。上位のチャンクを取得し、Claude Agent SDKを通じて処理します。エージェントはそれらのチャンクを確認し、推論することができます。これらのチャンクがどのドキュメントから来たものかを見つけ出し、必要であればそのドキュメントを読み通し、最初のセマンティック検索で関連するドキュメントを見逃したと判断した場合は後戻りすることができます。

GitHubのリポジトリがこちらです。実験できるようにコードが公開されています。ここで、それぞれのツールが正確に何であるかの概要を把握できます。先ほど説明した主要な戦略がこちらです。最初に並列スキャンを行い、次に深く掘り下げ、さらに情報が必要な場合は後戻りします。セットアップ方法の手順も記載されています。私はすでにすべてをセットアップ済みなので、このシステムがどのように機能するか、いくつかの例をお見せしましょう。

実際の動作デモと複雑なクエリの処理

では、このシステムがどのように機能するかの例をお見せします。長期的な視野での検索が可能です。今回の例では、私が複数の異なる情報源から収集した医療データを使用します。例えばこちらは高血圧の管理に関するFDAの資料です。これらのドキュメントを見ると、フリーテキスト、表、画像が含まれていますよね。単一の構造ではないため、非常に複雑になっています。Doclingのようなものを使用すると、これを解析するのはかなり難しいでしょう。そこでLlamaParseの出番です。LlamaParseが非常にうまくやってくれることの1つは、表からデータを抽出できるだけでなく、画像を識別し、それらのページのスクリーンショットを撮って別の名前で保存できることです。

さて、この最初の質問は特定の薬の副作用に関するものです。これは、アジェンティックRAG、つまり検索拡張生成システムであれば簡単にできることです。セマンティック類似性を使用していれば、これが正確に何を意味するのかを確認するだけで、おそらく一発でドキュメントを見つけることができるからです。そして、ここでもまさにそのようなことが起きています。最初は計画について考え、次にセマンティック検索メカニズムを通じてクエリを実行し、特定の表が1つあると判断してそれを取得します。その後、すべての情報が揃っていることを確認するためにもう1つの検索クエリを実行し、参照していたドキュメントにしっかりと基づいた回答を非常に正確に生成することができます。

さらに複雑なクエリを実行することもできます。例えば、FDAとADAの糖尿病薬ガイドを比較し、それぞれがカバーしている内容の違いは何かといったクエリを実行するとします。これは、通常のRAGシステムでは、クエリの分解を行わない限り苦労するかもしれない内容です。最初は一方のガイドを見て、次に2つ目のガイドを見て、そして2つ目のガイドを見るためのもう1つの推論ステップを経る必要があります。ここでは特定のガイドに言及したため、実際にドキュメントやフォルダをスキャンし、その特定のファイルを特定して両方をピックアップし、最終的な答えを導き出すための推論ループに入ります。

また、もっとオープンエンドな質問をすることもできます。血圧の薬を飲んでいる患者が注意すべき食べ物の相互作用は何ですかというような質問です。この場合、エージェントは複数回の処理を行うことを決定します。そして実際に見てわかるように、検索クエリを実行するたびに、幅広い情報源を確実に捉えるために、収集しているコンテキストに基づいてクエリを変更し続けています。

さらなるツールの活用とまとめ

しかし、ここでできることは他にもあります。エージェントは特定のツールセットにアクセスできます。エージェントにそれらのツールを使うよう指示することができます。例えばこのケースでは、血液サラサラの薬について探し、その後ドキュメントフォルダをスキャンして、最初の検索結果でカバーされていなかった追加のソースを見つけるよう求めています。ここで見られるプロセスは、最初に検索を行い、次に生成したクエリに基づいてさまざまなドキュメントの解析を開始し、それらを読み始めるというものです。これには約16の異なるステップがかかります。

しかし、これによってすべての関連ドキュメントを確認し、最初の検索で見逃されたものがあれば確実にそれを捉えられるようにしており、それがこのシステムの素晴らしいところでもあります。このシステムを通じて、かなり複雑なクエリを実行できます。以上が、私が現在構築している、Claudeエージェントに永続的なメモリを与えるプロジェクトの簡単な概要でした。コードはオープンソースです。GitHubリポジトリへのリンクは動画の概要欄に記載しておきます。この動画が役に立ったなら幸いです。ご視聴ありがとうございました。それではまた次回の動画でお会いしましょう。

コメント

タイトルとURLをコピーしました