spring ai 实战RAG(4)-模块化RAG

模块化RAG

Spring AI其实也提供了Modular RAG的支持,他的核心组件就是RetrievalAugmentationAdvisor

RetrievalAugmentationAdvisor 封装了完整的 RAG 流程,包括:

  • 查询预处理(查询重写、查询扩展等)
  • 文档检索(从向量数据库做检索)
  • 上下文后处理(如文档合并等)
  • 提示增强(将检索结果与用户问题合并)

RetrievalAugmentationAdvisor也是一个Advisor,他的用法和其他Advisor一样。

包含以下组件:

DocumentRetriever

DocumentRetriever作用是从外部知识源(如向量数据库、全文搜索引擎等)中根据用户查询语义检索出最相关的文档片段(chunks),为大语言模型(LLM)提供上下文支持,从而提升回答的准确性与事实性。

他的主要实现是VectorStoreDocumentRetriever,基于向量相似度从 VectorStore 中检索文档

QueryTransformer

问题改写增强转换组件,spring ai 默认有三种实现

  • CompressionQueryTransformer:问题压缩富化
  • RewriteQueryTransformer:问题改写
  • TranslationQueryTransformer: 问题翻译

QueryExpander

多元化查询 ,生成多个问题,默认实现 MultiQueryExpander

QueryAugmenter

QueryAugmenter 的作用是在检索完成后、模型生成回答之前,对原始查询进行"上下文增强"。它会根据当前对话内容、历史记录,为查询构建新的提示词,使模型在生成最终回答时理解更充分

与上面介绍的 QueryTransformer 不同,QueryTransformer是作用于检索前,QueryAugmenter 更专注于在生成前增强上下文,确保回答更加准确

DocumentJoiner

DocumentJoiner 是 RAG 流程中的"文档合并器"。当检索到多个文本块的时候,它负责将这些检索返回的文本块简单拼接成一个统一的文档列表,并做基本的去重与按相似度分数排序,最终输出供大模型生成回答的上下文内容

java 复制代码
@RestController
@RequestMapping("/rag/modular")
public class ModularRagController implements InitializingBean {


    @Autowired
    private DashScopeChatModel dashScopeChatModel;

    @Autowired
    private VectorStore vectorStore;

    private ChatClient chatClient;


    @GetMapping("retriever")
    public String retriever(String question) {
        // DocumentRetriever 文档检索器,用于从向量存储中检索最相关的文档
        DocumentRetriever retriever = VectorStoreDocumentRetriever.builder()
                .vectorStore(vectorStore)
                .topK(5)
                .similarityThreshold(0.8)
                .build();

        //当用户有多轮对话时,把当前问题"压缩成一个完整且独立的查询",避免丢失上下文。类比的话,其实这就是我们前面问题重写的富化功能,也就是说将历史对话,以及用户当前问题,进行总结输出一个丰富完整的、补充好代词主语的新Query
        ChatClient.Builder builder = ChatClient.builder(dashScopeChatModel);
        QueryTransformer queryTransformer = CompressionQueryTransformer.builder().chatClientBuilder(builder).build();

        //这个其实就是把用户原始问题"改写成更利于检索的关键词问法"。可能会去除掉一些冗余的表达、口语化的连接词、介词等等,使得问题更加具体。但是他是没有上下文关联的,也就是说对于多轮会话,他无法替换一些代词
        QueryTransformer rewriteQueryTransformer = RewriteQueryTransformer.builder()
                .chatClientBuilder(builder)
                .build();
        // 翻译问题
        QueryTransformer translationQueryTransformer = TranslationQueryTransformer.builder()
                .chatClientBuilder(builder)
                .build();

        // 多元化查询   ,生成多个问题
        QueryExpander queryExpander = MultiQueryExpander.builder()
                .chatClientBuilder(builder)
                .numberOfQueries(2)
                .includeOriginal(true)
                .build();

        //QueryAugmenter 的作用是在检索完成后、模型生成回答之前,对原始查询进行"上下文增强"。它会根据当前对话内容、历史记录,为查询构建新的提示词,使模型在生成最终回答时理解更充分。
        //
        //与上面介绍的 QueryTransformer 不同,QueryTransformer是作用于检索前,QueryAugmenter 更专注于在生成前增强上下文,确保回答更加准确
        QueryAugmenter queryAugmenter = ContextualQueryAugmenter.builder()
                .allowEmptyContext(true)
                .build();
        //DocumentJoiner 是 RAG 流程中的"文档合并器"。当检索到多个文本块的时候,它负责将这些检索返回的文本块简单拼接成一个统一的文档列表,并做基本的去重与按相似度分数排序,最终输出供大模型生成回答的上下文内容
        DocumentJoiner documentJoiner = new ConcatenationDocumentJoiner();
        RetrievalAugmentationAdvisor advisor = RetrievalAugmentationAdvisor.builder()
                .documentRetriever(retriever)
                .queryTransformers(List.of(queryTransformer, rewriteQueryTransformer, translationQueryTransformer))
                .queryAugmenter(queryAugmenter)
                .queryExpander(queryExpander)
                .documentJoiner(documentJoiner)
                .build();

        return chatClient.prompt(question).advisors(advisor).call().content();
    }


    @Override
    public void afterPropertiesSet() throws Exception {
        chatClient = ChatClient.builder(dashScopeChatModel).defaultAdvisors(new SimpleLoggerAdvisor()).build()
    }
}
相关推荐
人工智能技术咨询.5 分钟前
具身智能中的世界模型训练
人工智能
LaughingZhu5 分钟前
Product Hunt 每日热榜 | 2026-10-06
人工智能·深度学习·神经网络·搜索引擎·百度
AOI小白新手上路9 分钟前
AOI 缺陷检测复现实操指南:Anomalib + MVTec AD(glass)与 YOLOv8 + NEU-DET 两条路线
人工智能·深度学习·yolo
henrylin99991 小时前
RD-AGENT 第一讲 · AI 因子工厂是怎么运转的
人工智能
高洁011 小时前
具身智能中的世界模型训练
人工智能·python·深度学习·机器学习·transformer
无线通信科研笔记1 小时前
IEEE TVT 2026 论文精读与完整复现|相位误差如何重塑近场 RIS 的幅相响应
论文阅读·人工智能·python·算法·论文笔记
字节渡客1 小时前
Redis键明明过期了,业务还在读到旧数据
数据库·redis·spring
Devlive 开源社区1 小时前
AuthX 正式更名 GrantForge:我们重新做了一遍权限管理系统
大数据·人工智能·架构
朝朝辞暮i1 小时前
VLA 系统学习第 1 课:VLA 到底在干什么?
人工智能·python·计算机视觉·vla
鲲穹AI种草1 小时前
AI 壁纸生成工具怎么选?鲲穹 AI 壁纸工具功能实测与横向对比
人工智能·壁纸生成工具