ホームページ  >  記事  >  テクノロジー周辺機器  >  ナレッジ グラフを利用して RAG モデルの機能を強化し、大規模モデルの誤った印象を軽減する

ナレッジ グラフを利用して RAG モデルの機能を強化し、大規模モデルの誤った印象を軽減する

WBOY
WBOY転載
2024-01-14 18:30:20898ブラウズ

大規模言語モデル (LLM) を使用する場合、幻覚はよくある問題です。 LLM は滑らかで一貫性のあるテキストを生成できますが、生成される情報は不正確または一貫性がないことがよくあります。 LLM の幻覚を防ぐために、データベースやナレッジ グラフなどの外部知識ソースを使用して事実情報を提供できます。このようにして、LLM はこれらの信頼できるデータ ソースに依存できるため、より正確で信頼性の高いテキスト コンテンツが得られます。

ベクトル データベースとナレッジ グラフ

ナレッジ グラフを利用して RAG モデルの機能を強化し、大規模モデルの誤った印象を軽減する

ベクトル データベース

ベクトル データベースは、エンティティまたは概念を表す高次元ベクトルのセットです。 。これらは、ベクトル表現を通じて計算された、異なるエンティティまたは概念間の類似性または相関関係を測定するために使用できます。

ベクトル データベースでは、ベクトル距離に基づいて、「パリ」と「フランス」の方が「パリ」と「ドイツ」よりも関連性が高いことがわかります。

ベクトル データベースのクエリには、通常、類似したベクトルの検索または特定の基準に基づくベクトルの検索が含まれます。以下は、ベクトル データベースにクエリを実行する簡単な例です。

顧客プロファイルを格納する高次元ベクトル データベースがあると仮定します。特定の参照顧客に類似した顧客を見つけたいと考えています。

まず、顧客をベクトル表現として定義するために、関連する特徴または属性を抽出し、それらをベクトル形式に変換します。

類似性検索は、適切なアルゴリズム (k 最近傍アルゴリズムやコサイン類似度など) を使用してベクトル データベースで実行し、最も類似した近傍を識別できます。

定義された類似性尺度に従って、参照顧客に類似する顧客を表す、決定された最近傍ベクトルに対応する顧客プロファイルを取得します。

取得した顧客プロファイルや、名前、人口統計データ、購入履歴などの関連情報をユーザーに表示します。

ナレッジ グラフ

ナレッジ グラフは、エンティティまたは概念とそれらの関係 (事実、属性、カテゴリなど) を表すノードとエッジのコレクションです。ノードとエッジの属性に基づいて、さまざまなエンティティや概念に関する事実情報をクエリまたは推測するために使用できます。

たとえば、ナレッジ グラフでは、エッジ ラベルに基づいて、「パリ」が「フランス」の首都であることがわかります。

グラフ データベースのクエリには、グラフ構造を走査し、特定の基準に基づいてノード、関係、またはパターンを取得することが含まれます。

ソーシャル ネットワークを表すグラフ データベースがあるとします。ユーザーはノードであり、ユーザーの関係はノードを接続するエッジとして表されます。特定のユーザーに対して友人の友人 (共通の接続) が見つかった場合は、次のことを行う必要があります:

1. グラフ データベース内の参照ユーザーを表すノードを特定します。これは、特定のユーザー識別子またはその他の関連基準をクエリすることによって実現できます。

2. Cypher (Neo4j で使用) や Gremlin などのグラフ クエリ言語を使用して、参照ユーザー ノードからグラフを走査します。探索するパターンまたは関係を指定します。

MATCH (:User {userId: ‘referenceUser’})-[:FRIEND]->()-[:FRIEND]->(fof:User) RETURN fof

このクエリは参照ユーザーから始まり、FRIEND 関係に従って別のノード (FRIEND) を検索し、次に別の FRIEND 関係に従って友人の友人 (fof) を検索します。

3. グラフ データベースに対してクエリを実行し、クエリ モードに従って結果ノード (友人の友人) を取得し、取得したノードに関する特定の属性やその他の情報を取得できます。

グラフ データベースは、フィルタリング、集計、複雑なパターン マッチングなど、より高度なクエリ機能を提供できます。特定のクエリ言語と構文は異なる場合がありますが、一般的なプロセスには、グラフ構造を走査して、必要な基準を満たすノードと関係を取得することが含まれます。

