如何将任何文本转换为概念图(GC)

原文地址:how-to-convert-any-text-into-a-graph-of-concepts

使用 Mistral 7B 将任何文本语料库转换为知识图的方法

2023 年 11 月 10 日

使用递归 RAG 方法来实现具有多跳推理的 QnA,以回答基于大型文本语料库的复杂查询。

知识图增强生成与递归 RAG 结合时,它可能有助于创建超级研究代理。

抽象的

知识图(KG)或任何图由节点和边组成。KG 的每个节点代表一个概念,每条边是一对此类概念之间的关系。

使用Mistral 7B Openorca 指令和 Zephyr 模型、使用Neo4j等数据库来存储和检索图形数据、使用内存中的 Pandas Dataframes 和 NetworkX Python 库。

Github:https://rahulnyk.github.io/knowledge_graph/

知识图谱

玛丽有一只小羊羔,
你以前听过这个故事;
但你知道吗,她递了盘子,
还多了一点!

这是文本作为 KG 的一种可能的表示形式。

什么是知识图?

知识图谱,也称为语义网络,表示现实世界实体(即对象、事件、情况或概念)的网络,并说明它们之间的关系。这些信息通常存储在图形数据库中并可视化为图形结构,从而产生了知识“图形”一词。

为什么选择知识图谱?

知识图有多种用途。我们可以运行图算法并计算任何节点的中心性,以了解概念(节点)对工作主体的重要性。我们可以分析关联和不关联的概念集,或者计算概念社区以深入理解主题。我们可以理解看似互不相关的概念之间的联系。

我们还可以使用知识图来实现图检索增强生成(GRAG 或 GAG)并与我们的文档聊天。与普通的 RAG 旧版本相比,这可以给我们带来更好的结果,而 RAG 存在一些缺点。例如,通过简单的语义相似性搜索来检索与查询最相关的上下文并不总是有效。特别是当查询没有提供足够的关于其真实意图的上下文时,或者当上下文是大型文本语料库中的片段时。

例如,考虑这个查询 -

告诉我《孤独一百年》一书中何塞·阿卡迪奥·布恩迪亚的家谱。

该书记录了何塞·阿卡迪奥·布恩迪亚的 7 代人,其中一半的人物名为何塞·阿卡迪奥·布恩迪亚。如果可能的话,使用简单的 RAG 管道来回答查询将是一个相当大的挑战。

RAG 的另一个缺点是它无法告诉您要问什么。很多时候,提出正确的问题比获得答案更重要。

图增强生成(GAG)可以在一定程度上解决RAG的这些缺点。更好的是,我们可以混合搭配并构建图形增强检索增强生成管道,以充分利用两个世界。

现在我们知道图表很有趣,它们非常有用,而且看起来也很漂亮。

创建概念图

如果你问 GPT,如何根据给定的文本创建知识图?它可能会建议如下的过程。

  1. 从工作主体中提取概念和实体。这些是节点。
  2. 提取概念之间的关系。这些是边缘。
  3. 填充图数据结构或图数据库中的节点(概念)和边(关系)。
  4. ......

如何实现步骤 1 和 2 呢?

这是我设计的从任何给定文本语料库中提取概念图的方法的流程图。它与上面的方法类似,但有一些细微的差别。

  1. 将文本语料库分割成块。为每个块分配一个 chunk_id。
  2. 对于每个文本块,使用LLMs提取概念及其语义关系。让我们为这个关系指定一个权重 W1。同一对概念之间可以存在多种关系。每一个这样的关系都是一对概念之间的边缘。
  3. 考虑到同一文本块中出现的概念也通过它们的上下文邻近性而相关。让我们为这个关系指定一个权重 W2。请注意,同一对概念可能出现在多个块中。
  4. 对相似的对进行分组,对它们的权重进行求和,并连接它们的关系。所以现在我们在任何不同的概念对之间都只有一条边。边具有一定的权重和关系列表,如其名称所示。

您可以在我在本文中共享的 GitHub 存储库中看到此方法作为 Python 代码的实现。让我们在接下来的几节中简要介绍一下实现的关键思想。

Mistral 和 Prompt

上面流程图中的步骤 1 很简单。Langchain 提供了大量的文本分割器,我们可以使用它们将文本分割成块。

