使用FalkorDB、LangChain、Diffbot API和OpenAI构建高级RAG应用程序

2024年01月22日 由 alex 发表 584 0

介绍


知识图谱数据库在不断发展的大型语言模型领域的引入,改变了基于RAG应用程序构建的方式。由于RAG能够减轻知识局限性,比如幻觉和知识截断,我们利用RAG构建QA聊天机器人。知识图谱存储和查询原始数据,并捕获数据中嵌入的不同实体和关系。


在知识图谱的帮助下,我们将利用OpenAI的基础模型构建一个先进的RAG应用程序。


什么是知识图谱?


知识图谱围绕知识模型构建,它包括了概念、实体、关系和事件的相互关联描述。这些描述具有正式的语义,使得人和计算机能够有效且明确地处理它们。这些描述相互贡献,形成了一个网络,每个实体代表了与相关实体描述的一部分。基于建立的知识模型,不同数据通过语义元数据相互链接和描述。


知识图谱整合了来自不同数据管理范畴的特征。它既是数据库,又是网络,同时也是知识库。作为数据库,它允许对数据执行结构化查询;作为网络,它就像任何其他网络数据结构一样进行分析;作为知识库,由于数据的正式语义,它能够进行数据解释和新事实推断。本质上,知识图谱是一个统一平台,相同的数据可以扮演不同的角色。


2


知识图谱作为数据库,当用户使用查询语言创建复杂和结构化的查询以提取特定数据时发挥作用。与关系数据库不同,知识图谱的模式是动态的,不需要预定义的结构,它们规避了数据规范化的限制。此外,知识图谱像任何其他图一样运作,有顶点和标记的边缘,使它们适用于图形优化和操作。然而,知识图谱的真正力量在于附着在顶点和边缘的形式语义,这使得人类和机器能够推断出新的信息而不在数据集中引入事实错误。


为什么要使用知识图谱?


知识图谱作为一种动态且可扩展的解决方案,有效地满足了跨各个行业的企业数据管理需求。除此之外,它们作为数据、元数据和内容的中心枢纽,提供一个统一、一致和无歧义的视角,来查看分布在不同系统中的数据。此外,知识图谱通过整合全球知识作为解释的背景和丰富的资源来增强其专有信息,这使得数据更加智能化。


知识图谱为全球数据生态系统中各种大小的组织面临的挑战提供了全面的解决方案。这些挑战包括处理分布在传统系统上的多样化数据源和数据类型,这些系统常常被用于超出其原始目的的用途。知识图谱提供了更高级别的抽象,通过将数据格式与其预定用途分离。


传统的数据管理解决方案在现实世界的信息和软硬件限制之间创建了一个鸿沟,使它们变得不够直观。知识图谱通过复制人类表达和消费信息的连接性质来弥合这一鸿沟,它们能够适应理解和信息需求的变化。


随着商业案例的演变,僵化且不变的数据模式概念变成了一个挑战。知识图谱通过允许对模式进行动态调整,而不改变底层数据,提供了灵活性。在不断变化的世界中,保持固定模式是不现实的,这种适应性在这样的环境中显得非常宝贵。


知识图谱与向量数据库


向量数据库已成为索引、存储和检索数据的默认选择,这些数据稍后会用作向大型语言模型提出的问题或任务的背景。这涉及将数据分割成较小的片段,为每个片段创建嵌入,并将数据及其嵌入存储在向量数据库中。然而,这种方法有一个主要的限制,因为它依赖于数据库中语义相似的向量,这缺乏对LLM至关重要的信息。


3


知识图谱提供了一种替代方法来存储和查询原始文档,同时捕捉数据中的实体和关系。该过程从构建文档的知识图谱和识别实体及其关系开始。该图谱作为一个知识库服务于大型语言模型(LLM),允许构建更丰富的上下文。用户的问题被转换为图谱查询,它利用图中的所有连接为更全面的上下文。这种丰富的上下文,结合原始问题,呈现给LLMs来生成更为明确的回答。这种替代方法超越了仅依赖语义上相似向量的局限性。


