知识图谱

GraphRAG:很好,但很贵!

Key Takeaway

  • GraphRAG是微软开源的结合知识图谱的检索增强生成技术,旨在提升AI知识库的精确度,解决传统RAG无法捕捉实体复杂关系和层次结构的局限。
  • GraphRAG通过提取实体及其关系,构建庞大的知识图谱,从而实现“全局性”优势。
  • 部署GraphRAG需要安装相关库、创建目录、存入文档、初始化项目、配置API Key和模型参数,并创建索引。
  • GraphRAG在处理复杂查询时表现出色,但目前使用GPT-4的成本较高,且本地大模型运行存在速度慢和报错问题。
  • 微软开源GraphRAG旨在借助社区力量优化其速度和成本,以实现更广泛的应用。

Full Content

微软最近开源了GraphRAG。这是一项结合了知识图谱的检索增强生成技术。简单来说就是,它可以显著提升AI知识库的性能,让AI能根据你提出的文档,更准确地回答你提出的复杂问题。

本期视频,咱们来聊一下,为什么需要GraphRAG,以及现阶段需要付出多少代价。真的,这成本高得吓人。

关于AI知识库,在我们社群里,经常有小伙伴抱怨:精确度不够,AI总答不到点上。这个问题的根源之一,是传统RAG的局限性。

当我们用这套技术搭建知识库的时候,整个索引、检索是基于文本块的。简单来说就是,我们把一个大文档切碎了,变成一个个比较小的文本块;当有请求过来的时候,就根据请求去寻找哪些文本块是最相关、最匹配的;最后,把找到的文本块作为参考资料,连同请求一起给到大模型。

这套技术有两个局限:

第一,它没法有效捕捉实体之间的复杂关系和层次结构。

第二,它通常只能检索固定数量的、最相关的文本块。

这两点一结合,也就导致了传统RAG在面对复杂查询的时候特别吃力。比如,你给它一本小说,问它“这本书的主旨是什么”,那十有八九是给不出靠谱答案的。

为了补上传统RAG的短板,微软推出并且开源了GraphRAG。

就像我前几天在newtype社群里说的,这个技术的核心就一个关键词:全局性。

GraphRAG在对数据集建立索引的时候,会做两件事:

第一,提取实体(Entity)。

第二,提取实体之间的关系(Relationship)。

从视觉上看,这些实体就是一个个点;而有关联的两个实体用线连起来。于是,一张庞大的知识图谱就形成了——这就是它名字里Graph的来源,也是这套技术的聪明之处。

因为,要表达复杂关系,一个非常有效的手段就是,用图谱的方式来处理。大家可以回想一下之前看到的侦探片、警匪片,是不是经常会看到一整面墙的线索板。这其实就是用最直观的图谱方式来表示复杂关系,跟咱们今天聊的主题是一个意思。

因为采用知识图谱,所以GraphRAG能够把握复杂的、细微的数据关系,所以它才能构建一种全局性的优势,从而提升RAG的精确度。

OK,Why讲完了,咱们来说说How,也就是如何使用。

我建议大家都按照官方给的新手教学跑一遍。其实就几行命令,我在Mac上很顺利,没遇到任何报错。

第一步,pip install graphrag,这是就不用说了,很常规。要下载的东西挺多的,大家耐心等等。

第二步,创建目录,名字叫ragtest,并且在这个目录下边创建文件夹,名字叫input。

第三步,在文件夹中存入文档。官方给的Sample文档是查尔斯·狄更斯的《圣诞颂歌》。下载好之后,放到刚才创建好的input文件夹里,并且命名为book.txt。

第四步,初始化整个项目。这时我们会看到多了几个文件。其中最重要的文件是这两个:

一个是.env文件,在里边填入OpenAI的API Key。

另一个是settings.yaml,用来设置encoding和embedding所需要的模型和各种参数。你如果要用本地大模型的话,就在这边设置,我待会儿会演示。

第五步,一切准备妥当之后,就可以创建索引了。这个过程会比较慢,我等了好几分钟。

第六步,可以正式进行问答了。就像前边说的,GraphRAG的强项在于“全局性”。所以作为测试,问题自然是“这个故事的主旨是什么”。

当请求提出之后,我们会看到,GraphRAG根据settings这个文件里的配置要求,比如使用什么模型、最大token多少,开始处理请求和输出。

最终结果挺不错的。要知道,这是一部将近200页的小说。如果不是通过构建全局知识图谱的方式,是搞不定这样的问题的。

但是,一切都是有成本的。就这么一本小说,使用GPT-4创建索引、进行一次问答,居然花了我11美元!

之所以会这么贵是因为,为了搞定这个文档,GraphRAG发起了449次API Request去调用GPT-4。相比之下,嵌入模型才19次。

这个价格真的高得离谱了。即便它降到1美元也还是贵——我传个稍微大一点的文档,一杯瑞幸就没了。

所以,大家关心的问题就来了:如果改用本地大模型会怎么样?

在设置方面完全没问题。比如,我在PC上用LM Studio同时运行Llama 3和nomic embed。在settings文件里,把API Key改成lm-studio——其实用不上,就是满足一下格式需要;把API Base改成localhost:1234/v1(如果是Ollama的话,就是11434);最后把模型名字填上就行。下面的嵌入模型也是这么填。

保存之后,按同样的流程走一遍。这时候,我遇到了两个问题:

第一,提取实体的过程非常漫长。我等了得有20分钟。而之前用OpenAI的模型,几分钟就完事儿了。这个时间上的差别应该是模型性能上的差别造成的。毕竟体量摆在那里,我在本地跑的Llama 3才8B,跟GPT-4差太多了。

第二,好不容易提取完毕,到了嵌入环节的时候,总是报错,根本推进不下去。我试过把嵌入模型换回OpenAI的,还是不行,最多嵌入到70%多又报错。我搞了一晚上,实在没功夫一直耗下去,只能放弃。

其实即使不报错,一个大文档要处理半个多小时,在实际使用过程中也是不能接受的。

我猜这就是微软开源GraphRAG的原因,想要依靠社群的力量去优化它。毕竟现在这个速度和成本,生成的答案效果再好也是亏本的。

OK,以上就是本期内容。大家想找我交流的话,就来newtype社群,我都在。那咱们下期见!