第 2 步是真正的乐趣开始的地方。为了提取概念及其关系,我使用 Mistral 7B 模型。在找到最适合我们目的的模型变体之前,我进行了以下实验:

Mistral Instruct
Mistral OpenOrca
Zephyr (Hugging Face version derived from Mistral)

我使用了这些模型的 4 位量化版本—由 Ollama 本地托管。

Ollama

这些模型都是带有系统提示和用户提示的指令调优模型。如果我们告诉他们,他们都可以很好地遵循说明并以 JSON 格式整齐地格式化答案。收敛到了Zephyr模型,提示如下:

SYS_PROMPT = ("You are a network graph maker who extracts terms and their relations from a given context. ""You are provided with a context chunk (delimited by ```) Your task is to extract the ontology ""of terms mentioned in the given context. These terms should represent the key concepts as per the context. \n""Thought 1: While traversing through each sentence, Think about the key terms mentioned in it.\n""\tTerms may include object, entity, location, organization, person, \n""\tcondition, acronym, documents, service, concept, etc.\n""\tTerms should be as atomistic as possible\n\n""Thought 2: Think about how these terms can have one on one relation with other terms.\n""\tTerms that are mentioned in the same sentence or the same paragraph are typically related to each other.\n""\tTerms can be related to many other terms\n\n""Thought 3: Find out the relation between each such related pair of terms. \n\n""Format your output as a list of json. Each element of the list contains a pair of terms""and the relation between them, like the follwing: \n""[\n""   {\n"'       "node_1": "A concept from extracted ontology",\n''       "node_2": "A related concept from extracted ontology",\n''       "edge": "relationship between the two concepts, node_1 and node_2 in one or two sentences"\n'"   }, {...}\n""]"
)USER_PROMPT = f"context: ```{input}``` \n\n output: "

如果我们用这个提示通过我们的(不适合的)儿歌,这就是结果:

[{"node_1": "Mary","node_2": "lamb","edge": "owned by"},{"node_1": "plate","node_2": "food","edge": "contained"}, . . .
]

请注意,它甚至将“食物”猜测为一个概念,而文本块中并未明确提及这一概念。

如果我们对示例文章的每个文本块运行此操作并将 json 转换为 Pandas 数据帧,则其外观如下。

这里的每一行代表一对概念之间的关系。每行都是图中两个节点之间的一条边,同一对概念之间可以有多个边或关系。上面数据框中的count就是我任意设置为4的权重。

情境邻近性

我假设文本语料库中彼此接近的概念是相关的。我们将这种关系称为“上下文邻近度”。

为了计算上下文邻近边缘,我们融合了数据帧,以便 node_1 和 node_2 折叠成单个列。然后我们使用 chunk_id 作为键创建该数据帧的自连接。因此具有相同 chunk_id 的节点将相互配对形成一行。

但这也意味着每个概念也将与其自身配对。这称为自循环,其中边在同一节点上开始和结束。为了消除这些自循环,我们将从数据帧中删除node_1与node_2相同的每一行。

最后,我们得到一个与原始数据框非常相似的数据框。

这里的count列是node_1和node_2同时出现的chunk的数量。chunk_id 列是所有这些块的列表。

所以我们现在有两个数据帧,一个具有语义关系,另一个具有文本中提到的概念之间的上下文邻近关系。我们可以将它们组合起来形成我们的网络图数据框。

我们已经完成了为文本构建概念图的工作。但此时离开它将是一件非常令人不快的事情。我们的目标是像本文开头的特色图像一样可视化图表,我们离我们的目标不远了。

创建概念网络

NetworkX 是一个 Python 库,可以让处理图形变得超级简单。 将我们的数据框添加到 NetworkX 图中只需几行代码。
G = nx.Graph()## Add nodes to the graph
for node in nodes:G.add_node(str(node))## Add edges to the graph
for index, row in dfg.iterrows():G.add_edge(str(row["node_1"]),str(row["node_2"]),title=row["edge"],weight=row['count'])
这是我们可以开始利用网络图的力量的地方。NetworkX 提供了大量现成的网络算法供我们使用。 这是我们可以在图表上运行的算法列表的链接。 在这里,我使用社区检测算法为节点添加颜色。社区是一组节点,它们之间的连接比图中其他部分的连接更紧密。概念社区可以让我们很好地了解文本中讨论的广泛主题。 Girvan Newman 算法在我们正在处理的评论文章中检测到了 17 个概念社区。
['digital technology','EVIN','medical devices','online training management information systems','wearable, trackable technology'
]
这立即让我们了解了评论论文中讨论的健康技术的广泛主题,并使我们能够提出问题,然后我们可以通过 RAG Pipeline 来回答这些问题。 让我们还计算图中每个概念的程度。节点的度是与其连接的边的总数。因此,在我们的例子中,概念的程度越高,它对我们文本的主题就越重要。我们将使用度数作为可视化中节点的大小。

