一、什么是 RAG?

RAG(Retr؜ieval-Augmented Generation,检索增强生‌成)是一种结合信息检索技术和 AI 内容生成的混合架构,可以解决‍大模型的知识时效性限制和幻觉问题。

  • 检索增强生成(RAG)是一种技术,有助于克服大型语言模型的局限性,这些模型在处理长文本内容、事实准确性和上下文感知方面存在困难。

简单来说,RA؜G 就像给 AI 配了一个 “小抄本”,让 AI 回‌答问题前先查一查特定的知识库来获取知识,确保回答是基‍于真实资料而不是凭空想象。

        从技术角度看,R؜AG 在大语言模型生成回答之前 ,会先从外部知识库中检索相关信‌息,然后将这些检索到的内容作为额外上下文提供给模型,引导其生‍成更准确、更相关的回答。

通过 RAG 技术改造后,AI 就能:

  • 准确回答关于特定内容的问题
  • 在合适的时机推荐相关课程和服务
  • 用特定的语气和用户交流
  • 提供更新、更准确的建议

可以简单了؜解下 RAG 和传统 AI 模型的区别:‌

二、完整的RAG工作流

分为两大块:

1.建立索引,准备文档阶段        2.查询阶段

一个是我们开发者准备的,一个是给用户用的

索引构建的目标是为检索做好准备。其核心流程是:将原始文档预处理并切分成文本片段,然后利用Embedding模型把文本片段转化为向量表示,最终将这些向量存储到向量数据库中。

检索与生成阶段遵循以下步骤:

  1. ​检索​​:将用户查询转换为向量,基于相似度从向量数据库中检索出相关的文档切片。

  2. ​精排(可选)​​:使用重排序模型对初步检索结果进行精细排序,筛选出最相关的片段。

  3. ​生成​​:将top-K个最相关的文档切片与用户查询共同组合成提示词,交由大语言模型生成最终答案。

三、Spring AI 中的检索增强生成 Advisor 选型

Spring AI 框架中用于实现检索增强生成(RAG, Retrieval-Augmented Generation)的 Advisor 有两个 QuestionAnswerAdvisor 和 RetrievalAugmentationAdvisor,但它们在功能、设计和使用场景上存在一些区别,下面就是我对这两个 Advisor 的分析。在使用这两个 Advisors 的时候,官方文档中写明需要引入这个依赖,但是引入报错,不引入也是可以实现的

1. 概述

  • QuestionAnswerAdvisor: 这是 Spring AI 提供的一个专注于简单 RAG 场景的 Advisor,主要用于将用户查询与向量数据库(VectorStore)中检索到的文档结合,为 AI 模型提供上下文,从而生成更准确的回答。它通过默认或自定义的 PromptTemplate 将检索到的上下文与用户查询合并,适用于快速实现基本的 RAG 功能。
  • RetrievalAugmentationAdvisor: 这是 Spring AI 中更通用、更模块化的 RAG 实现,基于模块化架构,提供了更高的灵活性和扩展性。它支持更复杂的 RAG 工作流,包括查询转换(query transformation)、文档后处理(document post-processing)等,适用于需要高级定制或复杂 RAG 场景的开发。

2. 主要区别以下是从功能、配置、灵活性、使用场景等几个方面对两者的对比:

特性

QuestionAnswerAdvisor

RetrievalAugmentationAdvisor

设计目标

提供简单的 RAG 实现,专注于快速集成向量数据库检索和生成回答。

提供模块化的 RAG 框架,支持更复杂的工作流和高级功能(如查询转换、文档后处理)。

核心功能

- 查询向量数据库并将结果附加到用户 prompt。 - 支持自定义 PromptTemplate 来控制上下文合并方式。 - 支持动态过滤表达式(FILTER_EXPRESSION)。

- 支持查询转换(queryTransformers)、文档检索(documentRetriever)和文档后处理(DocumentPostProcessor)。 - 更灵活的模块化配置。

配置方式

通过 QuestionAnswerAdvisor.Builder 配置,例如设置相似性阈值(similarityThreshold)、返回结果数量(topK)、过滤表达式和自定义模板。

通过 RetrievalAugmentationAdvisor.Builder 配置,支持更丰富的组件(如 queryTransformers 和 DocumentPostProcessor)。

动态性

支持运行时通过 FILTER_EXPRESSION 参数动态调整检索过滤条件。

除支持 FILTER_EXPRESSION 外,还支持动态调整查询转换和文档后处理逻辑。

自定义模板

支持通过 PromptTemplate 自定义如何将检索到的上下文与用户查询合并。

不直接提供 PromptTemplate 配置,但可以通过 queryAugmenter 或其他组件间接控制上下文增强逻辑。

空上下文处理

默认情况下会返回检索到的上下文,需显式处理空上下文的情况。

默认不允许空上下文,但可通过 allowEmptyContext(true) 配置允许空上下文。

高级功能

功能较为简单,专注于基本的 RAG 流程。

支持高级功能,如查询重写(RewriteQueryTransformer)、文档重新排序、内容压缩等。

依赖要求

无需额外的依赖,直接包含在 Spring AI 核心模块中。

需添加 spring-ai-rag 依赖以使用模块化 RAG 功能。

适用场景

适用于简单的 RAG 应用,例如直接从向量数据库检索相关文档并生成回答。

适用于需要复杂 RAG 工作流的场景,例如需要优化查询、重新排序文档或处理大规模数据。

3. 使用场景的区别

  • QuestionAnswerAdvisor:
  1. 适合场景:
  •         简单的问答系统,例如基于知识库的 FAQ 回答。
  •         需要快速将向量数据库的检索结果附加到用户查询并生成回答。
  •         对 prompt 模板有一定定制需求,但不需要复杂的查询优化或文档处理。

示例场景:企业内部文档查询系统,用户提问后直接从向量数据库检索相关文档并生成回答。

  • RetrievalAugmentationAdvisor:
  1. 适合场景:
  • 复杂的 RAG 应用,例如需要优化用户查询(query rewriting)或对检索到的文档进行重新排序、压缩。
  • 大规模知识库场景,需要处理噪声数据或提高检索结果的相关性。
  • 需要模块化设计以支持未来的扩展或自定义 RAG 流程。示例场景:学术研究系统,需对用户查询进行改写以提高检索精准度,并对检索到的文档进行重新排序以确保相关性。

4. 总结QuestionAnswerAdvisor 适合简单的 RAG 场景,易于使用,专注于将向量数据库检索结果附加到用户查询并生成回答。RetrievalAugmentationAdvisor 适合复杂 RAG 场景,提供模块化设计,支持查询转换、文档后处理等高级功能。

        选择建议:

  • 如果你的应用需求简单,当前使用的 QuestionAnswerAdvisor 已经足够。
  • 如果需要查询优化、文档后处理或更灵活的 RAG 流程,考虑切换到 RetrievalAugmentationAdvisor,但需添加相应依赖并调整代码。
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