GraphRAG + GPT-4o mini 低成本构建 AI 图谱知识库教程
背景与限制
检索增强生成(Retrieval-Augmented Generation, RAG)的工作原理是将大型文档分割成多个小段落或片段。主要原因是大语言模型的上下文窗口长度有限,无法一次处理超过上下文窗口长度的信息。
当提出问题时,RAG 技术先从这些片段中检索相关信息,根据提问内容与片段的相似度找出若干个相关片段,组合成上下文,连同提问一起输入到大语言模型中,期待获得更为精准的回答。
然而,对于足够长的文档和非常复杂的问题,单靠这几个疑似相关的片段可能不够。真正的答案也许根本就不在里面。私有知识库提供的回答结果与通过数据微调模型获得的结果往往差异很大,微调后的模型能够依据私有数据回答非常复杂的问题,而 RAG 这种简单粗暴的拼接方式,很多时候得到的答案并不理想。
图谱技术引入
这些问题催生了 GraphRAG。GraphRAG 是一种创新的技术,它结合了知识图谱结构和 RAG 方法,旨在解决传统 RAG 方法的局限性。这是微软研发的一个创新产品,代表了 RAG 技术的最新进展,微软还发布了相关的学术论文,详细阐述了 GraphRAG 的理论基础和技术实现。
这里的'Graph(图)'代表知识的结构化表示。在这个图谱中,每个节点可能代表一个概念或实体,而连接这些节点的边则表示它们之间的关系。例如,节点「老虎」与「兔子」之间连一条线,上面写着「吃」,代表二者的关联是「老虎吃兔子」。
将图谱与 RAG 结合的原因是,传统 RAG 方式实际上效果不佳,我们希望将这些概念之间的复杂关系展现出来。在查询时,不再是大海捞针去找「可能相关」的信息碎片,而是根据图谱中已经掌握的关联,提取一整串相连的信息,让大语言模型来一并处理。
GraphRAG 在 GitHub 上已获得超过一万一千颗星,显示其受欢迎程度。
核心特点
GraphRAG 融合了人工智能的两大流派:深度学习和知识图谱。曾经这两个流派是对立的,后来发现对立并无必要。如果直接用深度学习回答效果不好,结合图谱后效果就会强很多。
另一方面,构建知识图谱原来得人工根据规则去抽取其中的实体和关联,那是一个砸钱堆人力的活计。后来发现用上深度学习可以有效提升实体抽取效率。特别是有了大语言模型,人们发现抽取实体和关联变得更加准确、简单且低成本。所以,二者的融合是大势所趋。
融合之后的 GraphRAG 擅长把实体之间的复杂关系和上下文串联起来。它可以连接多个信息点进行复杂查询。这种查询不是简单地提取一部分信息就能完成的。原先根据相似度找出来的这些信息碎片,可能根本不足以支撑问题解答。但现在,根据实际关联获取相关信息,效果要好很多。
另外 GraphRAG 由于对数据集有了整体的刻画,因此概念语义信息得到了充分的表达。两个特点相夹持,使得 GraphRAG 的表现有了非常显著的改进。
成本挑战与解决方案
这个技术遇到的问题,最为显著的就是一个字——贵。官方的例子提到一本书,稍后会看到,实体书篇幅大概 200 页左右。把它图谱化 RAG,需要花多少钱?官方例子中提到花费约 11 美金。有的人觉得这太贵了,为了索引一本电子书耗费的钱都快赶上一本实体书了。
GraphRAG 实施成本为什么会那么高?因为它使用的是 GPT-4 Turbo Preview 模型。这个模型 token 成本较高,由于在图谱构建过程中,需要反复调用它,因此 GraphRAG 成本居高不下。
既然找到了原因,我们可以尝试使用一个更经济的模型来替代它。许多人也做了尝试。例如,有人尝试在本地运行 Ollama 这样的本地小型模型,但最终效果不好,构建过程中常常出现问题。有的人使用 Groq 来做,而且成功了,但需要进行不少复杂的设置变更,对于初级用户来说非常麻烦。
最简便的方法,自然是期待 OpenAI 推出一个更经济实惠的模型。OpenAI 最近推出了 GPT-4o mini 模型。不要被名称忽悠了——GPT-4o mini 的对标模型,其实是 GPT-3.5 Turbo,但它甚至比 3.5 Turbo 还要便宜 60%。
GPT-4o mini 毕竟是个小模型,你可以指望它的中文输出能力,但千万不要以为它的推理与逻辑思考能力也可以赶上 GPT-4o 或者 Claude 3.5 Sonnet。所以我是把它放在了工作流里合适的位置上,物尽其用。用它和 GraphRAG 双剑合璧,可以降低成本。
安装与环境配置
首先,我们需要把 GraphRAG 安装上,这里使用 pip install,非常简单。
pip install graphrag
它会安装一系列的依赖,包括了 GraphRAG 所需的各种库和工具。安装过程可能需要一些时间,取决于你的网络速度和电脑性能。
安装完成后,我们找一个目录,新建一个目录,然后在下面执行这一句。
mkdir -p ./ragtest/input
这里的 input 是我们存放输入的文本 —— 像刚刚提到的 200 页的书或者文章 —— 的地方。


