大規模モデルは知識グラフを効率的に作成するのに役立ちます

大規模モデルは知識グラフを効率的に作成するのに役立ちます

著者 | 崔昊

レビュー | Chonglou

まとめ

この記事では、ナレッジ グラフと大規模言語モデルを連携させて業界のアプリケーションを改善する方法について説明しますナレッジグラフの開発プロセス、特にエンティティ認識、関係抽出、グラフ構築という 3 つの重要なリンクについて学習しますこの記事では、実際の例を通して、自然言語処理 (NLP) と大規模言語モデルを使用してナレッジグラフを生成する方法を説明します。さらに、この記事ではオープンソースのナレッジグラフプロジェクト GraphGPT についても紹介します。

導入

ご存知のとおり、ナレッジグラフは情報や知識をグラフ構造で整理して表現する方法です。このような構造では、ノードはエンティティ(人、場所、物など)を表し、エッジはエンティティ間のさまざまな関係を表します。ナレッジグラフは、情報をより効率的に整理して取得するのに役立ち、検索、推奨システム、自然言語理解、さまざまなアプリケーション シナリオで重要な役割を果たします。大規模モデルの開発がますます加速するにつれ、大規模モデルを使用してナレッジグラフを生成する方法も静かに登場してきました。この記事では、実用的なアプローチを使用して、大規模な言語モデルを使用してナレッジ グラフを生成する方法を説明します。

ナレッジグラフの応用と開発

ナレッジグラフの応用

ナレッジグラフといえば、皆さんもよくご存知かと思いますが、さまざまな分野で重要な役割を果たしています。

1. ヘルスケア

病気の診断と治療: ナレッジグラフは、病気、症状、薬の関係を分析することで、医師がより正確な診断と治療計画を立てるのに役立ちます。

医薬品開発: ナレッジグラフはさまざまな生物医学情報を統合し、新薬の開発を加速します。

2. 金融業界

リスク管理と評価: ナレッジ グラフは、個人や企業に関する多次元情報を統合して、融資や投資のリスクをより正確に評価できます。

不正防止: トランザクションのパターンと動作​​を分析することで、ナレッジグラフは不正行為を効果的に検出し、防止することができます。

3. 電子商取引とレコメンデーションシステム

パーソナライズされた推奨事項:ナレッジ グラフは、ユーザーの行動や好み、製品属性に基づいて、より正確なパーソナライズされた推奨事項を提供できます。

サプライ チェーンの最適化: ナレッジ グラフは、サプライ チェーンの各リンクからのデータを分析することで、企業が在庫管理と物流を最適化するのに役立ちます。

ナレッジグラフの開発

ナレッジグラフは、大規模で複雑なデータ ポイントを結び付けることで、複数の業界に関連性の高い実用的な洞察を提供します。これにより、現代の情報化時代には欠かせないものとなっています。

ナレッジ グラフの開発プロセスも比較的面倒で、次の手順が必要です。

データ収集: テキスト、データベース、Web サイトなどのさまざまなソースから生データを収集します。

データクリーニング: ノイズ除去、標準化など、収集したデータを前処理します。

エンティティ認識: テキスト内の重要なエンティティ (名詞や固有名詞など) を識別します。

関係抽出: エンティティ間の関係を決定します (「is」、「has」、「belongs to」など)。

グラフの構築: 識別されたエンティティと関係を使用してナレッジ グラフを構築します。

検証と更新: ナレッジ グラフを手動または自動で検証し、動的に更新します。

トリプル

上記のプロセスの各ステップは重要ですが、「エンティティ認識」、「関係抽出」、「グラフ構築」の 3 つのステップは、開発プロセス全体の最優先事項です。認識、抽出、構築を完了するにはトリプルを使用する必要があります。

GPT や BERT などの大規模言語モデルが登場する前は、ナレッジグラフは主にルールマッチング、品詞タグ付け、依存関係解析、およびさまざまな機械学習手法に依存してトリプレット (エンティティ 1、関係、エンティティ2 ) を抽出していました。これらの従来の方法にはそれぞれ長所と短所があります。たとえば、大量の手動ルール、ラベル付きデータ、コンピューティング リソースが必要であり、一般化能力と精度も限られています。