带有KGLLM的RAG架构


知识图谱作为一种强大的工具,用于结构化和查询数据、捕捉关系,以及从外部资源丰富信息。然而,知识图谱面临着处理非结构化自然语言数据的挑战,这些数据往往含糊和不完整。擅长生成自然语言的大型语言模型(LLM),通过理解句法和语义模式提供了一种解决方案。然而,LLM也有局限性,包括产生不准确或有偏见的文本。


知识图谱和LLM之间的交互是强大的。通过结合它们,我们可以解决弱点并利用优势。一个称为带LLM的知识图谱(KGLLM)的框架展示了实际应用,如问答、文本摘要和创意文本生成。KGLLM不仅使用知识图谱来告知LLM,而且还利用LLM来生成知识图谱,这有助于实现双向沟通。实体链接、嵌入和知识注入等技术提高了准确性和多样性,而知识提取、完成和优化扩展了知识图谱的覆盖范围并保持了质量。


我们已经看到了RAG如何与向量数据库协同工作。接下来让我们了解RAG如何与知识图谱协同工作。


4


在知识图谱大型语言模型结合检索增强生成(RAG)的背景下,该过程涉及以下几个步骤:


  1. 文档:从各种来源开始,由包含广泛信息的多样化文档组成的语料库。可以使用外部来源的数据,如维基百科和DBPedia。
  2. 实体提取器:利用自然语言处理技术,部署实体提取器识别并从文档中提取实体(人、地点、事件)及其关系。
  3. 知识图谱:利用提取的实体和关系构建结构化和语义化的知识图谱,通过形成互联实体的网络。
  4. 大型语言模型(LLM):在包含人类知识的广泛文本语料库上训练大型语言模型。大型语言模型简化了从知识图谱检索信息的过程,提供了不需要数据专家的用户友好访问方式。
  5. 图查询:当传递查询时,大型语言模型使用向量和语义搜索从知识图谱检索相关信息。它通过知识图谱的上下文数据增强响应。
  6. 内容:使用RAG的大型语言模型过程生成最终内容,确保准确性、精确性,并在防止错误信息(LLM幻觉)的同时输出与上下文相关的结果。


这个高级概述解释了如何结合RAG运作知识图谱大型语言模型,它承认可能根据具体实现和用例有所变化。


FalkorDB:开放的知识图谱


FalkorDB是一款高性能图数据库,专为需要快速响应时间且不愿意妥协数据建模的应用程序设计。它接替了RedisGraph,并以其极低的延迟而被认识。用户信赖FalkorDB的无妥协性能。可以轻松地使用Docker运行。


5


FalkorDB作为大型语言模型首选的知识数据库因其独特功能而脱颖而出:


  1. 超低延迟:FalkorDB的极低延迟非常适合需要快速响应时间的应用程序。
  2. 强大的知识图谱:FalkorDB通过高效地表示和查询结构化数据来利用强大的知识图谱,并捕捉诸如人、地点、事件和产品等实体的关系和属性。
  3. 与LLM的结合:通过将知识图谱与LLM整合,FalkorDB利用了两者的优势,从而弥补了它们的弱点。知识图谱为LLMs提供结构化数据,而LLM为知识图谱贡献了自然语言生成和理解能力。
  4. LLM上下文生成:FalkorDB从文档中构建知识图谱,作为能够识别实体及其关系的LLMs的知识库。有趣的是,LLM可以参与这个过程。


这些特性使FalkorDB成为LLM的一个有影响力的工具,为它们提供了一个结构化的、低延迟的知识库。这种整合使LLMs能够产出高质量且相关的文本,使FalkorDB成为LLM最顶级的KnowledgeDB。


结合FalkorDB、Diffbot API、LangChain和OpenAI实现RAG


要开始,请首先安装所有依赖项。


%pip install langchain
%pip install langchain-experimental
%pip install langchain-openai
%pip install falkordb


使用Docker本地启动FalkorDB。


docker run -p 6379:6379 -it -rm falkordb/falkordb:edge


