GraphRag解决了什么问题
在朴素的RAG(自我检索生成模型)中,我们使用一个向量库作为我们的知识库。当用户提出查询时,该系统从向量库中匹配顶部K个元素作为上下文,并将这个上下文与提示和查询一起交给大型语言模型(LLM)进行回答。
)
现在,让我们假设这个向量库是指向企业知识的。有两个示例查询:
- xx产品的价格是多少?
- 去年技术团队的成果有哪些?
对于第一个问题,由于它是非常具体的,知识库的搜索可能会找到相应的信息块或常见问题解答。对于这种类型的问题,朴素的RAG通常会表现得很好。
对于第二个问题,这是一个宏观层面的查询,需要将企业知识库中所有与技术团队相关的项目收集起来并进行总结。关键在于找到与技术团队成果相关的各类信息,然后以某种方式关联起来以得出答案。这种方法也被称为 “connecting the dots”。
在这里,“dots”指的是分散在不同地方的关键信息。那么,朴素RAG能否有效解决这类问题?虽然我们可以强制使用朴素RAG来寻找答案,但其效果很可能不会十分理想。
对于这类问题,我们的一种解决策略是预先整理信息。例如,我们首先抽取与技术团队相关的所有信息。当我们提出相关问题时,可以基于这些已经抽取的信息进一步进行总结。这个过程实际上就是构建知识图谱的过程。
举个例子,假设我们有大量文本,其中包含了技术团队执行的各种项目的信息。在我们构建的知识图谱中,我们有多个节点,代表技术团队和项目,并通过关系将它们连接起来。这样,当我们想了解他们完成了哪些工作时,只需关注与这些节点相关的部分,便可获悉技术团队已完成的任务。
这个构建知识图谱的过程通常可以用大型模型来完成,这也是GraphRAG模型提出的一个重要思想:预先提取并整理好信息,然后基于这些整理后的信息进行回答。
进一步来说,对于第二个问题,相关的提问方式有很多。例如:
- 张三的成果有哪些?我们可以找到与张三关联的节点,了解他相关的项目信息。
- 张三所在的后端团队的工作成果是什么?我们需要整合这个团队所有人员的工作成果。
- 进一步上升层次,整个技术团队的成果是什么?类似地,我们需要将各个技术团队的成果集中起来。
这里呈现的是一个层次结构,因此在GraphRAG模型中,做了进一步的操作: 创建这种层次结构。我们预先整理出相关的关键信息,这样的层次结构是基于知识图谱获取的。因此,我们对这个知识图进行了类似的聚类,然后将这些实体的信息合并在一起,再对这些合并后的信息进行整理。从知识图谱到这里,GraphRAG采用了一些社区挖掘算法,这是GraphRAG的第二个重要思想。
那么,这套方法能否在商业环境中实施呢?我认为目前来说更像是一个原型。
- 首先,构建知识图谱的过程会产生大量噪声,这需要大量的人工清洗和校正,成本高昂。
- 其次,在计算方面,聚类过程消耗资源较大。
- 再者,新数据的加入也是问题。当有关键信息加入时,我们可能需要从头开始重建整个结构,这会产生大量的计算。这在知识图谱领域实际上是一个比较难解决的问题。
尽管如此,GraphRag作为一个新的RAG流程还是有必要学习一下的。
GraphRAG入门
环境配置
名称 | 安装 | 目的 |
---|---|---|
Python 3.10 | 下载(opens in a new tab) | 该库基于 Python 开发。 |
Poetry | 使用说明(opens in a new tab) | Poetry 用于 Python 代码库的包管理和虚拟环境管理。 |
下载源码,安装依赖
git clone https://github.com/microsoft/graphrag.git
cd graphrag
poetry 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 https://www.gutenberg.org/cache/epub/24022/pg24022.txt > ./ragtest/input/book.txt
在当前目录准备初始化:
poetry run poe index --init --root ./ragtest
它会在当前目录创建output、prompts目录,以及.env文件和settings.yaml配置文件。
- output目录,存储生成的图、以及总结、日志等信息。
- prompts目录,存储默认的4个提示词文件:claim_extraction.txt、community_report.txt、entity_extraction.txt、summarize_descriptions.txt。
- .env文件中只包含一个GRAPHRAG_API_KEY,用于设置你的LLM API_KEY。
- settings.yaml 文件较为复杂,配置项目也较多,运行本项目只需要修改两个llm和embeddings,我这里直接使用OpenAI, 没错,就是这么土豪!
接着我们执行一条命令会自动索引数据,构建知识图谱,只是过程比较慢,耐心等待即可:
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到底耗费在哪,其内部运行的流程又是怎么样的呢?带着这些问题,接下来我会用两篇图文并茂的文章详细介绍一下:
- GraphRAG如何构造知识图谱
- 全局检索和局部检索的流程
如何学习AI大模型?
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;
第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;
第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;
第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;
第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;
第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;
第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。
👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;
• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;
• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;
• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。
1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集
👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