例: 次の3つの文からトリプルを抽出します

1. シャオホンは私のクラスメートです。

2. シャオホンはシャオミンの隣人です。

3. シャオミンはバスケットボールチームの私のチームメイトです。

NLP メソッドを使用して処理できます。コードは次のとおりです。

 from snownlp import SnowNLP # 初始化三元组列表triplets = [] # 待处理的文本列表sentences = [ "小红是我的同学。", "小红是小明的邻居。", "小明是我的篮球队队友。" ] # 遍历每个句子进行处理for sentence in sentences: # 使用SnowNLP进行自然语言处理s = SnowNLP(sentence) # 从句子中抽取名词和动词words = [word for word, tag in s.tags if tag in ('nr', 'n', 'v')] # 假设我们的三元组格式为: (实体1, 关系, 实体2) # 在这个简单的例子里,我们只取前两个名词作为实体1和实体2,动词作为关系if len(words) >= 3: triplets.append((words[0], words[2], words[1])) # 输出抽取出来的三元组print(triplets)

コードの簡単な説明は次のとおりです。

  • まず、抽出されたトリプレットを格納するための空のトリプレット リストを初期化します。
  • 次に、処理する 3 つの文を含む文リストが定義されます。
  • for ループを使用して文を反復処理します。
  • SnowNLP を使用して、各文に対して自然言語処理を実行します。
  • s.tags を通じて品詞タグを取得し、名詞 ('n')、名前 ('nr')、動詞 ('v') を抽出します。
  • 文にそのような単語が少なくとも 3 つ (エンティティが 2 つ、関係が 1 つ) 含まれている場合は、トリプレットが形成され、トリプレットのリストに追加されます。

上記のコードを実行すると、次の結果が生成されます。

 [('是', '邻居', '小明'), ('小明', '篮球队', '是')]

結果は、自然言語処理 (NLP) タスク問題を示しています

1. トリプルの構成が不正確です。たとえば、最初のトリプル (「是」、「邻」、「小明」) では、「是」はエンティティではなく関係です。

2. 一部の重要な情報が失われます。たとえば、3 番目の文「Xiao Ming と私はバスケットボール チームのチームメイトです」は、トリプルとして正しく抽出されません。

これらの問題は、一般的な NLP タスク、特にルールや浅い NLP ツールに基づくタスクのいくつかの制限を明らかにしています。

1. 品詞タグ付けと構文解析の不正確さ: 品詞タグ付けと構文解析ツールの精度に依存します。ツールが間違っていると、その後の情報抽出にも影響します。

2. 深い意味理解の欠如: 品詞タグ付けと浅い構文分析だけでは、複雑または曖昧な関係を正確に抽出することは困難です。

3. 一般化能力が低い: 異なるタイプや構造の文の場合、ルールやモデルを常に調整する必要がある場合があります。

4. 文脈情報の活用が不十分: このアプローチでは通常、1 つの文内の情報のみが考慮され、複雑なテキストでは非常に重要な文脈情報は無視されます。

大規模言語モデルが知識グラフにどのように役立つか

GPT や BERT などの大規模言語モデルは、優れたテキスト理解および生成機能を備えた、ディープラーニングに基づく自然言語処理モデルです。自然言語を理解できるため、複雑なクエリや推論が容易になります。従来の方法と比較して、大規模モデルには次のような利点があります。

  • テキスト理解機能:より複雑、曖昧、またはあいまいなエンティティと関係を正確に抽出して理解できます。
  • コンテキストへの敏感性:大規模なモデルは、さまざまなコンテキストにおける単語のさまざまな意味を理解することができ、これはエンティティと関係性を正確に抽出するために重要です。この文脈依存性により、モデルは複雑で曖昧な文の構造を理解することができます。
  • 強力な一般化能力:大量の多様なデータでトレーニングされているため、これらのモデルは新しい未知のデータにも適切に一般化できます。つまり、複雑な構造や珍しい表現を持つテキストからでも、エンティティと関係を正確に抽出できるということです。

