文章目录
自 ChatGPT 发布以来,大型语言模型(Large Language Model,LLM,大模型)得到了飞速发展,它在处理复杂任务、增强自然语言理解和生成类人文本等方面的能力让人惊叹,几乎各行各业均可从中获益。然而,在一些垂直领域,这些开源或闭源的通用基础大模型也暴露了一些问题,主要体现在以下 3 个方面:
- 知识的局限性: 大模型的知识源于训练数据,目前主流大模型(如:通义千问、文心一言等)的训练数据基本来源于网络公开的数据。因此,非公开的、离线的、实时的数据大模型是无法获取到(如:团队内部实时业务数据、私有的文档资料等),这些数据相关的知识也就无从具备。
- 幻觉问题:大模型生成人类文本底层原理是基于概率(目前还无法证明大模型有意识),所以它有时候会一本正经地胡说八道,特别是在不具备某方面的知识情况下。当我们也因缺乏这方面知识而咨询大模型时,大模型的幻觉问题会各我们造成很多困扰,因为我们也无法区分其输出的正确性。
- 数据的安全性: 对于个人、创新团队、企业来说,数据安全至关重要,老牛同学相信没有谁会愿意承担数据泄露的风险,把自己内部私有数据上传到第三方平台进行模型训练。这是一个矛盾:我们既要借助通用大模型能力,又要保障数据的安全性!
为了解决以上通用大模型问题,检索增强生成(Retrieval-Augmented Generation,RAG) 方案就应运而生。它的作用简单来说就是:通过检索获取相关的知识并将其融入 Prompt,让大模型能够参考相应的知识从而给出合理回答。
一、RAG
1.1 工作原理
RAG的核心机制融合了信息检索系统的精确性和语言模型的强大生成能力,为基于自然语言的任务提供了更为灵活和精准的解决方案。
RAG 给大模型提供了一个外部的知识库,这个知识库可以是文档的集合也可以是网站或者是其他结构化非结构化的知识库,当用户提出问题的时候,通过 Embedding 向量化处理和关键字查询等各种检索方式,把相关内容从知识库中拉出来,并通过优先级重排等操作再提供给 LLM,LLM 就会根据检索出来的知识和用户的问题,做针对性的回答。

