🕸️

LangChainのナレッジグラフデモを試す

2023/11/26に公開

ナレッジグラフを学習するために、LangChainの"Neo4j DB QA chain"デモで何ができるかを動かしながら見ていこうと思います。

LangChain公式チュートリアル
https://python.langchain.com/docs/use_cases/graph/graph_cypher_qa

環境構築

今回はDocker Composesを使用して環境構築を行います。
Docker Composeをインストールされていない方は以下を参考にインストールして下さい。
https://docs.docker.jp/v1.12/compose/install.html

今回試したコードは以下に追加していますので、クローンするなどローカルにダウンロードして下さい。
https://github.com/nishijima13/langchain_neo4j/tree/main/01_turtorial
クローンする場合のコマンド例

git clone git@github.com:nishijima13/langchain_neo4j.git

最後にDocker環境を作成します。

cd langchain_neo4j/01_turtorial
docker-compose build
docker-compose up -d

今回は参考文献1と同様にNeo4jのコンテナとpythonのコンテナの二つを用意します。

環境構築結果確認

Docker環境作成後、以下のURLからNeo4jのWeb画面にアクセスできます。
http://localhost:7474/browser/

Web画面上で以下を入力してログインして下さい。
Connect to Neo4j

  • Connect URL: neo4j://localhost:7687
  • Database: 空白
  • Authentication Type: Username / Password
  • Username: neo4j
  • Password: pleaseletmein

初期のログインIDやパスワードはNeo4jコンテナの環境変数で指定しています。
具体的な場所としては、ダウンロードしたコードの以下のDokcerfileになります。
langchain_neo4j/01_turtorial/neo4j_docker/Dockerfile

ENV NEO4J_AUTH=neo4j/pleaseletmein  

デモコード実行

デモコードを実行するためにpythonコンテナに入り、OpenAI APIキーを設定します。

# PythonのDockerコンテナに入る
docker exec -it python_docker bash

# OpenAI APIキーを設定する
export OPENAI_API_KEY="..."

その後、以下のようにチュートリアルコードを実行します。

python3 src/demo.py

チュートリアルコードでは以下のようにナレッジグラフを作成し、

  1. "Top Gun"という名前のMovieノードを作成
  2. ["Tom Cruise", "Val Kilmer", "Anthony Edwards", "Meg Ryan"]のリストの各要素をActorノードとして作成
  3. ActorノードとMovieノードをACTED_INの関係で結合
graph.query(
    """
    MERGE (m:Movie {name:"Top Gun"})
    WITH m
    UNWIND ["Tom Cruise", "Val Kilmer", "Anthony Edwards", "Meg Ryan"] AS actor
    MERGE (a:Actor {name:actor})
    MERGE (a)-[:ACTED_IN]->(m)
    """
)

作成したナレッジグラフに対して以下のように質問をしています。

response = chain.run("Who played in Top Gun?")

このコードの実行結果は以下になります。

> Entering new GraphCypherQAChain chain...
Generated Cypher:
MATCH (a:Actor)-[:ACTED_IN]->(m:Movie {name: 'Top Gun'})
RETURN a.name
Full Context:
[{'a.name': 'Tom Cruise'}, {'a.name': 'Val Kilmer'}, {'a.name': 'Anthony Edwards'}, {'a.name': 'Meg Ryan'}]

> Finished chain.
Tom Cruise, Val Kilmer, Anthony Edwards, and Meg Ryan played in Top Gun.

実行の流れとしては、回答を行うために、ChatGPTが以下のようなCypherコードを生成し、

MATCH (a:Actor)-[:ACTED_IN]->(m:Movie {name: 'Top Gun'})
RETURN a.name

その結果(以下)を踏まえて

[{'a.name': 'Tom Cruise'}, {'a.name': 'Val Kilmer'}, {'a.name': 'Anthony Edwards'}, {'a.name': 'Meg Ryan'}]

最終的な回答を作成しています(おそらく。。)。

Tom Cruise, Val Kilmer, Anthony Edwards, and Meg Ryan played in Top Gun.

また、Neo4jのWeb画面で以下を実行すると、チュートリアルで生成したグラフ内容が確認できます。

MATCH (n) RETURN n LIMIT 25

補足

LangChain内でどのようなプロンプトを使用しているかは以下が参考になるかと思います。

その他

次にWikipediaの記事からナレッジグラフを作成し、ナレッジグラフを元にQAを実施しようと思います。
https://zenn.dev/nishijima13/articles/22071961aa144c

GitHubトレンドチェック

こちらのアカウントでGitHub TrendingにあがっているリポジトリをChatGPTで要約して日々ポストしています。
これから話題になりそうな技術をいち早く知る助けになるかと思います。
気になった方はぜひフォローしてみて下さい。
https://x.com/nishijima_13v2

参考文献

  1. https://qiita.com/Ryo412/items/0d82934c401ccd6a5df4

Discussion