電通総研 テックブログ

電通総研が運営する技術ブログ

Geminiによるナレッジグラフの抽出とGraphRAGの簡易実装

こんにちは、スマートソサエティセンターの飯田です。

はじめに

NotebookLMでは、文章をアップロードすると、マインドマップ形式で内容を可視化することができます。
この機能により、情報の整理や関連性の把握が容易になります。

デジタル庁が公開している ChatGPT 等の生成 AI の業務利用に関する申合せ(第2版)を入力してみると下記のような結果が得られます。

NotebookLMでこのような見せ方ができるということは、Geminiでもナレッジグラフ生成ができるのでは?と思い、Geminiをつかって、どこまでナレッジグラフを抽出できるかを試してみてみました。
そして、抽出した結果をGraphRAGに入力し、どのような情報が得られるかを確認してみました。
※プリミティブな実装しかしていないので、本当はもっと性能がでるかもしれないですが、ご容赦ください。

対象のデータ

対象のデータは、デジタル庁の「ChatGPT等の生成AIの業務利用に関する申合せ(第2版)」です。
このドキュメントは、自治体における生成AIの業務利用に関するガイドラインを提供しており、AIの利用に関する重要な情報が含まれています。
このドキュメントをもとに、ナレッジグラフを抽出し、GraphRAGでの情報検索を行います。

全体の処理の流れ

流れとしては以下のような流れです

  1. Geminiを使用してドキュメントからナレッジグラフを抽出
    • 抽出したナレッジグラフを可視化・結果の確認
  2. 抽出したナレッジグラフをGraphRAGに入力
  3. GraphRAGを使用して情報検索を行い、関連情報を取得

ナレッジグラフの抽出

ナレッジグラフの抽出には、GraphRAGに繋げることも意識して、langchainのlangchain_experimental.graph_transformersを使ってみました。
langchainにGraphRAGの機能が追加されているのを知りませんでした。
便利になりましたね。

実装の一部としてはこんな感じです

llm_transformer = LLMGraphTransformer(llm=llm)
graph_documents = llm_transformer.convert_to_graph_documents(documents)

抽出結果

graph.draw_graphvizでグラフの可視化をすると下記のような結果が得られました。
いい感じに抽出できていそうです。


また、ネットワークとしては、下記のような形になっています。

[('Agreement On Business Use Of Generative Ai (2Nd Edition)',
  'Digital Society Promotion Council Secretariat',
  'ISSUED_BY'),
 ('Agreement On Business Use Of Generative Ai (2Nd Edition)',
  'Generative Ai',
  'CONCERNS'),
 ('Agreement On Business Use Of Generative Ai (2Nd Edition)',
  'Government Ministries And Agencies',
  'FOR'),
 ('Agreement On Business Use Of Generative Ai (2Nd Edition)',
  'Ai Strategy Council',
  'BASED_ON'),
 ('Agreement On Business Use Of Generative Ai (2Nd Edition)',
  'Ai Strategy Team',
  'BASED_ON'),
 ('Chatgpt', 'Generative Ai', 'IS_A'),
 ('Chatgpt', 'Contract-Based Cloud Service', 'CLASSIFIED_AS'),
 ('Government Ministries And Agencies',
  'Contract-Based Cloud Service',
  'MANAGES'),
 ('Contract-Based Cloud Service', 'Confidential Information', 'CANNOT_HANDLE'),
 ('Contract-Based Cloud Service',
  'Government Unified Standards',
  'DEFINED_BY'),
 ('Shadow It', 'Information Leakage', 'INCREASES'),
 ('Institutions, Etc.', 'Government Unified Standards', 'MENTIONED_IN'),
 ('Institutions, Etc.', 'Security Measures', 'RELATED_TO'),
 ('Institutions, Etc.', 'Data Handling', 'RELATED_TO'),
 ('約款型クラウドサービス', '要機密情報', 'CANNOT_HANDLE'),
 ('約款型クラウドサービス', '要機密情報を含まない情報の取扱い', 'USED_FOR'),
 ('生成Ai', '約款型クラウドサービス', 'CAN_BE_USED_VIA'),
 ('生成Ai', '個別契約等に基づく利用', 'CAN_BE_USED_VIA'),
 ('個別契約等に基づく利用', 'クラウドサービス関連規程', 'REQUIRES_COMPLIANCE_WITH'),
 ('個別契約等に基づく利用', '機密性2情報', 'CAN_HANDLE'),
 ('個別契約等に基づく利用', '機密性2情報取扱いのための措置', 'REQUIRES'),
 ('個別契約等に基づく利用', 'Ai戦略チーム', 'REQUIRES_UNDERSTANDING_FROM'),
 ('個別契約等に基づく利用', '組織の規程', 'REQUIRES_APPROVAL_BY'),
 ('個別契約等に基づく利用', '要機密情報を含まない情報の取扱い', 'USED_FOR'),
 ('職員等', '約款型クラウドサービス', 'SHOULD_BE_INFORMED_ABOUT'),
 ('職員等', '要機密情報', 'SHOULD_BE_INFORMED_ABOUT'),
 ('職員等', 'クラウドサービス', 'USES'),
 ('職員等', '定型約款や規約等', 'REVIEWS'),
 ('職員等', '利用申請の許可権限者', 'APPLIES_TO'),
 ('関係省庁', '個別契約等に基づく利用', 'CONSIDERS'),
 ('関係省庁', 'Ai戦略チーム', 'OBTAINS_UNDERSTANDING_FROM'),
 ('要機密情報を含まない情報の取扱い', '組織の規程', 'REQUIRES_APPROVAL_BY'),
 ('要機密情報を含まない情報の取扱い', 'Ai戦略チーム', 'DOES_NOT_REQUIRE_REPORT_TO'),
 ('統括情報セキュリティ責任者', '運用規程', 'ESTABLISHES'),
 ('運用規程', 'クラウドサービス', 'GOVERNS_USAGE_OF'),
 ('クラウドサービス', '要機密情報', 'CANNOT_HANDLE'),
 ('利用申請の許可権限者', 'クラウドサービス', 'APPROVES_USAGE_OF'),
 ('利用申請の許可権限者', 'クラウドサービス管理者', 'APPOINTS'),
 ('クラウドサービス管理者', '適切な措置', 'TAKES'),
 ('適切な措置', '安全な利用', 'ENSURES'),
 ('安全な利用', '要機密情報を取り扱わないクラウドサービス', 'OF')]

