Amazon Bedrock Knowledge Bases でもサポート開始 (preview) した噂の GraphRAG とは一体なんなのか ?!
Author : 本橋 和貴
こんにちは、機械学習スペシャリストソリューションアーキテクトの本橋です。みなさんは日々の業務の中で生成 AI を活用していますか?
大規模言語モデル (LLM) を企業のナレッジベースと組み合わせて活用する際、一般的なアプローチとして RAG (Retrieval-Augmented Generation) が注目されています。RAG は、質問に関連する文書をベクトル検索などで取得し、その情報を LLM に提供することで、より正確な回答の生成を可能にします。
しかし、従来のベクトル検索ベースの RAG には、いくつかの課題があることが指摘されています。特に以下の点が重要な課題として挙げられます。
- 関係性の分断 : 文書をチャンク (断片) に分割する際に、エンティティ間の関係性が失われてしまい、「XX が YY にどのように影響したか」といった因果関係を説明する質問に対して十分な回答が困難になる。
- 冗長な情報の取得 : 十分な情報をコンテキストに含めるために大量のチャンクを取得すると、その中から重要な情報を抽出するのが困難になることがある (Lost in the middle ジレンマ)。
- グローバルな文脈の欠如 : 局所的な情報の取得に優れる一方で、文書全体を通じた広い文脈や関連性の把握が困難。
このような課題に対して、グラフベースのアプローチである GraphRAG が新たな解決策として注目されています。GraphRAG は、文書から抽出した情報をエンティティとその関係性として構造化されたグラフとして表現します。これにより、テキスト間の相互関係を保持しながら情報を圧縮し、より正確で文脈を考慮した回答の生成を実現します。
2024 年 12 月に実施された AWS の最大の年次イベントである AWS re:Invent において、高度な RAG 構築のマネージドサービスである Amazon Bedrock Knowledge Bases の GraphRAG サポート (プレビュー) が発表 されました。こちらの機能では AWS が提供しているグラフデータベースである Amazon Neptune をバックエンドとして GraphRAG の仕組みを構築することができます。
本記事では、Amazon Bedrock Knowledge Bases と Amazon Neptune を活用した GraphRAG の実装方法について解説し、従来の RAG が抱える課題をどのように解決できるのかを具体的に示していきます。
グラフデータベースと GraphRAG の基礎
グラフデータベースってなに?
データベースの世界では基本的にテーブルという二次元の構造でデータを管理し、主キーや外部キーを用いてテーブル間の関係を表現します。しかし、現実世界のデータは必ずしもテーブル構造に適していません。例えば、「誰が誰を知っているか」「どの商品がどの商品と関連しているか」「あるアイデアが別のアイデアにどのように影響したか」といった複雑な関係性を、リレーショナルデータベースで表現しようとすると、多数の結合テーブルが必要になり、クエリも複雑化してしまいます。
グラフデータベースは、このような関係性を直感的に表現・管理するために設計されたデータベースです。その基本構造は以下の通りです。
- ノード (頂点) : エンティティを表現する。例えば、人物、会社、場所、商品など。各ノードには、名前や属性といったプロパティを持たせることができる。また、ノードは「Company」「City」「Employee」のようなラベルを持つことができ、これによってノードの種類を分類することができる。
- リレーション : ノード間の関係性を表現し、エッジとも呼ばれる。例えば「HAS_CEO (〜という CEO がいる)」「LOCATED_IN (〜に位置する)」「INFLUENCED (〜に影響を受けた)」といった関係性を表す。リレーションは方向性を持ち、さらにプロパティ (開始日や終了日など) を付与することができる。
このような構造により、例えば「Company ラベルのノードが City ラベルのノードに対して LOCATED_IN リレーションを持つ」といった形で、現実世界の関係性を直感的にモデル化することができます。
このような構造を持つグラフデータベースは、後述する GraphRAG において、文書から抽出した知識を構造化し、関係性を保持したまま検索可能にするための重要な基盤技術となっています。Amazon Neptune は、このようなグラフデータベースをマネージドサービスとして提供し、スケーラブルで信頼性の高いグラフデータの管理を実現します。
GraphRAG の仕組みと利点
GraphRAG は、文書から抽出した知識をグラフ構造として表現し、それを活用して高精度な質問応答を実現する手法です。その処理は大きく分けてグラフ構築フェーズと検索 + テキスト生成フェーズの 2 つで構成されています。
グラフ構築フェーズでは、まず文書からエンティティとその関係性を抽出し、トリプレット (SVO : 主語-述語-目的語) の形式に変換します。このトリプレットはグラフデータベースに格納され、主語と目的語がノードとして、述語がリレーションとして表現されます。また、それぞれの要素に関する追加情報はプロパティとして保存されます。トリプレットの抽出には、Amazon Comprehend のような自然言語処理サービスの構文解析器を用いることもできますし、LLM にグラフ構造抽出処理を指示することもできます。
検索 + テキスト生成フェーズでは、ユーザーからの質問を基にグラフのクエリを生成し、グラフデータベースから関連する部分グラフを取得します。この構造化された情報が LLM に提供され、LLM はこれを基に回答を生成します。
GraphRAG の最大の特徴は、エンティティ間の関係性を明示的に保持できる点です。従来の RAG では失われがちだった「どのように影響したか」といった因果関係を、グラフ構造として保存することで、より正確な回答が可能になります。例えば、「印象派の技法が後世の芸術運動にどう影響したか」という質問に対して、影響の連鎖を適切に追跡できるようになります。
文書の内容をグラフ構造として圧縮することで、情報の冗長性も効果的に排除できます。同じエンティティに関する情報は自然に統合され、「Lost in the middle」ジレンマの問題が緩和されます。また、情報が構造化された形式で保存されることで、LLM がより確実に情報を理解できるようになります。
これらの機能は、複雑な技術文書の理解と質問応答、製品間の関連性を考慮したカスタマーサポート、研究論文の引用関係や影響の分析、法令や規制の関連性の把握など、幅広いユースケースで活用できます。特に、Amazon Bedrock Knowledge Bases と Amazon Neptune の統合により、これらの利点を簡単に活用できる環境が整いました。
Amazon Bedrock Knowledge Bases による GraphRAG 構築
GraphRAG を構築する前に取り込みたいドキュメントを Amazon Simple Storage Service (Amazon S3) に配置してください。以下では こちらの手順 に従って AWS のホワイトペーパー を Amazon S3 にアップロードした前提で進めていきます。今回は東京リージョンで作業しています。
1. 現状、ドキュメントからのグラフの構築には Anthropic Claude 3 Haiku が用いられます。まずは Amazon Bedrock のダッシュボードから モデルアクセスの設定 を変更し、Claude 3 Haiku のアクセスを有効化してください。
クリックすると拡大します
次に、Amazon Bedrock Knowledge Bases のダッシュボードの「Create (作成)」メニューを開き、「Knowledge Base with vector store」をクリックしてください。
クリックすると拡大します
3. 「Step 1 Provide Knowledge Base detals」は変更せず、次に進みます。
4. 「Step 2 Configure data source」で、検索対象のドキュメント (今回はホワイトペーパー) を配置した S3 URI を入力します。今回はその他の設定は変更せず、次に進みます。
クリックすると拡大します
5. 「Step 3 Select embeddings model and configure vector store」で、ベクトル埋め込みに用いるモデルを選択します。今回は "Titan Embeddings G1 - Text v1.2" を選択します。
クリックすると拡大します
6. ベクトルデータベースの設定では「Quick create a new vector store - Recommended」を選択し、ベクトルストアは「Amazon Neptune Analytics (GraphRAG) - Preview」を選択します。
クリックすると拡大します
7. 10 分ほど待機すると Neptune Analytics の作成が完了します。
8. 作成されたナレッジベースの詳細画面に遷移したら、データソース一覧にあるデータソースにチェックを入れ、「Sync (同期)」ボタンをクリックします。
クリックすると拡大します
すると、ドキュメントのチャンク化、ベクトル化、グラフ構造の作成などの処理が実行されます。裏側で Titan Text Embeddings や Claude 3 Haiku が甲斐甲斐しく働いている間、ドキュメントのサイズによって数分から数時間待つ必要があります。
※ 今回投入した AWS のホワイトペーパーは 60 ファイルあり、合計 2,163 ページが含まれています。私のケースでは、同期は 17 分程度で完了しました。
質問応答の実例
作成したナレッジベースの詳細画面の右側の「Test Knowledge Base (ナレッジベースのテスト)」ペインで GraphRAG の質問応答をテストすることができます。ここでは回答生成モデルとして Anthropic Claude 3.5 Sonnet を選択し、「Amazon SageMakerのトレーニングワークフローにおいて、データ品質の問題がモデルパフォーマンスに与える影響と、それを緩和するためのベストプラクティスについて教えてください」と質問してみました。
クリックすると拡大します
回答は以下のようになりました。
Amazon SageMakerのトレーニングワークフローにおいて、データ品質の問題はモデルパフォーマンスに大きな影響を与える可能性があります。トレーニング時には通常、クリーンなデータを使用しますが、本番環境では異なるソースからデータが送られてくるため、モデルの性能が低下する可能性があります。
この問題を緩和するためのベストプラクティスとして、以下の2つのアプローチが推奨されます:
1. 統計の比較:ソース入力データとMLモデルが実際にトレーニングに使用したデータを比較します。これには定量的評価(データ数、データ期間、入力データの精度の確認)と定性的評価が含まれます。
2. クリーンでないデータ入力に対するモデルの検証:本番環境に近い状態でモデルの性能を評価します。[1][2]
さらに、データ品質の問題に対処するためのベストプラクティスには以下が含まれます:
1. 小規模で統計的に有効なサンプルデータセットから始め、異なるデータ準備戦略を反復的に試す。
2. データクリーニングプロセス中に、異常を警告するフィードバックループを実装する。
3. データの整合性を継続的に強制する。
4. 管理されたETL(抽出、変換、ロード)サービスを活用する。
5. Amazon SageMaker Ground Truthを使用して、高品質のトレーニングデータセットを迅速かつ正確に構築する。
6. データの可視化と分析を行い、パターンを識別する。
これらの実践により、データ品質の問題がモデルパフォーマンスに与える影響を最小限に抑え、より信頼性の高いMLモデルを開発することができます。[3][4]
いかがでしょうか。クエリとしては、(1) 複数のドキュメントにまたがる情報を統合する必要がある、(2) 文脈を理解する必要がある、(3) 因果関係の理解が必要、といった観点で考えてみましたが、GraphRAG によってよい回答が得られたのではないかと思います。
Neptune Analytics グラフの可視化
Amazon SageMaker AI Notebook インスタンスの作成
Neptune Analytics に構築されたグラフに対してクエリを叩いたり、可視化をするには Amazon SageMaker AI Notebook インスタンス を利用するのが簡単です。「Creating a new Neptune Analytics notebook using a AWS CloudFormation template (AWS CloudFormation テンプレートを用いて新しい Neptune Analytics ノートブックを作成)」のドキュメントにそれぞれのリージョンにおける AWS CloudFormation テンプレートが用意されており、これを使うと Neptune Analytics の操作をするための graph-notebook などが設定済みのノートブックインスタンスが起動します。
CloufFormation スタックのパラメータでいくつか Neptune Analytics に接続するためのネットワークの設定を入力します。事前に Neptune Analytics のパブリック接続を有効化しましょう。
※よりセキュアに接続したい場合は Amazon Virtual Private Cloud (VPC) にプライベートエンドポイントを作成することも可能です。
1. まずは Neptune Analytics のグラフのダッシュボード を表示し、Amazon Bedrock Knowledge Bases によって作成されたグラフの ID をクリックします。
クリックすると拡大します
2. 画面右上にある「Modify (修正)」ボタンをクリックします。
また、後の手順で利用するのでグラフエンドポイント <graph id>.<region>.neptune-graph.amazonaws.com をメモしておいてください。Connectivity & security > Connectivity settings > Endpoint の項目にグラフエンドポイントの記載があります。
クリックすると拡大します
3. Network > Enable public connectivity の下の「Allows your graph to be reachable over the Internet. All access to the graph requires IAM authentication. (インターネット経由のグラフへのアクセスを許可します。すべてのグラフへのアクセスは IAM 認証が必要です。)」にチェックを入れ、「Next (次へ)」をクリックします。
クリックすると拡大します
4. 確認画面で「Submit (送信)」ボタンをクリックすれば変更が反映されます。
5. 「Creating a new Neptune Analytics notebook using a AWS CloudFormation template (AWS CloudFormation テンプレートを用いて新しい Neptune Analytics ノートブックを作成)」のドキュメントにある「Launch Stack (スタックの起動)」ボタンをクリックします。私は東京リージョンで作業しているので、「Asia Pacific (Tokyo)」の行にあるボタンをクリックします。
クリックすると拡大します
6. 「Step 1 Create stack (ステップ 1 スタックの作成)」は変更せず、「Step 2 Specify stack details (ステップ 2 スタック詳細の指定)」に進みます。
7. (2) の手順でメモしたグラフエンドポイントを入力します。また、任意のノートブック名 (graphrag-notebook) を入力し、「Next (次へ)」ボタンをクリックします。
クリックすると拡大します
8. 「Step 3 Configure stack options (ステップ 3 スタックオプションの設定)」で「I acknowledge that AWS CloudFormation might create IAM resources (AWS CloudFormation が IAM リソースを作成し得ることを承認します。)」にチェックを入れ、「Next (次へ)」ボタンをクリックします。
クリックすると拡大します
9. 「Step 4 Review and create (ステップ 4 確認と作成)」の内容が問題なければ「Submit (送信)」ボタンをクリックします。CloudFormation スタックの作成が始まり、数分待つと完了します。
10. 「Outputs (出力)」タブにある SageMaker Notebook インスタンスの URL をクリックし、SageMaker Notebook (マネージド Jupyter ノートブック) を開きます。
クリックすると拡大します
グラフのクエリと可視化
右側にある「New」→「Python 3」をクリックして、新しいノートブックを開きます。
クリックすると拡大します
今回 CloudFormation で作成した SageMaker AI Notebook は、Neptune Analytics の操作をするための graph-notebook が設定済みであり、便利なマジックコマンドを使うことができます。
まず、セルの中に %summary と入力し、Shift + Enter などで実行しましょう。
クリックすると拡大します
すると、JSON 形式で以下のようなグラフの要約情報が取得できます。
- ノード数は 8,066
- エッジ (リレーション) の数は 20,905
- ノードのラベルは "Entity"、"DocumentId"、"Chunk" の 3 種類
- エッジのラベルは "FROM"、"CONTAINS" の 2 種類
グラフ DB に具体的にどのような値が入っているかを取得するにはクエリを実行します。Neptune Analytics は openCypher 形式のクエリ言語をサポートしており、マジックコマンド %%oc をセルの頭に書くことで実行できます。
ここでは、MATCH 文で「ノード (node) から任意のリレーション (relation) で繋がっている隣接ノード (peer)」を取得するクエリを実行します。全件取ってくると時間がかかりますし、可視化するとごちゃごちゃするので LIMIT 100 として件数を絞っています。
%%oc
MATCH (n)-[r]-(p)
RETURN n, r, p
LIMIT 100
実行結果の「Graph」セルをクリックすると、グラフを可視化することができます。要約情報にあったように、 "Entity" (黄色)、"DocumentId" (赤色)、"Chunk" (青色) のノードがあり、チャンクがエンティティを含む (CONTAINS)、もしくはチャンクがドキュメント ID に由来する (FROM) といったリレーションが貼られていることがわかります。
クリックすると拡大します
各ノードやリレーションの詳細を表示するには右上のメニューアイコンをクリックします。例えば以下の図のエンティティは "amazon s3" という ID (x-amz-bedrock-kb- はヘッダー) を持っています。
クリックすると拡大します
チャンクノードの詳細を表示すると、AMAZON_BEDROCK_TEXT というプロパティの中にテキストチャンクが含まれていることがわかります。
クリックすると拡大します
なお、チャンクの埋め込みベクトルは Neptune Analytics の neptune.algo.vectors.get 組み込み関数を使って取得することができます。
%%oc
MATCH (n:Chunk)
call neptune.algo.vectors.get(n)
yield node, embedding
RETURN n.AMAZON_BEDROCK_TEXT, embedding
LIMIT 1
実行結果の「JSON」タブを見ると、チャンクテキスト (n.AMAZON_BEDROCK_TEXT) と埋め込みベクトル (embedding) のペアが返ってきていることがわかります。
クリックすると拡大します
このように Neptune Analytics の中に埋め込みベクトルも格納されていることで、グラフクエリだけでなく、ベクトル検索も組み合わせたハイブリッド検索が実現されています。
まとめ
本記事では、Amazon Bedrock Knowledge Bases の GraphRAG サポート (プレビュー) について、その基本的な概念から実装方法まで解説してきました。GraphRAG は、従来の RAG が抱えていた関係性の分断や冗長な情報取得、グローバルな文脈の欠如といった課題に対して、グラフ構造を活用することで効果的な解決策を提供します。
Amazon Bedrock Knowledge Bases のマネージドな仕組みにより、これまで複雑だった GraphRAG の実装が大幅に簡素化され、より多くの開発者がこの技術を活用できるようになりました。ぜひみなさんの社内のドキュメントを用いて GraphRAG システムを構築してみて、どのような検索体験が得られるか確認してみてはいかがでしょうか。
筆者プロフィール
本橋 和貴
アマゾン ウェブ サービス ジャパン合同会社
JAPAN GTM Data and AI
機械学習スペシャリストソリューションアーキテクト
AWS の AI/ML サービスのお客様に対する技術的な支援を行いながら市場開拓を推進しています。好きなサービスは Amazon Bedrock と Amazon SageMaker です。ジャンガリアンハムスターを飼いたいです。博士 (理学)。
AWS を無料でお試しいただけます