2026年7月2日 周四晚上19:30,报名腾讯会议了解“如何构建自进化的动态知识库(Brain)”(限30人)
免费POC, 零成本试错
FDE知识库

FDE知识库

学习大模型的前沿技术与行业落地应用


收藏

Graph Maker:轻松使用开源大模型将文本转为知识图谱,发现新知识!

发布日期:2024-06-06 08:01:09 浏览次数: 9703
作者:活水智能

微信搜一搜,关注“活水智能”


本文将介绍一个Python库——Graph Maker(图谱生成器)它可以根据给定的本体从文本语料库中创建知识图谱。

用大模型处理知识图谱为什么这么重要?

我们来看看展示知识图谱在AI时代巨大潜力的精彩论文。它展示了知识图谱不仅可以用于知识检索,还可以用于发现新知识。以下是我最喜欢的摘录之一:

“例如,我们将展示这种方法如何将看似不相关的概念,如贝多芬的第九交响曲,与仿生材料科学联系起来。”

上图展示了一个将信息转化为知识的方法。a面板强调了将容易获取的信息(如回答“谁”、“什么”、“在哪里”和“何时”)转化为更难以传达和转移的知识(即“如何”)。b面板说明了解决这一问题的过程:首先将科学文章转换成标记语言,然后分解成文本块,这些文本块用于提炼出简洁的科学摘要。这些原始内容进一步用于生成图的三元组,最初在每个文本块层面上创建,然后通过串联所有局部图来构建一个全局图。

论文见:https://arxiv.org/pdf/2403.11996


本文将讨论图谱生成器的“为什么”和“是什么”这两个基本问题,并简要回顾前一篇文章以及当前方法如何解决其中的一些挑战。

在讨论 Graph Maker 的工作原理之前,让我们先讨论一下“为什么”和“是什么”。

为什么需要知识图谱?

我们先从“为什么需要知识图谱”开始。如果你已经熟悉知识图谱的基本概念,可以跳过这一部分。

下图简洁地总结了知识图谱的概念。

要创建知识图谱,我们需要两部分信息。

知识库:可以是文本语料库、代码库、文章集合等。

本体:我们关心的实体类别及其关系类型。我可能简化了本体的定义,但这对我们的目的来说是可行的。

以下是一个简单的本体:

实体:人、地点

关系

  • • 人—相关于→人

  • • 人—居住在→地点

  • • 人—访问→地点

有了这两部分信息,我们可以从提到人物和地点的文本中构建一个知识图谱。

然而,如果我们的知识库是关于处方药及其相互作用的临床研究,我们可能会使用不同的本体,其中化合物、用法、效果、反应等可能构成我们的本体。

在上一篇文章中,我们讨论了如何使用大模型提取知识图谱,而无需提供本体。这个想法是让大模型自己发现最适合给定文本语料库的本体。

尽管这种方法缺乏传统生成知识图谱方法的严谨性,但它有其优点。它可以比传统方法更容易地使用非结构化数据生成知识图谱。

它生成的知识图谱在某种意义上也是非结构化的,但它们更易构建且信息更丰富,适合GRAG(基于图谱的检索增强生成)等应用。

为什么选择 Graph Maker?

让我列出一些我在上一篇文章中收到的反馈中的挑战和观察。这将帮助我们理解使用大模型创建知识图谱面临的难题。让我们以《指环王》书籍的维基百科摘要为例。毕竟,没有人会不爱《指环王》!

有意义的实体

在自由运行的情况下,大模型提取的实体类别可能过于多样化。

例如,在“比尔博·巴金斯庆祝生日并把戒指留给佛罗多”这句话中,大模型可能会将“比尔博·巴金斯庆祝生日”或“庆祝生日”标记为“动作”。但如果它提取“生日”作为“事件”可能更有用。

一致的实体

它也可能在不同的上下文中错误地标记相同的实体。例如:“索伦”、“黑暗之主索伦”和“黑暗之主”不应被提取为不同的实体。

或者,如果它们被提取为不同的实体,它们应该用等价关系连接。

