GraphRAG
Key Takeaway
- 传统RAG在处理复杂查询时存在局限性,无法有效捕捉实体关系和层次结构。
- Second Me项目通过混合记忆架构(结合RAG、GraphRAG和本地模型微调)来解决传统知识库的局限,旨在打造一个能模仿用户风格、语气和关注议题的“第二个我”。
- 混合记忆架构包含三个层级:L0(快速检索层,RAG)、L1(记忆深度处理与结构化层,GraphRAG)和L2(模型个性化微调层)。
- Second Me的部署和训练过程包括自我介绍、上传资料、输入API Key和选择Base Model,核心在于五个步骤的训练。
- 该项目能够实现个人知识库与大语言模型能力的结合,提供更先进的AI交互体验,并具有将个人分身发布到网络供他人调用的想象空间。
Full Content
每一个搭建AI知识库的人,都有一个终极梦想:
把自己手头的所有资料,甚至毕生所学,全都教给AI。这样一来,我们知道的,它都知道。而且,它还有我们不具备的超强计算能力。
简单来说就是:第二个我。
用RAG做不到这一点。过去一年,我出过好多期关于RAG的视频。但是,当我了解得越深、用得越多之后,我越来越明白RAG在技术上的局限性。
你想嘛,无论你用什么样的策略,最终召回的还是那些被切碎的、独立的文本块,这一点不会改变。
要实现刚才说的“第二个我”的终极目标,今天的RAG还太初级。但是我知道,肯定有人在研究、在开发。
Second Me就是截至目前最让我欣喜、最让我看到希望的项目。
它采用混合记忆架构,有点类似于咱们人类大脑的短期记忆和长期记忆。
为了实现这个架构,Second Me把RAG、GraphRAG都用上了,去深度处理用户提供的文档。最后,基于这些处理过的数据,它还在本地微调一个模型。
也就是说,这个项目其实已经脱离了知识库的范畴。因为最后我们进行交互的,是一个完全根据你的风格、语气、表达方式,以及最关心的议题所定制出来的模型,再搭配上结构化处理的知识库。
这样一套解决方案,比我们现在在用的AI知识库,显然先进得多。
哈喽大家好,欢迎来到我的频道。谦虚地说啊,我是国内少数几个能把关于AI的Why和How讲明白的博主。我提供的东西比教程更值钱。记得点一波关注。如果想链接我,就来newtype社群。已经有超过1000位小伙伴付费加入啦!
回到今天的主题:Second Me。
这个项目其实是社群里的小伙伴发现的。当时他在星球问我,怎么本地部署。我试了一下,完全没问题啊,一路上没遇到任何报错。
就像GitHub上说的那样,你先把Python和Xcode命令行工具安装好,这是必须的。
然后把整个仓库下载下来。我当时没用这行命令,而是直接下载压缩包。
再然后,用cd命令进入项目文件夹,运行make setup。它会自动安装需要的一切。你就啥也别管,等着好了。
等全部安装完成,用make start命令启动项目,然后打开一个本地链接,就可以开始训练了。这个环节也很简单,就做三件事:
第一,做个自我介绍。因为,你给的资料,最终一定要跟你的身份属性相结合,才能描绘出一个生动的你。不然就只是一堆“死”的数据。
第二,上传资料。你可以直接贴文字进去,也可以上传文档。我是直接把我视频脚本的文件夹拖进去了。
第三,输入OpenAI的API Key,以及根据你机子的性能,选择一个Base Model。
这边我需要说一下。我的机子是M4 Pro芯片,48G统一内存。平时跑7B的模型完全没压力,所以就选了7B。结果到最后的微调环节,内存压力还是有点大的。我不得不把处理项目以外的软件全都关了,才顺利完成。至于OpenAI的API,花不了多少钱。你看,我这边快100个文档,花了3美金。因为它用的是GPT-4o mini,白菜价。
当你把这三步都设置完毕,就可以正式开始训练了。Second Me的核心,就在这五个步骤的训练中。
第一步,它需要下载Base Model,用的是Qwen2.5。最后的微调就是基于这个模型进行的。
第二步,处理用户上传的资料。这边用到了RAG技术,也就是把所有文档切成更小的文本块,然后把文本块转换成向量表示,最终完成基础数据的准备、索引的创建。
第三步,提取更深层次的结构化信息。这应该就是GraphRAG技术。因为通过第二步的处理,我们得到了一大堆文本块,它们都是独立存在的,是散的。但是,如果你站在整篇文章的角度来看,文本块之间,或者说上下文之间,应该是有逻辑关系的。由于RAG技术的局限性,这种逻辑关系丢失了。
所以需要GraphRAG,把人名、地名、概念等等实体,以及实体之间的关系,全部识别、提取出来,形成一个关于你这个人、关于你的知识体系的图谱。
第四步,准备用于微调的数据集。光有用户上传的资料还不足以进行微调。因为这些资料当中,哪些数据需要增强,还得依靠前两步的处理才能知道。比如,跟用户身份特征有关的数据显然需要强化。
第五步,正式开始微调。这一步最吃性能,也最花时间。我从下午等到晚上才搞定。
这五个步骤,其实就是在实现所谓的“混合记忆”架构。这个架构包含L0、L1和L2三个层级。
第二步的RAG,对应的是L0,也就是“快速检索层”。它是一种简单、快速的记忆检索机制。你可以把它看成是人类大脑的短期记忆。
第三步的GraphRAG,对应的是L1,也就是“记忆深度处理与结构化层”。它的目标是深入理解记忆内容,提取结构化信息。你可以把它看成是人类大脑的长期记忆。
第一步、第四步和第五步,对应的是L2,也就是“模型个性化微调层”。它的产物,就是那个经过个性化训练、能够模仿用户,并且利用知识库的Second Me模型。
这一大套的东西,都是为了让三个层级共同协作,实现了一个把用户个人记忆,或者说个人知识库,与大语言模型能力相结合的“混合记忆”系统。
至于怎么使用,很简单:点击“Start Device”,这个项目会通过llama.cpp加载训练好的模型,然后咱们正常对话就好。
因为资料都是我自己写的视频脚本,所以我再清楚不过了。我用下来的感受是,它不像RAG那么机械,没有那种复读机的生硬感。它似乎跟我一样了解所有的内容。这个就是“混合记忆”带来的体验。
说实话,一年前,我跟VC的小伙伴喝茶的时候还讨论过,可以参考人类记忆的特性去打造个人AI分身。现在看到有人实现了,我是真的很高兴。
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社群,我都在。那咱们下期见!