03-RAG Agent-集成百炼知识库(Spring AI Alibaba)
RAG Agent 实现
RAG(Retrieval Augmented Generation,检索增强生成)是用来改善大模型生成内容质量的一种技术,通过 ETL(Extract,Transform 和 Load)流程对数据进行处理,即先从文档读取数据,进行转换,之后写入到向量数据库供检索。
ETL 流程包括了数据提取、数据转换和加载数据:
(1)数据提取:通常从 pdf、markdown、csv 等文件中提取数据。
**(2)数据转换:**提取数据之后,需要将数据切分为更小的块,便于存储和检索,分块的方式通常有:
- **按语义分块:**确保块内的语义连贯性,并且通常会设置分段重叠长度,即。
- **按树分块:**将章、节、小节等内容组装成树后入库,增强对文档结构的感知能力。例如章节 A 下边包含了 a、b、c 三个小节,通过按树分块的方式就可以感知到 A 和 a、b、c 之间的关联关系,如果按照语义分块就不行。
- **压缩存储:**增强对重点内容的感知。比如对于大段文字,可以通过大模型提炼成摘要(重点内容可以通过关键词的方式引导大模型生成摘要),降低相关性较低的内容对大模型的影响。
**(3)加载数据:**数据转换之后就可以加载到向量数据库中进行存储。
传统 RAG 与 Agentic RAG
传统 RAG 通常基于用户提问内容,到向量数据库中进行检索,存在以下局限性:
- 数据源单一:从单一数据源检索数据,缺乏网页检索、第三方 API 检索方式,数据丰富度不足。
- 检索结果受用户输入影响:直接根据用户问题进行检索,如果用户问题与意图偏离较大,可能会检索不到用户想要的数据。
基于传统 RAG 存在的局限性,Agentic RAG 从以下几种方面解决:
- Agent 工具调用能力:基于多 Agent 能力,为不同 Agent 添加不同的 MCP 工具,可以从网页、第三方平台等多种数据源中检索数据。
- 查询扩展:基于大模型的内容生成能力,从多个角度将用户问题扩展为多个,分别进行检索。
- 检索结果评估:基于 Agent 能力对检索结果进行评估,如果评估缺少内容,则给出反馈循环进行检索。
Spring AI Alibaba 集成百炼知识库
Spring AI Alibaba 深度集成了阿里云百炼,基于百炼的知识库可以快速搭建一个 RAG 应用,本节代码位于:https://github.com/1020325258/spring-ai-alibaba-tutorial/tree/master/02-spring-ai-alibaba-rag。
上边我们介绍了 ETL 流程,包括了数据提取、数据转换、加载数据,借助于百炼知识库已经实现的 ETL 能力,我们可以在代码中直接连接百炼知识库进行数据检索。
知识库创建
首先需要在百炼平台创建一个知识库:https://bailian.console.aliyun.com/?tab=app#/knowledge-base
定义 Retriever
Spring AI 提供了 DocumentRetriever 接口,定义了文档检索的规范。
Spring AI Alibaba 基于该接口实现了 DashScopeDocumentRetriever,用于快速整合百炼的知识库,如下:
@Test
public void test_rag_retrieval() throws GraphStateException {DashScopeApi dashScopeApi = DashScopeApi.builder().apiKey(System.getenv("AI_DASHSCOPE_API_KEY")).build();DashScopeDocumentRetriever documentRetriever = new DashScopeDocumentRetriever(dashScopeApi, DashScopeDocumentRetrieverOptions.builder()// IndexName 就是百炼知识库的名称.withIndexName("面试解析生成")// 最小相关性分数阈值.withRerankMinScore(0.6f)// 不重写结果.withEnableRewrite(false).build());List<Document> retrieve = documentRetriever.retrieve(new Query("sql的更新流程"));for (Document document : retrieve) {logger.info(document.getText());}
}
整合百炼的知识库只需要两个步骤:
- 定义 DashScopeApi:内部封装了和百炼平台进行 API 交互的逻辑。
- 定义 DashScopeDocumentRetriever:内部封装了从百炼知识库检索数据的逻辑,通过 DashScopeApi 向百炼平台发送请求,检索数据。
知识库检索请求参数
在定义 DashScopeDocumentRetriever 可以设置请求参数(DashScopeDocumentRetrieverOptions),参含义如下:
- index_name:在百炼平台创建的知识库的名称。
- rerank_min_score:最小相关性分数阈值,低于该阈值的文档不返回。
- enable_rewrite:是否允许重写检索后的结果。
- rerank_top_n:返回排名前 n 条数据。
- …
最终,通过 documentRetriever.retrieve() 得到的检索结果如下:
1.连接器接收客户端连接,并进行认证、授权操作。
2.对SQL进行语法分析、词法分析,并通过优化器决定要使用的索引,并生成执行计划。
3.通过执行器进行数据更新。在执行器进行数据更新时,涉及到对两个很重要的日志binlog和redo log的写入,流程如下:
4.判断update更新的数据所在的数据页是否在内存中,如果不在,则需要将数据从磁盘读入BufferPool (MySQL中的一个内存结构)。
5.执行器更新BufferPool中的该行数据。
6.存储引擎InnoDB将该更新操作记录到redo log中, 并将该redo log 的状态设置为 prepare。
7.执行器生成binlog, 并将binlog写入磁盘。
8.此时,提交事务, 存储引擎InnoDB会将该更新操作的 redo log 状态设置为 commit状态, 表示事务已提交。
9.IO线程会不定期把 BufferPool中的脏数据(仅在内存中更新,还未刷入磁盘中的数据)刷入磁盘,完成数据的持久化。
由于关闭了重写(enable_rewrite),检索结果与知识库中的内容是完全一致的,下图为知识库中的 pdf 文档:
RagAgent
上边介绍了如何通过 Spring AI Alibaba 快速集成百炼的知识库,但是这种方式需要我们手动调用 retrieve() 方法来检索数据。
Spring AI 提供了 Advisors API,作为切面用于增强应用与 AI 模型的交互,创建好 Advisor 之后,直接配置在 ChatClient 内部,就可以自动执行 Advisor 内部的逻辑。
Spring AI Alibaba 基于 DashScopeDocumentRetriever 封装了 DocumentRetrievalAdvisor,可以直接配置在 ChatClient 内部,快速实现一个具备 RAG 能力的 Agent。
RagAgent 定义
以 Spring AI Alibaba 实现的 RAG 数据检索 DocumentRetrievalAdvisor 为例,只需要通过以下方式创建 Advisor 配置到 ChatClient 即可:
@Bean
public ChatClient ragAgent(ChatClient.Builder builder, DashScopeApi dashScopeApi) {// 定义 DocumentRetriever 检索器DashScopeDocumentRetriever documentRetriever = new DashScopeDocumentRetriever(dashScopeApi, DashScopeDocumentRetrieverOptions.builder().withIndexName("面试解析生成")// 最小相关性分数阈值.withRerankMinScore(0.6f)// 是否允许答案进行重写.withEnableRewrite(false).build());// 定义 AdvisorDocumentRetrievalAdvisor documentRetrievalAdvisor = new DocumentRetrievalAdvisor(documentRetriever);return builder.defaultAdvisors(List.of(documentRetrievalAdvisor)).build();
}
ChatClient 配置好 Advisor 之后,在 ChatClient 与 AI 模型交互的前后,会执行 Advisor 中的逻辑,DocumentRetrievalAdvisor 内部的逻辑如下:
- 请求 AI 模型前:通过 DocumentRetriever 从知识库检索数据,并将检索到的数据拼接到用户提示词的后边,之后一起发送给 AI 模型。
- 请求 AI 模型后:将基于 RAG 检索到的数据放入到 Response 的 metadata 中,记录生成内容所参考的数据。
总结
本节主要介绍了 RAG 中的 ETL 流程中涉及的技术,并且分析了传统 RAG 存在的局限性,以及 Agentic RAG 如何去解决。
基于 Spring AI Alibaba 提供了 RAG Advisor 快速实现了 RagAgent,集成了百炼的知识库,实现了 ETL 流程中的数据检索。
数据转换、数据存储对应的处理类为 DashScopeCloudStore、DashScopeDocumentTransformer,这里由于数据的存储和转换直接利用了百炼知识库的能力,因此没有配置这两个处理类,原理都与 DashScopeDocumentRetriever 类似,内部基于 DashScopeApi 与百炼进行交互。