解析的弹性

大模型的输出本质上是不确定的。为了从大文档中提取知识图谱,我们必须将语料库分割成较小的文本块,然后为每个块生成子图。

为了构建一致的图谱,大模型必须一致地输出符合给定模式的JSON对象,缺少一个可能会对整个图的连通性产生不利影响。

尽管大模型在生成格式良好的JSON对象方面变得越来越好,但它仍然远非完美。具有有限上下文窗口的大模型也可能生成不完整的响应。

实体的分类

大模型在识别实体时容易出错。当上下文是特定领域时,或者当实体不是标准英语命名时,这个问题更严重。NER模型在这方面可能表现更好,但它们也仅限于其训练数据。此外,它们无法理解实体之间的关系。

让大模型在类别上一致是提示工程的一门艺术。

隐含关系

关系可以是明确提到的,也可以是上下文隐含的。例如:

“比尔博·巴金斯庆祝生日并把戒指留给佛罗多”隐含了以下关系:

  • • 比尔博·巴金斯→拥有者→戒指

  • • 比尔博·巴金斯→继承人→佛罗多

  • • 佛罗多→拥有者→戒指

在某些时候,我认为大模型在提取关系方面会比任何传统方法更好。但目前,这仍是一个需要巧妙提示工程的挑战。

Graph Maker(图谱生成器)

我在这里分享的图谱生成器库在严谨性和易用性之间达到了一个平衡——在结构化和非结构化之间。

它在大多数上述挑战中比我之前讨论的方法表现得更好。

与之前的方法不同,大模型可以自行发现本体,而图谱生成器试图迫使大模型使用用户定义的本体。

我们可以通过一个简单的pip命令安装知识图谱生成器库:

pip install knowledge-graph-maker

以下是实现知识图谱的五个步骤。

Graph Maker 的Github 仓库见:https://github.com/rahulnyk/graph_maker

1. 定义图的本体

该库理解如下的本体架构。实际上,本体是一个pydantic模型。

ontology = Ontology(
    labels=[
        {"Person": "人物名称,无需任何形容词,记住一个人可以通过名字或代词引用"},
        {"Object": "物体名称,不要加定冠词'the'"},
        {"Event": "涉及多人的事件,不包括修饰词或动词如gives, leaves, works等"},
        "Place",
        "Document",
        "Organisation",
        "Action",
        {"Miscellaneous": "任何重要概念无法归类到其他标签"}
    ],
    relationships=[
        "任何实体对之间的关系",
    ],
)

我调整了提示,以生成与给定本体一致的结果。

我认为它在这方面做得相当不错。然而,它仍然不是百分之百准确。准确性取决于我们选择的模型、应用、本体和数据质量。

2. 将文本分块

我们可以使用尽可能大的文本语料库来创建大规模的知识图谱。

然而,大模型目前有一个有限的上下文窗口。因此,我们需要适当地分块文本,并一次创建一个块的图谱。

块的大小应根据模型的上下文窗口确定。在这个项目中使用的提示占用了大约500个tokens。

其余的上下文可以分为输入文本和输出图谱。根据我的经验,较小的200到500个tokens的块可以生成更详细的图谱。

3. 将这些块转换为文档

文档是一个具有以下架构的pydantic模型:

class Document(BaseModel):
    text: str
    metadata: dict

我们添加到文档中的元数据将标记为从文档中提取的每个关系。我们可以将关系的上下文,例如页码、章节、文章名称等,添加到元数据中。

通常每对节点在多个文档中有多个关系。元数据有助于将这些关系情境化。

4. 运行Graph Maker

Graph Maker直接接受一个文档列表,并迭代每个文档以创建每个文档的子图。

最终输出是所有文档的完整图谱。

以下是一个简单的示例:

from knowledge_graph_maker import GraphMaker, Ontology, GroqClient

model = "mixtral-8x7b-32768"

llm = GroqClient(model=model, temperature=0.1, top_p=0.5)
graph_maker = GraphMaker(ontology=ontology, llm_client=llm, verbose=False)

graph = graph_maker.from_documents(docs)

