「どのテキストもコンセプトのグラフに変換する方法」

「美容・ファッションのエキスパートが贈る、コンセプトをグラフに変換する方法」

この記事で共有されたプロジェクトを使用して作者によって生成された画像。

数ヶ月前、ナレッジベースのQnA(KBQA)は斬新でした。今では、Retrieval Augmented Generation(RAG)と組み合わせたKBQAはAI愛好家にとって朝飯前です。LLMs(Language Models)のおかげでNLPの可能性の範囲が急速に拡大しているのが魅力的です。そして、ますます良くなっています。

前回の記事で、大規模なテキストコーパスに基づいて複雑なクエリに答えるためにマルチホップの推論を使用したQnAを実装するための再帰的なRAGのアプローチを共有しました。

リサーチエージェント:大きなテキストコーパスに基づく質問に答える課題に対処する

私は深いマルチホップ推論機能を持つ難しい質問に答える自律型のAIリサーチエージェントを作成しました

towardsdatascience.com

多くの方々がそれを試し、フィードバックを送ってくださいました。すべてのフィードバックに感謝します。その後、これらの貢献をまとめ、元の実装の問題のいくつかに対処するためにコードを改善しました。それについては別の記事を書く予定です。

この記事では、再帰的なRAGと組み合わせることで、スーパーリサーチエージェントの作成に役立つかもしれない別のアイデアを共有したいと思います。このアイデアは、小規模なLLMsを使用した再帰的なRAGの実験や、VoAGIで読んだ他のいくつかのアイデアから生まれました。

概要

ナレッジグラフ(KG)または任意のグラフは、ノードとエッジから構成されます。KGの各ノードは概念を表し、各エッジはそのような概念のペア間の関係です。この記事では、任意のテキストコーパスをコンセプトのグラフ(GC)に変換する方法を共有します。私はここでデモンストレーションをより良く説明するために用語「コンセプトのグラフ(GC)」と「KG」を同義に使用しています。

この実装で使用したすべてのコンポーネントはローカルで設定できるため、このプロジェクトは個人のマシンで簡単に実行できます。私はここで小さいオープンソースモデルを採用しているため、GPTは使用していません。私は素晴らしいミストラル7Bオーペンオルカインストラクトとゼフィールモデルを使用しています。これらのモデルはOllamaを使用してローカルに設定できます。

Neo4jなどのデータベースを使用すると、グラフデータの格納と取得が容易になります。ここでは、メモリ内のPandas DataframesとNetworkX Pythonライブラリを使用してシンプルに保持しています。

私たちの目標は、どんなテキストコーパスでもコンセプトのグラフ(GC)に変換し、この記事の美しいバナー画像のように視覚化することです。ノードとエッジを移動したり、ズームイン・アウトしたり、グラフの物理特性を思いのままに変更したりしてネットワークグラフと対話することさえできます。以下は、私たちが構築しているものの結果を示すGithubページへのリンクです。

https://rahulnyk.github.io/knowledge_graph/

しかし、まずはKGの基本的なアイデアとその必要性について掘り下げてみましょう。この概念についてすでにご存知の方は、次のセクションをスキップしても構いません。

ナレッジグラフ

以下のテキストを考えてみましょう。

Mary had a little lamb,You’ve heard this tale before;But did you know she passed her plate,And had a little more!

(子供たちがこれを読んでいないことを願っています 😝)

以下は、テキストをKGとして表現した一つの可能な形です。

draw.ioを使用して作成した図

IBMの以下の記事は、知識グラフの基本的な概念を適切に説明しています。

知識グラフとは?|IBM

www.ibm.com

記事から引用し、アイデアを要約するための抜粋:

知識グラフ、または意味ネットワークとも呼ばれるものは、実世界のエンティティ―すなわち、オブジェクト、イベント、状況、または概念―のネットワークを表し、それらの間の関係を示します。この情報は通常、グラフデータベースに保存され、グラフ構造として視覚化されます。このため、「知識 ‘グラフ’」という用語が使われます。

なぜ知識グラフを使用するのか?

知識グラフはさまざまな方法で役立ちます。ノードごとにグラフアルゴリズムを実行し、その概念(ノード)が業務全体にどれだけ重要かを把握することができます。接続されたおよび非接続の概念セットを分析したり、主題に関する深い理解のための概念のコミュニティを計算したりすることができます。見かけ上は関連性のない概念間のリンクを理解することができます。

