从头预训练一只迷你 LLaMA 3_llama3 预训练预处理

我将向你展示如何使用 LLama 3.1(一个本地运行的模型)来执行GraphRAG操作,总共就50号代码。。。

首先,什么是GraphRAG?GraphRAG是一种通过考虑实体和文档之间的关系来执行检索增强生成的方式,关键概念是节点和关系

▲ 知识图谱与向量数据库集成

知识图谱与向量数据库集成是GraphRAG 架构之一:这种方法利用知识图谱和向量数据库来收集相关信息。知识图谱的构建方式可以捕获向量块之间的关系,包括文档层次结构。知识图谱在从向量搜索中检索到的块附近提供结构化实体信息,从而通过有价值的附加上下文丰富提示。这个丰富的提示被输入到 LLM 中进行处理,然后 LLM 生成响应。最后,生成的答案返回给用户。此架构适用于客户支持、语义搜索和个性化推荐等用例。
在这里插入图片描述

节点代表从数据块中提取的实体或概念,例如人、组织、事件或地点

知识图谱中,每个节点都包含属性和特性,这些属性为实体提供了更多上下文信息。

然后我们定义节点之间的连接关系,这些连接可以包括各种类型的关联,例如层次结构(如父子关系)、时间顺序(如前后关系)或因果关系(因果关系)。

关系还具有描述连接性质和强度的属性。当你有很多文档时,你会得到一个很好的图来描述所有文档之间的关系。

让我们看一个非常简单的例子,在我们的数据集中,节点可以代表像苹果公司和蒂姆·库克这样的实体,而关系则可以描述蒂姆·库克是苹果公司的 CEO。

这种方法非常强大,但一个巨大的缺点是它**计算成本很高,因为你必须从每个文档中提取实体,并使用 LLM 计算关系图。**这就是为什么使用像 LLaMa 3.1 这样本地运行的模型来采用这种方法非常棒。

保姆级教程开始

在本文中,我们将结合使用LangChain、LLama 和 Ollama ,以及 Neo4j 作为图数据库。我们将创建一个关于一个****拥有多家餐厅的大型意大利家庭的信息图,所以这里有很多关系需要建模。

先利用Ollama拉取llama3.1 8b模型:

所有代码的链接我放在文末。。。

打开代码文件,来到VS Code 中,你可以在左边看到我们将使用的多个文件。

配置运行Neo4j数据库

在进入代码之前,我们将设置 Neo4j。我为你创建了一个 Docker Compose 文件。所以我们将使用 neo4j 文件夹,里面有一个 jar 文件,这是我们创建图所需的插件。

要创建我们的数据库,只需运行 docker compose up:

这将设置所有内容,并且可以直接使用。可能需要几秒钟,之后你会看到数据库正在运行。

安装依赖

然后我们可以进入 Jupyter Notebook,首先安装所需的包:

我们需要安装 LangChain、OpenAI 的 LangChain、Ollama、LangChain Experimental,因为图解决方案目前在 LangChain 实验包中

我们还需要安装 Neo4j,以及用于在 Jupyter Notebook 中显示图的 py2neo 和 ipywidgets。

%pip install --upgrade --quiet  langchain langchain-community langchain-openai langchain-ollama langchain-experimental neo4j tiktoken yfiles_jupyter_graphs python-dotenv

导入类

安装完这些包后,我们可以导入所需的类。我们将从 LangChain 中导入多个类,例如 Runnable Pass Through、Chat Prompt Template、Output Parser 等。

我们还导入 Neo4j 的图类,这在 LangChain Community 包的 Graphs 模块中。我们还导入 Chat OpenAI 作为 Ollama 的后备模型。

在 LangChain Experimental 包中,我们有一个 Graph Transformer 模块,我们将从那里导入 LLM Graph Transformer,它利用复杂的提示将数据转换为可以存储在图数据库中的形式。

我们还将导入 Neo4j 的图数据库,不仅作为图数据库使用,还可以作为普通的向量数据库使用。

