RAG(Retrieval-Augmented Generation)技术是一种将信息检索与生成模型相结合的方法,广泛应用于自然语言处理(NLP)领域。它通过在生成的过程中引入外部知识库或文档,增强模型的表现能力,特别是在知识密集型任务中,如问答系统、文档摘要、翻译等。RAG技术的发展历程是深度学习、信息检索和自然语言生成技术不断融合的过程。本文将回顾RAG技术的发展历史、核心概念以及最新的研究成果,结合一些关键论文,探讨RAG在实际应用中的潜力与挑战。
一、概述
核心问题:RAG为什么会出现,产研同学为什么要关注RAG技术
大型语言模型(LLM),如GPT系列,在文本生成、理解和翻译等任务中表现出色,但它们也存在固有的局限性,尤其是在处理需要海量知识或实时信息的任务时,容易产生“幻觉”(生成不真实的信息)、知识更新困难和缺乏可解释性等问题。为了解决这些问题,检索增强生成(Retrieval-Augmented Generation,RAG)应运而生,它将信息检索和生成模型结合起来,为LLM插上了更智能的翅膀。
1.1 RAG诞生的背景:LLM的局限性
在RAG出现之前,传统的LLM面临以下挑战:
- 幻觉: LLM容易生成看似合理但与事实不符的内容,这是因为它们只能学习训练数据中的知识,无法访问最新的信息或特定领域知识。
- 知识更新困难: LLM的知识是固定的,一旦模型训练完成,其知识库就很难更新,需要重新训练整个模型,成本高昂。
1.2 什么是RAG?
RAG的核心思想是在生成文本的过程中,从外部知识库检索相关信息,并将其融入到生成过程中,从而提高生成文本的准确性、可靠性和可解释性。简单来说,RAG就像给LLM配备了一个“外脑”,让它在回答问题或生成内容时可以查阅资料,而不是仅仅依靠自身有限的“记忆”。
1.3 RAG的优势和重要性
首先来做下比较,上图体现了三种不同方式优化大模型的思路,分别是提示词优化,检索增强生成和指令微调,这三种优化思路从外部知识需求和模型适应性需求各有不同,对比如下:
Prompt Engineering:
- 外部知识需求:Low。Prompt engineering侧重于利用模型本身的知识和能力,通过设计合适的提示(prompts)来引导模型完成特定任务。这种方法通常不需要额外的外部知识库。
- 模型适应性需求:Low。虽然prompt engineering不需要额外的知识库,但创建有效的提示可能需要对任务和模型有深入的理解,以及一定程度的实验和调整。
RAG系统:
- 外部知识需求:Middle to High。RAG系统通过检索外部知识库中的相关信息来增强模型的回答能力,特别是在知识密集型任务中。这要求有一个准确、更新和相关的外部知识源。
- 模型适应性需求:Low。RAG系统通常不需要对模型本身进行大量的适应性调整,因为它们依赖于外部知识库来提供所需的信息。然而,RAG系统可能需要调整以优化检索策略和生成过程,以便更好地整合检索到的信息。
Fine-tuning:
- 外部知识需求:Low to Middle。但需要特定领域的数据。Fine-tuning涉及在特定任务的数据集上进一步训练预训练模型,使其更好地适应该任务。这通常不需要大量的外部知识,但需要足够的标注数据来指导模型学习。
- 模型适应性需求:High。Fine-tuning需要模型适应新任务或领域的特定要求,这通常通过在特定任务的数据集上进行训练来实现。这种方法可以使模型更好地适应特定任务,但可能需要大量的计算资源和时间。
相比于大模型预训练和微调,RAG不需要过多的预算,对于大量C端用户和小B用户来说,兼具了实用性和和灵活性,是更有可操作性的解决方案。并且从市场上看,RAG现在以 51% 的采用率占据主导地位,比去年的31%大幅上升。
二、RAG技术起源、发展和范式转变
关键问题:RAG宏观技术架构是什么样的?范式发生了哪些变化?
2.1 RAG技术的起源
RAG的概念最早出现在2019年左右,随着生成模型的快速发展,人们逐渐认识到,纯粹依赖生成模型进行任务完成,虽然能产生流畅的文本,但在面对信息密集型问题时往往无法保证答案的准确性和全面性,为了弥补这一不足,研究者们提出了将外部知识检索与生成过程结合的思路。这样,模型不仅能够依赖训练时学习到的知识,还能通过检索数据库或搜索引擎来补充知识库,从而产生更加精准的回答。
RAG的具体提出可以追溯到2020年由Facebook AI Research(FAIR)团队发布的论文《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》(https://arxiv.org/abs/2005.11401)。该论文首次系统地提出了RAG框架,并在多个知识密集型任务中展示了其优势。
端到端的问答系统,它通过结合检索(retrieval)和生成(generation)两种方式来回答问题。这个系统可以完成多种任务,包括问答、事实核查、问题生成等。
系统的工作流程大致如下:
- 问题编码 (Query Encoder):将用户提出的问题转化为计算机能够处理的向量表示。
- 检索 (Retriever):在知识库中查找与问题最相关的文档。
- 生成 (Generator):利用检索到的文档和问题表示,生成答案。
- 排序(Marginalize):对多个候选答案进行排序,选出最优答案。
图中各部分的含义:
- q(x):问题编码器,将问题x编码为向量表示。
- Pn:非参数化检索器,在知识库中检索与问题相关的文档。
- d(z):文档索引,将检索到的文档转化为向量表示。
- pe:参数化生成器,根据问题和文档表示生成答案。
- MIPS:多实例学习(Multiple Instance Learning),用于处理文档中的多个实例。
- Marginalize:边缘化,对多个候选答案进行排序。
- x:问题,例如”Barack Obama was born in Hawaii”。
- y:答案,例如”supports”。
图中涉及到的任务:
- 问答 (Question Answering):给定问题,系统给出答案。
- 事实核查 (Fact Verification):判断给定事实是否正确。
- 问题生成 (Question Generation):给定答案,系统生成相应的问题。
“Define ‘middle ear’” 这个例子说明系统可以处理定义类问题。
图中强调了端到端(End-to-End)的概念,即从问题输入到答案输出,整个过程由一个模型完成,无需人工干预。
2.2 RAG技术的核心理念
RAG技术的核心理念是结合检索和生成,利用外部知识库来增强大型语言模型(LLM)的回答能力,使其在回答问题时更加准确、可靠,并且能够处理时效性信息。
具体来说,RAG技术包含两个核心模块:
- 检索模块: 该模块负责从外部知识库中检索与用户查询相关的文档或信息片段。这个知识库可以是各种形式的,例如文档数据库、知识图谱、互联网等。检索的方法也多种多样,包括关键词搜索、向量搜索等。
- 生成模块: 该模块接收检索模块返回的信息片段,并将其融入到LLM的生成过程中,生成最终的回答。通过这种方式,LLM不再仅仅依赖于自身训练时学习到的知识,而是可以利用最新的、更全面的信息来回答问题。
这种方式能够有效地提升模型在知识密集型任务中的表现,特别是在需要大量背景知识或最新数据的任务中,如开放域问答、文本摘要和事实检查等。
这也是最初始化和常用的RAG架构,Naive RAG
query:
您如何评价 OpenAl 首席执行官 Sam Altman 在短短三天内突然被董事会解雇,然后又被公司重新聘用,权力动态就像现实版的《权力的游戏》?
without RAG:
我无法对未来事件发表评论。目前,我没有关于 OpenAl 首席执行官被解雇和重新聘用的任何信息
Relevant Documents:
区块 1:“Sam Altman 重返 OpenAl 担任 CEO,硅谷大戏类似‘甄嬛传’喜剧”
区块 2:“大戏落幕?Sam Altman 将重返 OpenAl 担任 CEO,董事会将进行重组”
区块 3:“OpenAl 人事动荡告一段落:谁赢谁输?”
with RAG:
这表明 OpenAl 内部在公司未来方向和战略决策方面存在重大分歧。所有这些曲折都反映了 OpenAl 内部的权力斗争和公司治理问题
2.3 RAG技术范式的演进过程
2.3.1 Naive RAG的局限性
Index(索引) ——> Retrieval(检索) ——> Genaration(生成)
用户提问:
请分析英伟达和苹果过去三年的财务表现,以确定哪家公司更具投资价值?
(专业领域、需要多个文件、时间范围限制、复杂要求)
出现的错误:
不同年份的 Nvidia 年度报告中的同一章节、错误的时间范围、缺少Apple 相关内容、检索不足
最后生成回答:
仅提供英伟达、标普500指数、纳斯达克100指数和苹果的股价表现,在没有更多财务数据的情况下,难以判断其投资价值。(不是一个满意的答案)
Naive RAG在实际使用上遇到的问题:
- 检索质量问题:检索模型的质量直接影响最终生成结果的准确性。如果检索到的文档与查询不相关或不准确,生成的回答也可能是错误的。
- 生成质量控制:虽然生成模型已经取得了显著进展,但仍然存在生成文本不够精确或不符合事实的风险。如何提高生成模型的控制能力和可解释性是一个重要的研究方向。
- 计算资源需求:RAG结合了检索和生成两个模型,因此需要较高的计算资源。这可能成为其在一些实际应用中推广的瓶颈,尤其是在资源受限的情况下。
2.3.2 Advanced RAG的改进
Index Optimization(索引优化) ——> Pre-Retrieval Process(预检索优化) ——> Retrieval(检索优化) ——> Post-Retrieval Process(检索后优化)** ——> Genaration(生成优化)**
整个过程在两个部分进行了优化:
- 预检索过程(Pre-retrieval Process):
-
- 目的:在正式检索前对查询进行预处理,提高检索效果。
方法:
- 数据清洗:去除无用的信息,提高数据质量。
- 滑动窗口:有效地保留上下文信息,尤其适用于需要考虑上下文语境的任务
- Small2Big:使用较小的文本块进行初始检索,找到相关的文本片段
- 添加文件结构:提高效率和查找速度,提升检索效率
- 问题重写:将自然语言查询转化为更适合检索的形式。
- 检索路由:选择更为合适的检索通路,提升检索效果
- 后检索过程(Post-retrieval Process):
- 目的:对检索到的结果进行进一步处理,提高生成质量。
- 方法:
- 排序:根据相关性对检索结果进行排序。
- 过滤:去除冗余或无关的信息。
- 提示压缩:将检索到的结果压缩成一个更紧凑的提示,以提高模型的效率。
(财务表现 改写为了 关键财务指标,股票价格)
Retrieval:
改善检索的召回率
Post-Retrieval:
根据相关性进行了召回段落的重排序,选择更合适的段落进行生成
最终答案:
投资机会分析
Nvidia:
优点:2021 年和 2022 年表现出强劲的增长潜力,适合风险承受能力较高的投资者。
缺点:2023 年经历了大幅波动,这可能会引起一些投资者的担忧。
苹果:
相较于基础RAG模型,高级RAG的优势在于:
- 更精细的索引:通过滑动窗口和细粒度分段,可以更好地匹配不同类型的查询。
- 更准确的检索:预处理和后处理过程可以提高检索的准确性和效率。
- 更优质的生成:通过提供更准确、更相关的上下文信息,可以生成质量更高的文本。
尽管高级RAG有所改进,但是仍然与实际应用与需求之间存在差距:随着 RAG 技术的发展,用户期望提高,需求持续演变,应用设置也变得更为复杂。例如,异构数据的整合以及对系统透明度、控制和可维护性的新需求。
2.3.3 Modular RAG技术范式
索引阶段:
- 引入多样化、复杂数据源
- 构建知识图谱,索引建库逻辑覆盖文本块和数据库表(现金流量表、资产负债表)
预检索阶段:
- 按需检索
- query分解
- 结构化query构建
检索阶段:
- 混合检索(稀疏检索、稠密检索)
- 检索阶段的feedback
后检索阶段:
- 结果的重新排序
- 流程控制、自我反思(请参考已提供的信息。如果没有相关内容,或者您找不到答案,则应回答未找到相应内容)
生成阶段:
- 专业领域的高级prompt拼接
- 多分支问题平行生成(详细、准确的财务数据、指标计算与趋势分析、最终投资建议)
- 模型评判问题是否已经被回答
详细且正确的财务数据、指标计算和趋势分析、最终投资建议然后最后对三个问题的回答进行了总结,得到了最终答案
苹果和英伟达都展现出强大的投资潜力,但根据投资者的风险承受能力和投资目标,它们适合不同类型的投资者:
对于保守型投资者:尽管苹果的杠杆率较高,但由于其稳定的财务表现、多元化的收入来源和强大的品牌忠诚度,它更适合这类投资者。
对于成长型投资者:英伟达对那些寻求尖端技术领域更高增长潜力的投资者更具吸引力,其较低的杠杆率和在未来技术市场的强势地位也为其增色不少,但需要注意的是其较高的市场估值风险。
通过以上全面分析,对于寻求稳定、长期回报且风险较低的投资者来说,苹果可能被认为是更合适的选择,而对于愿意承担较高估值风险的投资者来说,英伟达则可能提供更大的显著增长潜力。
最终建议:基于其整体的持续性、稳定性、较低的财务波动性和强大的品牌忠诚度,苹果公司通常对更广泛的投资者来说是更审慎的投资选择,尤其是那些将稳定性置于高风险、高回报机会之上的投资者。
为达成更精准和高效的任务执行,模块化 RAG 系统正逐步融合更复杂的功能,比如以知识图谱的形式构建更精细的索引库,通过查询构建方法整合结构化数据,以及运用微调技术让编码器更好地适应特定领域的文档。
在流程设计方面,模块化 RAG 系统已超越传统的线性检索生成范式。研究人员采用迭代检索获取更丰富的上下文,利用递归检索处理复杂查询,以及借助自适应检索提供整体的自主性和灵活性。这种流程上的灵活性显著增强了 RAG 系统的表达力和适应性,使其能更好地适应各类应用场景。然而这使得RAG系统的架构越来越复杂,越来越多的新问题不断出现:
复杂数据源集成:RAG 不再局限于单一的非结构化文本数据源类型,而是拓展至涵盖诸如表格之类的半结构化数据以及像知识图谱这样的结构化数据。获取来自多个来源的异构数据,能够为系统赋予更丰富的知识背景以及更可靠的知识验证能力。
可解释性、可控性和可维护性方面的新需求:随着系统复杂度的提升,系统维护和调试变得更具挑战。此外,当问题出现时,必须迅速锁定需要优化的特定组件。
组件的选择与优化:更多的神经网络融入 RAG 系统,需要挑选适宜的组件以满足特定任务和资源配置的需求。而且,新的组件虽提升了 RAG 的效能,但也带来了新的协作工作要求。确保这些模型按预期运行并高效协同,以提升整体系统性能,这一点至关重要。
工作流的编排与调度:组件可能需要依照特定顺序执行,在某些条件下并行处理,甚至由 LLM 根据不同的输出进行判定。对工作流进行合理规划,对于提高系统效率和达成预期成果至关重要。
为了应对以上这些问题,研究团队提出了模块化 RAG 架构。
在现代计算系统中,模块化正成为一种趋势。能够增强系统的可扩展性和可维护性,并通过流程控制实现高效的任务执行。模块化 RAG 架构分为三个层级:
- 顶层聚焦于 RAG 的关键阶段,其中每个阶段都视作一个独立的模块。该层级不仅继承了高级 RAG 范式的主要流程,还引入了一个编排模块来调控 RAG 流程的协同。
- 中间层由每个模块内的子模块组成,进一步细化和优化功能。
- 底层由基本操作单元——算子构成。
索引(Indexing):
将文档分割成易于管理的块,是系统组织的关键步骤。
面临的挑战包括内容表示不完整、块相似度搜索不准确和引用轨迹不清晰。
解决方案包括块优化(如调整块大小和重叠)、元数据附加和结构化组织。
技术包括:
- * 块优化(Chunk Optimization):调整块的大小和重叠以优化语义信息的捕获和噪声的控制。
- * 元数据附加(Metadata Attachment):为块附加元数据,如页码、文件名等,以增强检索的过滤能力。
- * 结构化组织(Structure Organization):建立文档的层次结构,如段落和句子的分割,以提高检索效率。
- * 知识图谱索引(KG Index):使用知识图谱来组织文档,明确概念和实体之间的关系。
检索前处理(Pre-retrieval):
- * 改进原始查询以提高检索效果,解决诸如查询表述不清、语言复杂性和歧义等问题。
- * 方法包括查询扩展、查询转换和查询构造。
- * 技术包括:
查询扩展(Query Expansion):通过扩展查询来丰富上下文,提高检索的相关性。
查询转换(Query Transformation):对原始查询进行改写或转换以提高检索的准确性。
查询构建(Query Construction):根据需要将查询转换为不同的查询语言,如SQL或Cypher,以访问结构化数据。
检索(Retrieval):
- 利用强大的嵌入模型在潜在空间中高效表示查询和文本,建立问题与文档之间的语义相似性。
- 考虑因素包括检索器的选择、检索器微调以及检索效率和质量。
- 技术包括:
检索器选择(Retriever Selection):根据任务需求选择合适的检索器,包括稀疏检索器、密集检索器和混合检索器。
检索器微调(Retriever Fine-tuning):对检索器进行微调以适应特定领域的数据和术语。
检索后处理(Post-retrieval):
- 对检索到的文档块进行后处理,以更好地利用上下文信息。
- 包括重新排序、压缩和选择操作,以提高最终生成答案的质量。
- 技术包括:
重排(Rerank):根据相关性对检索到的文档块进行重新排序。
压缩(Compression):压缩检索到的内容,以减少噪声并提高LLM对关键信息的识别。
选择(Selection):直接移除不相关或冗余的文档块。
生成(Generation):
- 使用大型语言模型基于用户的查询和检索到的上下文信息生成答案。
- 考虑因素包括生成器微调和答案的验证。
- 技术包括:
生成器微调(Generator Fine-tuning):根据特定领域或数据特性对生成器进行微调,以提高生成答案的质量。
验证(Verification):通过知识库或模型基础的方法对生成的答案进行验证,以减少错误信息。
编排(Orchestration):
- 控制RAG过程的模块,包括路由、调度和融合。
- 动态选择后续步骤,根据前一个结果进行决策。
- 技术包括:
路由(Routing):根据查询的类型或内容将查询定向到不同的处理流程。
调度(Scheduling):管理RAG流程中的决策点,如何时进行检索或生成。
融合(Fusion):整合来自多个分支的信息,以形成一个全面且一致的响应。
模块化 RAG 的优势是显著的,因为它增强了 RAG 系统的灵活性和可扩展性。用户可以根据数据源和任务场景的要求,灵活地组合不同的模块和算子
这三个范式(朴素RAG、高级RAG和模块化RAG)之间的关系是继承与发展的关系。高级 RAG 是模块化 RAG 的一种特殊情形,而朴素 RAG 是高级 RAG 的一种特殊情形。
- 缺乏可解释性: LLM的生成过程通常是黑盒的,难以理解模型生成特定内容的原因。