🕸️

Wikipediaの記事からナレッジグラフを作成して、QAできるようにする

2023/11/26に公開

簡単ではありますが、Wikipediaの記事からナレッジグラフを作成し、ナレッジグラフを元にQAを実施するコードを作成したため、そちらについて説明します。

事前に実施したLangChainとNeo4jのデモコードを動かした記事は以下になります。
https://zenn.dev/nishijima13/articles/ae763750111455

環境構築

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

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

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

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

cd langchain_neo4j/02_read_wiki
docker-compose build
docker-compose up -d

環境構築結果確認

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/02_read_wiki/neo4j_docker/Dockerfile

ENV NEO4J_AUTH=neo4j/pleaseletmein  

コード実行

デモコードは以下の処理を実施しています。

  1. Wikipediaから藤本タツキ先生の要約を取得
  2. 要約からCypherクエリを生成
  3. CypherクエリをNeo4jに投入
  4. 質問(藤本タツキは何者ですか?)に対する回答を取得

実行コマンドは以下になります。

# Dockerコンテナに入る
docker exec -it python_docker bash
# OpenAI APIキーを設定
export OPENAI_API_KEY="..."

# デモコードを実行
python3 src/demo.py

実行結果

### 藤本タツキのwiki要約 ###
藤本 タツキ(ふじもと タツキ、1992年〈平成4年〉10月10日 – )は、日本の男性漫画家。秋田県にかほ市出身。秋田県立仁賀保高等学校情報メディア科CGデザインコース卒、東北芸術工科大学美術科洋画コース卒。
##################################################

> Entering new LLMChain chain...
Prompt after formatting:

以下の文章からグラフを作成するCypherクエリのみを出力して下さい。
ただし[:is a]の関係は[:is_a]のように_を含む形で出力して下さい。
藤本 タツキ(ふじもと タツキ、1992年〈平成4年〉10月10日 – )は、日本の男性漫画家。秋田県にかほ市出身。秋田県立仁賀保高等学校情報メディア科CGデザインコース卒、東北芸術工科大学美術科洋画コース卒。

> Finished chain.
### 藤本タツキの要約からCypherクエリを生成 ###
CREATE (fujimoto:Person {name: "藤本タツキ", birthdate: "1992年10月10日"})
CREATE (japan:Country {name: "日本"})
CREATE (akita:Prefecture {name: "秋田県"})
CREATE (kaho:City {name: "かほ市"})
CREATE (fujimoto)-[:is_a]->(mangaka:Occupation {name: "漫画家"})
CREATE (akita)-[:is_a]->(japan)
CREATE (kaho)-[:is_a]->(akita)
CREATE (fujimoto)-[:born_in]->(kaho)
CREATE (fujimoto)-[:graduated_from]->(highschool:School {name: "秋田県立仁賀保高等学校情報メディア科CGデザインコース"})
CREATE (fujimoto)-[:graduated_from]->(university:School {name: "東北芸術工科大学美術科洋画コース"})
##################################################

### 藤本タツキに関する質問に対する回答 ###
> Entering new GraphCypherQAChain chain...
Generated Cypher:
MATCH (p:Person {name: '藤本タツキ'})-[:is_a]->(o:Occupation)
RETURN o.name
Full Context:
[{'o.name': '漫画家'}]

> Finished chain.
Q: 藤本タツキは何者ですか?
A: 藤本タツキは漫画家です。
##################################################

作成されたナレッジグラフは以下のようになります。

Discussion