from langchain_core.runnables import  RunnablePassthrough``from langchain_core.prompts import ChatPromptTemplate``from langchain_core.pydantic_v1 import BaseModel, Field``from langchain_core.output_parsers import StrOutputParser``import os``from langchain_community.graphs import Neo4jGraph``from langchain.text_splitter import RecursiveCharacterTextSplitter``from langchain_openai import ChatOpenAI``from langchain_community.chat_models import ChatOllama``from langchain_experimental.graph_transformers import LLMGraphTransformer``from neo4j import GraphDatabase``from yfiles_jupyter_graphs import GraphWidget``from langchain_community.vectorstores import Neo4jVector``from langchain_openai import OpenAIEmbeddings``from langchain_community.document_loaders import TextLoader``from langchain_community.vectorstores.neo4j_vector import remove_lucene_chars``   ``from dotenv import load_dotenv``   ``load_dotenv()

我们将采用混合方法,既使用图知识,也使用标准的文档搜索方式,即通过嵌入模型来搜索与查询最相似的文档

我们还将使用 dotenv 包,并在 Jupyter Notebook 中加载环境变量。在 .env 文件中,有一个 OpenAI API 密钥、一个 Neo4j URI、Neo4j 用户名和密码。你可以按原样使用这些信息,但在仓库中,它们将被命名为 .env.example。

下一步是创建与数据库的连接。所以我们实例化 Neo4j 图类,

这将建立与 Neo4j 的连接。

准备dummy_text.txt 数据集

你可以看到它描述了这个意大利家庭的大量信息,包括不同的名字、关系,如 Antonio 的妹妹 Amo、祖母等。这些信息稍后都将在我们的图中呈现。

我们将使用文本加载器将其加载到内存中,

然后使用文本分割器将其分割成多个块,这是标准的方法,以便 LLM 更容易处理信息。

LLM图转换函数创建文档块之间的所有关系

加载后,我们将设置我们的 LLM 图变换器,它负责将文档转换为 Neo4j 可以处理的形式。

基于环境变量 llm_type,目前我没有设置,所以默认是 Ollama。我们将实例化 ChatOllama 或 ChatOpenAI,然后将其传递给 LLM 图变换器的构造函数。

convert_to_graph_documents 方法将创建文档块之间的所有关系。我们传入创建的文档,计算可能需要一些时间,即使是这个很小的例子,也花了我大约 3 分钟时间,所以稍等片刻。

运行结果来了:这是一个图文档,你可以看到我们有一个 nodes 属性,它是一个包含不同节点的列表,具有 ID。我们可以看到 ID 类似于 Micos Family,类型是 Family,然后我们还有更多的节点,如 Love 概念节点、Tradition 等等。

他们之间也有关系,这些关系将被存储在 Neo4j 中。

可视化我们的图

当前我们还没有启动数据库,所以我们需要先运行 add_graph_documents 方法,提供图文档,然后将所有内容存储在 Neo4j 中。这也可能需要几秒钟时间。文档存储到数据库后,我们可以可视化它们。

首先我们要连接到数据库,我们将使用驱动方法,传入我们的 URI(存储在 Neo4j URI 环境变量中),还需要提供用户名和密码进行身份验证,并创建驱动实例。然后我们创建一个新会话,并使用会话的 run 方法对 Neo4j 运行查询。我们将使用这个查询语句:

如果你不熟悉 Neo4j 可能会觉得有点复杂,但它的意思是 Neo4j 应该返回所有通过 mentions 类型的关系连接的节点对,我们想返回 s, r, 和 t。s 是起始节点,r 是结束节点,t 是关系。

我们可以运行这个方法,并实际可视化我们的图:

现在我们可以向下滚动,这里我们可以看到这是我们的文档的完整知识图谱。正如你所看到的,这相当多,我们可以通过滚动来深入了解更多信息。这里我们可以看到一些实体,比如 Petro 是一个人,我们可以看到 Petro 喜欢厨房、喜欢大海,并且是另一个人 Sophia 的家长。

所以我们可以看到不同的实体通过不同的关系建模,最终你得到了这个非常大的知识图谱。我认为即使是对于我们的小数据集,这也实际上是很多内容。我个人非常喜欢这种图。现在我们来看一下这不仅仅是美观,实际上也很有用。

