游乐游手机版
首页/AI热点日报/热点详情

如何通过给定本体将任意文本转换为知识图谱

类型:热点整理2026-05-31
基于给定本体,该Python工具可将任意文本自动转化为知识图谱。流程包括定义实体与关系、文本分块、生成文档子图并合并为总图,输出边列表。设计注重鲁棒性,能容错大模型偶发错误,可选保存至Neo4j数据库用于检索增强生成。

项目简介

知识图谱,或者叫语义网络,说白了就是一张用实体(比如人、事、物、概念)和它们之间的关系连接起来的信息网。这些信息通常被存放在图数据库里,并以图形结构呈现出来,所以叫“知识图谱”。下面这个示意图,就很直观地展示了它的样子。

将任意文本通过给定的本体转换成知识图谱!

现在,有一个Python工具,它的功能很直接:给定一个本体(你可以理解为一个预定义的分类和关系框架),它能把任何一段文本自动转换成符合这个框架的知识图谱。它的项目链接在文末。

Why Graph? 为什么要画成图?

知识图谱能干的事情其实挺多的。比如,我们可以跑图算法,算算每个节点的中心性,看看哪个概念在这段文本里最关键。还可以做社区发现,把相关的概念自动分到一组,让文本分析变得更清晰。更重要的是,它能把那些看似八竿子打不着的概念,通过潜在的关系网络给串联起来。

当然,最诱人的应用还是图检索增强生成(GRAG)。它本质上是对传统RAG(检索增强生成)的一次升级——把图结构当成一个超级检索器,然后跟你的文档聊天。相比于传统RAG依赖的向量数据库,GRAG在捕捉复杂关系和深层语义方面,优势非常明显。

这个项目

这是一个Python库,核心能力就是基于给定的本体,从任意文本中构建知识图谱。它在设计上很注重一致性,同时对大模型偶尔出现的“幻觉”或错误输出,也有不错的容错能力。下面我们一步步来看它的工作流程。对了,要搭建这个项目,你需要先安装Poetry。

# Create a local environment
$ poetry config virtualenvs.create false --local
# Install dependencies.
$ poetry install

1. 定义图的本体

项目定义本体的方式很直白,底层是一个Pydantic模型。你只需要告诉它两件事:你关心哪些实体(节点)以及它们之间可能存在的关系。

ontology = Ontology(
    labels=[
        {"Person": "Person name without any adjectives, Remember a person may be references by their name or using a pronoun"},
        {"Object": "Do not add the definite article 'the' in the object name"},
        {"Event": "Event event involving multiple people. Do not include qualifiers or verbs like gives, lea ves, works etc."},
        "Place",
        "Document",
        "Organisation",
        "Action",
        {"Miscellanous": "Any important concept can not be categorised with any other given label"},
    ],
    relationships=[
        "Relation between any pair of Entities",
    ],
)

从实际效果来看,我调整过的提示词在引导模型输出与给定本体一致的结果上,表现得很不错。当然,它还没到100%完美的程度,最终的准确性还是取决于你选用的模型、具体的应用场景、本体设计的精细度,以及源文本的数据质量。

2. 将文本分割成块

如果你想构建一个巨大的知识图谱,理论上可以用任意长度的文本。但问题是,当前的大语言模型都有上下文窗口限制。所以,我们需要先把文本切成合适的块,然后一块一块地构建子图。块的大小怎么定呢?项目里的提示词本身就消耗大约500个token,剩下的容量可以分配给输入文本和输出的图结构。实践经验表明,800到1200个token的文本块,效果是比较理想的。

3. 将这些块转换为文档

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

这里的“文档”其实是一个Pydantic模型,结构很简单,就是文本内容和元数据。关键在于,你附加到文档上的元数据(比如页码、章节名、文章标题等),会被自动标记到从该文档中提取出的每一条关系上。考虑到同一个节点对可能在多个文档中间出现多次,元数据就能为理解这些关系的具体语境提供关键线索。

4. 运行图形制作器

图形制作器的工作方式就是接收一个文档列表,然后逐个处理,为每个文档生成一个子图。最终,这些子图会被合并成一个完整的总图。下面是一段最简单的示例代码。

from graph_maker import GraphMaker, Ontology, GroqClient
from graph_maker import Document

## Select a groq supported model
## model = "mixtral-8x7b-32768"
model = "llama3-8b-8192"
## model = "llama3-70b-8192"
## model="gemma-7b-it" 

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

## create a graph out of a list of Documents.
graph = graph_maker.from_documents(
    list(docs),
    delay_s_between=10
)

## result -> a list of Edges.
print("Total number of Edges", len(graph))
## 1503

输出的结果是一个边的列表,每条边都是一个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响应解析失败,它还会尝试手动把JSON字符串拆成更小的、单条边的字符串,然后分别尝试解析——这种设计在实际运行中,能很大程度提升整个流程的鲁棒性。

5. 保存到Neo4j(可选步骤)

把图结构保存到Neo4j图数据库里,是一个很实用的后续操作。之后你可以用它来构建RAG应用、运行网络分析算法,或者直接通过Neo4j的Bloom工具来可视化整个知识图谱。

项目链接

项目链接:github.com/rahulnyk/graph_maker

来源:https://www.53ai.com/news/qianyanjishu/2024052634602.html

相关热点

继续查看同栏目近期热点。

延伸阅读

补充最近整理过的热点入口。