また、知識グラフを使用して、グラフ検索増強生成(GRAGまたはGAG)を実装し、ドキュメントとチャットすることもできます。これにより、単純な意味的な類似検索ではクエリに最も関連性のある文脈を取得することが常に効果的ではありません。特に、クエリがその真の意図について十分な文脈を提供していない場合や、文脈が大量のテキストのコーパスに分散している場合には特にそうです。

たとえば、次のクエリを考えてみましょう―

『百年の孤独』の中のホセ・アルカディオ・ブエンディアの家族の系図について教えてください。

この本では、ホセ・アルカディオ・ブエンディアの世代が7つあり、登場人物の半分がホセ・アルカディオ・ブエンディアという名前です。シンプルなRAGパイプラインを使用してクエリに答えることは困難であるかもしれません。

RAGのもう一つの不十分な点は、何を質問すべきかを教えてくれないことです。しばしば、正しい質問をすることの方が答えを得ることよりも重要です。

グラフ増強生成(GAG)は、RAGのこれらの不十分な点をある程度解決することができます。さらに良いことに、両方の利点を最大限に引き出すために、グラフ増強検索増強生成パイプラインを組み合わせることもできます。

したがって、グラフは興味深いこと、非常に有用なこと、そして美しいことがわかりました。

概念のグラフを作成する

GPTに、与えられたテキストから知識のグラフを作成するための方法を尋ねると、以下のようなプロセスを提案するかもしれません。

  1. 作業全体から概念とエンティティを抽出します。これらはノードです。
  2. 概念間の関係を抽出します。これらはエッジです。
  3. グラフデータ構造またはグラフデータベースにノード(概念)とエッジ(関係)を追加します。
  4. 芸術的な満足感のために視覚化します。

3番目と4番目の手順は理解できると思います。しかし、1番目と2番目の手順はどのように達成するのでしょうか?

以下のフローダイアグラムは、任意のテキストコーパスから概念のグラフを抽出するための方法を示したものです。上記の方法と似ていますが、いくつかの細微な違いがあります。

Diagram created by the Author using draw.io
  1. テキストコーパスをチャンクに分割します。それぞれのチャンクにchunk_idを割り当てます。
  2. 各テキストチャンクごとにLLMを使って概念とその意味的な関係を抽出します。この関係の重みをW1とします。同じペアの概念の間には複数の関係があるかもしれません。この関係は概念のペア間のエッジです。
  3. 同じテキストチャンクに出現する概念は、文脈的な近接性によっても関連しているとみなします。この関係には重みW2を割り当てます。同じペアの概念が複数のチャンクに出現する可能性があることに注意してください。
  4. 類似したペアをグループ化し、重みを合計し、関係を連結します。これにより、異なる概念のペア間にはわずかに1つのエッジのみが存在します。エッジには一定の重みと関係のリストがあります。

このメソッドの実装は、この記事で共有しているGitHubリポジトリ内のPythonコードとして確認することができます。次のいくつかのセクションでは、実装の主なアイデアについて簡単に説明します。

このメソッドをデモンストレーションするために、Creative Commons Attribution Licenseの条件の下でPubMed/Cureusに掲載された次のレビュー記事を使用しています。この記事の最後には、著者へのクレジットがあります。

インドの医療における人的資源の課題への対応の機会

インドの健康指標は最近改善してきましたが、他の国と比較するとまだ遅れています…

www.cureus.com

ミストラルとプロンプト

上記のフローチャートのステップ1は簡単です。Langchainは、テキストをチャンクに分割するために使用できる複数のテキストスプリッターを提供しています。

ステップ2は本当の楽しさのスタートです。概念とその関係を抽出するために、私はミストラル7Bモデルを使用しています。私たちの目的に最も適したモデルのバリアントに収束する前に、次のような実験を行いました:

ミストラルインストラクトミストラルオープンオルカ、およびゼファー(ミストラルから派生したHugging Faceバージョン)

これらのモデルの4ビット量子化バージョンを使用しました-私のMacが私を嫌い始めないように-それらはOllamaでローカルにホストされています。

オラマ

ローカルで大規模な言語モデルをセットアップして実行します。

ollama.ai