同じ例を使用して大規模なモデルがどのように行われるかを見てみましょう。コードは次のとおりです。

 from snownlp import SnowNLP # 初始化三元组列表triplets = [] # 待处理的文本列表from langchain.llms import OpenAI llm = OpenAI(model_name="gpt-3.5-turbo") texts = '''小红是我的同学。小红是小明的邻居。小明是我的篮球队队友。''' #知识图谱索引创建from langchain.indexes import GraphIndexCreator #知识图谱问答的chain from langchain.chains import GraphQAChain #知识图谱三元素的一个类。 三元素:主谓宾。 from langchain.graphs.networkx_graph import KnowledgeTriple #创建图谱的索引,解析文本内容index_creator = GraphIndexCreator(llm=llm) #创建图谱的索引,显示对象之间的关系f_index_creator = GraphIndexCreator(llm=llm) final_graph = f_index_creator.from_text('') #对文本进行切割for text in texts.split("."): #将切割以后的文本生成三元组triples = index_creator.from_text(text) for (node1, node2, relation) in triples.get_triples(): #将三元组的信息放到final_graph中用以显示final_graph.add_triple(KnowledgeTriple(node1, node2,relation )) print("=================") print(node1) print(relation) print(node2)

上記のコードはナレッジグラフを構築するために使用されます。 3 つのメインモジュール「OpenAI」、「GraphIndexCreator」、「GraphQAChain」と、補助クラス「KnowledgeTriple」を使用します。主な内容は次のとおりです。

  1. OpenAI 初期化: `llm = OpenAI(model_name="gpt-3.5-turbo")` 。 `gpt-3.5-turbo` の大規模言語モデル (LLM) を初期化しました。
  2. 入力テキスト: `texts = 'Xiaohongは私のクラスメートです。シャオホンはシャオミンの隣人です。シャオミンはバスケットボールチームの私のチームメイトです。 '` 複数の文を含む、処理対象のテキストを定義します。
  3. グラフ インデックスを作成します: `index_creator = GraphIndexCreator(llm=llm)` `GraphIndexCreator` クラスを使用して、以前に初期化された大規模言語モデルを使用するグラフ インデックス ジェネレーターを作成します。
  4. 最終グラフを初期化します。`final_graph = f_index_creator.from_text('')` は、最終的なトリプル情報を格納するための空のナレッジ グラフを初期化します。
  5. テキストの分割とトリプル生成: `for text in texts.split("."):`このループは、テキストをピリオドで分割し、空でない文ごとにトリプルを生成します。
  6. `triples = index_creator.from_text(text)` は、 `index_creator` の `from_text` メソッドを通じて各文のトリプルを生成します。
  7. トリプルの保存と出力: `final_graph.add_triple(KnowledgeTriple(node1, node2,relation ))` は、生成されたトリプルを `final_graph` ナレッジ グラフに追加します。

結果は次のとおりです:

 =================小红是我的同学=================小红是小明的邻居=================小明是我的篮球队队友

上記の NLP 処理の結果よりも良く見えますか?

テキスト変数を変更すると:

 texts = '''小鸟国,正式名称飞禽国度(ISO:飞禽国度),是位于新世界南部的国家。它以领土面积而言是世界第七大国家;是人口最多的国家,一直是世界上人口最多的民主国家。小鸟国南临翡翠海,西南濒临蓝色海洋,东南濒临碧玉海,与翼足国家在西部接壤;北部与巨翼国、鸣虫国和象牙国相邻;东部与彩虹国和翡翠国接壤。在翡翠海中,小鸟国位于双岛国家和翡翠群岛,与彩虹国、碧玉国和绿洲国共享海上边界。翡翠海是7大文明遗迹之一,在天门东边'''