この得られたグラフの情報をつかって、LangChainのGraphQAChainをつかって質問をしてみます。
下記のような実装のイメージです

# グラフとLLMを使ってQAチェーンを作成
chain = GraphQAChain.from_llm(
    llm=llm, 
    graph=graph, 
    verbose=False
)

question = input("質問を入力してください ")
result=chain.run(question)
print(f"\n[回答]: {result}")

その結果は下記の通りです。
このケースでは、そこそこいい感じに取れていますね。

ChatGPTについて詳しくまとめてください
[回答]: 提供された知識に基づくと、ChatGPTについては以下のことがわかります。

  • ChatGPTはGenerative Aiです。
  • ChatGPTはContract-Based Cloud Serviceに分類されます。

サンプルを実装したときの感想

GraphRAGは数年前に話題になってから気になっており、ようやく触れたというカタチなのですが、
実装はLangChainのおかげて、シンプルに実装できたと思います。

ただ、プロダクションに投入するか?と言われると、このまま持っていくのは難しそうという印象を受けました。
1つは、処理時間の問題。ネットワークのグラフ構造を抽出する部分は、処理に時間がかかりました。
また、質問に対する精度についても、検索結果にヒットしないことも多く、一般的なRAGを超えるようにするには使い方とデータの与え方が難しいなという感想です。

グラフデータベースに慣れていないというのもあり、一般的なRAGに比べると、”検索”で何をどう検索しているかの感覚が、通常のデータベースと異なってくるので、直感的な理解が難しいなとも思いました。
うまく、GraphRAGを使いこなせるようになれるといいなと思いました。

おまけ

シンプルにLLMにプロンプトで指示するだけでもある程度のグラフ構造を取得できます。
情報の理解や、グラフ構造による分析をしていくには、Geminiで前処理をしてしまうのは、
コストパフォーマンスがよくグラフ情報の抽出ができるかなと思うので、ナレッジグラフの抽出はどこかで使えたらいいなと思っています。
以下は、Geminiアプリのcanvasでネットワークを可視化したもの


最後まで読んでいただき、ありがとうございました。
↓ のスターを押していただけると嬉しいです。励みになります。

私たちは一緒に働いてくれる仲間を募集しています!

電通総研 キャリア採用サイト 電通総研 新卒採用サイト

執筆:@iida.michitaka7b3a3dd24e9c454b、レビュー:@miyazawa.hibiki
Shodoで執筆されました