Prompt工程师必备:复旦重磅 | 最佳RAG实践长什么样的?
一段时间以来,我们都能感受到,几乎任何有影响力的AI应用背后,都离不开RAG的身影。这项名为检索增强生成(Retrieval-Augmented Generation)的技术,正在以一种静水流深的方式,深刻影响着生成式AI行业的演进方向。可以这么说,如果你现在是一名Prompt工程师,但对几种主流的RAG技术不甚了解,那恐怕很难称得上合格。
01 RAG:突破AI的认知界限
大语言模型确实能干很多事,但说句实话,它的知识面是有边界的——受限于训练数据的截止日期,缺乏实时更新,面对高度专业化的领域问题也常常力不从心。RAG技术的出现,恰恰就是为了解决这些核心痛点。
想象一下,如果让AI具备实时访问和利用海量外部知识的能力,会发生什么?这正是RAG所做的。它不仅能大幅提升AI输出的准确性和可靠性,还让AI具备了持续学习和适应新知识的可能,相当于给它装上了一扇通往外部世界的任意门。
这方面,复旦大学的研究团队带来了一个令人振奋的突破。他们系统性地探索了RAG的最佳实践,为开发者们提供了一份相当实用的实施指南。研究团队深入剖析了RAG系统的各个核心组件,包括查询分类、文档分块、检索、重排序、重新打包和总结等模块。他们不仅横向对比了每个模块内不同实现方法的优劣,还深入探讨了这些模块之间的相互作用,最终找到了当前技术环境下最优的组合策略。在此要特别感谢复旦大学的研究团队,为我们总结了当前技术环境下最优的RAG实践!这篇论文于7月1日发表,代码链接在论文摘要末尾可以找到。
02 RAG:精密的知识管理系统
RAG系统的工作流程,可以理解为一个设计精密的“知识管理和再利用”系统。根据研究团队提供的检索增强生成系统架构图,我们可以清晰地看到各个关键组件及其相互关系:
1. **大语言模型(Large Language Model):** 系统的核心,负责理解查询并生成回答。 2. **查询分类(Query Classification):** 判断当前查询是否需要检索外部知识。 3. **检索(Retrieval):** 从外部知识源中检索相关信息,包括BM25、Contriever等多种方法。 4. **重排序(Reranking):** 对检索结果进行二次排序,进一步提升相关性。 5. **重新打包(Repacking):** 调整检索文档的排列顺序,优化上下文结构。 6. **总结(Summarization):** 压缩检索到的文档,提炼关键信息。 7. **外部知识源(External Source):** 包含文档分块(Chunking)和向量化嵌入(Embedding)等预处理步骤。 8. **向量数据库(Vector Database):** 用于存储和索引文档的向量化表示。 9. **微调(Fine-tune):** 通过不同策略优化模型在RAG场景下的性能。 10. **评估(Evaluation):** 从多个维度对系统整体性能进行评测。这张架构图完整展示了RAG系统的复杂性与各组件的协同关系,为理解和优化RAG系统提供了一个清晰的蓝图。它强调了从查询处理、知识检索、信息整合到最终生成的完整链路,展现了现代AI系统如何通过结合大语言模型与外部知识来显著提升性能和可靠性。
2.1 查询分类:智能门卫
查询分类模块,就像是RAG系统的“智能门卫”。它的任务听起来很简单——判断输入查询是否需要启动检索增强流程,但其重要性却不容小觑。研究发现,合理使用查询分类,能把系统的平均响应时间从16.58秒大幅缩短到11.71秒,同时还能稍微提升整体性能。
这个发现对Prompt工程师的启示是深刻的:在设计RAG系统时,查询分类绝不是一个可有可无的附加功能,而应该被视为核心组件。它不仅能明显提升系统响应速度,还能通过避免不必要的检索操作来优化资源利用。
深入理解查询分类
为了更好地理解查询分类的工作机制,来看看下面这张图:
这张图详细展示了RAG系统中查询分类模块的工作原理,它将输入的查询分为“需要检索”和“无需检索”两类。这种分类对于提高系统效率和性能至关重要。
* **信息充分的查询:** 这类查询自身信息完整,可以直接由语言模型处理,无需额外检索。例如翻译、改写、总结等任务,它们通常是对给定信息的处理,不依赖额外背景知识。 * **信息不足的查询:** 这类查询需要外部信息支持,因此需要进行检索。例如搜索类任务、开放式问答、需要最新信息的查询等,都需要访问外部知识库来补充必要信息。 * **背景知识:** 有些查询虽然提供了部分信息,但仍需通过检索来补充完整的背景知识。比如继续写作任务,可能需要检索相关的历史背景或人物信息。 * **无背景知识:** 一些查询完全依赖外部信息,需要全面的检索支持。例如询问未来某个事件的地点,或寻求特定问题的建议。这种精细的查询分类机制,赋予了RAG系统几个关键能力:
* **提高效率:** 对不需要检索的查询直接处理,节省时间和计算资源。 * **提升准确性:** 为需要额外信息的查询提供精确的知识支持。 * **优化用户体验:** 根据查询类型提供最适合的响应方式。 * **资源管理:** 合理分配系统资源,重点支持需要检索的复杂查询。对Prompt工程师来说,理解这套分类机制至关重要。它能帮助我们设计更智能的提示策略,根据不同的查询类型动态调整系统行为,从而在各种场景下都能获得最佳性能。
2.2 检索模块:RAG的“大脑”
检索模块是RAG系统的核心,就像人类大脑中负责记忆检索的区域。研究团队横向对比了多种检索方法,包括原始检索、假设性文档嵌入(HyDE)、混合检索,以及HyDE与混合检索的结合。
HyDE技术的核心思路是:对于一个给定的查询,首先生成一个假设性的“理想文档”(即可能包含答案的虚构文档),然后使用这个假设文档的嵌入向量去检索实际的相关文档。这种方法旨在提高检索的相关性和准确性。
实验结果显示,HyDE与混合检索的结合方法在性能上表现最佳,RAG得分达到了0.580。它的优势在于,既利用了HyDE生成假设文档的创新思路,又结合了混合检索的全面性。不过,高性能是有代价的,每次查询需要11.71秒。这意味着,在构建RAG系统时,需要根据具体应用场景来权衡性能和效率。比如,对实时性要求高的客服聊天机器人,可以选择更快速的混合检索;而对输出质量要求高的内容生成系统,则可以考虑使用HyDE与混合检索的组合。
此外,工程师也可以考虑实现动态检索策略。系统可以根据查询的复杂度、时间要求等因素,自动选择最合适的检索方法,这种灵活性能让RAG系统在各种应用场景中都发挥出最佳状态。
嵌入模型的选择
之前的研究者已经详细总结了分块(Chunking)策略在RAG系统中的重要性,以及如何通过优化分块大小、技术和嵌入模型来提高系统性能。
* **分块的重要性:** 将文档分割成小段对提高检索精度和避免LLM的上下文长度限制至关重要。分块可以在不同粒度级别进行:标记级、句子级和语义级。 * **分块级别:** * 标记级分块最简单,但可能分割句子,影响检索质量。 * 语义级分块使用LLM确定断点,能保留上下文,但比较耗时。 * 句子级分块在保留文本语义和简单高效之间取得了平衡。 * **句子级分块**,从几个维度考察: * **块大小:** 大块提供更多上下文,但增加处理时间;小块改善检索召回率并减少时间,但可能缺乏足够上下文。最佳块大小为512,在忠实度(97.59)和相关性(97.41)之间取得了良好平衡。 * **分块技术:** 高级技术如small-to-big和滑动窗口通过组织块关系改善检索质量。其中,滑动窗口技术表现最佳,平均忠实度为97.41,相关性为96.85。接着,研究者评估了目前流行的五种向量数据库,从四个关键方面进行了比较:
* **多重索引类型:** Milvus和Faiss支持多重索引类型,能提供更灵活的搜索优化选项。其他数据库如Wea viate、Chroma、Qdrant则不提供。 * **十亿级扩展:** Milvus和Qdrant能够处理十亿级别的向量,适合大规模应用。 * **混合搜索:** 除Faiss外,所有数据库都支持混合搜索,结合了向量搜索和传统关键词搜索的优势。 * **云原生:** 除Faiss外,所有数据库都具有云原生特性,便于在云环境中部署和管理。总的来说,Milvus是唯一一个在所有四个方面都表现出色的数据库,显示出其全面的能力。Faiss虽然支持多重索引类型,但在其他方面表现较弱,尤其是在云部署方面。Qdrant在除多重索引类型外的所有方面都表现良好。Wea viate和Chroma虽然支持混合搜索和云原生,但在处理大规模数据和索引灵活性上存在限制。这个对比清晰地凸显了Milvus作为全面解决方案的优势,同时也展示了不同数据库各自的优缺点。在实际选型时,需要根据项目的具体需求和规模来权衡这些特性。
检索模块的效果很大程度上依赖于所使用的嵌入模型。来看看下面这张表格,它展示了不同嵌入模型在namespace-Pt/msmarco数据集上的性能对比:
这些数据对于理解和选择RAG系统中的嵌入模型至关重要:
* **评估指标:** MRR@k(平均倒数排名)衡量模型在前k个结果中找到相关文档的能力;R@k(召回率)衡量模型在前k个结果中检索到相关文档的比例。 * **性能最佳的模型:** BAAI/LLM-Embedder和BAAI/bge-large-en在多个指标上表现最佳,在MRR@1、MRR@10和R@10上都取得了最高分。 * **模型大小与性能:** 通常,较大的模型(如large版本)性能优于较小的模型,但BAAI/bge-small-en-v1.5在某些指标上表现也很抢眼,显示了小模型的潜力。 * **版本迭代的影响:** 新版本的模型(如v1.5)通常比旧版本表现更好,体现了模型迭代的重要性。这些结果给RAG系统的设计带来了重要启示:
1. **模型选择:** 根据具体应用场景对准确性、速度的不同要求,选择合适的嵌入模型。 2. **性能与效率平衡:** 在高性能的大模型和计算效率高的小模型之间进行权衡。 3. **版本更新:** 及时关注和采用最新版本模型,以获得性能提升。 4. **任务适配:** 根据特定任务的关键指标(是更看重MRR还是更看重Recall)来选择模型。对Prompt工程师而言,理解这些嵌入模型的性能特征非常重要。它可以帮助我们针对不同应用场景设计更有效的提示策略,比如对高召回率的任务使用不同于追求高精度任务的提示方式。
2.3 重排序:精准定位关键信息
重排序模块就像是RAG系统的“信息过滤器”。它的作用是进一步提升检索结果的相关性,确保最重要的信息能被优先处理。研究比较了多种重排序方法,包括monoT5、monoBERT、RankLLaMA和TILDEv2。
实验结果表明,使用monoT5进行重排序能够获得最高的平均得分。这个发现强调了重排序在提升生成质量中的关键作用。对Prompt工程师来说,这意味着在RAG系统中集成有效的重排序机制,可以显著提高最终输出的质量。
在实际应用中,可以考虑实现多级重排序策略。例如,先用计算速度较快的方法(如TILDEv2)进行初步筛选,然后再用更精确但计算成本较高的方法(如monoT5)对Top-K结果进行精细排序。这种策略可以在保证性能的同时,有效控制计算成本。
2.4 重新打包:优化上下文排列
重新打包模块的作用,相当于给检索到的信息“排版”。研究者比较了正向排序、反向排序和两侧排序三种策略。结果显示,反向排序策略表现最佳,RAG得分达到0.560。
这个发现揭示了一个重要的认知原理:将最相关的信息放在靠近查询的位置,有助于生成模型更好地理解和利用上下文。对Prompt工程师来说,这提供了一个优化RAG系统输出质量的重要方向。
在实际应用中,可以考虑实现动态打包策略。比如根据任务类型、查询长度等因素,自动选择最合适的排序方法。甚至可以尝试用机器学习模型来学习最优的文档排序方式,进一步提升系统性能。
2.5 总结模块:提炼精华信息
总结模块就像是RAG系统的“信息压缩器”。研究比较了Recomp和LongLLMLingua两种总结方法。结果表明,Recomp方法在性能上略胜一筹。不过,研究者也发现,在某些情况下,完全移除总结模块反而能获得更好的性能和更低的延迟。
这一发现为Prompt工程师提供了一个重要的设计思路:总结模块并非必不可少,是否使用它,应该根据具体的应用场景和系统要求来决定。在一些对实时性要求极高的应用中,可以考虑省略总结步骤以提高响应速度。
在实际应用中,可以考虑实现自适应总结策略。系统可以根据检索结果的长度、复杂度等因素,动态决定是否进行总结,以及使用哪种总结方法。这种灵活性可以让RAG系统在各种应用场景中都能保持最佳性能。
2.6 生成器微调:提升模型适应性
研究团队探讨了生成器微调对RAG系统性能的影响,尝试了使用相关文档、随机文档以及混合文档进行微调的策略。结果表明,使用相关和随机文档混合进行微调的策略效果最佳。
这个发现对Prompt工程师具有重要的指导意义。在微调RAG系统的生成器时,不应只关注与任务直接相关的文档,还应引入一定比例的随机文档。这种方法不仅可以提高模型对相关信息的利用能力,还能增强其对不相关信息的鲁棒性,从而提高模型的泛化能力和抗干扰能力。
在实际应用中,可以考虑实现动态微调策略。比如根据系统的实际使用情况,定期收集用户查询和系统响应,用这些真实数据来持续微调模型。这种方法可以让RAG系统不断适应新的应用场景和用户需求,保持长期的高性能。
03 RAG的最佳实践:性能与效率的平衡艺术
基于大量实验结果,研究团队提出了两种RAG实施策略,分别针对追求最高性能和平衡性能与效率的场景。让我们通过下面这张详细的实验结果表格来深入分析这些策略:
这张表格提供了对RAG系统不同组件和配置的全面评估结果,里面藏着很多宝贵的洞察:
3.1 评估指标解读
表格涵盖了多个任务领域:常识推理、事实检查、开放域问答、多跳问答和医疗问答。使用了准确率、精确匹配、F1分数等指标,以及综合的RAG得分。同时,平均延迟也被考虑在内,体现了性能与效率的权衡。3.2 关键发现
* **查询分类模块的影响:** 引入查询分类后,整体性能略有提升(平均分从0.465提高到0.478),同时显著降低了延迟(从16.58秒减少到11.71秒)。 * **检索模块比较:** "Hybrid with HyDE"方法在多数指标上表现最佳,平均分达到0.478,但代价是较高的延迟(11.71秒)。纯Hybrid方法在医疗任务上表现突出(0.750),同时保持较低延迟(1.45秒)。 * **重排序模块的作用:** monoT5重排序方法整体表现最佳,平均分为0.478。不同方法在性能和延迟上存在差异,如RankLLaMA性能好但延迟高。 * **重新打包策略:** 反向排序策略略优于其他方法,在医疗和RAG任务上表现尤为出色。 * **总结模块的影响:** Recomp总结方法略优于LongLLMLingua。有趣的是,移除总结模块在某些任务上反而提高了性能,同时减少了延迟。 基于这些发现,研究团队提炼出了两种可供参考的RAG实施策略:3.3 追求最佳性能的RAG配置
* 集成查询分类模块 * 采用"Hybrid with HyDE"检索方法 * 使用monoT5进行重排序 * 采用反向排序策略 * 使用Recomp进行总结这种配置在实验中获得了最高的平均得分0.483,但计算开销较大。它适合那些对输出质量要求极高,且能够容忍较长响应时间的应用场景。比如在生成高质量的研究报告、详细的技术文档或复杂的数据分析时,这种配置可以发挥出它的优势。
3.4 平衡效率和性能的RAG配置
* 集成查询分类模块 * 采用Hybrid检索方法 * 使用TILDEv2进行重排序 * 采用反向排序策略 * 使用Recomp进行总结这种配置在保持较好性能的同时,大幅降低了系统延迟。它适合那些需要在性能和效率之间取得平衡的应用场景。比如开发实时性要求较高的客户服务聊天机器人或交互式学习系统时,这种配置可能是更好的选择。
04 RAG的实践启示
对Prompt工程师和AI系统开发者来说,这些研究结果提供了丰富的实践启示:
* **模块化设计的重要性:** 每个模块都对整体性能有显著影响,证实了RAG系统模块化设计的价值。在实际开发中,应注重系统的模块化,以便灵活调整和优化各个组件。 * **性能与效率的权衡:** 高性能配置通常伴随高延迟,实际应用中需要根据具体需求权衡。工程师应根据应用场景的特点,选择合适的性能与效率平衡点。 * **任务特异性:** 不同配置在各类任务上表现不一,这凸显了为特定领域定制RAG系统的重要性。开发针对特定领域的AI应用时,应进行针对性的优化和调整。 * **查询分类的价值:** 查询分类不仅提升了性能,更大幅降低了延迟,是一个值得重视的优化点。工程师应考虑在RAG系统中实现智能的查询分类机制。 * **灵活配置的必要性:** 最佳配置因任务而异,这强调了设计灵活、可配置RAG系统的重要性。开发可动态调整的RAG系统架构,能够适应不同的应用需求。 * **意外发现的价值:** 某些情况下,简化系统(如移除总结模块)反而能提升性能,这提醒我们要警惕过度复杂化。在系统设计中,应保持开放心态,不断测试和验证各种可能性。检索增强生成技术无疑是AI领域的一个重要突破。研究团队已经在探索将RAG扩展到图像生成和理解任务中。未来,我们可能会看到更多跨模态的RAG应用,如视频分析、音频处理等。未来的RAG系统可能会具备实时学习能力,能够从每次交互中学习并更新其知识库,实现真正的持续学习。RAG系统可能会更加个性化,能够根据用户的历史交互和偏好来定制检索和生成策略。为了处理更大规模的知识库,未来可能会出现分布式RAG系统,能够在多个服务器或设备上协同工作。这项研究通过系统性地探索RAG的最佳实践,为Prompt工程师和AI开发者提供了宝贵的指导,在此推荐给大家。
-
- 关于宇宙的好的网名有哪些
- 角色扮演 | 1
- 网名