「錯覚」問題の解決におけるナレッジ グラフの利点

ナレッジ グラフは、ベクトル データベースよりも正確で具体的な情報を提供します。ベクトル データベースは 2 つのエンティティまたは概念間の類似性または相関関係を表し、ナレッジ グラフによりそれらの間の関係をより深く理解できるようになります。たとえば、ナレッジ グラフでは「エッフェル塔」が「パリ」のランドマークであることがわかりますが、ベクトル データベースでは 2 つの概念の類似性が示されるだけで、それらがどのように関連しているかは説明されません。

ナレッジ グラフは、ベクトル データベースよりも多様で複雑なクエリをサポートします。ベクトル データベースは主に、ベクトルの距離、類似性、または最近傍に基づいてクエリに応答できますが、これらは直接の類似性測定に限定されます。また、ナレッジ グラフは、「属性 Z を持つすべてのエンティティは何ですか?」または「W と V の共通カテゴリは何ですか?」などの論理演算子に基づいたクエリを処理できます。これは、LLM がより多様で興味深いテキストを生成するのに役立ちます。

ナレッジ グラフは、ベクトル データベースよりも推論と推論に適しています。ベクトル データベースは、データベースに保存されている直接情報のみを提供できます。また、ナレッジ グラフは、エンティティまたは概念間の関係から得られる間接的な情報を提供できます。たとえば、ナレッジ グラフは、「パリはフランスの首都である」と「フランスはヨーロッパに位置する」という 2 つの事実に基づいて、「エッフェル塔はヨーロッパに位置する」と推測できます。これは、LLM がより論理的で一貫性のあるテキストを生成するのに役立ちます。

つまり、ナレッジ グラフはベクトル データベースよりも優れたソリューションです。これにより、LLM はより正確で、関連性があり、多様性があり、興味深い、論理的で一貫性のある情報が提供され、正確で本物のテキストを生成する際の信頼性が高まります。ただし、ここで重要なのは、ドキュメント間に明確な関係がある必要があるということです。そうでない場合、ナレッジ グラフはそれを捉えることができません。

但是,知识图谱的使用并没有向量数据库那么直接简单,不仅在内容的梳理(数据),应用部署,查询生成等方面都没有向量数据库那么方便,这也影响了它在实际应用中的使用频率。所以下面我们使用一个简单的例子来介绍如何使用知识图谱构建RAG。

代码实现

我们需要使用3个主要工具/组件:

1、LlamaIndex是一个编排框架,它简化了私有数据与公共数据的集成,它提供了数据摄取、索引和查询的工具,使其成为生成式人工智能需求的通用解决方案。

2、嵌入模型将文本转换为文本所提供的一条信息的数字表示形式。这种表示捕获了所嵌入内容的语义含义,使其对于许多行业应用程序都很健壮。这里使用“thenlper/gte-large”模型。

3、需要大型语言模型来根据所提供的问题和上下文生成响应。这里使用Zephyr 7B beta模型

下面我们开始进行代码编写,首先安装包

%%capture pip install llama_index pyvis Ipython langchain pypdf

启用日志Logging Level设置为“INFO”,我们可以输出有助于监视应用程序操作流的消息

import logging import sys # logging.basicConfig(stream=sys.stdout, level=logging.INFO) logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))

导入依赖项

from llama_index import (SimpleDirectoryReader,LLMPredictor,ServiceContext,KnowledgeGraphIndex) # from llama_index.graph_stores import SimpleGraphStore from llama_index.storage.storage_context import StorageContext from llama_index.llms import HuggingFaceInferenceAPI from langchain.embeddings import HuggingFaceInferenceAPIEmbeddings from llama_index.embeddings import LangchainEmbedding from pyvis.network import Network

我们使用Huggingface推理api端点载入LLM

HF_TOKEN = "api key DEEPHUB 123456" llm = HuggingFaceInferenceAPI(model_name="HuggingFaceH4/zephyr-7b-beta", token=HF_TOKEN )

首先载入嵌入模型:

embed_model = LangchainEmbedding(HuggingFaceInferenceAPIEmbeddings(api_key=HF_TOKEN,model_name="thenlper/gte-large") )

