GraphRag解决了什么问题
在朴素的RAG(自我检索生成模型)中,我们使用一个向量库作为我们的知识库。当用户提出查询时,该系统从向量库中匹配顶部K个元素作为上下文,并将这个上下文与提示和查询一起交给大型语言模型(LLM)进行回答。
现在,让我们假设这个向量库是指向企业知识的。有两个示例查询:
对于第一个问题,由于它是非常具体的,知识库的搜索可能会找到相应的信息块或常见问题解答。对于这种类型的问题,朴素的RAG通常会表现得很好。
对于第二个问题,这是一个宏观层面的查询,需要将企业知识库中所有与技术团队相关的项目收集起来并进行总结。关键在于找到与技术团队成果相关的各类信息,然后以某种方式关联起来以得出答案。这种方法也被称为 "connecting the dots"。你可以参考这篇文章了解更多:️-connecting-the-dots-how-to-improve-rag-with-knowledge-graphs-092c32024326
在这里,“dots”指的是分散在不同地方的关键信息。那么,朴素RAG能否有效解决这类问题?虽然我们可以强制使用朴素RAG来寻找答案,但其效果很可能不会十分理想。
对于这类问题,我们的一种解决策略是预先整理信息。例如,我们首先抽取与技术团队相关的所有信息。当我们提出相关问题时,可以基于这些已经抽取的信息进一步进行总结。这个过程实际上就是构建知识图谱的过程。
举个例子,假设我们有大量文本,其中包含了技术团队执行的各种项目的信息。在我们构建的知识图谱中,我们有多个节点,代表技术团队和项目,并通过关系将它们连接起来。这样,当我们想了解他们完成了哪些工作时,只需关注与这些节点相关的部分,便可获悉技术团队已完成的任务。
这个构建知识图谱的过程通常可以用大型模型来完成,这也是GraphRAG模型提出的一个重要思想:预先提取并整理好信息,然后基于这些整理后的信息进行回答。
进一步来说,对于第二个问题,相关的提问方式有很多。例如:
这里呈现的是一个层次结构,因此在GraphRAG模型中,做了进一步的操作: 创建这种层次结构。我们预先整理出相关的关键信息,这样的层次结构是基于知识图谱获取的。因此,我们对这个知识图进行了类似的聚类,然后将这些实体的信息合并在一起,再对这些合并后的信息进行整理。从知识图谱到这里,GraphRAG采用了一些社区挖掘算法,这是GraphRAG的第二个重要思想。
那么,这套方法能否在商业环境中实施呢?我认为目前来说更像是一个原型。
尽管如此,GraphRag作为一个新的RAG流程还是有必要学习一下的。
GraphRAG入门
环境配置
名称 |
安装 |
目的 |
Python 3.10 |
下载(opens in a new tab) |
该库基于 Python 开发。 |
使用说明(opens in a new tab) |
Poetry 用于 Python 代码库的包管理和虚拟环境管理。 |
下载源码,安装依赖
git clonegraphragpoetry install
如果你本地poetry install比较慢,可以在项目的pyproject.toml文件末尾添加:
[[tool.poetry.source]]name = "aliyun"url = "https://mirrors.aliyun.com/pypi/simple/"
并执行poetry lock重新生成poetry.lock, 再执行poetry install即可
对数据建索引
首先让我们准备一个示例数据集:
mkdir -p ./ragtest/input
curl> ./ragtest/input/book.txt
在当前目录准备初始化:
poetry run poe index --init --root ./ragtest
它会在当前目录创建output、prompts目录,以及.env文件和settings.yaml配置文件。
接着我们执行一条命令会自动索引数据,构建知识图谱,只是过程比较慢,耐心等待即可:
poetry run poe index --root ./ragtest
查询
GraphRag的查询分为两种类型:
全局查询
poetry run poe query --root ./ragtest --method global '这个故事的主题是什么?'
输出结果如下:
SUCCESS: Global Search Response: ### 故事主题概述本故事的核心主题围绕着**转变与救赎**,通过Ebenezer Scrooge从吝啬鬼到慷慨大方的典范的转变,展现了个人改变的可能性和重要性。Scroogts (12, 15, 16, 20)]。### 人物互动与社会关系故事通过Scrooge与Cratchit家庭以及各种鬼魂的互动,强调了慈悲、善良以及个人改变的重要性。这些互动不仅展示了个人改变的可能性,还突出, 16, 18, 20)]。### 社会影响与个人行为Scrooge的旅程揭示了个体通过善行和慷慨对社区产生的积极影响。故事探讨了希望、韧性和圣诞精神的主题,通过Tiny Tim和Cratchit家庭的形象,展示了即使在困难中也能体现出圣诞精神的典范 [Data: Reports (16, 18)]。### 超自然引导与反思故事还探讨了超自然向导在促使反思和改变中的作用,通过圣诞节过去、现在和未来的鬼魂的访问,促使Scrooge反思自己的生活和行为。此外,故警告来体现 [Data: Reports (12, 21)]。### 社会正义与家庭社区的重要性最后,故事还深入讨论了社会不公和家庭及社区的重要性。Scrooge与Bob Cratchit和Tiny Tim的互动,不仅揭示了社会不公的主题,也强调了家庭和社区在个人生活中的价值 [Data: Reports (12)]。综上所述,本故事通过Scrooge的转变之旅,探讨了救赎、慈悲、社会责任和个人改变的重要性,以及这些主题如何在个人、家庭和更广泛社区中产生深远影响。
局部检索
poetry run poe query --root ./ragtest --method local 'Scrooge 这个故事的主人公是谁,他的主要关系是什么?'
输出结果如下:
SUCCESS: Local Search Response: # 主人公与主要关系## 主人公简介故事的主人公是Ebenezer Scrooge,他是《A Christmas Carol》中的中心人物。Scrooge最初被描绘为一个贪婪、吝啬的老人,对圣诞节和周围人的苦难漠不关心。他的性格和态度通 (18, 23)]。## 主要关系### 与Bob Cratchit的关系Bob Cratchit是Scrooge的职员,一个收入微薄但心地善良的人。Scrooge最初对Cratchit的待遇冷酷无情,但在故事的结尾,Scrooge提高了Cratchit的工资,并成为了他家庭的恩人 [Data: Relationships (14); Entities (9, 28)]。### 与Jacob Marley的关系Jacob Marley是Scrooge已故的商业伙伴,他的鬼魂在圣诞夜访问Scrooge,警告他改变自己的生活方式,以免死后遭受同样的命运。Marley的访问为Scrooge的转变开启了序幕 [Data: Relationships (63, 41); Entities (50, 44)]。### 与三个圣诞鬼魂的关系三个圣诞鬼魂(圣诞节的过去、现在和未来)分别访问Scrooge,展示了他的过去、现在和可能的未来。这些访问深刻影响了Scrooge,促使他反思自己的生活并最终改变了他的行为和态度 [Data: Relationships (72, 86); Entities (47)]。### 与Tiny Tim的关系Tiny Tim是Bob Cratchit的儿子,他的健康状况和幸福成为Scrooge改变的一个重要动力。Scrooge从一个冷漠的旁观者变成了Tiny Tim的守护者和家庭的支持者 [Data: Relationships (86)]。### 与侄子Fred的关系Scrooge的侄子Fred代表了圣诞节的精神和乐观态度,尽管Scrooge最初拒绝了Fred的圣诞邀请,但最终他接受了Fred的善意,并与他和其他家庭成员建立了积极的关系 [Data: Entitiationships (52)]。## 结论Ebenezer Scrooge的故事是一个关于救赎和转变的经典故事。通过与Bob Cratchit、Jacob Marley、三个圣诞鬼魂、Tiny Tim和他的侄子Fred等关键角色的互动,Scrooge从一个孤独、间的联系、同情和理解的重要性。
总结
本文首先介绍了GraphRAG相比传统的朴素RAG的优势以及其在商业落地上的局限性,然后讲解了GraphRAG的基本使用,在实际操作过程中发现还是比较耗费token的,那token到底耗费在哪,其内部运行的流程又是怎么样的呢?带着这些问题,接下来我会用两篇图文并茂的文章详细介绍一下:
原文链接: