检索扩充生成 (RAG) 模式是一种行业标准方法,用于构建使用大型语言模型对大型语言模型尚未知晓的特定或专有数据进行推理的应用程序。 虽然架构简单明了,但设计、试验和评估符合该架构的 RAG 解决方案却涉及许多复杂的考虑因素,需要采用严谨、科学的方法。
本指南以系列的形式呈现。 本系列的每篇文章都涉及设计 RAG 解决方案的某个特定阶段。
本指南中的文章涵盖的注意事项包括:
- 确定在评估过程中使用哪些测试文档和查询
- 选择分块策略
- 确定应扩充哪些区块以及如何扩充
- 选择正确的嵌入模型
- 确定如何配置搜索索引
- 确定要执行的搜索:矢量、全文、混合、手动多重搜索
- 评估每个步骤
本指南中的文章介绍了所有这些注意事项。
RAG 体系结构
图 1. 高级 RAG 体系结构
RAG 应用程序流
以下是 RAG 应用程序的高级流。
- 用户在智能应用程序用户界面上发出查询。
- 智能应用程序向业务流程协调程序调用 API。 业务流程协调程序可以通过语义内核、Azure 机器学习提示流 或 LangChain 等工具或平台来实现。
- 业务流程协调程序确定要在 Azure AI 搜索上执行的搜索并发出查询。
- 业务流程协调程序会将查询中的前 N 个结果打包,连同查询一起打包成提示中的上下文,然后将提示发送给大型语言模型。 业务流程协调程序将响应返回给智能应用程序,以供用户阅读。
RAG 数据管道流
以下是为 RAG 应用程序提供基本数据的数据管道的高级流。
文档被推送或拉取到数据管道中。
数据管道通过以下步骤对每个文档进行单独处理:
- 分块文档 - 将文档分解为语义相关的部分,这些部分最好只有一个想法或概念。
- 扩充区块 - 将根据区块中的内容创建的元数据字段添加到标题、摘要和关键字等离散字段中。
- 嵌入区块 - 使用嵌入模型来矢量化区块和其他用于矢量搜索的元数据字段。
- 保留区块 - 将区块存储在搜索索引中。
RAG 设计和评估注意事项
在设计 RAG 解决方案时,必须做出各种实现决策。 下图说明了其中的一些决定。
图 2. 设计 RAG 解决方案时出现的问题
本指南中的一系列文章介绍了这些注意事项以及更多内容。
- 确定解决方案领域 - 讨论明确定义 RAG 解决方案的业务需求的重要性
- 收集具有代表性的测试文档 - 讨论为 RAG 解决方案收集具有语料库代表性的测试文档的注意事项和指导。
- 收集测试查询 - 讨论应在测试查询中收集哪些信息,为生成合成查询和文档未涵盖的查询提供指导。
- 了解分块经济考量 - 讨论在考虑文本语料库分块解决方案的总体成本时应考虑的因素
- 执行文档分析 - 提供在分析文档类型时可提出的问题列表,帮助确定要忽略或排除的文档内容、要捕获的区块内容以及进行分块的方式
- 了解分块方法 - 概述不同的分块方法,如基于句子、固定大小、自定义、大型语言模型扩充、文档布局分析、使用机器学习模型等
- 了解文档结构如何影响分块 - 讨论文档的结构程度如何影响分块方法的选择
- 清理区块 - 讨论可以采用的不同清理方法,通过消除对文本语义无关紧要的潜在差异来支持近似匹配
- 扩充区块 - 讨论应考虑用一些常见的元数据字段来扩充区块数据,同时提供一些有关其在搜索中的潜在用途的指导,以及生成元数据内容的常用工具或技术
- 了解嵌入模型的重要性 - 讨论嵌入模型如何对矢量搜索结果的相关性产生重大影响
- 选择嵌入模型 - 为选择嵌入模型提供指导
- 评估嵌入模型 - 讨论评估嵌入模型的两种方法:可视化嵌入和计算嵌入距离
- 创建搜索索引 - 讨论适用于矢量字段的矢量搜索配置必须做出的一些关键决策
- 了解搜索选项 - 概述可以考虑的搜索类型,如矢量、全文、混合和手动多重搜索。 为将查询拆分成子查询、过滤查询提供指导
- 评估搜索 - 为评估搜索解决方案提供指导
- 了解大型语言模型的评估指标 - 概述了可用于评估大型语言模型响应的几个指标,包括基础性、完整性、利用率和相关性。
- 了解相似性和评估指标 - 提供在评价 RAG 解决方案时可以使用的相似性和评价指标的小列表
- 了解文档、报告和聚合的重要性 - 讨论记录超参数和评估结果、聚合多个查询的结果以及将结果可视化的重要性
- RAG 试验加速器 - 解决 RAG 试验加速器 GitHub 存储库 如何用于帮助团队通过运行多个试验、持久化和评估结果来查找 RAG 实现的最佳策略
结构化方法
由于步骤和变量较多,因此必须通过结构化的评估过程来设计 RAG 解决方案。 评估每个步骤的结果,并根据自己的要求进行调整。 虽然应该独立评估每个优化步骤,但最终结果才是用户将体验到的。 在确定每个步骤的验收标准之前,请务必了解此流程中的所有步骤。