こんにちは、機械学習チーム YAMALEX の駿です。
YAMALEX は Acroquest 社内で発足した、会社の未来の技術を創る、機械学習がメインテーマのデータサイエンスチームです。
(詳細はリンク先をご覧ください。)
今回は AWS が提供するオープンソースツール GraphRAG Toolkit を使って、 GraphRAG に入門しようと思います。
GraphRAG Toolkit を使うと、 Amazon Neptune と Amazon OpenSearch Serverless を使用した GraphRAG システムをローコードで実装できます。
なお、2024年12月から Bedrock Knowledge Base で使用できるようになった GraphRAG とは別物なので、混同しないようご注意ください。
1. はじめに
1.1. GraphRAG とは
従来の RAG は、キーワード検索やベクトル検索を用いて関連情報を取得するのに対し、GraphRAG はナレッジグラフを利用して、検索結果の文脈をより深く理解し、関連性の高い情報を抽出する手法です。
従来の RAG ではキーワード検索やベクトル検索でヒットした情報しか回答生成に使用することができませんが、 GraphRAG ではキーワード検索やベクトル検索で得られた結果を起点にグラフを走査することで、検索にヒットしなかったが文脈的に関連のある情報も取得し、回答生成に活用できます。
すなわち、 GraphRAG は構造化されたエンティティ間の関係を利用して、より精度の高い情報検索と文脈理解を実現します。