图形可视化

使用 PiVis 库来创建交互式图表。Pyvis 是用于 可视化网络的Python 库。 Pyvis 有个内置的NetworkX Helper,可以将我们的 NetworkX 图转换为 PyVis 对象。 我们已经计算了每条边的权重(即边的厚度)、节点的社区(其颜色)以及每个节点的度(其大小)。
交互式图表链接:https://rahulnyk.github.io/knowledge_graph/ 。我们可以根据需要放大和缩小以及移动节点和边。我们还在页面底部提供滑块面板来更改图形的物理特性。看看图表如何帮助我们提出正确的问题并更好地理解主题。

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

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

相关文章

unity-urp:视野雾

问题背景 恐怖游戏在黑夜或者某些场景下,需要用雾或者黑暗遮盖视野,搭建游戏氛围 效果 场景中,雾会遮挡场景和怪物,但是在玩家视野内雾会消散,距离玩家越近雾越薄。 当前是第三人称视角,但是可以轻松的…

【C++】十大排序算法之 归并排序 快速排序

本次介绍内容参考自:十大经典排序算法(C实现) - fengMisaka - 博客园 (cnblogs.com) 排序算法是《数据结构与算法》中最基本的算法之一。 十种常见排序算法可以分为两大类: 比较类排序:通过比较来决定元素间的相对次序…

力扣--滑动窗口438.找到字符串中所有字母异位词

思路分析: 使用两个数组snum和pnum分别记录字符串s和p中各字符出现的次数。遍历字符串p,统计其中各字符的出现次数,存储在pnum数组中。初始化snum数组,统计s的前m-1个字符的出现次数。从第m个字符开始遍历s,通过滑动窗…

史上最细,接口自动化测试用例设计编写总结,一篇带你打通...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 说到自动化测试&a…

亚信安慧AntDB:“融合+实时”引领数据库创新

在当今多变的数据应用场景中,AntDB作为行业领先的超融合流式实时数仓,秉承着“融合实时”的研发理念,全面应对企业日益复杂的数据处理需求。通过SQL接口访问多种执行引擎,AntDB在实现交易、分析等多重能力的“超融合”方面取得了显…

SQL设计时增加说明列

后关闭sql Studio,然后打开注册表,注册表地址: 计算机\HKEY_CURRENT_USER\SOFTWARE\Microsoft\SQL Server Management Studio\18.0_IsoShell\DataProject 如有版本不同,红色内容有所变化,修改内容如下: SSVPropViewColumnsSQL70,SSVPropViewColumnsSQL80 全修改为 1,2,6,7…

魔方,3循环是你的秘密[嗑瓜子]。​

引理1.任意Sn中的元素:(N_1N_2N_3...N_m) 证明: (N_1N_2N_3...N_m) (N_1N_m)(N_1N_m-1)...(N_1N_2) 举例: 比如(1234) (14)(13)(12) (3214) (34)(31)(32) 2.任意An可以表示成3循环的乘积, 证明: 1.An中的元素属于…

抖店无货源模式,采购商品、平台渠道正规吗?相关基础问题解答

我是王路飞。 无货源模式,相信你们也都不陌生了。 每个电商平台都存在这种模式,且我以为,每个电商平台的发展壮大,最应该感谢的就是这些无货源商家了。 而现在说到无货源,最适合普通人的无疑就是抖音小店了。 今天…

[云原生] k8s之存储卷

一、emptyDir存储卷 当Pod被分配给节点时,首先创建emptyDir卷,并且只要该Pod在该节点上运行,该卷就会存在。正如卷的名字所述,它最初是空的。Pod 中的容器可以读取和写入emptyDir卷中的相同文件,尽管该卷可以挂载到每…

