グラフ検索拡張生成(Graph RAG)は、特定の分野に固有の知識と関連情報を使用する生成AIアプリケーションのための強力な手法として台頭しつつあります。Graph RAGはベクトル・データベースを使用するベクトル検索手法の代替手段です。
ナレッジグラフは、Neo4j や Amazon Neptune などのグラフデータベースで構造化データを表現できる知識システムです。ナレッジグラフでは、エッジと呼ばれるデータ・ポイント間の関係が、頂点またはノードと呼ばれるデータ・ポイント間の接続と同様に意味を持ちます。ナレッジグラフを使用すると、ネットワークを横断し、接続されたデータに関する複雑なクエリを処理することが容易になります。ナレッジグラフは、チャットボット、IDソリューション、ネットワーク分析、推奨エンジン、Customer 360、不正アクセス検知などのユースケースに特に適しています。
Graph RAGのアプローチでは、グラフ・データベースの構造的な性質を活用して、ネットワークや複雑な関係に関する取得情報により深いコンテキストを与えます。グラフデータベースを大規模言語モデル(LLM)と組み合わせると、開発者はテキストなどの非構造化データからグラフを作成するプロセスの大部分を自動化できます。LLMはテキストデータを処理してエンティティーを識別し、それらの関係を理解してグラフ構造で表現することができます。
Graph RAGのアプリケーションを作成する方法はいくつもあります。たとえば、Microsoft の GraphRAG や、GPT4 とLlamaIndexを組み合わせる方法などがあります。このチュートリアルでは、オープンソースのグラフ・データベース・ソリューションであるMemGraphを使用し、watsonx上でMetaのLlama-3を使用してRAGシステムを作成します。Memgraphは、宣言型クエリ言語であるCypherを使用しています。SQLといくつかの共有点がありますが、テーブルや行ではなく、ノードと関係に重点を置いています。Llama 3を使用すると、データベース内の非構造化テキストとクエリ情報からグラフ・データベースを作成して入力することができます。
いくつかあるツールの中から選択することもできますが、このチュートリアルでは、Jupyter Notebookを使用してIBMアカウントを設定する方法について説明します。
IBM Cloudアカウントを使用して、watsonx.aiにログインします。
watsonx.aiプロジェクトを作成します。
プロジェクトIDをプロジェクト内から取得します。「管理」タブをクリックし、「全般」ページの「詳細」セクションからプロジェクトIDをコピーします。このチュートリアルには、このプロジェクトIDが必要です。
次に、プロジェクトをwatsonx.ai Runtimeに関連付けます。
a. watsonx.ai Runtime サービス・インスタンスを作成します(無料インスタンスであるLiteプランを選択します)。
b. watsonx.ai RuntimeでAPIキーを生成します。チュートリアルで使用できるように、API キーを保存します。
c. プロジェクトに移動し、「管理」タブを選択します。
d. 左側のタブで、「サービスと統合」を選択します。
e. IBM サービスを選択します。
f. 「アソシエイト・サービス」を選択し、watsonx.ai Runtimeを選択します。
g. watsonx.ai で作成したプロジェクトにwatsonx.ai Runtimeサービスを関連付けます。
ここで Dockerをインストールします。
Dockerをインストールしたら、Dockerコンテナを使用してMemgraphをインストールします。OSXまたはLinuxでは、ターミナルで次のコマンドを使用できます。
Windowsコンピューターでは次のコマンドを使用します。
インストール手順に従って、MemGraphエンジンとMemGraphラボを起動して実行します。
コンピューター上で、このプロジェクトのために新たな仮想環境を作成します。
ノートブックのPython環境に、以下のPythonライブラリーをインストールします。
これで、Memgraphに接続する準備が整いました。
Memgraphでユーザー名とパスワードを使用する構成にした場合は、ここで設定します。それ以外の場合は、ユーザー名もパスワードもないデフォルトを使用できます。実稼働データベースの場合は不適切なやり方ですが、機密データを保管していないローカル開発環境の場合は問題になりません。
次に、LLMシステムのグラフ生成機能をテストするために使用できる関係のデータセットを記述するサンプル文字列を作成します。より複雑なデータソースを使用することもできますが、この単純な例はアルゴリズムを示すのに役立ちます。
最初の手順で作成した watsonx APIキーを入力します。
次に、テキストを生成するようにWatsonxLLMインスタンスを構成します。ハルシネーションで存在しないエンティティや関係を作り出すことなく、モデルが可能な限り詳細な情報を生成するように設定するには、温度を比較的低くして、トークン数を大きくする必要があります。
LLMGraphTransformerを使用すると、LLMで生成するノードと関係の種類を設定できます。今回のテキストは会社の従業員と彼らの属するグループ、およびその役職について記述したものです。LLMをこのエンティティーのみに制限すると、知識をグラフで適切に表現できる可能性が高まります。
Convert_to_graph_documents の呼び出しで、LLMGraphTransformerがテキストからナレッジグラフを作成します。このステップでは、情報をグラフ・データベースに挿入し、関連するコンテキストと関連するエンティティーを表すための、正しいNeo4j構文を生成します。
次に、Memgraphデータベースから古いデータを削除し、新しいノードとエッジを挿入します。
生成されたCypher 構文は、graph_documentsオブジェクトに保管されます。文字列として表示させれば検証することができます。
暗号化によって作成されたスキーマとデータ・タイプは、グラフの「get_schema」プロパティーで確認できます。
表示内容は以下の通りです。
Memgraphラボ・ビューアーでグラフ構造を確認することもできます。
LLMが、正しいノードと関係を作成するという合理的な作業を実行しました。ここでナレッジグラフをクエリします。
LLMへの適切なプロンプトには、ある程度のプロンプト・エンジニアリングが必要です。LangChainが提供するFewShotPromptTemplateを使用すれば、正確で簡潔なCypher構文を確実に記述できるよう、プロンプト内でLLMに例を与えることができます。次のコードには、LLMが使用すべき質問とクエリの例がいくつか含まれています。さらに、モデルのアウトプットをクエリのみに制約するよう示しています。饒舌すぎるLLMは、無効なCypherクエリにつながる追加情報を追加する可能性があるため、プロンプトテンプレートはモデルにクエリ自体のみを出力するように指示します。
また、指示的なプレフィックスはモデルの動作を制約することができ、LLMが正しいCypher構文をアウトプットする可能性を高めます。
次に、Memgraphから返された情報を使用してLLMが質問に答える方法を制御するためのプロンプトを作成します。LLMがグラフ・データベースからコンテキスト情報を受け取った後の応答方法について、いくつかの例と手順を示します。
次に、質問応答チェーンを作成します。MemgraphQAChainを使用すると、使用するLLM、使用するグラフスキーマ、およびデバッグに関する情報を設定できます。温度を0にし、長さに関するペナルティを設定することで、LLMはCypherプロンプトを短く簡単に保つよう促します。
これで、自然言語による質問でチェーンを呼び出すことができます(LLMは完全に決定論的ではないため、応答が多少異なる可能性があることに注意してください)。
アウトプットは以下のようになります。
> Entering new MemgraphQAChain chain...
Generated Cypher:
MATCH (p:Person {id: 'John'})-[:TITLE]->(t:Title) RETURN t.id
Full Context:
[{'t.id': 'Director of the Digital Marketing Group'}]
> Finished chain.
{'query': 'What is Johns title?',
'result': ' \nAnswer: Director of the Digital Marketing Group.',
'intermediate_steps': [{'query': " MATCH (p:Person {id: 'John'})-[:TITLE]->(t:Title) RETURN t.id"},
{'context': [{'t.id': 'Director of the Digital Marketing Group'}]}]}
次の質問では、チェーンにもう少し複雑な質問をします。
以下の内容が返されます。
正しい答えが応答に含まれています。場合によっては、エンドユーザーに回答を返す前に削除が必要な、余分なテキストが含まれる可能性があります。
Memgraphチェーンにグループ関係について質問することができます。
これにより、次のものが返されます。
これが正しい答えです。
最後に、チェーンにアウトプットが2つある質問をします。
これにより、次の情報が出力されます。
チェーンは両方の協力者を正しく識別します。
このチュートリアルでは、Memgraphとwatsonxを使用してGraph RAGアプリケーションを構築し、グラフデータ構造を生成し、クエリを実行しました。watsonxを介したLLMを使用して、自然言語のソース・テキストと生成された暗号クエリー構文からノードとエッジ情報を抽出し、グラフ・データベースに入力しました。次に、watsonxを使用して、そのソース・テキストに関する自然言語の質問をCypherクエリーに変換し、グラフ・データベースから情報を抽出しました。LLMは、プロンプト・エンジニアリングを使用して、Memgraphデータベースの成果を自然言語による応答に変換しました。