AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


如何将任何文本转换为概念图——使用 LLM 将任何文本语料库转换为知识图谱的方法
发布日期:2024-05-11 08:46:18 浏览次数: 1859


作者使用本文分享的项目生成的图像。

几个月前,基于知识的问答 (KBQA) 还很新鲜。现在,任何人工智能爱好者都可以轻松地使用检索增强生成 (RAG) 来进行 KBQA。令人着迷的是,由于大型语言模型 (LLM),自然语言处理 (NLP) 的可能性领域扩展得如此之快。而且它每天都在变得更好。

在我的上一篇文章中,我分享了一种递归 RAG 方法来实现具有多跳推理的 QnA,以基于大型文本语料库回答复杂查询。

很多人尝试了它并发送了他们的反馈。感谢大家的反馈。此后,我整理了这些贡献,并对代码进行了一些改进,以解决原始实现中的一些问题。我计划写一篇单独的文章来讨论它。

在本文中,我想分享另一个想法,它可以与递归 RAG 结合起来创建超级研究代理。这个想法源于我对小型 LLM 的递归 RAG 实验,以及我在 Medium 上读到的一些其他想法——特别是 知识图增强生成

摘要

知识图谱 (KG) 或任何图谱都由节点和边组成。KG 的每个节点代表一个概念,每个边代表一对概念之间的关系。在本文中,我将分享一种将任何文本语料库转换为概念图的方法。我在这里交替使用术语“概念图”(GC) 和术语 KG 来更好地描述我在这里演示的内容。

我在此实现中使用的所有组件都可以在本地设置,因此该项目可以轻松地在个人机器上运行。我在这里采用了非 GPT 方法,因为我相信更小的开源模型。我正在使用出色的 Mistral 7B Openorca 指令模型和 Zephyr 模型。这些模型可以使用 Ollama 在本地设置。

像 Neo4j 这样的数据库可以轻松存储和检索图形数据。在这里,我使用内存中的 Pandas Dataframes 和 NetworkX Python 库来保持简单。

我们的目标是将任何文本语料库转换为概念图 (GC) 并将其可视化,就像本文美丽的横幅图像一样。我们甚至可以通过移动节点和边、放大和缩小以及根据我们的喜好改变图形的物理特性来与网络图形进行交互。以下是展示我们正在构建的内容的结果的 Github 页面链接。

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

但首先,让我们深入研究 KG 的基本思想以及为什么我们需要它们。如果您已经熟悉此概念,请随时跳过下一部分。

知识图谱

考虑以下文本。

Mary had a little lamb,
You've heard this tale before;
But did you know she passed her plate,
And had a little more!

(我希望孩子们不要读这个 ?)

以下是用 KG 表示文本的一种可能方式。

作者使用 draw.io 创建的图表

以下来自 IBM 的文章恰当地解释了知识图谱的基本概念。

引用文章的摘录来总结这个想法:

知识图谱,也称为语义网络,表示真实世界实体的网络——即对象、事件、情况或概念——并说明它们之间的关系。此信息通常存储在图形数据库中,并可视化为图形结构,从而引发术语知识“图”。

为什么选择知识图谱?

知识图谱在许多方面都非常有用。我们可以运行图算法并计算任何节点的中心性,以了解某个概念(节点)对整个工作的重要性。我们可以分析相互关联和不关联的概念集,或者计算概念社区,以便深入理解主题内容。我们可以理解看似不相关的概念之间的联系。

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

例如,考虑以下查询:

告诉我关于《百年孤独》中 José Arcadio Buendía 家族树的信息。

这本书记录了 José Arcadio Buendía 的七代人,其中一半的角色都叫 José Arcadio Buendía。如果可能的话,使用简单的 RAG 管道来回答这个查询将是一个很大的挑战。

RAG 的另一个缺点是它不能告诉你该问什么。很多时候,问对问题比得到答案更重要。

图增强生成 (GAG) 可以在一定程度上解决 RAG 的这些缺点。更棒的是,我们可以混合搭配并构建一个图增强检索增强生成管道,以获得两全其美的效果。

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

创建概念图谱

如果你问 GPT,如何从给定的文本中创建一个知识图谱?它可能会建议如下流程:

  1. 从工作主体中提取概念和实体。这些是节点。

  2. 提取概念之间的关系。这些是边。

  3. 在图数据结构或图数据库中填充节点(概念)和边(关系)。

  4. 可视化,至少可以获得一些艺术上的满足感。

步骤 3 和 4 听起来可以理解。但是如何实现步骤 1 和 2 呢?

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

该图由作者使用 draw.io 创建

  1. 将文本语料库分成块。为每个块分配一个 chunk_id。

  2. 对于每个文本块,使用 LLM 提取概念及其语义关系。让我们将这种关系的权重设为 W1。同一对概念之间可以有多种关系。每种这样的关系都是一对概念之间的边。

  3. 考虑出现在同一文本块中的概念也通过其上下文邻近性相关联。让我们将这种关系的权重设为 W2。请注意,同一对概念可能会出现在多个块中。

  4. 对相似的对进行分组,求和它们的权重,并连接它们的关系。所以现在我们在任何不同的概念对之间只有一条边。这条边具有一定的权重,并且关系列表作为其名称。

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