print("Total number of Edges", len(graph))

Graph Maker将每个文档运行通过大模型,并解析响应以创建完整的图谱。

最终的图谱是一个边列表,每条边都是一个类似于以下的pydantic模型。

class Node(BaseModel):
    label: str
    name: str

class Edge(BaseModel):
    node_1: Node
    node_2: Node
    relationship: str
    metadata: dict = {}
    order: Union[int, None] = None

我调整了提示,使其现在生成相当一致的JSON。如果JSON响应解析失败,Graph Maker还会尝试手动将JSON字符串拆分成多个边的字符串,然后尽力挽救有用的信息。

5. 保存到Neo4j

我们可以将模型保存到Neo4j中,以创建RAG应用程序、运行网络算法,或者仅仅通过the Bloom来可视化图谱。

from knowledge_graph_maker import Neo4jGraphModel
create_indices = False
neo4j_graph = Neo4jGraphModel(edges=graph, create_indices=create_indices)
neo4j_graph.save()

图谱的每条边都会作为一个事务保存到数据库中。如果你是第一次运行此代码,请将create_indices设置为true。

这将通过在节点上设置唯一性约束来准备数据库。

5.1 可视化

这里,由于我们已经将图谱保存到Neo4J中,可以直接利用Bloom来可视化图谱。

为了避免重复,我们生成了与上一篇文章不同的可视化。假设我们希望看到角色之间的关系如何随着书籍的进展而演变。

我们可以通过跟踪在图谱生成过程中,边的增量添加顺序来实现这一点。为此,Edge模型有一个名为‘order’的属性。

这个属性可以用于为图谱添加时间或顺序维度。

在我们的示例中,图谱生成器会自动将特定文本块在文档列表中出现的顺序编号添加到它从该块中提取的每条边上。

所以,为了看到角色之间关系的演变,我们只需按边的顺序对图谱进行切片即可。

以下是这些切片的截图。

知识图谱与RAG

这种知识图谱的最佳应用可能在于RAG。有大量文章讨论如何使用图谱增强RAG应用程序。

本质上,知识图谱提供了许多不同的知识检索方式。根据我们设计图谱和应用程序的方式,其中一些技术可能比简单的语义搜索更强大。

最基本的,我们可以将嵌入向量添加到我们的节点和关系中,并针对向量索引运行语义搜索以进行检索。

然而,我认为知识图谱在RAG应用中的真正威力在于将Cypher查询和网络算法与语义搜索相结合。

我自己也在探索其中一些技术。希望能在下一篇文章中写到它们。

说 明

这个项目起源于作者为他的宠物项目开发应用程序,这个代码库也可以用于其他应用程序。

Graph Maker 的仓库见:https://github.com/rahulnyk/graph_maker

请随意试用。我还在仓库中包含了一个示例Python笔记本,可以帮助你快速入门。

请注意,在开始之前,你需要在**_.env_**文件中添加你的GROQ凭证


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

产品:场景落地咨询+大模型应用平台+行业解决方案

承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业

联系我们

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

微信扫码

添加专属顾问

回到顶部

加载中...

扫码咨询

扫码登录
登录即表示您同意《53AI网站服务协议》
服务协议

欢迎您使用【53AI 官方网站】(以下简称“本网站”或“我们”)。本《会员服务协议》(以下简称“本协议”)是您(以下简称“会员”或“用户”)与【深圳市博思协创网络科技有限公司】之间关于注册、登录及使用本网站会员服务所订立的法律协议。

在您注册或登录前,请务必审慎阅读、充分理解各条款内容,特别是免除或限制责任的条款、知识产权条款、争议解决条款等。此类条款将以加粗形式提示您注意。 当您通过微信公众号授权、手机验证码验证或其他方式成功登录本网站时,即视为您已完全理解并同意接受本协议的全部内容。

一、 定义

本网站:指由【深圳市博思协创网络科技有限公司】运营的,域名为【53ai.com】的网站及相关移动端页面。

会员服务:指本网站向注册会员提供的知识库文章查阅、内容检索及其他相关增值服务。