RAG 的主要流程主要包含以下 2 个阶段:
- 索引阶段(数据准备阶段): 管理员将内部私有数据向量化后入库的过程,向量化是一个将文本数据转化为向量矩阵的过程,该过程会直接影响到后续检索的效果;入库即将向量数据构建索引,并存储到向量数据库的过程。
- 查询阶段(用户应用阶段): 根据用户的 Prompt 提示词,通过检索召回与 Prompt 提示词相关联的知识,并融入到原 Prompt 提示词中,作为大模型的输入 Prompt 提示词,通用大模型因此生成相应的输出。
从上面 RAG 方案我们可以看出,通过与通用大模型相结合,我们可搭建团队私有的内部本地知识库,并能有效的解决通用大模型存在的知识局限性、幻觉问题和隐私数据安全等问题。
1.2 发展历程
参考综述性论文:Retrieval-Augmented Generation for Large Language Models: A Survey
RAG的发展包含三个主要的阶段:
- 原始RAG(Naive RAG)
- 先进RAG(Advanced RAG)
- 模块化RAG(Modular RAG)
(1)原始RAG
原始RAG研究范式代表了最早的方法,这些方法在ChatGPT广泛采用后迅速流行起来。原始RAG遵循传统的流程,包括索引、检索和生成(indexing, retrieval, and generation),也被称为“检索-读取”框架( “Retrieve-Read” framework)【7】。
-
索引(indexing)。从清理和提取各种格式(如PDF、HTML、Word和Markdown)的原始数据开始,然后将其转换为统一的纯文本格式。为了适应语言模型的上下文限制,文本被分割成更小、易消化的块。使用嵌入模型将块编码为向量表示并存储在向量数据库中。这一步对于在随后的检索阶段实现高效的相似性搜索至关重要。
-
检索(retrieval)。在接收到用户查询后,RAG系统使用在索引阶段使用的相同编码模型将查询转换为向量表示。然后,它计算查询向量与已索引语料库中块向量之间的相似性分数。系统优先检索与查询最相似的前K个块。这些块随后被用作提示中的扩展上下文。
-
生成(generation)。将提出的查询和选择的文档合成为一个连贯的提示,大型语言模型负责生成一个响应。根据特定任务的标准,模型的回答方法可能有所不同,允许它从其固有的参数知识中提取答案,或者限制其响应仅限于提供的文档中的信息。在持续对话的情况下,任何现有的对话历史都可以整合到提示中,使模型能够有效地进行多轮对话互动。
关于 先进RAG(Advanced RAG)和 模块化RAG(Modular RAG)的更多内容,可以参考博客:Retrieval-Augmented Generation for Large Language Models A Survey
1.3 实现方案
目前市面上已经有多个 RAG的实现方案,比如:
-
LangChain-Chatchat (原 Langchain-ChatGLM):基于 ChatGLM 等大语言模型与 Langchain 等应用框架实现,开源、可离线部署的 RAG 与 Agent 应用项目。
-
LlamaIndex:一个LLM文本增强的框架,其中包含完整的RAG解决方案。
-
AnythingLLM:一个全栈应用程序,使您能够将任何文档、资源或内容转换为上下文,任何LLM都可以在聊天过程中将其用作引用。此应用程序允许您选择要使用的LLM或矢量数据库,并支持多用户管理和权限。
-
MaxKB (Max Knowledge Base):一个基于大型语言模型(LLM)和检索增强生成(RAG)的聊天机器人。MaxKB广泛应用于智能客户服务、企业内部知识库、学术研究和教育等场景。
-
QAnything (Question and Answer based on Anything):一个本地知识库问答系统,旨在支持各种文件格式和数据库,允许离线安装和使用。使用QAnything,您可以简单地删除任何格式的本地存储文件,并获得准确、快速和可靠的答案。
1.4 实现案例
- 基于LlamaIndex实现大模型RAG
- 基于 Ollama+AnythingLLM 实现大模型RAG
- 基于 LangChain-Chatchat 实现大模型RAG【待更新…】
1.5 RAG的缺陷
传统 RAG 技术在某些场景下,可能存在以下几个问题,即使使用高级 RAG 方法通常也较难克服。
-
可解释性:文本 Embedding 后的向量,可解释性很低。RAG 检索后得到的向量只关注文本的片段,而表示文本片段的向量是数字数组,没有直接的可解释性,无法通过观察向量中的具体数字理解文本内容。
-
整体理解受限:RAG 检索到的内容(向量块)虽然来自数据库中所包含的文档,但这些内容相关的上下文却不一定包含在答案中,导致其无法对问题、答案以及文档形成整体理解。
-
忽视关系:实际上,文本内容并非孤立存在,而是相互关联的。传统的 RAG 无法捕获仅靠语义相似性无法呈现的重要结构化关系知识。比如,在通过引用关系连接论文的引用网络中,传统的 RAG 方法侧重于依据查询找到相关论文,却忽略了论文之间重要的引用关系。
-
缺乏全局信息:RAG 只能检索文档的子集,无法全面掌握全局信息,因而在诸如查询聚焦摘要(Query-Focused Summarization,QFS)等任务中表现不佳。
二、GraphRAG
2024年4月,微软推出 GraphRAG(Graph-based Retrieval-Augmented Generation)。GraphRAG它结合了知识图谱(Knowledge Graph)和传统的RAG框架,将图结构的知识检索与生成式模型相结合,以增强模型的回答能力和知识准确性。
2.1 工作原理
对于类似非结构化文本等复杂信息,挖掘其中的隐性信息关系的方法是**“知识图谱”**,即将非结构化文本等复杂信息通过实体、关系和属性抽取技术,重新组织成结构化的知识图。这种结构化的格式使得模型能够更好地理解和利用不同信息之间的相互关系,发现其中隐藏的信息连接。同时,这种结构化的检索使得生成答案在语境上更加丰富和准确。
GraphRAG(Graph-based Retrieval-Augmented Generation)是一种基于图结构的检索增强生成技术。应用过程中,GraphRAG首先会利用大语言模型(LLM)对领域知识进行知识图谱化,构建可“图查询”(Graph Querying)的知识图谱数据库。更进一步地,GraphRAG不仅可以将全域知识库分割成多社区模块的知识图谱,还可以构建多层次知识图谱(从下至上信息更加抽象化和“主题化”)。这种多社区模块、多层次知识图谱技术旨在全面充分挖掘知识库中的复杂连接和隐性关系,最终实现对全域范围的各种知识关系在广度和深度上的“连点成线”。
GraphRAG 的整个流程拆解为三个主要阶段:
- 基于图的索引
- 图引导检索
- 图增强生成
GraphRAG包括两个处理阶段:
- 索引阶段:索引阶段利用LLM来自动化构建知识图谱,提取出对应的节点(如实体)、边(如关系)和协变量(如主张,claim),然后利用社区发现技术(如Leiden算法)对整个知识图谱进行子图划分,然后自底而上对子图利用LLM进行摘要、总结。
- 查询阶段。针对特定查询,“全局答案(Global Search)”汇总所有与之相关的社区摘要最后汇总生成答案。
下图为GraphRAG查询示意图。具体检索时,在对知识向量库(Vector Database)进行检索的同时,还将对知识图谱数据库进行检索,并将检索到的知识图谱信息和知识向量信息进行集成转化为“提示词”(Prompt),再由LLM生成答案。
2.2 优劣势分析
(1)GraphRAG 的优势
-
结构化信息检索能力
- 图结构能够以节点和关系的形式呈现知识,能够更准确地捕捉实体之间的语义关系。例如,“公司-雇员关系”可以通过边直接呈现,从而提高检索效率。
- 与传统基于向量或文本的检索相比,GraphRAG 在结构化数据领域表现更优。
-
关系推理能力
- GraphRAG 可以利用知识图谱中的关系进行推理,帮助生成更符合逻辑的内容。
- 例如:给定“苹果公司→生产→iPhone”,系统可以通过关系推理回答“苹果公司生产什么产品?”这一问题。
-
领域适配能力强
- GraphRAG 特别适用于具有大量结构化和半结构化数据的领域,例如医疗、金融、供应链管理等。
- 企业可以构建领域知识图谱并利用 GraphRAG 实现专属优化。
-
动态更新数据
- 知识图谱可以动态更新,确保模型检索和生成的内容始终基于最新数据。例如,在医疗领域,可以快速更新新发现的疾病与治疗方法。
(2)GraphRAG 的劣势
-
构建知识图谱的高成本
- 构建和维护高质量的知识图谱需要投入大量的时间、人力和技术资源。
- 数据采集、清洗、标注以及图谱关系设计是较为复杂的工程。
-
依赖图谱质量
- GraphRAG 的性能高度依赖于知识图谱的完整性、准确性和时效性。如果图谱存在错误或遗漏,会直接影响生成的质量。
- 复杂任务的适配性较弱
- 对于需要非结构化推理或上下文依赖性强的任务(例如文学创作或开放性问题回答),GraphRAG 的表现可能不如传统的 RAG 或直接生成模型。
-
性能瓶颈
- 在大型知识图谱中进行高效检索和推理可能会消耗大量的计算资源。
- 特别是在关系密集的图谱中,图遍历和复杂关系推理可能导致延迟。
-
跨领域扩展性受限
- 知识图谱通常是针对特定领域设计的,GraphRAG 的效果在跨领域应用中可能受到限制。
2.3 应用场景
-
医疗领域:结合医学知识图谱回答临床问诊、药物相互作用和治疗建议问题。
-
金融领域:使用企业关系图谱生成财务分析、风险评估和市场预测。
-
教育领域:基于学术知识图谱提供精准的课程推荐和答案解析。
-
供应链管理:构建供应链图谱,用于回答供应商、物流和库存管理相关的问题。
2.4 实现案例
参考本人的博客:【大模型】基于Ollama+GraphRAG本地部署大模型,构建知识图谱,实现RAG查询
三、LightRAG
LightRAG是一种使用图结构数据进行增强的RAG系统。利用图结构对复杂关系的准确描绘,LightRAG能够有效地解决上述问题。
为了实现系统的性能和效率,LightRAG的设计聚焦于解决以下挑战:
- 信息检索的全面性:RAG系统应当能够全面考虑查询和外部知识在不同层级的语义,既能够感知具体的实体,也能够理解抽象概念。
- 信息检索的效率:在保证检索准确性的情况下,能够进行高效的信息检索,是RAG系统面对海量查询请求时的关键能力。
- 对新数据的快速适应能力:在实际使用过程中,外部数据库常常发生持续不断的演化,如何让RAG系统保持灵活的更新能力,是一个重要问题。
3.1 工作原理
上图展示了LightRAG的架构,分为两个主要部分:
(1)基于图的索引阶段。使用大型语言模型从每个文本块中提取实体和关系。
(2)基于图的检索阶段。首先利用大型语言模型(LLM)生成相关关键字。
LightRAG的主要特点如下:
- 与当前的检索增强生成(RAG)系统类似,LightRAG的检索机制依赖于基于向量的搜索。
- 与传统的 RAG 中检索块不同,LightRAG专注于检索实体和关系。
- 与 GraphRAG 中使用的基于社区的遍历方法相比,LightRAG显著降低了检索开销。