知识图谱已成为管理与分析复杂数据关系的强大工具。与传统的关系型数据库通过行和列在表格中存储数据不同,图数据库使用节点、边和属性来表示和存储数据,提供了一种更直观和高效的方式来构建、查看和查询复杂系统。本文将指导你了解、实现和利用知识图谱数据库。
理解知识图谱(关键概念)
节点:这些代表单个数据实体,如人、地点或物体。每个节点具有标识符、标签和若干属性。
边:这些代表节点之间的连接,显示它们之间的关系。每条边有一个起始节点、一个结束节点、一个类型和一些属性。
属性:与节点和边关联的属性或数据值。
为什么选择知识图谱数据库?
解决朴素RAG的问题 -> RAG(检索增强生成)是一种技术,它为大语言模型提供了外部知识或数据,这些数据是语言模型未曾训练过的。依赖于基于向量的检索的朴素RAG方法面临诸如缺乏深层次上下文理解和复杂推理能力等若干限制。为了解决这些问题,将知识图谱集成到RAG系统中。
传统的数据库,如关系数据库,将数据存储在结构化的表格中。尽管这种方法适用于许多应用程序,但在处理复杂关系时却显得不足。关系数据库需要复杂的连接和查询来导航关系,这使得它们效率较低且难以管理。
相比之下,知识图谱设计用于轻松处理复杂关系。它们能够实现:
简化数据建模:实体及其关系的自然表示。
高效的查询性能:更快地检索关联数据。
灵活性:轻松适应不断变化的数据结构。
使用知识图谱的场景
图数据库在数据点之间关系至关重要的场景中表现卓越。以下是一些常见的应用场景:
客户分析:通过映射交互和关系来理解客户行为。
推荐系统:通过分析用户和产品之间的连接提供个性化推荐。
分析复杂关系:探索数据中的复杂连接,如社交网络或组织结构。
构建知识图谱:逐步指南
在这个项目中,我使用了Neo4j图数据库、Langchain框架和AzureChat OpenAI模型(GPT 3.5 turbo)。在跳转到代码之前,我们首先在Neo4j上创建图数据库实例。
点击此链接并使用Google账户登录。登录后,点击创建免费实例,如下面的图片所示。然后,您将获得下载和继续按钮以获取Instance01的凭据。您可以将该凭据复制并粘贴到.env文件中。
步骤1:导入必要的包和凭证。
我将详细介绍每个包。
from langchain_openai` `import AzureChatOpenAI``from langchain_experimental.graph_transformers` `import LLMGraphTransformer``from langchain_core.documents` `import Documentfrom langchain.text_splitter` `import CharacterTextSplitter``from langchain_community.graphs` `import Neo4jGraphimport osfrom dotenv` `import load_dotenvllm_deployement_name = os.getenv("llm_deployement_name")``azure_endpoint = os.getenv("azure_endpoint")
第2步:初始化AzureChatOpenAI及Neo4jGraph
来自LangChain的AzureChatOpenAI类允许我们与部署在Azure上的OpenAI GPT模型进行交互。接下来,我们使用LangChain社区图模块中的Neo4jGraph类设置Neo4j图数据库,以存储和检索数据。Neo4j提供了Cypher查询语言,使得与图数据的交互和查询变得简单易行。
Cypher查询语言(Cypher)是一种专门用于查询和操作如Neo4j这样的图数据库的强大而表达力的语言。它允许用户以直观且高效的方式描述图中的模式。例如,一个简单的Cypher查询,用于查找名为Alice的所有朋友:
MATCH (alice:Person {name: ‘Alice’})-[:FRIEND]->(friend)
RETURN friend
此查询匹配名为“Alice”的人员节点,并查找与Alice通过“FRIEND”关系连接的所有节点,将这些节点作为朋友返回。
llm = AzureChatOpenAI(deployment_name=llm_deployement_name, model_name="gpt-35-turbo-16k", azure_endpoint=azure_endpoint)``graph = Neo4jGraph()
步骤3:数据摄取与预处理
我们从包含某科技公司员工信息的样本文本开始。将使用CharacterTextSplitter将该文本分割成可管理的块。
text = """Emily is an employee at TechNova, a leading technology company based in Silicon Heights.` `She has been working there for the past four years as a software developer. James is also an employee` `at TechNova, where he works as a data analyst. He joined the company three years ago after completing his` `undergraduate studies. TechNova is a renowned technology company that specializes in developing innovative` `software solutions and advanced artificial intelligence systems. The company boasts a diverse team of talented` `professionals from various fields. Both Emily and James are highly skilled experts who contribute significantly to``TechNova's achievements. They collaborate closely with their respective teams to create cutting-edge products and services``that cater to the dynamic needs of the company's clients."""`` ``documents = [Document(page_content=text)]``text_splitter = CharacterTextSplitter(chunk_size=200, chunk_overlap=20)``texts = text_splitter.split_documents(documents)
步骤4:将文本转换为图
LLMGraphTransformer类利用语言模型将文本转换为图文档,在语言模型的帮助下识别节点和关系。一旦我们有了图文档,就可以将其添加到Neo4j数据库中。
llm_transformer = LLMGraphTransformer(llm=llm)``graph_documents = llm_transformer.convert_to_graph_documents(texts)`` ``print(f"Nodes:{graph_documents[0].nodes}") # this is to see Nodes of generate graph``print("-----------------------------------------------------------------")``print(f"Relationships:{graph_documents[0].relationships}")` ` ``graph.add_graph_documents(graph_documents)``print("Documents successfully added to Graph DataBase")
请注意,由于构建图时使用了大型语言模型(LLM),因此每次构建的结果可能不同。您也可以根据需要指定要提取的节点和关系的类型。这里是如何设置仅允许特定的节点和关系:
llm_transformer_filtered = LLMGraphTransformer(` `llm=llm,` `allowed_nodes=["Author", "Book", "Publisher"],` `allowed_relationships=["WRITTEN_BY", "PUBLISHED_BY"],``)``graph_documents_filtered = llm_transformer_filtered.convert_to_graph_documents(` `documents``)
步骤5:查询图数据库
要查询图数据库,我们使用来自LangChain的GraphCypherQAChain。这条链允许我们使用自然语言查询从图中提取信息。GraphCypherQAChain是一个工具,它可以根据用户的问题生成针对Neo4j图数据库的Cypher查询,从而轻松获取所需的信息。
chain = GraphCypherQAChain.from_llm(` `llm, graph=graph, verbose=True``)``result = chain.invoke({"query": "Where does James work?"})`` ``print(result)
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。