【Redis】redis持久化

redis 持久化 所谓的持久化,就是把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。 redis 开始是将所有数据保持在内存中,对数据的更新将根据策略配置异步地保存在磁盘中。 持久化的方式 快照方式 快照是某时某刻对数据的完整备份。在以…

3dmax画图卡顿解决方法---模大狮模型网

当你在使用3D Max进行画图时遇到卡顿问题,可以尝试以下方法来解决: 减少模型复杂度:如果你的场景中有过多的高细节模型,可能会导致卡顿。尝试减少模型的复杂度,合并或简化多边形数量过多的模型。这将减轻计算机的负担&…

【UE 材质 Niagara】爆炸效果

目录 效果 步骤 一、材质部分 二、Niagara部分 效果 步骤 一、材质部分 1. 创建一个材质,这里命名为“M_Burst” 打开“M_Burst”,设置混合模式为半透明,设置着色模型为无光照,勾选双面显示 在材质图表中首先创建扰动效果 其…

智能指针基础知识【C++】【RAII思想 || unique_ptr || shared_ptrweak_ptr || 循环引用问题】

目录 一,为什么需要智能指针 二,内存泄露的基本认识 1. 内存泄露分类 2. 常见的内存检测工具 3,如何避免内存泄露 三,智能指针的使用与原理 1. RAII思想 2. 智能指针 (1. unique_ptr (2. shared_…

数据治理实战——翼支付金融板块业务数仓建设和数据治理之路

目录 一、数据治理背景 二、数据治理建设内容 2.1 组织协同 2.2 平台建设 2.3 数据应用治理 2.4 数据规范 2.5 数据安全 三、企业级数仓建设 3.1 调研阶段 2.2 平台护航 2.3 数仓分层 2.4 维度建模 2.4.1 维度建模四步曲 2.4.2 命名规范 2.4.3 资产沉淀 2.4.4 …

百度智能云发布专用向量数据库 VDB 1.0,全新设计内核开启性能狂飙

1 专用向量数据库应对未来业务挑战 向量数据库 向量检索 数据库 向量数据库大致可以分为 2 部分:向量数据的检索,以及向量数据的存储和管理。 向量数据库的性能,比如高 QPS、低延时等,使得业务能够更快的响应用户的查询请求…

2024 AI 辅助研发的新纪年

随着人工智能技术的持续发展与突破,2024年AI辅助研发正成为科技界和工业界瞩目的焦点。从医药研发到汽车设计,从软件开发到材料科学,AI正逐渐渗透到研发的各个环节,变革着传统的研发模式。在这一背景下,AI辅助研发不仅…

【kubernetes】关于k8s集群中的ingress规则案例

目录 一、k8s 对外服务之 Ingress 1.1什么是ingress 1.2外部的应用能够访问集群内的服务有哪些方案? 1.3Ingress 组成 1.4Ingress-Nginx 工作原理 1.5ingress 暴露服务的方式 二、实操ingress暴露服务 前期.部署 nginx-ingress-controller 2.1基于host网络…

RabbitMQ的Windows版安装教程

文章目录 前言一、Windows安装RabbitMQ总结 前言 曾经写过一篇关于RabbitMQ的Ubuntu安装教程(http://t.csdnimg.cn/5CYfC),当时使用的是Docker将RabbitMQ安装到虚拟机上,但是有很多小伙伴问Windows上如何进行安装RabbitMQ&#x…

flink重温笔记(十二): flink 高级特性和新特性(1)——End-to-End Exactly-Once(端到端精确一致性语义)

Flink学习笔记 前言:今天是学习 flink 的第 12 天啦!学习了 flink 高级特性和新特性之 End-to-End Exactly-Once(端到端精确一致性语义),主要是解决大数据领域数据从数据源到数据落点的一致性,不会容易造成…

官宣!百度智能云千帆产品发布会3月21日北京见!

回望2023大模型狂奔的一年,百度智能云千帆大模型平台无疑是浓墨重彩的一笔。自2023年3月27日正式问世后,百度智能云千帆大模型平台以突飞猛进的速度持续发展。从模型、应用到生态,“千帆”书写着自身在大模型时代的答卷。 作为全球首个一站式…