图的存储做完了,再来一个向量存储

下一步是从 Neo4j 创建一个向量存储,所以我们将使用 Neo4jVector 类,并使用 from_existing_graph 方法,在这里我们只传入嵌入模型,从现有图中计算嵌入。这样我们也可以执行向量搜索,最终我们将把这个向量索引转换成一个检索器,以便有一个标准化的接口。

为图数据库准备实体(Prompt实体识别)

现在我们有一个图数据库,存储了我们的文档,也有了普通的向量存储。现在我们可以执行检索增强生成。由于我们使用图数据库,我们需要从查询中提取实体,以便从图数据库中执行检索步骤。

图数据库需要这种实体,所以我们将创建一个名为 Entities 的自定义模型,继承自 BaseModel,我们希望提取实体,这可以通过提供这个属性 entities 来完成,它是一个字符串列表。这里是 LLM 的描述,所以我们希望提取文本中的所有人、组织和业务实体。

▲ Langchain教程操作有类似

然后我们创建一个 ChatPromptTemplate,系统消息是你正在从文本中提取组织、个人和业务实体。然后我们提供用户输入,并将我们的提示模板传递给 LLM,与结构化输出一起使用,这使用了 Entities 类。我将向你展示其效果。

我们得到了我们的实体链,并可以像这样调用它。我们传入问题 “Who are Nonna and Giovanni Corrado?”,所以我们有两个名字,执行调用方法后,我们可以看到输出是一个字符串列表,只有名字,

这些名字将用于查询图数据库。接下来是在 graph_retriever 函数中调用这个方法。首先从查询中提取实体,然后对 Neo4j 运行查询,我将向你展示最终效果。

我们创建了 graph_rae 函数,传入问题,提取实体,然后查询数据库。

我们问 “Who is Nonna?”,如果运行这个查询,我们可以看到 Nonna 拥有哪些节点和连接。她影响了 Conato,教导了孙子们,影响了新鲜意大利面,影响了 Amico,是家族的女族长。

创建一个混合检索器

然后我们创建一个混合检索器,使用 graph_retriever 和我们的向量存储检索器。我们定义一个函数 full_retriever,在这里设置我们的 graph_retriever 函数,并使用向量检索器,调用其 invoke 方法,获取最相关的文档。我们有了关系图和基于余弦相似度的最相关文档,最终我们将所有文档结合,返回最终数据集。这就是 full_retriever 的作用。

最终链

然后我们创建一个最终链,这是一个普通的 RAG 链,你在几乎所有初学者教程中都会找到这样的链。我们有两个变量,context 和 question,context 是向量存储或其他数据库的输出,question 是我们的问题。所有这些都将发送给 LLM,我们创建一个模板,然后使用 Lang 和表达式语言在这里创建我们的最终链。这将创建一个 runnable_parallel,我将展示其 invoke 方法。

我们只使用一个字符串输入,传递给 full_retriever 函数,保持问题不变,然后将 context 和 question 传递给我们的提示,以填充这些变量。填充这些变量后,我们将所有内容传递给 LLM,并将 LLM 的输出传递给字符串输出解析器。

现在我们可以问 “Who is Nonna Lucia? Did she teach anyone about restaurants or cooking?” 所有关于关系的东西,执行结果:

Generated Query: Nonna~2 AND Lucia~2``'Nonna Lucia is the matriarch of the Caruso family and a culinary mentor. She taught her grandchildren the art of Sicilian cooking, including recipes for Caponata and fresh pasta.'

**我们可以看到答案是 Nonna Lucia 是 Corrado 家族的女族长和烹饪导师。她教导了她的孙子们西西里烹饪的艺术,**这确实是正确的。

这就是如何使用 Neo4j 执行图数据库 RAG。

附件:

以前看过的一个叫PP-Structure文档分析的项目,

信息抽出其中的实体识别。。。

▲ 信息抽取 是自然语言处理中的基础问题,即从自然语言文本中,抽取出特定的事件或事实信息,帮助我们将海量内容自动分类、提取和重构。