特に複雑な例を使って説明しましょう。この例は私たちが作成した架空の国であり、この国に関連する他のいくつかの国について説明しています。かなり複雑に見えます。この時点で、ノードとエッジを通じてこのような複雑な関係を示すグラフを追加します。次のコードを追加します:

 import networkx as nx import matplotlib.pyplot as plt #创建一个空的有向图G = nx.DiGraph() #将上面得到的三元组放到图像的边中#source - node1 , target - node2 , relation - relation G.add_edges_from((source, target, {'relation': relation}) for source, relation, target in final_graph.get_triples()) #指定图像的大小和分辨率plt.figure(figsize=(8,3), dpi=500) #通过spring算法定义节点的布局pos = nx.spring_layout(G, k=3, seed=0) edge_labels = nx.get_edge_attributes(G, 'relation') nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels, font_size=8,font_family='simhei') #定义显示中文字体nx.draw_networkx(G, font_family = 'simhei') #关闭坐标轴显示plt.axis('off') plt.show()

このコードは、`networkx` および `matplotlib.pyplot` ライブラリを使用して、以前に抽出されたトリプル (エンティティ-リレーションシップ-エンティティ) からノードとエッジが取得される有向グラフ (つまり、ナレッジ グラフ) を視覚化します。

1. 空の有向グラフを作成する: `G = nx.DiGraph()`

2. グラフにエッジを追加します。

`G.add_edges_from((source, target, {'relation': relationship}) for source, relationship, target in final_graph.get_triples())`

以前にテキストから抽出したトリプルをグラフ `G` にエッジとして追加します。各エッジには、ソース (`source`)、エンドポイント (`target`)、および 2 つの関係を示すラベル (`relation`) があります。

3. 画像のサイズと解像度を設定します。

`plt.figure(figsize=(8,3), dpi=500)`

画像サイズ(8x3)と解像度(500 DPI)が設定されています。

4. ノードレイアウトを定義します。

`pos = nx.spring_layout(G, k=3, シード=0)`

「スプリング」レイアウト アルゴリズムを使用して、グラフ内の各ノードの位置を決定します。 `k` はノード間隔を設定するために使用されるパラメータであり、 `seed` は乱数ジェネレータのシードです。

5. エッジラベルを取得して描画します。

`edge_labels = nx.get_edge_attributes(G, '関係')`

`nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels, font_size=8, font_family='simhei')`

グラフ内の各エッジのラベル (つまり、`relation`) が取得され、プロットされます。

6. グラフを描きます。

`nx.draw_networkx(G, フォントファミリ = 'simhei')`

図全体は、漢字をサポートするために「simhei」フォントを使用して描かれています。

7. 軸表示をオフにして画像を表示します

`plt.axis('off')`

`plt.show()`

軸の表示がオフになり、最終画像が表示されます。

結果を見てみましょう:

 =================小鸟国是新世界南部的国家=================小鸟国以领土面积而言是世界第七大国家=================小鸟国是人口最多的国家=================小鸟国是世界上人口最多的民主国家=================小鸟国南临翡翠海=================小鸟国西南濒临蓝色海洋=================小鸟国东南濒临碧玉海=================小鸟国与翼足国家在西部接壤=================小鸟国北部与巨翼国、鸣虫国和象牙国相邻=================小鸟国东部与彩虹国和翡翠国接壤=================小鸟国在翡翠海中位于双岛国家和翡翠群岛=================小鸟国与彩虹国、碧玉国和绿洲国共享海上边界=================翡翠海是7大文明遗迹之一

生成されたナレッジ グラフは、Bird Country に関連するすべての場所を接続します。

次に、次のコードに示すように、上記のナレッジ グラフについて質問します。

 chain = GraphQAChain.from_llm(llm, graph=final_graph, verbose=True) chain.run('翡翠海在哪里?')

結果は次のとおりです:

 > Entering new chain... Entities Extracted:翡翠海Full Context:翡翠海7大文明遗迹之一是

ナレッジ グラフは、3 つの要素を通じて、「エメラルドの海」(エンティティ 1)、「7 大文明遺跡の 1 つ」(エンティティ 2)、「である」(関係) を伝えます。

GraphGPTをすぐに使える

上記の実践的な経験から、大規模なモデルを使用すると、ナレッジ グラフをより適切に処理し、ナレッジ グラフの内容について質問できることがわかります。このようなシステムを自分で開発するのが面倒な場合は、 Github にあるオープンソースの GraphGPTを使用してみることもできます