これらのモデルはすべて指示に調整されたモデルであり、システムのプロンプトとユーザのプロンプトがあります。それらはすべて、指示に従い、要求があればきちんとしたJSON形式で答えを整形することができます。

幾回かの試行錯誤の後、私は最終的に以下のプロンプトを持つゼファーモデルに収束しました。

SYS_PROMPT = (    "与えられた文脈から用語とそれらの関係を抽出するネットワークグラフメーカーです。"    "コンテキストのチャンク(```で区切られています)が与えられます。与えられた文脈の中でキーコンセプトを表す用語のオントロジーを抽出するのがタスクです。 \n"    "【考え1】各文を通過する際に、それに言及されているキータームについて考えます。\n"        "\tキータームにはオブジェクト、エンティティ、場所、組織、人物、\n"        "\t状況、略語、書類、サービス、コンセプトなどが含まれる場合があります。\n"        "\tタームはできるだけ原子的であるべきです。\n\n"    "【考え2】これらの用語が他の用語との1対1の関係を持つ方法について考えます。\n"        "\t同じ文または同じ段落に言及される用語は通常、関連しています。\n"        "\t用語は多くの他の用語と関連することができます。\n\n"    "【考え3】関連する各関連ペアの関係を見つけます。 \n\n"    "出力をリストのjsonとしてフォーマットしてください。リストの各要素には"    "用語のペアとそれらの関係が含まれています。以下のようになります: \n"    "[\n"    "   {\n"    '       "node_1": "抽出されたオントロジーのコンセプト",\n'    '       "node_2": "抽出されたオントロジーの関連コンセプト",\n'    '       "edge": "2つのコンセプト(ノード1とノード2)の関係、1つまたは2つの文で説明されています"\n'    "   }, {...}\n"    "]")USER_PROMPT = f"context: ```{input}``` \n\n output: "

このプロンプトで(適していないですが)私たちの子守唄を渡すと、以下はその結果です。

[  {    "node_1": "メアリー",    "node_2": "羊",    "edge": "所有されている"  },  {    "node_1": "プレート",    "node_2": "食べ物",    "edge": "含まれている"  }, . . .]

注意してください、このテキストチャンクには明示的に言及されていない「食べ物」という概念を推測しました。素晴らしいですね!

この例の記事の各テキストチャンクを通して実行し、jsonをPandasデータフレームに変換すると、以下のようになります。

ここでの各行は、コンセプトのペア間の関係を表しています。各行はグラフ内の2つのノード間のエッジであり、同じコンセプトのペア間には複数のエッジや関係が存在することがあります。上記のデータフレームのカウントは、私が任意に4と設定したウェイトです。

脈絡的な近接性

テキストコーパス内で互いに近接して出現するコンセプトは関連していると仮定します。この関連を「脈絡的な近接性」と呼びましょう。

脈絡的な近接性のエッジを計算するために、データフレームをメルトし、node_1とnode_2を1つの列に結合します。そして、このデータフレームのチャンクIDをキーとして自己結合を作成します。したがって、同じチャンクIDを持つノードはお互いに結び付けて1つの行を形成します。

しかし、これは各コンセプトがそれ自体とも結びつくことを意味します。これは自己ループと呼ばれ、エッジが同じノードで始まり終わることを意味します。この自己ループを削除するために、データフレームからnode_1とnode_2が同じであるすべての行を削除します。

最終的に、元のデータフレームに非常に似たデータフレームが得られます。

ここでのカウント列は、node_1とnode_2が一緒に出現するチャンクの数です。column chunk_idはこれらのチャンクのリストです。

したがって、テキストで言及されるコンセプト間の意味的な関係と脈絡的な近接性の関係を持つ2つのデータフレームを持っています。これらを組み合わせてネットワークグラフのデータフレームを形成できます。

テキストの概念のグラフを構築するのに成功しました。しかし、ここで終わるのは非常に不満足な取り組みになるでしょう。私たちの目標は、この記事の冒頭にあるようなグラフを視覚化することです。そして、私たちは目標からそれほど遠くないです。

概念のネットワークの作成

NetworkXは、グラフの取り扱いを非常に簡単にするPythonライブラリです。まだこのライブラリに慣れていない場合は、以下のロゴをクリックして詳細を学びましょう。

データフレームをNetworkXグラフに追加するのはわずか数行のコードです。