加载数据集

documents = SimpleDirectoryReader("/content/Documents").load_data() print(len(documents))  ####Output### 44

构建知识图谱索引

创建知识图谱通常涉及专业和复杂的任务。通过利用Llama Index (LLM)、KnowledgeGraphIndex和GraphStore,可以方便地任何数据源创建一个相对有效的知识图谱。

#setup the service context  service_context = ServiceContext.from_defaults(chunk_size=256,llm=llm,embed_model=embed_model )  #setup the storage context  graph_store = SimpleGraphStore() storage_context = StorageContext.from_defaults(graph_store=graph_store)  #Construct the Knowlege Graph Undex index = KnowledgeGraphIndex.from_documents( documents=documents,max_triplets_per_chunk=3,service_context=service_context,storage_context=storage_context,include_embeddings=True)

Max_triplets_per_chunk:它控制每个数据块处理的关系三元组的数量

Include_embeddings:切换在索引中包含嵌入以进行高级分析。

通过构建查询引擎对知识图谱进行查询

query = "What is ESOP?" query_engine = index.as_query_engine(include_text=True,response_mode ="tree_summarize",embedding_mode="hybrid",similarity_top_k=5,) # message_template =f"""Please check if the following pieces of context has any mention of the keywords provided in the Question.If not then don't know the answer, just say that you don't know.Stop there.Please donot try to make up an answer.  Question: {query} Helpful Answer: """ # response = query_engine.query(message_template) # print(response.response.split("")[-1].strip()) #####OUTPUT ##################### ESOP stands for Employee Stock Ownership Plan. It is a retirement plan that allows employees to receive company stock or stock options as part of their compensation. In simpler terms, it is a plan that allows employees to own a portion of the company they work for. This can be a motivating factor for employees as they have a direct stake in the company's success. ESOPs can also be a tax-efficient way for companies to provide retirement benefits to their employees.

可以看到,输出的结果已经很好了,可以说与向量数据库的结果非常一致。

最后还可以可视化我们生成的图谱,使用Pyvis库进行可视化展示

from pyvis.network import Network from IPython.display import display g = index.get_networkx_graph() net = Network(notebook=True,cdn_resources="in_line",directed=True) net.from_nx(g) net.show("graph.html") net.save_graph("Knowledge_graph.html") # import IPython IPython.display.HTML(filename="/content/Knowledge_graph.html")

ナレッジ グラフを利用して RAG モデルの機能を強化し、大規模モデルの誤った印象を軽減する

ナレッジ グラフを利用して RAG モデルの機能を強化し、大規模モデルの誤った印象を軽減する

ナレッジ グラフを利用して RAG モデルの機能を強化し、大規模モデルの誤った印象を軽減する

通过上面的代码我们可以直接通过LLM生成知识图谱,这样简化了我们非常多的人工操作。如果需要更精准更完整的知识图谱,还需要人工手动检查,这里就不细说了。

数据存储,通过持久化数据,可以将结果保存到硬盘中,供以后使用。

storage_context.persist()

存储的结果如下:

ナレッジ グラフを利用して RAG モデルの機能を強化し、大規模モデルの誤った印象を軽減する

总结

向量数据库和知识图谱的区别在于它们存储和表示数据的方法。向量数据库擅长基于相似性的操作,依靠数值向量来测量实体之间的距离。知识图谱通过节点和边缘捕获复杂的关系和依赖关系,促进语义分析和高级推理。

对于语言模型(LLM)幻觉,知识图被证明优于向量数据库。知识图谱提供了更准确、多样、有趣、有逻辑性和一致性的信息,减少了LLM产生幻觉的可能性。这种优势源于它们能够提供实体之间关系的精确细节,而不仅仅是表明相似性,从而支持更复杂的查询和逻辑推理。

在以前知识图谱的应用难点在于图谱的构建,但是现在LLM的出现简化了这个过程,使得我们可以轻松的构建出可用的知识图谱,这使得他在应用方面又向前迈出了一大步。对于RAG,知识图谱是一个非常好的应用方向。

以上がナレッジ グラフを利用して RAG モデルの機能を強化し、大規模モデルの誤った印象を軽減するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事は51cto.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。