GraphRAGの利点
1.2. GraphRAG Toolkit とは
GraphRAG Toolkit は AWS が提供するオープンソースの GraphRAG 用ライブラリで、 GraphRAG を使ったシステムの構築を簡易化する機能が多く提供されています。
Amazon Neptune Database をグラフ DB として、 Amazon OpenSearch Serverless をベクトル DB として使用可能です。
このツールキットを使用することで、非構造化データからエンティティとそのリレーションを抽出し、ナレッジグラフとして保存、ユーザーの質問に対してこのナレッジグラフをクエリすることで、より関連性の高い情報を提供するアプリケーションを構築できます。
今回は GraphRAG を試すためにこのツールキットを使用します。
GraphRAG Toolkit におけるナレッジグラフの基本構造
ナレッジグラフは、データをエンティティ(実体)とそのリレーション(関係性)として構造化し、意味的なつながりを表現するデータモデルです。
「エンティティ」と「リレーション」のネットワークとして情報を整理することで、関係性を考慮した検索や論理的な推論が可能です。
GraphRAG Toolkit 内では下記の用語と構成でナレッジグラフを構築します。
上にあるものほど、大きな抽象的な概念で、下に行くにつれて具体的になっていきます。
No | 項目 | 概要 | 例 |
---|---|---|---|
1 | ドキュメント(Source) | 元ドキュメントを表す属性 | https://docs.aws.amazon.com/neptune/latest/userguide/intro.html |
2 | チャンク(Chunk) | ドキュメントを小さい単位に分割したもの | [](https://docs.aws.amazon.com/pdfs/neptune/latest/userguide/neptune-ug.pdf#intro) Amazon Neptune is a fast, reliable, fully managed graph database service that makes it easy to build and run applications that work with highly connected datasets. The core of Neptune is... |
3 | トピック(Topic) | チャンクに記載されている主題 | Amazon Neptune |
4 | 文言(Statement) | チャンクに書かれている文章や文言 | The core of Neptune is a purpose-built, high-performance graph database engine. |
5 | 事実(Fact) | 文言から導かれる事実 | Amazon Neptune HAS high-performance |
6 | エンティティ | 事実の主語・目的語。実世界の「モノ」や「概念」にあたる | Amazon Neptune |
1.3. Amazon Neptune とは
Amazon Neptune は、 AWS が提供するフルマネージド型のグラフデータベースサービスであり、データ間の関係性を効率的に管理・操作できます。
Neptune は複数のグラフモデルをサポートし、柔軟なデータ操作が可能です。
ナレッジグラフの構築だけでなく、ソーシャルネットワーク分析、レコメンデーションシステムなど、多様なユースケースで活用されています。
使わない時間帯に「停止」したり、開発環境では T3 インスタンスなど比較的安価なインスタンスを使ったりして、コストを抑えられるのも、うれしいポイントです。
2. 環境を構築する
今回構築する環境は GraphRAG Toolkit が用意している Cloudformation テンプレートで立ち上げます。
No | 項目 | 概要 |
---|---|---|
1 | Amazon Neptune | ナレッジグラフを保持し、検索する |
2 | Amazon OpenSearch Service | グラフ検索と併せて使用するベクトル検索用 |
3 | Amazon Bedrock | チャンクからトピック、文言、事実、エンティティを抽出する。ベクトル DB に投入するベクトルを生成する 抽出用モデル:Claude-3-Sonnet ベクトル化モデル:Titan Text Embedding V2 |
4 | Notebook | GraphRAG Toolkit を操作し、ドキュメントの投入と検索を行う |
3. データを取り込む
上記 Cloudformation テンプレートを使用して環境を構築すると、サンプルノートブックがいくつか用意されています。
データの取り込みには 01-Combined-Extract-and-Build.ipynb (ドキュメントからのエンティティなどの抽出とグラフの構築をまとめて行う)、 02-Separate-Extract-and-Build.ipynb (エンティティなどの抽出とグラフの構築を別々に行う)のいずれかが使用できます。
ドキュメントの取り込みは下の手順で行われます。
- ドキュメントを細かい単位に分割する(チャンキング)
チャンクをLLMに渡して、命題(proposition)を抽出する
命題は、ナレッジグラフを作成するときに必要な6つの要素を抽出するための前処理として生成されるもので、 元のドキュメントに対して、複雑な文章は単純でわかりやすい文章に分割する、代名詞や略語を開く、といったクレンジングが行われています。
命題を LLM に渡して、トピック、文言、事実、エンティティを抽出する
- 抽出されたエンティティなどからナレッジグラフを構築し、グラフ DB に取り込む
- 文言を LLM に渡してエンベディングを行い、ベクトル DB に取り込む
GraphRAG Toolkit を使用すると、 extract
メソッドを呼ぶだけで、上記手順をひとまとめに実施してくれるため、とても簡単に始めることができます。
3.1. 取り込まれるデータを確認する
今回は、 02-Separate-Extract-and-Build.ipynb を使用して、抽出用モデルが元のドキュメントをどのように処理してグラフ DB に取り込める形にしているのかを確認してみます。
ノートブック中の Extract
フェーズを実施すると、 LLM がドキュメントを解釈し、エンティティ、属性の抽出、そしてそれぞれのリレーションを抽出します。
抽出結果は extracted/
ディレクトリに保存されます。
設定を変更することで S3 に保存することも可能なため、一度処理したものをS3に貯めておき、新しいデータが増えナレッジグラフを構築しなおす際や、別 DB に同じナレッジグラフを構築したくなった時などに、複数回抽出作業をする必要がなくなり、 LLM の制限やお財布にやさしくすることができます。
実際に extracted/
に出力された JSON の中身は下記のようになっています。(スペースの都合上、大幅に省略しています)
上で説明した、命題、トピック、文章、事実、エンティティがそれぞれ入れ子になって保存されていることが分かります。
{ "id_": "aws:xxxx", "metadata": { "url": "https://docs.aws.amazon.com/neptune-analytics/latest/userguide/what-is-neptune-analytics.html", "aws::graph::propositions": [ // 命題 "Neptune Analytics is a memory-optimized graph database engine for analytics", "Neptune Analytics allows getting insights and finding trends by processing large amounts of graph data in seconds" ], "aws::graph::topics": { "topics": [ { // トピック "value": "Neptune Analytics", "entities": [ { // エンティティ "value": "Neptune Analytics", "classification": "Software" } ], "statements": [ { // 文言 "value": "Neptune Analytics is a memory-optimized graph database engine for analytics", "facts": [ // 事実 { "subject": { "value": "Neptune Analytics", "classification": "Software" }, "predicate": { "value": "OPTIMIZED FOR" }, "complement": "memory" } ] } ] } ] } } }
なお、日本語のドキュメントに対しても、良い感じに抽出してくれました。
{ "id_": "aws:xxxx", "metadata": { "aws::graph::propositions": [ // 命題 "知識表現の方法", "ナレッジグラフはデータをエンティティと関係性のネットワークとして表現する", "ナレッジグラフは情報の意味を捉えやすくする強力な手法である" ], "aws::graph::topics": { "topics": [ { // トピック "value": "Knowledge Representation", "entities": [ { // エンティティ "value": "ナレッジグラフ", "classification": "Concept" } ], "statements": [ { // 文言 "value": "ナレッジグラフはデータをエンティティと関係性のネットワークとして表現する", "facts": [ // 事実 { "subject": { "value": "ナレッジグラフ", "classification": "Concept" }, "predicate": { "value": "REPRESENTS" }, "object": { "value": "データ", "classification": "Concept" } } ] } ] } ] } } }
3.2. 取り込まれたデータを確認する
CloudFormation で Notebook をデプロイした際、同時にグラフエクスプローラーがデプロイされています。
このグラフエクスプローラーを開くことで、構築されたナレッジグラフを実際に確認できます。
下の図はAmazon NeptuneのドキュメントをGraphRAG Toolkit を使って取り込んで作成されたナレッジグラフの一部を表示したものです。
上に書いたように、ドキュメント、チャンク、トピック、文言、事実、エンティティの階層に分かれて、それぞれのリレーションが記載されていることが分かります。

実際に構築されたナレッジグラフの一部
4. 検索する
GraphRAG では、ベクトル検索で起点となるノードを検索し、その後ナレッジグラフを走査して最終的な検索結果を返却します。
GraphRAG Toolkit は大きく2つの検索方法を提供しています。
No | 検索方法 | 利点 | 欠点 | 用途 |
---|---|---|---|---|
1 | TraversalBasedRetriever | ・処理が軽量 ・結果の再現性が高い ・未知の単語や固有名詞に強い |
・柔軟性が低い ・検索精度が低め |
カテゴリごとに整理された FAQ など |
2 | SemanticGuidedRetriever | ・質問の意図に沿った情報を探索できる ・複雑な関連性を考慮できる ・検索結果の多様性を確保できる |
・計算コストが高く、処理が重い | 質問の意図に合った情報、多様性のある情報など柔軟で高度な情報検索が必要な場合 |
4.1. TraversalBasedRetriever
TraversalBasedRetriever
はグラフ構造を順番に走査することで、情報を拡張する検索方法です。
決まった順番にナレッジグラフを走査するため、処理が軽量です。
TraversalBasedRetriever
にも2つの手法があり、どちらか片方、もしくは両方を組み合わせて使用することが可能です。
デフォルト設定では両方を組み合わせた結果を返却します。
EntityBasedSearch
クエリ文字列からキーワードを抽出し、マッチするエンティティをグラフから探します(Bottom up)。
マッチするエンティティを見つけたら、そこから事実、命題、トピックと大きい概念に向かって走査することで、検索を行います。
未知語や固有名詞であっても、事前に整理されたナレッジグラフに従って、関連した情報を集められるのが特徴です。エンティティから出発するため、そのエンティティに関わる情報を幅広く取得できる傾向にあります。
ChunkBasedSearch
チャンクに対してクエリとのベクトル類似度を使いて検索を行います(Top down)。
ヒットしたチャンクから、トピック、命題、事実と小さい概念に向かって走査することで、検索を行います。クエリに意味的に近いところから出発するため、より関連度の高い情報に絞って取得できる傾向にあります。
4.2. SemanticGuidedRetriever
SemanticGuidedRetriever
は文言(Statement)をベクトル化したものに対して検索を行います。
ベクトル検索で取得した文言からビームサーチとパス解析を用いて、近隣のノードから探索して関連度の高いものを取得します。
また、リランクで質問の意図に沿った検索結果に絞る、多様性フィルターで類似した情報ばかりではなく多様性のある回答になるようにするなど、回答生成に必要な情報を検索するための仕組みが使われています。
ベクトル検索とグラフ検索のハイブリッドを行うことで、関連度を高く保ちつつ、幅広い検索結果を返すことができますが、その分処理が重くなります。
4.3. 検索結果を確認する
GraphRAG Toolkit に含まれる 04-Querying.ipynb を使って上の2つの検索方法を試すことができます。
各Retrieverに「Neptune Database と Neptune Analytics の違いは何ですか?」と聞いた場合の LLM の回答と回答に使用したドキュメントを確認しました。
4.3.1. TraversalBaseRetriever
Neptune DatabaseとNeptune Analyticsは補完的な関係にあります。 Neptune Databaseは、管理型のグラフデータベースサービスです。 データの永続的な保存、バックアップ、レプリケーションなどの機能を提供します。 [https://docs.aws.amazon.com/neptune/latest/userguide/intro.html] 一方、Neptune Analyticsは大規模なグラフデータを高速に分析するためのインメモリエンジンです。 Neptune DatabaseやS3からグラフデータを読み込み、事前構築されたグラフアルゴリズムや カスタムクエリを実行して分析を行います。 [https://docs.aws.amazon.com/neptune-analytics/latest/userguide/what-is-neptune-analytics.html] つまり、Neptune Databaseはグラフデータの永続的な保存と管理を担い、 Neptune Analyticsはそのデータに対する高速な分析処理を可能にするサービスです。 データの保存と分析を分離することで、それぞれの機能に特化したパフォーマンスが得られます。 [https://docs.aws.amazon.com/neptune-analytics/latest/userguide/neptune-analytics-features.html]
■ドキュメント
[ { "source": "https://docs.aws.amazon.com/neptune-analytics/latest/userguide/what-is-neptune-analytics.html", "topic": "Neptune Analytics", "statements": [ "Neptune Analytics can load data from a Neptune Database graph", "Neptune Analytics complements Amazon Neptune Database, a popular managed graph database", "Neptune Analytics can load data from a Neptune Database snapshot", "The Neptune Analytics vs Neptune Database page explains when to use Neptune Analytics and when to use Neptune Database", "Neptune Analytics can load graph data stored in Amazon S3" ] }, { "source": "https://docs.aws.amazon.com/neptune/latest/userguide/intro.html", "topic": "Amazon Neptune", "statements": [ "Neptune Analytics is an analytics database engine.", "Neptune Analytics complements Neptune database.", "The Neptune database has continuous backup to Amazon S3", "Amazon Neptune automatically detects database crashes and restarts", "Amazon Neptune increases database performance and availability" ] } ]
4.3.1. SemanticGuidedRetriever
Neptune DatabaseとNeptune Analyticsは異なる製品で、以下のような違いがあります。 Neptune Databaseはマネージド型のグラフデータベースサービスです。 データの永続的な保存と、低レイテンシーのクエリ実行を行うことができます。 [https://docs.aws.amazon.com/neptune/latest/userguide/intro.html] 一方、Neptune Analyticsはメモリ上でグラフデータを分析するためのエンジンです。 大規模なグラフデータセットをメモリに読み込み、事前に用意された高度な分析アルゴリズムや 独自のCypherクエリを高速に実行できます。 [https://docs.aws.amazon.com/neptune-analytics/latest/userguide/what-is-neptune-analytics.html] Neptune Analyticsは、データ分析やデータサイエンス、探索的なワークロードに適しています。 つまり、Neptune Databaseはデータの永続的な保存と低レイテンシーのクエリ実行を、 Neptune Analyticsはメモリ上での大規模グラフデータの高速分析を主な目的としています。 Neptune Analyticsは、Neptune Databaseからデータを読み込んで分析することもできます。 [https://docs.aws.amazon.com/neptune-analytics/latest/userguide/what-is-neptune-analytics.html]
■ドキュメント
<sources> <source_1> <source_1_metadata> <url> https://docs.aws.amazon.com/neptune-analytics/latest/userguide/what-is-neptune-analytics.html</url> </source_1_metadata> <statement_1.1>Neptune Analytics is a memory-optimized graph database engine for analytics</statement_1.1> <statement_1.2>Neptune Analytics is a memory-optimized graph database engine for analytics</statement_1.2> <statement_1.3>Neptune Analytics can load data from a Neptune Database graph</statement_1.3> <statement_1.4>Neptune Analytics can load data from a Neptune Database snapshot</statement_1.4> <statement_1.5>Neptune Analytics is an ideal choice for data-science workloads that require fast iteration for data, analytical and algorithmic processing, or vector search on graph data</statement_1.5> </source_1> <source_2> <source_2_metadata> <url>https://docs.aws.amazon.com/neptune/latest/userguide/intro.html</url> </source_2_metadata> <statement_2.1>Neptune Analytics is an analytics database engine.</statement_2.1> <statement_2.2>Neptune Analytics is a solution for quickly analyzing existing graph databases.</statement_2.2> <statement_2.3>Neptune Analytics is a solution for quickly analyzing graph datasets stored in a data lake.</statement_2.3> <statement_2.4>Amazon Neptune is a fully managed graph database service</statement_2.4> <statement_2.5>Amazon Neptune is a fully managed graph database service</statement_2.5> </source_2> </sources>
なんとなく、 SemanticGuidedRetriever
を使った場合の方が正しい回答をしてくれているように見えますが、各検索方法での検索精度の違いなどは今後の検証課題としたいと思います。
なお、 Traversal...
と Semantic...
でレスポンスに含まれるドキュメントの型が異なりますが、これは今後のアップデートで統一してくれるとのことです。
まとめ
GraphRAG Toolkit を使って、 GraphRAG がどのようにデータを処理しているのかを見てきました。
実際に動かしてみながら中身を確認することで、 GraphRAG の特性を理解できたと思います。
そして、 GraphRAG Toolkit を使って、とても簡単に GraphRAG システムを構築できることが分かりました。
グラフ DB に入れるまでの面倒な処理をラップしてくれているのがありがたいですね。
Acroquest Technologyでは、キャリア採用を行っています。少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。 www.wantedly.com
- Azure OpenAI/Amazon Bedrock等を使った生成AIソリューションの開発
- ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
- マイクロサービス、DevOps、最新のOSSやクラウドサービスを利用する開発プロジェクト
- 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長