最后如果您也对AI大模型感兴趣想学习却苦于没有方向👀
小编给自己收藏整理好的学习资料分享出来给大家💖

在这里插入图片描述

👉AI大模型学习路线汇总👈

大模型学习路线图,整体分为7个大的阶段:(全套教程文末领取哈)
在这里插入图片描述

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

👉如何学习AI大模型?👈

作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
在这里插入图片描述

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!
在这里插入图片描述

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。
在这里插入图片描述

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。
在这里插入图片描述

四、AI大模型商业化落地方案

在这里插入图片描述

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/56881.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AndroidLogger 使用问题

Q1:解压zip后,启动Notepad未看到AndroidLogger工具栏 请检查plugins下安装位置是否正确,必须与下图一致,再确认Notepad 是否为 x64 ? Q2:使用 adb 可以显示已连接,但是获取不到日志 暂时不确定问…

理工科考研想考计算机,湖南大学、重大、哈工大威海、山东大学,该如何选择?

C哥专业提供——计软考研院校选择分析专业课备考指南规划 计算机对理工科同学来说,还是性价比很高的,具有很大的优势! 一、就业前景广阔 高需求行业 在当今数字化时代,计算机技术几乎渗透到了各个领域,无论是互联网…

Spring Boot实现接口限流

API限流是一种重要的策略,用于控制对API的访问速率,以保护后端服务免受过载和滥用。以下是API限流的必要性: 防止服务过载: 当API的请求量突然激增时,如果没有限流措施,可能会导致服务器资源耗尽&#xff0…

【部署篇】RabbitMq-03集群模式部署

一、准备主机 准备3台主机用于rabbitmq部署,文章中是在centos7上安装部署rabbitmq3.8通过文章中介绍的方式可以同样在centos8、centos9上部署,只需下载对应的版本进行相同的操作。 主机IP角色说明192.168.128.31种子节点192.168.128.32普通节点192.16…

2.Node.js 缓冲器(Buffer)

二、常用模块 2.1Buffer(缓冲器) 2.1.1概念 Buffer是一个类似于数组的对象,用于表示固定长度的字节序列 Buffer本质是一段内存空间,专门用来处理二进制数据 2.2.2特点 Buffer大小固定无法调整; Buffer性能较好,可以直接操…

科技云报到:大模型时代下,向量数据库的野望

科技云报到原创。 自ChatGPT爆火,国内头部平台型公司一拥而上,先后发布AGI或垂类LLM,但鲜有大模型基础设施在数据层面的进化,比如向量数据库。 在此之前,向量数据库经历了几年的沉寂期,现在似乎终于乘着Ch…

Linux驱动开发——设备树

文章目录 1 什么是设备树?2 DTS、DTB和DTC3 DTS语法3.1 dtsi头文件3.2 设备节点3.3 标准属性3.4 根节点compatible属性3.5 向节点追加或修改内容 4 创建小型模板设备树5 设备树在系统中的体现6 绑定信息文档7 设备树常用OF操作函数7.1 查找节点的OF函数7.2 查找父/子…

Unity Meta Quest 开发调试工具 Immersive Debugger

XR 开发者社区链接: 赠送原版GPT、完整课程、项目下载、项目孵化宣发、答疑、投融资(YY) 此工具可以在头显当中对 Unity 脚本的参数进行调整(相当于在编辑器 Inspector 里调整脚本参数),并且还可以查看 Un…

免费送源码:Java+B/S+MySQL springboot电影推荐系统 计算机毕业设计原创定制

摘 要 随着互联网与移动互联网迅速普及,网络上的电影娱乐信息数量相当庞大,人们对获取感兴趣的电影娱乐信息的需求越来越大,个性化的电影推荐系统成为一个热门。然而电影信息的表示相当复杂,己有的相似度计算方法与推荐算法都各有优势&#…

赋能特大城市水务数据安全高速运算,深圳计算科学研究院YashanDB数据库系统斩获“鼎新杯”二等奖