为了在这里演示这个方法,我使用了以下在 PubMed/Cureus 上发布的评论文章,该文章遵循知识共享署名许可协议。本文末尾会对作者进行致谢。

Mistral 模型和提示语

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

第二步才是真正有趣的地方。为了提取概念及其关系,我使用了 Mistral 7B 模型。在确定最适合我们目的的模型变体之前,我尝试了以下模型:

Mistral Instruct
Mistral OpenOrca 
Zephyr (Hugging Face 版本,源自 Mistral)

我使用了这些模型的 4 位量化版本——这样我的 Mac 就不会开始讨厌我了——并使用 Ollama 在本地托管。

这些模型都是经过指令调整的模型,具有系统提示语和用户提示语。如果我们告诉它们,它们都能很好地遵循指令并以 JSON 格式整齐地格式化答案。

经过几轮的尝试和错误,我最终确定了 Zephyr 模型,并使用以下提示语。

SYS_PROMPT = (  
"你是一个网络图创建者,负责从给定的上下文中提取术语及其关系。"
"你将获得一个上下文块(由 ``` 分隔)。你的任务是提取给定上下文中提到的术语的本体。"
"这些术语应代表根据上下文得出的关键概念。\n"
"想法 1:在遍历每个句子时,思考其中提到的关键术语。\n"
"\t术语可能包括对象、实体、位置、组织、人物、\n"
"\t条件、缩写词、文档、服务、概念等。\n"
"\t术语应尽可能原子化\n\n"
"想法 2:思考这些术语如何与其他术语建立一对一的关系。\n"
"\t在同一个句子或同一个段落中提到的术语通常彼此相关。\n"
"\t术语可以与许多其他术语相关\n\n"
"想法 3:找出每对相关术语之间的关系。 \n\n"
"将你的输出格式化为 json 列表。列表的每个元素包含一对术语"
"以及它们之间的关系,如下所示: \n"
"[\n"
" {\n"
' "node_1": "从提取的本体中得出的概念",\n'
' "node_2": "从提取的本体中得出的相关概念",\n'
' "edge": "两个概念(node_1 和 node_2)之间的一或两个句子的关系"\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 数据框,结果如下所示。

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

上下文邻近性

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

为了计算上下文邻近性边,我们对数据框进行熔化,以便 node_1 和 node_2 合并到一个列中。然后,我们使用 chunk_id 作为键创建此数据框的自连接。因此,具有相同 chunk_id 的节点将相互配对形成一行。

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

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

此处的计数列是 node_1 和 node_2 共同出现的块数。chunk_id 列是所有这些块的列表。

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

我们已经完成了为文本构建概念图的工作。但到此为止将是一个相当不令人满意的练习。我们的目标是像本文开头的主图一样可视化图形,而我们距离目标并不遥远。

创建概念网络

NetworkX 是一个 Python 库,它使处理图形变得非常容易。如果您还不熟悉该库,请单击下面的徽标以了解更多信息

将我们的数据框添加到 NetworkX 图只需几行代码。

G = nx.Graph()


for node in nodes:
G.add_node(str(node))


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 管道回答这些问题。这难道不很棒吗?

让我们还计算图中每个概念的度数。节点的度数是它连接的边的总数。因此,在我们的例子中,概念的度数越高,它对我们文本主题的中心地位就越高。我们将使用度数作为可视化中节点的大小。

图形可视化

可视化是这个练习中最有趣的部分。它具有一种特殊的品质,能给你带来艺术上的满足感。

我使用 PiVis 库来创建交互式图形。Pyvis 是一个用于可视化网络的 Python 库。 这篇 Medium 文章展示了该库的便捷性和强大功能

Pyvis 有一个内置的 NetworkX 助手,可以将我们的 NetworkX 图转换为 PyVis 对象。所以我们不需要再编写代码了……。耶!!

记住,我们已经计算了每条边的权重(用于边的粗细)、节点的社区(用于节点的颜色)以及每个节点的度数(用于节点的大小)。

所以,有了所有这些花哨的功能,这就是我们的图表。

1*tUIG_q8jFoObdzoD9_gWNg.gif (1280×715) (medium.com)

Gif 由作者使用本文讨论的项目生成。

交互式图形的链接: https://rahulnyk.github.io/knowledge_graph/](https://rahulnyk.github.io/knowledge_graph/)

我们可以随意放大缩小并移动节点和边。我们还在页面底部有一个滑块面板来改变图形的物理特性。看看这个图表如何帮助我们提出正确的问题并更好地理解主题!

我们可以进一步讨论我们的图表如何帮助我们构建图形增强检索以及如何帮助我们构建更好的 RAG 管道。但我认为最好留到改天再说。我们已经实现了本文的目标!

Github 仓库

https://github.com/rahulnyk/knowledge_graph?source=post_page-----110844f22a1a--------------------------------

欢迎贡献和建议

我使用了以下文章来演示我的代码。

**Saxena S G, Godfrey T (June 11, 2023) India's Opportunity to Address Human Resource Challenges in Healthcare. Cureus 15(6): e40274. DOI 10.7759/cureus.40274**

我感谢作者的出色工作,并将其发布在 Creative Commons Attribution License 下。



53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询