G = nx.Graph()## グラフにノードを追加for node in nodes:    G.add_node(str(node))## グラフにエッジを追加for index, row in dfg.iterrows():    G.add_edge(        str(row["node_1"]),        str(row["node_2"]),        title=row["edge"],        weight=row['count']    )

ここからは、Network Graphの力を活用し始めることができます。NetworkXは、私たちが使用できる多数のネットワークアルゴリズムを提供しています。以下のリンクは、私たちのグラフで実行できるアルゴリズムのリストへのリンクです。

アルゴリズム – NetworkX 3.2.1 ドキュメント

説明の編集

networkx.org

ここでは、コミュニティ検出アルゴリズムを使用してノードに色を付けます。コミュニティは、他の部分と比べてより緊密に接続されているノードのグループです。コンセプトのコミュニティは、テキストで議論されている広範なテーマについての良いアイデアを提供してくれます。

私たちが取り組んでいるレビュー記事では、Girvan Newmanアルゴリズムは17のコンセプトのコミュニティを検出しました。以下はそのようなコミュニティの一つです。

[  'デジタルテクノロジー',   'EVIN',   '医療機器',   'オンライントレーニング管理情報システム',   '身に着けられるトラッカブルテクノロジー']

これによって、レビューペーパーで議論される健康技術の広範なテーマについてのアイデアをすぐに得ることができ、それによって私たちはRAGパイプラインで質問をすることができます。素晴らしいですね。

さらに、グラフの各概念の度数を計算しましょう。ノードの度数とは、それに接続しているエッジの総数です。したがって、私たちの場合、概念の度数が高いほど、テキストの主題にとって中心的なものです。私たちは、ノードのサイズとして度数を使用します。

グラフの可視化

可視化はこの演習の中で最も楽しい部分です。それには、芸術的な満足感があります。

私はPiVisライブラリを使用してインタラクティブなグラフを作成しています。Pyvisはネットワークの可視化のためのPythonライブラリです。ここには、VoAGIの記事があり、そのライブラリの簡単さと力を示しています。

Pyvis:Pythonでインタラクティブなネットワークグラフを可視化する

数行のコードだけで済む

towardsdatascience.com

Pyvisには、NetworkXグラフをPyVisオブジェクトに変換するための組み込みのNetworkX Helperがあります。したがって、もうコーディングは必要ありません… やった!!

覚えておいてください、エッジの太さのために各エッジの重み、ノードのカラーのためにノードのコミュニティ、および各ノードの度数をすでに計算しています。

それでは、これらのいくつかの特徴を備えたグラフをご覧ください。

この記事で議論されているプロジェクトを使用して筆者が生成したGif

インタラクティブグラフへのリンク:https://rahulnyk.github.io/knowledge_graph/

ズームイン/アウトやノードやエッジの移動が自由にできます。また、グラフの物理学を変更するためのスライダーパネルもページの下部にあります。グラフがどのように私たちが適切な質問をする手助けをし、主題をより良く理解するのに役立つか見てみましょう!

さらに、グラフがどのようにグラフ拡張検索を構築するのに役立つか、そしてそれがより良いRAGパイプラインの構築を助けるのに役立つかをさらに議論することができます。しかし、それは別の日にする方が良いと思います。この記事の目標をすでに達成しています!

Githubリポジトリ

GitHub – rahulnyk/knowledge_graph:任意のテキストを知識のグラフに変換します。これは…

任意のテキストを知識のグラフに変換します。これは、グラフ拡張生成または知識グラフベースのQnAに使用できます…

github.com

貢献と提案は大歓迎です

私は自分のコードのデモンストレーションに以下の記事を使用しました。

Saxena S G, Godfrey T (June 11, 2023) India’s Opportunity to Address Human Resource Challenges in Healthcare. Cureus 15(6): e40274. DOI 10.7759/cureus.40274

素晴らしい仕事とクリエイティブ・コモンズ・アトリビューション・ライセンスでの公開に香典申し上げます。

私について

私はアーキテクチャの学習者です(建物ではなく…テクノロジーの種類)。過去には、半導体モデリング、デジタル回路設計、電子インターフェースモデリング、IoTなどに取り組んできました。現在、Walmart Health and Wellnessで健康とウェルネスのためのデータ相互運用性とデータウェアハウスのアーキテクチャに取り組んでいます。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more