几个月前,基于知识的问答(KBQA)还是一个新奇事物。
现在,对于任何 AI 爱好者来说,带检索增强生成(RAG)的 KBQA 就像小菜一碟。看到自然语言处理(NLP)的可能性领域由于大型语言模型(LLMs)的发展而如此迅速扩展,真是令人着迷。
而且,它每天都在变得更好。
01 摘 要
知识图谱(KG)或任何图谱由节点和边组成。知识图谱的每个节点代表一个概念,每条边是这样一对概念之间的关系。
在这篇文章中,我将分享一种将任何文本语料库转换成概念图的方法。我在这里将“概念图”(GC)一词与知识图谱这个术语交替使用,以更好地描述我在这里演示的内容。
我在这个实现中使用的所有组件都可以在本地设置,因此这个项目可以轻松地在个人机器上运行。我在这里采用了无 GPT 方法,因为我相信较小的开源模型。
我正在使用出色的 Mistral 7B Openorca instruct 和 Zephyr 模型。这些模型可以通过 Ollama 在本地设置。
(编者注:Mistral 7B 是一个基于 GPT 架构的大型语言模型,专门优化以理解和执行用户指令,适用于多种自然语言处理任务)
像 Neo4j 这样的数据库使得存储和检索图形数据变得容易。在这里,我使用内存中的 Pandas 数据框和 NetworkX Python 库,以保持简单。
我们的目标是将任何文本语料库转换成概念图(GC)并像本文的精美横幅图像一样进行可视化。我们甚至将通过移动节点和边缘、放大和缩小以及改变图的物理特性来与网络图进行交互,以满足我们的心愿。
这是 Github 页面链接,展示了我们正在构建的结果:
https://rahulnyk.github.io/knowledge_graph/
但首先,让我们深入了解知识图谱的基本概念以及我们为什么需要它们。如果你已经熟悉这个概念,请跳过下一节。
02 知识图谱
考虑以下文本:
玛丽有一只小羊羔,
你以前听说过这个故事;
但你知道她传递了她的盘子,
又多吃了一点!
(我希望孩子们没有读到这个😝)
这是将文本表示为知识图谱的一种可能方式。
本文作者使用 draw.io 创建的图表
IBM 在一篇文章中恰当地解释了知识图谱的基本概念:
知识图谱,也称为语义网络,代表了现实世界实体——即对象、事件、情境或概念——之间的网络,并展示了它们之间的关系。这些信息通常存储在图形数据库中,并以图形结构的形式可视化,因此得名知识“图谱”。
为什么要用知识图谱?
知识图谱在多种方式上都很有用。我们可以运行图算法并计算任何节点的中心性,以了解一个概念(节点)对于整个作品的重要性。
我们可以分析概念的连接集和断开集,或计算概念社区以深入理解主题。我们可以理解看似不相关概念之间的联系。
我们还可以使用知识图谱来实现图形检索增强生成(GRAG 或 GAG),并与我们的文档进行聊天。
这可以给我们带来比老旧版本的 RAG 更好的结果,后者有几个缺点。例如,仅使用简单的语义相似性搜索来检索与查询最相关的上下文并不总是有效的。
特别是当查询没有提供足够的上下文来说明其真实意图,或者当上下文跨越大量文本片段时。
例如,考虑这个查询——
“告诉我《百年孤独》书中关于 José Arcadio Buendía 家族史的信息。”
这本书记录了 7 代人的家族史,其中一半的角色都叫。如果使用简单的 RAG 管道,即使可能,回答这个查询也将是相当的挑战。
RAG 的另一个缺点是它不能告诉你该问什么。很多时候,提出正确的问题比得到答案更重要。
图形增强生成(GAG)可以在一定程度上解决 RAG 的这些缺点。更好的是,我们可以混合搭配,构建一个图形增强检索增强生成管道,以获得两全其美的效果。
所以现在我们知道图形很有趣,它们可以非常有用,它们看起来也很美。
03 创建概念图
如果你问 GPT 如何从给定文本创建知识图谱?它可能会建议如下过程:
- 从作品中提取概念和实体。这些是节点。
- 提取概念之间的关系。这些是边。
- 在图形数据结构或图形数据库中填充节点(概念)和边(关系)。
- 可视化,至少是为了视觉上的满足感。
第 3 步和第 4 步听起来可以理解。但你如何实现第 1 步和第 2 步?
这是我设计的从任何给定文本语料库中提取概念图的方法流程图。它类似于上述方法,但有一些小的不同:
- 将文本语料库分割成块。为每个块分配一个 chunk_id。
- 对于每个文本块,使用 LLM 提取概念及其语义关系。我们给这种关系分配一个 W1 的权重。同一对概念之间可以有多重关系。每一种关系都是一对概念之间的边。
- 考虑在同一文本块中出现的概念,也通过它们的上下文邻近性相关联。让我们为这种关系分配一个 W2 的权重。请注意,同一对概念可能出现在多个块中。
- 将相似的对分组,合计它们的权重,并连接它们的关系。因此,现在我们在任何不同的概念对之间只有一条边。这条边具有一定的权重,并带有一系列关系作为其名称。
如下图所示:
本文作者使用 draw.io 创建的图表 / 活水智能 编译
你可以在本文分享的 GitHub 仓库中,查看 Python 代码。
让我们在接下来的几节中简要介绍实现的关键方法。
为了在这里演示该方法,我使用了在 PubMed/Cureus 上发表的文章(编者注:文章见文末),文章遵循 CC BY 版权使用协议。
Mistral 及提示词
上述流程图的第 1 步很简单。Langchain 提供了大量的文本分割器,我们可以使用它们将文本分割成块。
第 2 步是真正有趣的开始。为了提取概念及其关系,我使用了 Mistral 7B 模型。在确定最适合我们目的的模型变体之前,我尝试了以下几种:
Mistral Instruct
Mistral OpenOrca
Zephyr(从 Mistral 衍生的 Hugging Face 版本)
我使用了这些模型的 4 位量化版本——这样我的 Mac 就不会开始讨厌我了——通过 Ollama 在本地托管。
这些模型都是经过指令调整的模型,带有系统提示和用户提示。如果我们告诉它们,它们都能很好地遵循指令,并整齐地以 JSON 格式格式化答案。
经过几轮尝试和错误后,我最终选择了 Zephyr模型 和以下提示:
如果我们用这个提示传递我们的(不适合)童谣,这是结果。
注意,它甚至猜到了“食物”作为一个概念,这在文本块中并没有明确提到。这不是很棒吗!
如果我们将这个过程应用于我们示例文章的每个文本块,并将 json 转换为 Pandas 数据框,这是它的样子。
这里的每一行代表一对概念之间的关系。每行是我们图中两个节点之间的一条边,同一对概念之间可以有多条边或关系。
上述数据框中的计数是我任意设置为 4 的权重。
上下文邻近性
我假设在文本语料库中彼此靠近出现的概念是相关的。我们称这种关系为“上下文邻近性”。
为了计算上下文邻近性边缘,我们将数据框融化,使得 node_1 和 node_2 合并成一个列。
然后我们使用 chunk_id 作为键对这个数据框进行自连接。因此,具有相同 chunk_id 的节点将彼此配对,形成一行。
但这也意味着每个概念也会与自己配对。这称为自环,其中边缘起始和结束于同一个节点。为了移除这些自环,我们将从数据框中删除 node_1 与 node_2 相同的每一行。
最终,我们得到一个与原始数据框非常相似的数据框。
这里的 count 列是 node_1 和 node_2 一起出现的块数。列 chunk_id 是所有这些块的列表。
所以我们现在有两个数据框,一个带有语义关系,另一个带有文本中提到的概念之间的上下文邻近性关系。我们可以将它们结合起来形成我们的网络图数据框。
我们已经完成了为我们的文本构建概念图的工作。但在这一点上就结束将是一项相当不令人满意的练习。
我们的目标是像本文开头的特色图像一样可视化图表,而我们离目标不远了。
04 创建概念网络
NetworkX 是一个使处理图变得非常容易的 Python 库。
如果你还不熟悉这个库,请点击链接了解更多:https://networkx.org/?source
将我们的数据框添加到 NetworkX 图中只需要几行代码:
这是我们可以开始利用网络图的力量的地方。NetworkX 为我们提供了大量现成的网络算法供我们使用。
这是我们可以在图上运行的算法列表的链接:https://networkx.org/documentation/stable/reference/algorithms/index.html
在这里,我使用社区检测算法为节点添加颜色。社区是一组节点,它们彼此之间的连接比与图的其余部分更紧密。概念社区(Communities of concepts)可以让我们很好地了解文本中讨论的广泛主题。
Girvan Newman 算法在我们正在处理的审查文章中,检测到了 17 个概念社区。这是其中一个概念社区。
这立即让我们了解到审查论文中讨论的健康技术的广泛主题,并使我们能够提出问题,然后我们可以用我们的 RAG 管道来回答。这不是很棒吗?
让我们也计算图中每个概念的度数。节点的度数是它连接的边的总数。所以在我们的案例中,概念的度数越高,它对我们文本的主题就越中心。我们将在可视化中使用度数作为节点的大小。
05 图形可视化
可视化是这个练习中最有趣的部分。它有一种特质,能给你带来艺术上的满足感。
我使用 PiVis 库来创建交互式图表。Pyvis 是一个用于可视化网络的 Python 库。
Pyvis 内置了一个 NetworkX 助手,可以将我们的 NetworkX 图转换为 PyVis 对象。所以我们不需要更多的编码……耶!!
记住,我们已经计算了每条边的权重(边的粗细),节点的社区(颜色),以及每个节点的度(大小)。
复制链接打开,即可看到交互式知识图谱:https://rahulnyk.github.io/knowledge_graph/
我们可以随意放大和缩小,移动节点和边缘。页面底部还有一个滑块面板,可以改变图的物理特性。看看图表如何帮助我们提出正确的问题,更好地理解主题内容!
我们可以进一步讨论我们的图如何帮助我们构建图形增强检索,以及这如何帮助我们构建更好的 RAG 管道。但我认为最好留到另一天。
我们已经实现了本文的目标!■
如何学习大模型 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 的正确特征了。