如果你已经按照本系列第1部分的步骤进行了操作,那么你应该已经创建了一些 parquet 文件。我们将把这些 parquet 文件转换成海龟格式文件,以描述我们的链接数据。你可以在这里阅读有关海龟格式的信息。然后,我们将把龟格式文件导入 RDF 存储器。但在导入该文件之前,我们要先导入我创建的本体文件,以描述 Microsoft GraphRAG。我们还将创建一个矢量索引,用于语义搜索。完成所有这些工作后,我们就可以在 RDF 知识图谱的帮助下使用 RAG 了。本部分的步骤如下:
将本体导入 RDF 存储器
本体是对知识的正式描述,是一个领域中的一组概念以及它们之间的关系。本体是知识图谱的重要基础。你可以在此阅读更多相关信息。万维网联盟(W3C)创建了一个格式规范,允许我们定义称为 OWL2 的本体。我为我们将要使用的 Microsoft GraphRAG 创建了一个本体,它看起来是这样的:
我使用一款名为 Metaphactory 的优秀产品创建了本体,然后将其导出为 OWL 文件。请查看 “资源 ”部分的链接,获取本体文件的副本以及与本部分相关的所有其他文件(和笔记本)。
本体是知识图谱的重要组成部分。本体允许以标准化的方式定义数据和关系。本体还提供了验证数据和解释数据的能力。非常重要的一点是,我们创建的系统不能是无人能懂的黑盒子。我们需要能够解释我们的系统和输出,并验证输入的数据。
首先,我们将在 RDF 存储器中创建一个空存储库,然后导入本体文件。我使用 GraphDB 作为我的 RDF 存储库(因为他们提供免费版本),所以你可以像这样创建一个新的存储库(我将其命名为 msft-graphrag):
创建存储库后,你就可以导入我提供的本体 OWL 文件:
导入时,确保指定 “默认图形”:
创建符合本体的数据并将其导入 RDF 存储器
现在我们已经将本体导入了 RDF 存储,可以安全地创建和导入数据了。
我创建了一个 Jupyter 笔记本,它可以读取第 1 部分输出的 parquet 文件,然后创建相应的海龟文件,并将其导入图中。如果你只想导入数据,而不想知道数据是如何创建的,我还提供了 2 个海龟文件供你使用。一个是用 300 块大小创建的,另一个是用 1200 块大小和相关数据创建的。
创建矢量索引
在 Jupyter 笔记本的最后一部分,我展示了如何使用 Elasticsearch 为数据创建矢量索引。
我们将为实体类创建一个索引,存储 description_embedding 字段。该字段在实体的 parquet 文件中,因此我们将其与 id 字段绑定。
from elasticsearch import Elasticsearch
embedding_vector = entity_df['description_embedding'].iloc[0]
es = Elasticsearch("https://localhost:9200",
basic_auth=("elastic", "password"),
verify_certs=False)
indexMapping = {
"properties":{
"id":{
"type":"keyword"
},
"description_embedding":{
"type": "dense_vector",
"dims": len(embedding_vector),
"index": True,
"similarity": "cosine",
},
}
}
index_name = "entity_graph_index"
#es.indices.delete(index=index_name)
es.indices.create(index=index_name, mappings=indexMapping)
# We need to convert our DataFrame to a dictionary as this is the format Elasticsearch
# expects when we're adding a record to the index.
record_list = entity_df[['id', 'description_embedding']].to_dict("records")
for record in record_list:
es.index(index=index_name, document=record, id=record["id"])
创建此索引后,我们将在第 3 部分中使用它与我们的 RDF 知识图谱一起,为用户的问题生成更好的答案。