微信扫码
添加专属顾问
我要投稿
从Native RAG到Graph RAG,解锁知识库搭建新姿势,解决复杂场景检索难题。 核心内容: 1. Native RAG的局限性及Graph RAG的优势对比 2. Graph RAG的核心原理:实体关系建模与存储机制 3. 实战案例解析:电影知识图谱的构建与应用
之前咱们已经系统介绍了Native RAG的基本原理和使用。大家已经可以借助各种平台搭建属于自己的知识库了。
Native RAG的好处是上手比较容易,但缺点就是上限不高,无法建立块跟块之间的联系,检索效果往往只能达到6-70分的水平,根本不敢上生产。
那么今天咱们就开个新坑来聊聊Graph RAG,看看它是怎么解决复杂知识场景的。
咱们先来简单复习一下Native RAG
Native RAG会有两个大的链路,入库
和检索
数据清洗
、数据分块
、向量化
等。检索优化
、多路召回
、结果重排
、生成优化
等。不太了解的小伙伴也建议回去补补课:
Native RAG从理论到实践系列
GraphRAG 是一种结构化的、分层的检索增强生成(RAG)方法。
在知识库构建的时候,会把你的知识转化成Graph结构,并存储进Graph数据库中。
Graph数据库一般不会直接存储数据片段,而是会存储数据实体(Entity)
,并且会建立实体和实体之间的数据关系(Relationship)
,这也是Graph RAG最重要的一个环节。
举个例子:
# 原文
电影雪季过客上映于2006年。这是一部剧情/爱情电影,豆瓣评分8.3分,2006年上映以来好评如潮。导演马克·埃文斯 ,主演艾伦·瑞克曼和埃米丽·汉普希尔。
# 实体一般都是有意义的名词,如:人名、地名、物品名等。
# 所以我们能够得到的实体是
雪季过客,2006年,剧情电影,爱情电影,豆瓣8.3分
马克·埃文斯,艾伦·瑞克曼,埃米丽·汉普希尔
# 实体关系用来描述两个实体之间的关联,一般都是动词
# 我们能得到的实体关系如下:
上映,分类,评分,导演,主演
# 最终我们得到一组实体&实体关系
Trunk1:
(雪季过客)-[上映]->(2006年)
Trunk2:
(雪季过客)-[类型]->(剧情)
(雪季过客)-[类型]->(爱情)
(雪季过客)-[豆瓣评分]->(8.3分)
Trunk3:
(雪季过客)-[导演]->(马克埃文斯)
(雪季过客)-[主演]->(艾伦瑞克曼)
(雪季过客)-[主演]->(艾米丽汉普希尔
数据存储到Graph数据库的样子如下:
那么在检索的时候,我们就能很轻松的顺着实体关系探索相关知识。
现在我有一批电影的数据,大概几万部电影
每一部电影的数据长这样:
使用Native RAG进行分块、向量化之后,我们可以很轻松的召回电影的数据。
# 例子1
Q:雪季过客啥时候上映的?
A:2006年
# 例子2
Q:雪季过客导演是谁?
A:马克·埃文斯,同时他也担任本片的编剧。
由于我们把每一步影片的基本信息当做一个Chunk存储在向量库中,那么我们很容易能够回答有关这部电影的所有问题。
但是,如果问题变成:
# 例子1
Q:雪季过客的导演还出品过哪些影片?
# 例子2
Q:今年一共上映了有多少部日本电影?
由于知识库里面,并没有这样的数据,所以检索的效果就不会太好,或者说需要在工程上做很多的补偿才能够勉强达到效果。
但是使用Graph RAG就能够很轻松的查询相关数据。
Graph RAG的实现机制会比Native RAG复杂很多。但是总体来说也是两个大的模块,数据构建
和数据检索
。
数据构建主要会经过如下的几个步骤:
详细的流程见下图:
数据检索其实有非常多的策略,需要根据不同的情况进行调整,咱们后续的文章也会详细介绍。
这里介绍两种:
全局搜索Global Search):
检索社区摘要信息并返回。本地搜索(Local Search):
检索实体信息,并通过实体关系扩大搜索面积。大致的原理如下图:
了解了基本原理后,咱们就来实际上手体验一下。使用Coze工作流搭建一个简单的GraphRAG。
首先咱们要选择一款Graph数据库,这里咱们使用Neo4j。
https://console.neo4j.io/
支持本地部署和在线使用两种方式,咱们可以先使用他的免费体验版。
创建实例之后,点击Query就可以连接到咱们的数据库了,右侧可以编写Cypher查询语句操作数据库。
注意创建实例的时候会生成数据库的账号和密码,要妥善保管,后续会需要用到。
咱们简单知道Cypher语句,类似SQL就好了,可以操作数据库进行增删改查。
这里放几个最简单的例子,感兴趣的可以自己去看官方文档。
# 创建一个实体"电影",名字叫拯救大兵瑞恩
CREATE(m:电影{name:"拯救大兵瑞恩"})
# 创建另一个实体"人员",名字叫汤姆汉克斯
CREATE(p:人员{name:"汤姆汉克斯"})
# 创建一个关系,拯救大兵的主演是汤姆汉克斯
CREATE(m)-[:主演]->(p)
# 找到所有的电影和他们的主演,并返回
MATCH(m:电影)-[:主演]-(p:人员)
RETURN m.name, p.name
把上面的查询语句复制到查询框中就可以体验GraphRAG了
完成之后的基本功能示例:
# 示例1
紫日的导演还出出品过什么其他电影?
# 示例2
有哪些日语电影?
# 示例3
紫日的基本介绍?
为了方便演示和大家理解,这里不引入向量数据库,直接构建查询语句操作图数据库。
首先使用一个循环处理多条数据:
其实工作流非常简单,核心是如何提取实体,这里的提示词需要根据不同的业务、数据场景进行调整。
# 角色
实体提取大师
# 任务
1. 根据输入的数据,尽可能全面的提取实体和实体关系,并建立实体和实体之间的关联。
2. 实体必须从[实体列表]中选取,不得创造实体。
3. 实体关系必须从[实体关系列表]中选取,不得创造实体关系。
4. 实体具备属性,参考[实体属性表],不得创造实体属性。
4. 不要解释,不要额外输出其他内容,严格按照输出的要求进行。
5. 最终转换成Cypher格式,方便我直接插入到neo4j数据库中。
# 实体列表
[影片, 语种...]
# 实体关系
[分类,语言...]
# 实体列表和实体关系的映射
(影片)-[上映时间]->(年份)
...
# 实体属性表
(影片{name:"String", intro:"String"})
...
# 输出示例
MERGE(m:影片{name:"拯救大兵",intro:"故事发生在..."})
MERGE(l:语种{name:"英语"})
MERGE(m)-[n:语言]-[l]
...
咱们使用http模块直接调用即可:
# $id 是你的数据库实例ID,在neo4j实例页面可以看到
# $key 是你的账号密码base64
# $query 你的实际查询query
# 在命令行中使用这个命令生成$key:echo -n "你的账号:你的密码" | base64
# 账号密码创建neo4j实例的时候有保存。
curl -X POST "https://$id.databases.neo4j.io/db/neo4j/query/v2" \
-H "Authorization: Basic $key" \
-H "Content-Type: application/json" \
-d '{
"statement": "$query",
"parameters": {}
}'
# 角色
neo4j数据检索助手
# 任务
1. 理解用户的问题,并把用户的问题转化成Cypher查询语句。
2. 从图数据库中尽可能全面的查询和用户问题相关的内容。
3. 不需要回答用户的问题,也不需要解释。
4. 只需要输出Cypher的查询语句,方便我后续直接调用neo4j数据库。
5. 可用的实体列表、实体关系、映射关系见下图。
6. 不要自己创造实体、实体关系和映射关系。
# 实体列表
[影片...]
# 实体关系
[分类...]
# 实体列表和实体关系的映射
(影片)-[上映时间]->(年份)
...
# 实体属性表
(影片{name:"String", intro:"String"})
...
# 输出示例
Q: 找到1994年安东尼导演的作品。
MATCH(m:影片)-[:上映时间]->(n:年份{name:1994}) WITH m MATCH(m)-[:导演]->(p:人员{name:"安东尼"}) RETURN p.name as name
由于样例数据不多,所以检索的结果不代表真实情况哈,如果想要获得很好的检索效果,需要导入全量的电影数据。
# 示例1
Q: 有哪些日本电影?
A: 有以下日本电影:《驾驶我的车》《世界奇妙物语 06秋之特别篇》《何时是读书天》《隐剑鬼爪》《哆啦A梦:大雄与风之使者》《宛如阿修罗》《星之声》《精灵宝可梦:水都的守护神 拉帝亚斯与拉帝欧斯》《GO!大暴走》《哆啦A梦:大雄与翼之勇者》《心动》《不夜城》《海上花》《烟花》。
# 示例2
Q:谁出演过两部以上的电影作品?
A:金城武出演过两部以上的电影作品。
# 示例3
Q:金城武都演了啥电影?
A:金城武出演的电影有《心动》《不夜城》。
今天我们大概了解了Graph RAG的基本工作原理和能力边界,并且上手体验了一把Graph RAG。
目前的案例还比较简单,随着项目的深入,我们也会不断演进和迭代工作流。
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业
2025-07-16
2025-06-02
2025-06-17
2025-06-02
2025-06-13
2025-06-17
2025-06-15
2025-07-27
2025-07-15
2025-07-14