AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


最近爆火的GraphRAG是什么,真的能用于商业应用吗?
发布日期:2024-09-07 13:39:05 浏览次数: 1605


GraphRag解决了什么问题

在朴素的RAG(自我检索生成模型)中,我们使用一个向量库作为我们的知识库。当用户提出查询时,该系统从向量库中匹配顶部K个元素作为上下文,并将这个上下文与提示和查询一起交给大型语言模型(LLM)进行回答。

现在,让我们假设这个向量库是指向企业知识的。有两个示例查询:

  1. xx产品的价格是多少?
  2. 去年技术团队的成果有哪些?

对于第一个问题,由于它是非常具体的,知识库的搜索可能会找到相应的信息块或常见问题解答。对于这种类型的问题,朴素的RAG通常会表现得很好。

对于第二个问题,这是一个宏观层面的查询,需要将企业知识库中所有与技术团队相关的项目收集起来并进行总结。关键在于找到与技术团队成果相关的各类信息,然后以某种方式关联起来以得出答案。这种方法也被称为 "connecting the dots"。你可以参考这篇文章了解更多:https://blog.curiosity.ai/️-connecting-the-dots-how-to-improve-rag-with-knowledge-graphs-092c32024326

在这里,“dots”指的是分散在不同地方的关键信息。那么,朴素RAG能否有效解决这类问题?虽然我们可以强制使用朴素RAG来寻找答案,但其效果很可能不会十分理想。

对于这类问题,我们的一种解决策略是预先整理信息。例如,我们首先抽取与技术团队相关的所有信息。当我们提出相关问题时,可以基于这些已经抽取的信息进一步进行总结。这个过程实际上就是构建知识图谱的过程。

举个例子,假设我们有大量文本,其中包含了技术团队执行的各种项目的信息。在我们构建的知识图谱中,我们有多个节点,代表技术团队和项目,并通过关系将它们连接起来。这样,当我们想了解他们完成了哪些工作时,只需关注与这些节点相关的部分,便可获悉技术团队已完成的任务。

这个构建知识图谱的过程通常可以用大型模型来完成,这也是GraphRAG模型提出的一个重要思想:预先提取并整理好信息,然后基于这些整理后的信息进行回答。

进一步来说,对于第二个问题,相关的提问方式有很多。例如:

  • 张三的成果有哪些?我们可以找到与张三关联的节点,了解他相关的项目信息。
  • 张三所在的后端团队的工作成果是什么?我们需要整合这个团队所有人员的工作成果。
  • 进一步上升层次,整个技术团队的成果是什么?类似地,我们需要将各个技术团队的成果集中起来。

这里呈现的是一个层次结构,因此在GraphRAG模型中,做了进一步的操作: 创建这种层次结构。我们预先整理出相关的关键信息,这样的层次结构是基于知识图谱获取的。因此,我们对这个知识图进行了类似的聚类,然后将这些实体的信息合并在一起,再对这些合并后的信息进行整理。从知识图谱到这里,GraphRAG采用了一些社区挖掘算法,这是GraphRAG的第二个重要思想。

那么,这套方法能否在商业环境中实施呢?我认为目前来说更像是一个原型。

  1. 首先,构建知识图谱的过程会产生大量噪声,这需要大量的人工清洗和校正,成本高昂。
  2. 其次,在计算方面,聚类过程消耗资源较大。
  3. 再者,新数据的加入也是问题。当有关键信息加入时,我们可能需要从头开始重建整个结构,这会产生大量的计算。这在知识图谱领域实际上是一个比较难解决的问题。

尽管如此,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的查询分为两种类型:

  1. 全局检索:可以简单理解为 用于回答需要聚合信息的问题
  2. 本地检索/局部检索:可以简单理解为 用于回答特定实体的问题

全局查询

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从一个孤独、间的联系、同情和理解的重要性。



53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询