PostgreSQL Apache AGE を使ったグラフデータの RAG 検証

LangChain を用いて Apache AGE グラフデータの RAG

Python ライブラリの LangChain を用いて Apache AGE で構成されたグラフデータを利用した RAG を検証した。

Overall

Apache AGE とは PostgreSQL の拡張機能であり、リレーショナルデータベースである PostgreSQL においてもグラフデータを格納することを可能にする。グラフデータベースとしては Neo4j が広く知られているが、Apache AGE では Neo4j と同じ Cypher クエリによってデータの操作がサポートされている。 Neo4J については、以下で検証している。

Neo4j でグラフ指向データベース入門

LLM の活用の一つとして、持ち合わせているデータと組み合わせて LLM の結果を返すような RAG の利用が進んでいる。 その中でも、関係性の表現が得意であるグラフデータを組み合わせることに関しても注目が集まっている。グラフデータを参照することで、従来の RAG では回答が困難であった質問などに対して、より高精度の回答が得られることが期待されている。

LLM の活用を支援するライブラリ LangChain では、比較的容易にグラフデータを用いた RAG を実施することができる。LangChain による Neo4j を用いた検証は見られるが、Apache AGE に関する事例は少なかったため、以下で検証した。

検証

AGE が有効である PostgreSQL に関しては、AGE のサイトを参考に docker で用意した。

Navigating the Maze of Data with Apache AGE and LangChain | Blog

1
docker run --name mystical-age -p 5432:5432 -e POSTGRES_USER=wizard -e POSTGRES_PASSWORD=alchemy -e POSTGRES_DB=enchantedDB -d apache/age

検証に際して、データベースに接続し、以下のクエリでサンプルとなるグラフデータを生成しておいた。 Apache AGE においては、$$ で囲うことで、Cypher クエリを実行させることができる。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
-- グラフを作成する
SELECT create_graph('my_graph');

-- ノードを追加する
SELECT * FROM cypher('my_graph', $$
    CREATE (n:Person {name: 'Alice', age: 30})
    CREATE (m:Person {name: 'Bob', age: 25})
    CREATE (o:Person {name: 'Charlie', age: 35})
$$) AS (v agtype);

-- エッジを追加する
SELECT * FROM cypher('my_graph', $$
    MATCH (a:Person {name: 'Alice'}), (b:Person {name: 'Bob'}), (c:Person {name: 'Charlie'})
    CREATE (a)-[:FRIEND]->(b), (a)-[:FRIEND]->(c)
$$) AS (v agtype);

実際に LangChain を用いて検証した Python のコードに関しては以下の通りである。 また、利用する LLM に関しては、以下の公開情報を参考に Azure Open AI でモデルをデプロイした。ここでは gpt-4o-mini を利用している。

Azure OpenAI Service リソースを作成してデプロイする

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
from langchain_community.graphs.age_graph import AGEGraph
from langchain_neo4j import GraphCypherQAChain
from langchain_openai import AzureChatOpenAI
import os

os.environ["AZURE_OPENAI_ENDPOINT"] = "https://<endpoint>.openai.azure.com/"
os.environ["AZURE_OPENAI_API_KEY"] = "<apikey>"

conf = {
    "database": "enchantedDB",
    "user": "wizard",
    "password": "alchemy",
    "host": "localhost",
    "port": 5432,
}

llm = AzureChatOpenAI(
    azure_deployment="gpt-4o-mini",
    api_version="2024-08-01-preview", 
    temperature=0,
    max_tokens=None,
    timeout=None,
    max_retries=2
)

graph = AGEGraph(graph_name="""my_graph""", conf=conf)
graph.refresh_schema()

chain = GraphCypherQAChain.from_llm(
   llm, graph=graph, verbose=True,allow_dangerous_requests=True
)

result = chain.invoke("Alice の友達は誰ですか?")
print(result)

GraphCypherQAChain.from_llm において、allow_dangerous_requests を指定しないと以下のエラーが生じた。 allow_dangerous_requests を有効にすることで、データベース接続の権限を必要最小限に制限し、データの破損や損失、機密データの読み取りを防ぐための適切な対策を講じる必要があることに対する注意事項のようである。詳細は LangChain のセキュリティガイドに記載がある。

https://python.langchain.com/docs/security

1
2
raise ValueError(
ValueError: In order to use this chain, you must acknowledge that it can make dangerous requests by setting `allow_dangerous_requests` to `True`.You must narrowly scope the permissions of the database connection to only include necessary permissions. Failure to do so may result in data corruption or loss or reading sensitive data if such data is present in the database.Only use this chain if you understand the risks and have taken the necessary precautions. See https://python.langchain.com/docs/security for more information.

サンプルのグラフデータを参考に、友達はだれであるかを尋ねる関係性に関する質問をした結果が以下である。

result

その結果、友達という関係にある情報を LLM より得られたことを確認できた。 回答までの具体的なプロセスとしては、GraphCypherQAChain によってグラフデータの検索が行われている。自然言語で提供された質問に対して Cypher クエリを生成し、そのクエリの AGE における実行結果を基に、自然言語で最終回答が得られている。 これにより、関係性を考慮した質問への回答やグラフデータの効率的な探索が可能になると見受けられる。

  1. 自然言語の質問 「Alice の友達は誰?」
  2. Cypher クエリの生成 「MATCH (a:Person {name: ‘Alice’})-[:FRIEND]->(friend) RETURN friend.name」
  3. クエリの実行結果 [Bob, Charlie]
  4. 自然言語の回答 「Alice の友達は Bob と Charlie です。」

まとめ

PostgreSQL に関してはリレーショナルデータベースであるが、Apache AGE によってグラフデータも格納することができることを確認した。加えて、こちらのデータについて LangChain を用いることで、容易にグラフデータを利用した RAG を実施することができた。これにより、今後より複雑なシナリオでの LLM の活用やグラフデータの効率的な探索が期待される。

Licensed under CC BY-NC-SA 4.0
Hugo で構築されています。
テーマ StackJimmy によって設計されています。