アドレスはここに載せました。https ://github.com/varunshenoy/GraphGPT

GraphGPT は、構造化されていない自然言語を知識グラフに変換するプロジェクトです。映画のあらすじ、Wikipedia のページ、ビデオの書き起こしなど、さまざまな種類の入力を受け取り、エンティティ間の関係を示す視覚的なグラフを生成します GraphGPT は継続的なクエリをサポートしており、これを使用して既存のグラフの状態を更新したり、まったく新しい構造を作成したりできます。

インストール手順

依存関係をダウンロードする

必要な依存関係をダウンロードするにはnpm installを実行します。現在はreact-graph-visのみが必要です

OpenAI APIキーを取得する

クエリを実行するときに入力する OpenAI API キーがあることを確認してください。

プロジェクトを開始する

npm run startを実行します。GraphGPT が新しいブラウザ タブで開きます。

これらの手順を実行すると、GraphGPT を実行し、自然言語テキストをナレッジグラフに変換できるようになります。

コードを実行する

上記の手順に従ってコードを実行すると、 http://localhost:3000でローカルのウェブサイトが開きます。ナレッジグラフのテキストとOpenAIを入力する必要があります。 鍵。

ナレッジ グラフを生成するテキストを入力し、「生成」ボタンをクリックして、グラフの関係を生成します。

コードの説明

このオープンソースプロジェクトはjsを通じて実装されています 大規模モデルの呼び出しを実現し、ナレッジグラフを生成します。下の図のコード構造から、主なビジネスロジックはApp.jsファイルにあり ディレクトリの下。

