こんにちは、CCCMKホールディングスTECH LAB三浦です。
最近Retrieval-Augmented Generation(RAG)に関する情報を見ていると、ドキュメントデータの格納場所としてVectorDBではなくKnowledge-Graphを使う手法を目にすることが多くなりました。Knowledge-Graphを用いることで、VectorDBによるRAGでは回答が難しい質問にも答えることが出来る場合があります。
今回はRAGにおけるKnowledge-Graphの活用方法から、そもそもKnowledge-Graphとはどのような概念なのか、そしてドキュメントからKnowledge-Graphをどうやって構築するのかについて色々な情報を元に調べてみたのでまとめてみたいと思います。
GraphRAG
最初に、Knowledge-GraphやRAGへの活用について興味を持ったきっかけとなったMicrosoftのブログをご紹介します。
このブログでは、RAGにKnowledge-Graphを用いたGraphRAGという新しい手法が紹介されています。従来のVectorDBによるRAGでは様々な情報を横断して新しい意見を導き出したり広範囲のドキュメントを要約する時に特に上手くいかないことがあります。
これは私自身も経験があって、"○○について要約して"と質問をすると一見上手くいっているようでも何らかの大事な情報が欠けていることが起こります。たとえば"LLM"について要約をしてほしい時、LLMの誕生した背景や学習データ、学習方法、種類といった情報が含まれることを期待します。ところが従来のRAGだとその要約の中に例えば"学習方法"が含まれていなかったりします。これはVectorDBから関連情報を検索する時にLLMの学習方法に関する情報が抽出出来ていないことに起因します。
この問題をもう少し深く考えてみると、まずLLMは機械学習モデルの1種であって、機械学習モデルにはそれを学習させるアルゴリズム(方法)があり、そして機械学習モデルの1種であるLLMを説明するためにはその学習方法についても説明する必要があるだろう、という考えを私は無意識にしているのだと思います。
これを実現するためにはデータの持ち方として、ドキュメントの中に出現する"モノ", "イベント", "概念"といった登場人物たちをその関係性で関連付けて持っておく必要があります。たとえば"LLM"と"Next-Token Prediction"という登場人物を"学習方法"という関係性で結び付けておく、というイメージです。
このようなデータの持ち方としてKnowledge-Graphがあり、Knowledge-GraphのベースとしてOntologyがあります。
Knowledge-GraphとOntology
Knowledge-Graphとは英語版のWikipediaを参照すると、まずグラフ構造でデータを表現すること、グラフはエンティティという現実世界の"モノ"、"イベント"、"状況"、"抽象的な概念"と、それらの相互関係によって構成されたものであることが分かります。
たとえば私(三浦)の仕事上の自己紹介資料があったとして、そこから構築されるKnowledge-Graphには"三浦"というエンティティがいて、出身地としての"東京"というエンティティ、仕事としての"AIエンジニア"というエンティティが相互リンクされていることになります。
仕事で使う自己紹介資料には、たいてい"人物"と、その人物の"出身地", "仕事内容", "趣味"といった概念が出現し、"人物"は"出身地", "仕事内容", "趣味"を"自身の属性"として所持している関係性があります。このようにある領域における概念やその概念の関係性を表現したものをOntologyと呼びます。Knowledge-GraphはOntologyを具体化したものであると見なすことが出来ると思います。
Knowledge-GraphとOntologyの関係性についてはこちらの記事が大変参考になりました。
・・・それでKnowledge-Graphってどうやって構築するのか?
ここまでで何となくKnowledge-Graphが分かってきたものの、Knowledge-Graphってどうやって作るんだろう?という疑問が湧いてきます。GraphRAGのブログの最後の方に"Creating LLM-generated knowledge graphs"というセクションがあり、そこを読むとKnowledge-Graphの構築にLLMを使用していることが伺えます。
LLMを用いてKnowledge-Graphを構築する実例はLangChainのブログでも紹介されています。
Experimental(実験的な)機能の中にLLMGraphTransformer
というクラスがあり、このクラスを用いることで比較的容易にLangChainのドキュメントクラスDocument
の配列からKnowledge-Graphを構築することが出来るようです。LLMGraphTransformer
のソースコードを読むと、与えられたテキストに対し、Tool Callingの機能を用いてエンティティと関係性の抽出を行っている様でした。
この方法はテキストから直接Knowledge-Graphを構築していますが、Ontologyを構築してからKnowledge-Graphを構築する手順をLLMを用いて行う手法も提案されています。それは"From human experts to machines: An LLM supported approach to ontology and knowledge graph construction"という論文で紹介されている方法です。
LLMによるOntologyとKnowledge-Graphの構築
OntologyとKnowledge-Graphの構築は従来とても時間がかかり、かつ様々な分野の専門性が求められるタスクです。ゼロから人が構築しようとするととても重たいタスクですが、LLMがアイデアを作り、それを人が過不足ないか確認する方法を取ることで大幅に負荷を下げられることが期待されます。
こちらの論文ではLLMを用いたOntologyの構築からKnowledge-Graphの構築までの手法が提案されています。
- Title: From human experts to machines: An LLM supported approach to ontology and knowledge graph construction
- Authors: Vamsi Krishna Kommineni, Birgitta König-Ries, Sheeba Samuel
- Submitted : 13 Mar 2024
- arXiv URL: https://arxiv.org/abs/2403.08345
この論文の手法で面白いなと感じたことの1つがOntologyのベースとなる能力質問(Competency Questions: CQs)の作成は"gpt-35-turbo"で行い、以降はオープンソースのLLM"Mixtral 8x7B"を用いている点です。オープンソースのLLMを用いることでコストを抑えるだけでなく、透明性や柔軟性を確保することが出来ます。
提案手法では、Ontologyの構築からKnowledge-Graphまでの構築を次のような手順で行っています。
CQ generation
Competency Question(CQ)は日本語では"能力質問"と訳されることがあるようですが、私は実は初めて聞いた概念でした。ChatGPTによると"雇用主が求める特定の能力や経験を評価するための質問"と答えてくれたので、その分野に関する知識や経験を引き出すための質問であると捉えることが出来ると思います。
論文の提案手法では、まず対象のドキュメントが属する専門領域についての抽象的な内容を尋ねるCQを生成します。そしてCQを元にOntologyを構築します。論文では"Deep Learning"の領域を例として扱っており、Deep Leaningの処理のパイプラインの出所についてのCQを生成していました。たとえば"What are the sources of input data for the deep learning pipeline?"(そのDL pipelineの入力データの源泉は?)のような質問です。
CQの作成はgpt-35-turboで行い、その後人の目で評価されたものが以降使用されます。
Ontology creation
LLMが生成したCQを用いてOntologyの構築を行います。ここからはオープンソースのLLMが使用されます。最初にCQからそこに含まれている概念とそれらの関係性をLLMを用いて抽出します。その後、それらの概念と関係性、さらにPROV-OというOntologyの表現記法を例としてLLMに与え、PROV-Oの記法に基づいたOntologyが構築されます。
CQ Answering
ここからはドキュメントに含まれるエンティティをOntologyに当てはめてKnowledge-Graphを構築するステップに入ります。まず先のステップで生成されたCQに対する回答をLLMで生成します。その際対象のドキュメントを参照するRAGを利用します。生成された回答から冗長だったり繰り返されている内容を取り除き、Knowledge-Graphの構築に利用されます。
KG construction
最後にLLMにCQとその回答、Ontologyの情報を与え、CQの回答に含まれるエンティティ、関係性、概念を抽出させOntologyの構造に当てはめ、Knowledge-Graphを構築します。
まとめ
今回の記事ではGraphRAGからKnowledge-GraphやOntologyという概念に触れてみました。軽い気持ちで足を踏み入れたのですが、いざ足を踏み入れるととても深い領域でした・・・。GraphRAGは今度、LangChainの機能を使って試してみたいと思います。一方でOntologyやKnowledge-Graph構築におけるLLMの活用はRAGに留まらず、AIが人間と近い観点で物事を考える、そんな世界に繋がっていくような可能性を感じました。今回これまで知らなかった新しい概念を知ることが出来、とてもいい勉強になりました。