第三届“鼎新杯”数字化转型应用优秀案例评选结果日前正式公布,深圳计算科学研究院联合深圳市环境水务集团有限公司申报的《深圳环境水务国产数据库YashanDB,赋能特大城市水务数据安全高速运转》案例,经过5个多月的评审,从4000申报…

Docker搭建Cisco AnyConnect 教程

本章教程搭建一个Cisco AnyConnect 连接教程。 一、下载文件 因为是基于Docker方式进行搭建的,所以需要提前安装好Docker,本章不介绍如何安装Docker,可以自行百度解决。 通过网盘分享的文件:ocserv-docker 链接: https://pan.baidu.com/s/14-2p9jenqE0KWzMilVzV-A?pwd=4yd…

穷举vs暴搜vs深搜vs回溯vs剪枝(一)

文章目录 全排列子集找出所有子集的异或总和再求和全排列 II电话号码的字母组合 全排列 题目:全排列 思路 通过深度优先搜索的方式,不断枚举每个数在当前位置的可能性,然后回溯到上一个状态,直到枚举完所有可能性得到正确的结果 r…

幂律分布笔记

一、幂律分布的数据拟合 数据分箱: 所谓分箱就是对原始数据进行分组,然后对每一组内的数据进行平滑处理。常见的分箱方式主要有等深分箱、等宽分箱、用户自定义等 对数分箱: 对原数据进行分箱,第i个箱的宽度为bi,b…

客户案例 | Ansys与台积电和微软合作加速光子仿真

Ansys与台积电和微软展开合作,将硅光子器件的仿真和分析速度提高10倍以上 主要亮点 借助使用NVIDIA图形处理单元(GPU)的Microsoft Azure虚拟机,Ansys Lumerical™ FDTD 3D电磁仿真的光子器件仿真速度实现了10倍提升 凭借Azure云…

CRMEB标准版Mysql修改sql_mode

数据库配置 1.宝塔控制面板-软件商店-MySql-设置 2.点击配置修改,查找sql-mode或sql_mode (可使用CtrlF快捷查找) 3.复制 NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION 然后替换粘贴,保存 注:MySQL8.0版本的 第三步用…

Vulkan 开发(三):Vulkan 物理设备

Vulkan 物理设备 图片来自《 Vulkan 应用开发指南》 上一节了解了 Vulkan 实例,一旦有了实例,就可以查找系统里安装的与 Vulkan 兼容的物理设备。 Vulkan 物理设备(PhysicalDevice)一般是指支持 Vulkan 的物理硬件,通…

基于模型设计的智能平衡移动机器人-基础实验eCAP

目录 eCAP基本介绍 捕捉模式或者是APWM模式 捕获模块功能 CCS中打开模型 eCAP基本介绍 TMS320F28069的捕获单元模块能够捕获外部输入引脚的逻辑状态(电平的高或低、电平翻转时的上升沿或下降沿),并利用内部定时器对外部事件或者引脚状态变…

关于网络接口监测工具ifstat命令的功能详解以及Linux下lsof命令的使用详解

一、关于网络接口监测工具ifstat命令的应用 ifstat工具是个网络接口监测工具,比较简单看网络流量,像VMSTAT那样一行行显示着浏览信息,可以设置显示某个或所有网卡流量数据。ifstat默认不监控回环接口,显示的流量单位是KB。系统默认未安装&…

【目标检测---旋转框标注】roLabelImg安装与使用

在目标检测领域,数据标注是至关重要的一环。为了提升模型的准确率和泛化能力,高质量的标注数据集是必不可少的。而roLabelImg作为一款专门用于标注旋转框的工具,为处理复杂场景下的目标检测提供了极大的便利。本文将详细介绍roLabelImg的安装…

电力变压器故障诊断数据集(猫脸码客 第219期)

电力变压器故障诊断数据集 电力变压器作为电力系统中不可或缺的重要设备,其稳定性和可靠性直接关系到整个电网的安全运行。然而,由于运行环境复杂、负载多变以及设备老化等因素,变压器在运行过程中难免会出现各种故障。这些故障若不能及时发…