微信扫码
添加专属顾问
RAG(Retrieval Augmented Generation)技术中检索是一个非常重要的环节,检索的准确性直接影响到生成的质量,但普通 RAG 的向量检索技术并不能满足所有场景下的需求,比如在一些大型私有文档库中,传统的检索技术往往表现不好。目前已经有很多研究团队在 RAG 中引入知识图谱来提高检索的准确性,并且取得了很好的效果。今天我们就来了解一下知识图谱的原理,以及如何在 RAG 中进行使用。
知识图谱是一种利用图结构来表示和建模现实世界中实体及其关系的技术方法。它将信息以节点(实体)和边(关系)的形式组织成一个有机的网络,从而实现对复杂知识的高效存储、查询和分析。知识图谱的核心在于通过三元组形式(实体-关系-实体)来描述事物之间的关联,这种结构化的数据表示方法不仅能够捕捉数据的语义含义,还能便于理解和分析。
知识图谱在 RAG 中的使用流程图如下所示:
在数据入库过程中,文档经过分块后,知识图谱 RAG 会将文档块进行实体和关系的提取,提取出实体和关系后,通常是将它们保存到图数据库中。
在检索过程中,知识图谱 RAG 会将问题进行实体提取,将提取出来的实体通过图数据库进行检索,获取相关的实体和关系,检索结果往往是一个庞大的实体关系网络,最后将检索到的实体和关系结合问题提交给 LLM(大语言模型)进行答案生成。
有些知识图谱 RAG 的实现也会结合图检索和向量检索两种方式,这样可以综合利用图检索和向量检索的优势,提高检索的准确性和效率。
在 RAG 中使用知识图谱主要解决在大型文档库上问答和理解困难的问题,特别是那些普通 RAG 方法难以处理的全局性问题。普通 RAG 在回答针对整个文档库的全局性问题时表现不佳,例如问题:请告诉我所有关于 XXX 的事情,这个问题涉及到的上下文可能分布在整个大型文档库中,普通 RAG 的向量检索方法很难得到这种分散、细粒度的文档信息,向量检索经常使用 top-k 算法来获取最相近的上下文文档,这种方式很容易遗漏关联的文档块,从而导致信息检索不完整。
另外是 LLM 的上下文窗口限制问题,对于全局性问题往往涉及到非常多的上下文文档,如果要全部提交给 LLM 则很容易超出 LLM 的窗口限制,而知识图谱将文档提取成实体关系后,实际上大大压缩了文档块的大小,从而让所有相关文档提交给 LLM 成为可能。
知识图谱 RAG 使用图结构来表示和存储信息,捕捉实体间的复杂关系,而普通 RAG 通常使用向量化的文本数据
知识图谱 RAG 通过图遍历和子图检索来获取相关信息,普通 RAG 主要依赖向量相似度搜索
知识图谱 RAG 能更好地理解实体间的关系和层次结构,提供更丰富的上下文,普通 RAG 在处理复杂关系时能力有限
下面我们来看下知识图谱 RAG 具体的数据入库流程,普通 RAG 在文档分块后,通常是使用 Embedding 模型将文档块进行向量化,然后将向量和文档保存到向量数据库。与普通 RAG 不同,知识图谱 RAG 在入库过程中会将文档块进行实体和关系的提取,提取出实体和关系后再将它们保存到图数据库中。
实体提取的传统方法是基于预定义的规则和词典、统计机器学习或者深度学习等技术,但进入到 LLM 时代后,实体提取更多的是使用 LLM 来进行,因为 LLM 能够更好地理解文本的语义,实现也更加简单。
比如在 LlamaIndex[1] 的 KnowledgeGraphIndex 类中的实体提取提示词是这样的:
DEFAULT_KG_TRIPLET_EXTRACT_TMPL = (
"Some text is provided below. Given the text, extract up to "
"{max_knowledge_triplets} "
"knowledge triplets in the form of (subject, predicate, object). Avoid stopwords.\n"
"---------------------\n"
"Example:"
"Text: Alice is Bob's mother."
"Triplets:\n(Alice, is mother of, Bob)\n"
"Text: Philz is a coffee shop founded in Berkeley in 1982.\n"
"Triplets:\n"
"(Philz, is, coffee shop)\n"
"(Philz, founded in, Berkeley)\n"
"(Philz, founded in, 1982)\n"
"---------------------\n"
"Text: {text}\n"
"Triplets:\n"
)
在提示词中要求 LLM 将文档块 text 提取成实体-关系-实体这样的三元组,实体一般是名词,表示文档块中的实体,关系是动词或者介词,表示实体之间的关系,并给出了几个 Few Shot,让 LLM 能更好地理解实体抽取的任务。
将实体提取出来后,通常是将实体和关系保存到图数据库中,但也有一些知识图谱 RAG 的实现会将这些数据保存到文件中,然后通过其特有的算法来进行检索,比如微软的 GraphRAG[2]。
图数据库是一种专门用来存储图结构数据的数据库,它能够高效地存储和查询图数据,常见的图数据库有 Neo4j、ArangoDB 等。不同的图数据库有不同的查询语言,比如 Neo4j 的查询语言使用的是 Cypher,如果想要在 RAG 中使用 Neo4j 来存储知识图谱数据,那么掌握一些基础的 Cypher 语法是有必要的。
了解了知识图谱 RAG 的数据入库流程之后,我们再来看下它的检索生成过程。普通 RAG 在检索过程中通常是将问题进行向量化,然后通过向量相似度搜索来获取最相近的几个文档块,然后将这些文档块提交给 LLM 进行答案生成。而知识图谱 RAG 在检索过程中会将问题进行实体提取,将提取出来的实体通过图数据库进行检索,这样可以获取到名称相同的实体,以及与实体相关的实体和关系,最后将检索到的所有实体和关系提交给 LLM 进行答案生成。
对问题进行实体提取与数据入库时的实体提取方法类似,也是通过 LLM 来进行,但只需要提取出问题中的实体即可,不需要提取三元组,可以看下 LlamaIndex 的 KGTableRetriever 类中提取问题关键字的提示词:
DEFAULT_QUERY_KEYWORD_EXTRACT_TEMPLATE_TMPL = (
"A question is provided below. Given the question, extract up to {max_keywords} "
"keywords from the text. Focus on extracting the keywords that we can use "
"to best lookup answers to the question. Avoid stopwords.\n"
"---------------------\n"
"{question}\n"
"---------------------\n"
"Provide keywords in the following comma-separated format: 'KEYWORDS: <keywords>'\n"
)
提示词要求 LLM 从问题中提取出多个关键字,并用逗号分隔,这些关键字通常是问题中的实体。将问题的实体提取出来后,再用实体名称去图数据库中进行检索, 检索的原理就是使用图数据库的查询语句对每个实体进行检索,获取对应的三元组。以 Neo4j 图数据库为例,下面是一个简单的 Cypher 查询语句:
MATCH (n {name: 'Alice'})-[r]-(m)
RETURN n, r, m
这个查询语句的意思是查找图数据库中所有与实体 Alice 相关的实体和关系,这样就可以获取到 Alice 相关的所有三元组。最后将得到的数据转换为文本,作为问题的上下文,提交给 LLM 进行答案生成。
了解完知识图谱 RAG 的原理后,接下来我们来看下如何在实际项目中使用知识图谱 RAG ,在 LlamaIndex 框架中已经实现了知识图谱的功能,下面我们来看下如何使用 LlamaIndex 和 Neo4j 实现知识图谱 RAG。
Neo4j 是一个高性能的图形数据库,它将结构化数据存储在网络(从数学角度称为图)上而不是传统的表中,这种设计使得 Neo4j 在处理复杂的关系和连接时具有显著的优势。Neo4j 使用 Cypher 作为查询语言,Cypher 是一种声明式图数据库查询语言,类似于 SQL,但是专门用于图数据库。Cypher 语言的语法简单直观,易于学习和使用,可以快速编写复杂的图查询。Neo4j 除了支持图检索外,还支持其他多种检索方式,包括向量检索、全文检索等。
下面我们来看在如何安装 Neo4j 数据库,Neo4j 的安装非常简单,只需要通过 Docker 下载镜像并启动就可以了,安装命令如下:
docker run --name neo4j -d \
--publish=7474:7474 --publish=7687:7687 \
--volume=/your/host/path/neo4j-data/data:/data \
--env NEO4J_PLUGINS='["apoc"]' \
neo4j:5.21.0
我们使用 Neo4j 的 Docker 镜像进行安装,版本是 5.21.0
Neo4j 镜像会开放 2 个端口,端口 7474 的服务是 Web 管理服务,端口 7687 的服务是数据库服务
我们将 Neo4j 的数据目录映射到宿主机的 /your/host/path/neo4j-data/data 目录
我们通过环境变量给 Neo4j 安装一个插件 Apoc,保证 Python 程序可以通过账号密码连接数据库
服务成功启动后,我们打开浏览器访问 http://localhost:7474,可以看到 Neo4j 的 Web 管理界面,如下图所示:
输入初始账号密码:neo4j/neo4j,然后设置新密码,就可以进入到 Neo4j 的管理界面了。
安装完 Neo4j 数据库后,我们就可以在 LlamaIndex 中使用 Neo4j 了,首先使用 Neo4jGraphStore 类来连接 Neo4j 数据库:
from llama_index.graph_stores.neo4j import Neo4jGraphStore
username = "neo4j"
password = "neo4j"
url = "bolt://localhost:7687"
database = "neo4j"
graph_store = Neo4jGraphStore(
username=username,
password=password,
url=url,
database=database,
)
使用 Neo4jGraphStore 创建连接 Neo4j 数据库的存储对象,传入用户名、密码、连接地址、数据库名称等参数
bolt 是 Neo4j 数据库使用的一种高效的二进制协议,用于在客户端和服务器之间传输数据
Neo4j 数据库的社区版只能使用一个数据库,这里的数据库名称是固定的 neo4j
然后将文档保存到 Neo4j 数据库中,这里的测试文档还是用维基百科上的复仇者联盟[3]电影剧情,示例代码如下:
from llama_index.core import StorageContext, SimpleDirectoryReader KnowledgeGraphIndex
documents = SimpleDirectoryReader("./data").load_data()
storage_context = StorageContext.from_defaults(graph_store=graph_store)
index = KnowledgeGraphIndex.from_documents(
documents,
storage_context=storage_context,
max_triplets_per_chunk=2,
include_embeddings=True,
)
使用 SimpleDirectoryReader 加载文档数据
使用 StorageContext 创建存储上下文对象,传入图数据库存储对象
使用 KnowledgeGraphIndex 从文档中创建知识图谱索引对象
max_triplets_per_chunk=2 参数表示每个文档块将被最多提取成 2 个三元组
include_embeddings=True 参数表示将提取后的三元组转成 Embedding 向量并保存
KnowledgeGraphIndex 默认使用 OpenAI 的 LLM 模型和 Embedding 模型 来进行实体提取和 Embedding,因此需要在环境变量中设置 OpenAI 的 API Key
文档经过分块、实体提取、Embedding 等操作后,最后将实体和关系保存到 Neo4j 数据库中。数据入库完成后,我们可以在 Neo4j 数据库中查看所有的实体和关系,如下图所示:
最后我们构建查询引擎,并对问题进行检索生成:
query_engine = index.as_query_engine(
include_text=True,
response_mode="tree_summarize",
embedding_mode="hybrid",
similarity_top_k=5,
verbose=True,
)
response = query_engine.query("Which two members of the Avengers created Ultron?")
print(f"Response: {response}")
使用 index.as_query_engine 创建查询引擎对象
response_mode="tree_summarize" 参数表示最终结果使用树形总结的方式来生成
embedding_mode="hybrid" 参数表示使用图检索和向量检索的混合模式
similarity_top_k=5 参数表示最多返回 5 个相似的文档块,verbose=True 参数表示检索过程中打印详细信息
使用查询引擎进行问题的检索和生成,最后打印出生成答案
我们再来看下程序运行后的结果,因为我们开启了调试模式,所以在检索过程中会打印出详细的检索信息,如下所示:
Extracted keywords: ['Avengers', 'Ultron', 'created', 'members']
KG context:
The following are knowledge sequence in max depth 2 in the form of directed graph like:
`subject -[predicate]->, object, <-[predicate_next_hop]-, object_next_hop ...`
['CAPTURES', 'Romanoff', 'USES', "Loki's scepter to close"]
['BATTLE', 'Chitauri', 'KNOWN_AS', 'Extraterrestrial race']
['CAPTURES', 'Romanoff', 'MAKES_HER_WAY_TO', 'Generator']
......
Response: Tony Stark and Bruce Banner.
首先提取问题中的关键词,这里提取出了Avengers, Ultron, created, members这几个关键词
然后打印出根据关键词检索到的实体和关系三元组
最后根据问题和这些上下文生成了答案
看完 LlamaIndex 的知识图谱 RAG 实现后,我们再来看下另外一个知识图谱 RAG 的实现。最近微软开源了一个知识图谱 RAG 的实现叫 GraphRAG[2],它是一个基于知识图谱的 RAG 应用,可以用于问答、文本生成等任务。GraphRAG 是在微软之前发布的论文[5] 理论基础上进行开发,与普通知识图谱 RAG 不同的地方是,它并没有用到图数据库,而是直接将知识图谱保存到文件中,然后通过其特有的图检索算法进行检索。另外 GraphRAG 还利用知识图谱的模块化特性,将知识图谱划分为多个语义相关的社区,并为每个社区生成概括性的摘要。在回答用户查询时,GraphRAG 会根据查询内容检索相关的社区摘要,并利用这些摘要生成最终答案。
下面我们介绍一下 GraphRAG 的安装和使用方法,让大家可以快速地了解 GraphRAG。
关于 GraphRAG 的安装方法,这里推荐使用源码安装的方式来安装 GraphRAG,因为这样可以让我们在使用过程中通过修改源码的方式来调试 GraphRAG,从而更好地理解 GraphRAG 的原理。
首先我们需要下载 GraphRAG 的源码:
git clone https://github.com/microsoft/graphrag.git
cd graphrag
然后我们需要使用 Poetry[6] 来安装 GraphRAG 的依赖,Poetry 的安装可以参考其官网的安装手册[7],安装命令如下:
Poetry 是一个用于 Python 项目依赖管理和打包的工具,Poetry 使用一个
pyproject.toml文件来管理项目的所有依赖项和元数据,使项目配置更加简洁明了,它会自动处理依赖项的版本冲突,并且能够生成锁文件poetry.lock,确保在不同环境中安装相同的依赖版本。
# 使用 conda 创建一个 Python 环境
conda create -n graphrag python=3.10
# 切换到这个 Python 环境
conda activate graphrag
# 构建一个 Poetry 虚拟环境
poetry env use python
# 进入该环境
poetry shell
# 安装依赖,会根据 GraphRAG 的 poetry.lock 文件安装依赖
poetry install
GraphRAG 安装完成后,我们再来准备测试文档,创建一个测试文件夹,用来存放我们的测试文档:
mkdir -p ./ragtest/input
# GraphRAG 官方文档是下载这个文件作为测试文档,我们也可以放其他的 txt 文档
curl https://www.gutenberg.org/cache/epub/24022/pg24022.txt > ./ragtest/input/book.txt
然后创建配置文件,我们使用 GraphRAG 的初始化命令来生成配置文件:
poetry run poe index --init --root ./ragtest
初始化完成后,我们可以看到在 ./ragtest 目录下生成了 settings.yaml 和 .env 2 个文件,在 .env 文件中通过 GRAPHRAG_API_KEY 键来设置 OpenAI 的 API Key,而settings.yaml 文件用来保存 GraphRAG 的流水线配置信息。
初始化配置完成后,我们使用 GraphRAG 执行数据入库流水线,命令如下:
poetry run poe index --root ./ragtest
这个执行过程比较耗时,因为 GraphRAG 会将文档进行一系列的操作,包括文档分块、实体提取、文本 Embedding、生成社区报告等,以下是 GraphRAG 的索引入库流程图:
执行完成后,我们可以在 ./ragtest/output/{timestamp}/artifacts 目录下可以看到生成的索引文件,默认是 parquet 格式,后面的检索流程会从这里读取数据。
想了解更多关于 GraphRAG 数据入库的信息,可以参考其官方文档[8]。
文档入库完成后,我们就可以使用 GraphRAG 进行检索生成了,命令如下:
poetry run poe query --root ./ragtest --method local "Which two members of the Avengers created Ultron?"
GraphRAG 的检索模式有 2 种,分别是本地模式和全局模式,上面的命令使用 --method 参数来指定哪种模式。
本地模式类似传统的知识图谱 RAG,通过结合来自知识图谱的相关数据和原始文档的文本块生成答案,而全局模式是通过在所有社区报告上进行搜索,以类似 map-reduce 的方式生成答案。以下是 GraphRAG 本地检索的流程图:
经过测试,GraphRAG 在检索质量上要比普通 RAG 更好,文档数据越多优势越明显,但是 GraphRAG 的检索速度要比普通 RAG 慢,因为 GraphRAG 需要对文档进行多种方式检索。
关于 GraphRAG 的检索流程的更多信息,可以参考其官方文档[9]。
知识图谱 RAG 是一种基于知识图谱的 RAG 技术,它通过图结构来表示和存储信息,提取其中的实体和关系,然后通过图检索的方式来进行检索生成。对于一些大型的私有文档库和复杂的全局性问题,知识图谱 RAG 无疑是一个很好的选择,但在使用过程中也要综合考虑,知识图谱的增强往往也会导致检索生成的速度变慢以及耗费的资源增加,因此在实际应用中需要根据具体的场景来选择合适的 RAG 技术。
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业
2026-07-01
提升 RAG 准确率全攻略 让你的 AI 知识库 真正靠谱起来!
2026-06-30
教程:如何用AutoRAG + Milvus避免RAG 与Agent 中出现串租问题
2026-06-30
知识库不是文件堆——我把RAG准确率从60%调到了92%
2026-06-30
本体论语义建设新思路,另类RAG来解决检索问题
2026-06-30
别把RAG当架构:Ontology(本体)才是Agent的业务世界
2026-06-29
PixelRAG:伯克利团队颠覆传统 RAG,用截图代替文本检索! 28 天狂揽 3000+ Star!
2026-06-29
腾讯WeKnora开源详解(三):检索引擎与生态集成
2026-06-29
腾讯开源WeKnora详解(二):知识库与对话核心能力
2026-04-06
2026-04-27
2026-04-23
2026-04-20
2026-04-09
2026-04-12
2026-04-22
2026-04-10
2026-05-14
2026-04-30
2026-06-23
2026-06-23
2026-06-15
2026-06-10
2026-06-10
2026-05-20
2026-05-18
2026-05-11
欢迎您使用【53AI 官方网站】(以下简称“本网站”或“我们”)。本《会员服务协议》(以下简称“本协议”)是您(以下简称“会员”或“用户”)与【深圳市博思协创网络科技有限公司】之间关于注册、登录及使用本网站会员服务所订立的法律协议。
在您注册或登录前,请务必审慎阅读、充分理解各条款内容,特别是免除或限制责任的条款、知识产权条款、争议解决条款等。此类条款将以加粗形式提示您注意。 当您通过微信公众号授权、手机验证码验证或其他方式成功登录本网站时,即视为您已完全理解并同意接受本协议的全部内容。
一、 定义
本网站:指由【深圳市博思协创网络科技有限公司】运营的,域名为【53ai.com】的网站及相关移动端页面。
会员服务:指本网站向注册会员提供的知识库文章查阅、内容检索及其他相关增值服务。
知识库内容:指本网站发布的包括但不限于文字、图表、数据、研究报告、行业分析等数字化内容资源。
二、 账号注册与登录
登录方式:本网站支持以下登录方式,您可根据实际情况选择:
微信公众号授权登录:您同意将您的微信OpenID信息授权给本网站,用于创建或关联会员账号。
手机验证码登录:您需提供真实有效的手机号码,并通过短信验证码完成身份验证与登录/注册。
账号安全:您的账号仅限您本人使用,禁止赠与、借用、租用、转让或售卖。因您保管不善导致的账号被盗、密码泄露等损失,由您自行承担。
实名认证:根据相关法律法规要求,我们可能要求您在特定功能下完成实名认证。如您拒绝提供,可能无法使用部分或全部服务。
未成年人保护:若您未满18周岁,请在法定监护人的陪同下阅读本协议,并在征得监护人同意后使用本服务。
三、 服务内容与规范
知识库查阅权限:会员登录后,有权按照其会员等级对应的权限范围,在线浏览、检索本网站知识库中的相关文章及内容。
服务变更:我们有权根据业务发展需要,调整、变更或终止部分服务内容,并将以网站公告、公众号消息等方式提前通知。
禁止行为:您在使用服务时不得实施以下行为:
利用技术手段批量爬取、下载、转存知识库内容;
将知识库内容用于商业目的或未经授权地向第三方传播;
干扰本网站正常运行或侵犯其他用户合法权益;
发布违法违规信息或从事违反公序良俗的活动。
四、 知识产权声明
权利归属:本网站知识库中的排版设计、软件代码等内容的知识产权均归【公司全称】或原权利人所有,受《中华人民共和国著作权法》等法律保护。
有限许可:本网站授予会员一项非独占、不可转让、不可转授权的普通许可,仅限于个人学习、研究之目的在线查阅知识库内容。
侵权追责:未经书面许可,任何单位或个人不得以任何形式复制、转载、摘编、镜像、汇编或以其他方式使用上述内容。一经发现,我们保留追究其法律责任的权利。
五、 个人信息保护
我们重视对您个人信息的保护。关于我们如何收集、使用、存储和保护您的个人信息,请单独阅读 《隐私政策》。
您通过微信公众号授权或手机号验证所提供的信息,我们将严格按照《个人信息保护法》的规定处理,仅用于身份识别、服务提供及安全验证等必要用途。
您可以随时通过网站设置或联系客服行使查阅、更正、删除个人信息及撤回授权同意的权利。
六、 免责声明
内容准确性:知识库内容仅供参考,不构成专业建议。我们不对其完整性、准确性、时效性作任何明示或暗示的保证,您应自行判断并承担使用风险。
不可抗力:因自然灾害、政策法规变化、网络故障、第三方平台接口异常(如微信接口维护、运营商短信通道故障)等不可抗力导致的服务中断或延迟,我们不承担违约责任。
第三方链接:本网站可能包含指向第三方网站的链接,该等网站的内容和服务不受我们控制,请您自行甄别风险。
七、 违约责任
如您违反本协议约定,我们有权视情节采取警告、限制功能、暂停服务、注销账号等措施,并保留要求赔偿损失的权利。
如因您的违约行为导致我们遭受行政处罚、第三方索赔或商誉损失,您应承担全部赔偿责任(包括但不限于罚款、赔偿金、律师费、公证费等)。
八、 法律适用与争议解决
本协议的订立、执行和解释均适用中华人民共和国大陆地区法律。
因本协议产生的或与本协议有关的任何争议,双方应友好协商解决;协商不成的,任何一方均可向【公司所在地】有管辖权的人民法院提起诉讼。
九、 其他
本协议构成双方就本服务达成的完整协议,取代此前任何口头或书面约定。
本协议任一条款被认定为无效或不可执行的,不影响其他条款的效力。
我们对本协议享有最终解释权,并在法律允许的范围内保留随时修改的权利。修改后的协议一经公布即生效,继续使用服务即视为同意修订内容。