登录到Diffbot的官方网站以获取API密钥。你将在网页右上角看到API令牌。


Diffbot API是一个强大的工具,旨在从非结构化的文档,如网页、PDF和电子邮件中提取结构化数据。用户可以利用这个API建立一个知识图谱,通过捕获其文档中的实体和关系,并将其存储在FalkorDB中。为了查询和检索来自知识图谱的信息,可以使用LangChain。LangChain能够根据存储的数据提供准确且相关的答案,从而处理复杂的自然语言查询。


from langchain_experimental.graph_transformers.diffbot import DiffbotGraphTransformer
diffbot_api_key = "your-api-key"
diffbot_nlp = DiffbotGraphTransformer(diffbot_api_key=diffbot_api_key)


这里,我们将使用WikipediaLoader,这是一个外部资源,用于通过LangChain加载数据。加载器通过使用名为Wikipedia的Python包从维基百科文章中检索文本。它接受以页面标题或唯一标识维基百科页面的关键字形式的输入。目前为止,加载器专注于提取文本,并不考虑图像、表格或其他元素。我此次查询的是“Washington”,让我们看看它可以提供哪些知识。


from langchain.document_loaders import WikipediaLoader
query = "Washington"
raw_documents = WikipediaLoader(query=query).load()
graph_documents = diffbot_nlp.convert_to_graph_documents(raw_documents)


然后,我们将使用FalkorDBGraph来创建和存储一个知识图谱。


from langchain.graphs import FalkorDBGraph
graph = FalkorDBGraph("falkordb")
graph.add_graph_documents(graph_documents)
graph.refresh_schema()


我们需要一个 OpenAI API 密钥,所以请将你的密钥传递给环境。


import os
os.environ["OPENAI_API_KEY"] = "your-api-key"


现在,我们将传递我们创建的图表和我们在这里使用的LLM(大型语言模型),OpenAI。我们正在使用一个非常基础的OpenAI模型,它的温度设置为0,这可以通过免费层的OpenAI API密钥来使用。


from langchain_openai import ChatOpenAI
from langchain.chains import FalkorDBQAChain
chain = FalkorDBQAChain.from_llm(ChatOpenAI(temperature=0), graph=graph, verbose=True)


在那之后,把你的问题传递到链条中。


chain.run("Which university is in Washington")


以下将是结果:


> Entering new FalkorDBQAChain chain…
Generated Cypher:
MATCH (o:Organization)-[:ORGANIZATION_LOCATIONS]->(l:Location)
WHERE l.name = 'Washington'
RETURN o.name
Full Context:
[['Jain Foundation'], ['University of Washington'], ['Washington']]
> Finished chain.
'The University of Washington is located in Washington.'


我们来尝试链条中的另一个问题。


chain.run("Is Washington D.C. and Washington same?")


结果如下:


> Entering new FalkorDBQAChain chain…
Generated Cypher:
MATCH (l:Location)
WHERE l.name = 'Washington D.C.'
MATCH (w:Location)
WHERE w.name = 'Washington'
RETURN l, w
Full Context:
[]
> Finished chain.
'Yes, Washington D.C. and Washington are not the same. Washington D.C. is the capital of the United States, while Washington refers to the state located on the West Coast of the country.'


结果表明,即使使用OpenAI的基础模型也相当不错。


结论


随着知识图谱的引入,利用它实现RAG以减少大型语言模型的幻觉效应是很容易的。与向量数据库相比,知识图谱更为简单。令人着迷的是,你的数据不仅被存储和查询,实体之间的关系也被捕获了。


文章来源:https://medium.com/@akriti.upadhyay/building-advanced-rag-applications-using-falkordb-langchain-diffbot-api-and-openai-083fa1b6a96c
欢迎关注ATYUN官方公众号
商务合作及内容投稿请联系邮箱:bd@atyun.com
评论 登录
热门职位
Maluuba
20000~40000/月
Cisco
25000~30000/月 深圳市
PilotAILabs
30000~60000/年 深圳市
写评论取消
回复取消