LangChainのナレッジグラフデモを試す
ナレッジグラフを学習するために、LangChainの"Neo4j DB QA chain"デモで何ができるかを動かしながら見ていこうと思います。
LangChain公式チュートリアル
環境構築
今回はDocker Composesを使用して環境構築を行います。
Docker Composeをインストールされていない方は以下を参考にインストールして下さい。
今回試したコードは以下に追加していますので、クローンするなどローカルにダウンロードして下さい。
クローンする場合のコマンド例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画面にアクセスできます。
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
チュートリアルコードでは以下のようにナレッジグラフを作成し、
- "Top Gun"という名前のMovieノードを作成
- ["Tom Cruise", "Val Kilmer", "Anthony Edwards", "Meg Ryan"]のリストの各要素をActorノードとして作成
- 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内でどのようなプロンプトを使用しているかは以下が参考になるかと思います。
- https://api.python.langchain.com/en/latest/_modules/langchain/chains/graph_qa/cypher.html#
- https://github.com/langchain-ai/langchain/blob/0efa59cbb8633357129083594ff6222fbc27726a/libs/langchain/langchain/chains/graph_qa/prompts.py#L99
- https://github.com/langchain-ai/langchain/blob/0efa59cbb8633357129083594ff6222fbc27726a/libs/langchain/langchain/chains/graph_qa/prompts.py#L36C29-L47C14
その他
次にWikipediaの記事からナレッジグラフを作成し、ナレッジグラフを元にQAを実施しようと思います。
GitHubトレンドチェック
こちらのアカウントでGitHub TrendingにあがっているリポジトリをChatGPTで要約して日々ポストしています。
これから話題になりそうな技術をいち早く知る助けになるかと思います。
気になった方はぜひフォローしてみて下さい。
Discussion