知识库内容:指本网站发布的包括但不限于文字、图表、数据、研究报告、行业分析等数字化内容资源。

二、 账号注册与登录

登录方式:本网站支持以下登录方式,您可根据实际情况选择:

微信公众号授权登录:您同意将您的微信OpenID信息授权给本网站,用于创建或关联会员账号。

手机验证码登录:您需提供真实有效的手机号码,并通过短信验证码完成身份验证与登录/注册。

账号安全:您的账号仅限您本人使用,禁止赠与、借用、租用、转让或售卖。因您保管不善导致的账号被盗、密码泄露等损失,由您自行承担。

实名认证:根据相关法律法规要求,我们可能要求您在特定功能下完成实名认证。如您拒绝提供,可能无法使用部分或全部服务。

未成年人保护:若您未满18周岁,请在法定监护人的陪同下阅读本协议,并在征得监护人同意后使用本服务。

三、 服务内容与规范

知识库查阅权限:会员登录后,有权按照其会员等级对应的权限范围,在线浏览、检索本网站知识库中的相关文章及内容。

服务变更:我们有权根据业务发展需要,调整、变更或终止部分服务内容,并将以网站公告、公众号消息等方式提前通知。

禁止行为:您在使用服务时不得实施以下行为:

利用技术手段批量爬取、下载、转存知识库内容;

将知识库内容用于商业目的或未经授权地向第三方传播;

干扰本网站正常运行或侵犯其他用户合法权益;

发布违法违规信息或从事违反公序良俗的活动。

四、 知识产权声明

权利归属:本网站知识库中的排版设计、软件代码等内容的知识产权均归【公司全称】或原权利人所有,受《中华人民共和国著作权法》等法律保护。

有限许可:本网站授予会员一项非独占、不可转让、不可转授权的普通许可,仅限于个人学习、研究之目的在线查阅知识库内容。

侵权追责:未经书面许可,任何单位或个人不得以任何形式复制、转载、摘编、镜像、汇编或以其他方式使用上述内容。一经发现,我们保留追究其法律责任的权利。

五、 个人信息保护

我们重视对您个人信息的保护。关于我们如何收集、使用、存储和保护您的个人信息,请单独阅读 《隐私政策》。

您通过微信公众号授权或手机号验证所提供的信息,我们将严格按照《个人信息保护法》的规定处理,仅用于身份识别、服务提供及安全验证等必要用途。

您可以随时通过网站设置或联系客服行使查阅、更正、删除个人信息及撤回授权同意的权利。

六、 免责声明

内容准确性:知识库内容仅供参考,不构成专业建议。我们不对其完整性、准确性、时效性作任何明示或暗示的保证,您应自行判断并承担使用风险。

不可抗力:因自然灾害、政策法规变化、网络故障、第三方平台接口异常(如微信接口维护、运营商短信通道故障)等不可抗力导致的服务中断或延迟,我们不承担违约责任。

第三方链接:本网站可能包含指向第三方网站的链接,该等网站的内容和服务不受我们控制,请您自行甄别风险。

七、 违约责任

如您违反本协议约定,我们有权视情节采取警告、限制功能、暂停服务、注销账号等措施,并保留要求赔偿损失的权利。

如因您的违约行为导致我们遭受行政处罚、第三方索赔或商誉损失,您应承担全部赔偿责任(包括但不限于罚款、赔偿金、律师费、公证费等)。

八、 法律适用与争议解决

本协议的订立、执行和解释均适用中华人民共和国大陆地区法律。

因本协议产生的或与本协议有关的任何争议,双方应友好协商解决;协商不成的,任何一方均可向【公司所在地】有管辖权的人民法院提起诉讼。

九、 其他

本协议构成双方就本服务达成的完整协议,取代此前任何口头或书面约定。

本协议任一条款被认定为无效或不可执行的,不影响其他条款的效力。

我们对本协议享有最终解释权,并在法律允许的范围内保留随时修改的权利。修改后的协议一经公布即生效,继续使用服务即视为同意修订内容。


已查阅