この React アプリケーションの主な目的は、GPT モデルを通じて入力された自然言語に基づいてナレッジ グラフを生成することです。メイン関数(App.js について説明しましょう。

  • 依存関係のインポートimport './App.css'; // CSS スタイルをインポートimport Graph from "react-graph-vis"; // グラフの視覚化のために react-graph-vis ライブラリをインポート
    import React, { useState } from "react"; // ReactとuseStateフックをインポートする
  • 定数の定義const DEFAULT_PARAMS = {...}; // GPTモデルのデフォルトパラメータ
    const SELECTED_PROMPT = "STATELESS"; // デフォルトのプロンプトタイプconst options = {...}; // グラフのレイアウトとスタイルのオプション
  • 主な機能コンポーネント - アプリfunction App() { const [graphState, setGraphState] = useState({...}); // useStateを使用してグラフの状態を管理する
    const clearState = () => {...}; // グラフの状態をクリアする
    const updateGraph = (updates) => {...}; // グラフの状態を更新します
    const queryStatelessPrompt = (prompt, apiKey) => {...}; // クエリステートレスプロンプト
    const queryStatefulPrompt = (prompt, apiKey) => {...}; // クエリステートフルプロンプト
    const queryPrompt = (prompt, apiKey) => {...}; // 選択したプロンプトタイプに基づいてクエリを実行します
    const createGraph = () => {...}; // グラフを作成するreturn (<div className='container'> ... </div>); // アプリケーションの JSX 構造を返す
    }
  • グラフの状態をクリアする - clearState定数クリアステート = () => {
    グラフの状態を設定する({
    ノード: [],
    エッジ: []
    });
    };
    この関数はグラフのすべてのノードとエッジをクリアします。
  • グラフの状態を更新する - updateGraph const updateGraph = (更新) => {
    var current_graph = JSON.parse(JSON.stringify(graphState)); // 現在のグラフ状態をディープコピーします
    // ...
    setGraphState(current_graph); // 新しいグラフの状態を設定する
    };
    この関数は、提供された更新情報 (ノード、エッジ、色など) に基づいてグラフの状態を更新する役割を担います。
  • GPT API とのやり取り - queryStatelessPrompt と queryStatefulPromptこれら 2 つの関数は GPT モデルと対話し、モデルによって生成されたテキストを取得し、この情報を使用してグラフを更新します。
  • グラフを作成する - createGraph
 const createGraph = () => { // ... queryPrompt(prompt, apiKey); // 调用queryPrompt进行图的生成}; ```

この関数は、ユーザーが入力したプロンプトと API キーを受け取り、`queryPrompt` 関数を呼び出してグラフを生成します。

さらに、2 つのプロンプト状態に対して 2 つの異なるプロンプト ファイルが生成されます。stateful.promptと stateless.prompt はどちらも、ナレッジ グラフ内のエンティティとリレーションシップを処理するために使用されます。 stateful.prompt は状態を認識し、グラフの現在の状態に基づいてノードとエッジを追加または変更します。継続的な更新が必要なシナリオに適しています。対照的に、stateless.prompt はステートレスであり、グラフの現在の状態に関係なく、指定されたプロンプトに基づいて一連の更新のみを生成します。一度限りの更新タスクや独立した更新タスクに適しています。 2 つの主な違いは、グラフの現在の状態を考慮する必要があるかどうかです。

要約する

この記事では、現代の情報処理と意思決定におけるナレッジグラフとビッグモデルのかけがえのない役割について説明します。医療診断から財務リスク評価、パーソナライズされた推奨事項まで、ナレッジグラフは強力な応用可能性を実証しています。同時に、GPT などの大規模言語モデルも、ナレッジ グラフの生成とクエリにおいて重要な役割を果たします。大規模言語モデルの助けを借りて、知識グラフを効率的に作成し、リアルタイムで柔軟に更新およびクエリすることができます。この記事は、ビッグデータと AI テクノロジーを実際のアプリケーションに統合したい人にとって有益です。

著者について

51CTO コミュニティ エディター兼シニア アーキテクトの Cui Hao 氏は、ソフトウェア開発とアーキテクチャで 18 年の経験があり、分散アーキテクチャでは 10 年の経験があります。

<<:  旅行業界における人工知能の未来

>>: 

ブログ    
ブログ    
ブログ    
ブログ    
ブログ    

推薦する

スノーフレークアルゴリズムを学ぶのに役立つ記事

[[419666]]序文みなさんこんにちは、パンパンです!これまでは rand と srand を使...

...

AIにも美的感覚や創造性が備わったら、人間のデザイナーは恥ずかしくなるでしょうか?

毎日、インテリジェント システムとアルゴリズムが、Uber の運転手、会計士、さらには弁護士などの単...

AmazonのAI研究開発はファッショントレンドをリードするために異なるアプローチを採用しています

テクノロジーサイトEngadgetが北京時間8月25日に報じたところによると、人工知能は現在、ほとん...

3 つの AIOps プラクティス: 可視化、自動化からインテリジェンスまで

2018年5月18日〜19日、51CTO主催のグローバルソフトウェアおよび運用技術サミットが北京で開...

人工知能教育の時代が到来。AIは何ができるのか?

[[265994]]最近、国際人工知能教育会議、第3回世界知能会議が相次いで開催され、さまざまなA...

自社開発のAIチップのトレンドが始まっており、テクノロジー依存からの脱却は始まりに過ぎない

大規模な AI モデルへの熱狂に後押しされ、AI チップの分野ではついに百家争鳴の時代が到来しました...

カオスに基づくデジタル画像暗号化アルゴリズム

概要: 現在、カオスシステムと暗号化技術の組み合わせは、最もホットなトピックの 1 つです。多数の暗...

OpenAI憲章中国語版

この文書は、OpenAI 内外の多くの人々からのフィードバックを含め、過去 2 年間にわたって改良し...

貢献度が最も高い GitHub コレクションとディープラーニング フレームワーク 16 選

ビッグデータ概要編纂者:Jingzhe、Shijintian、Jiang Baoshangディープラ...

バーチャルシンガー、AIの背後にある見えざる手が音楽の未来を握っているのか?

19 世紀以前、人々が集まるときには、人生の物語を語り、感情や考えを伝えるために、常に最も原始的な...

...

適切な機械学習アルゴリズムを簡単に選択

著者: ヨギータ・キナブガッティが編集企画丨孫淑娊適切な機械学習アルゴリズムを選択するにはどうすれば...

人工知能、機械学習、ディープラーニング

1. 人工知能と機械学習記事を始める前に、下の図 1.1 に示すように、人工知能、機械学習、ディープ...

...