Spring AI高级RAG功能 Multi Query Expansion (多查询扩展)

发布于:2025-04-16 ⋅ 阅读:(45) ⋅ 点赞:(0)

1、多查询扩展是提高RAG系统检索效果的关键技术。在实际应用中,用户的查询往往是简短且不完整的,这可能导致检索结果不够准确或完整。Spring AI提供了强大的多查询扩展机制,能够自动生成多个相关的查询变体,从而提高检索的准确性和召回率。

  private final ChatClient openAiChatClient;

    private final ChatModel chatModel;

    private final MultiQueryExpander queryExpander;

    public RagController(ChatModel chatModel) {

        this.chatModel = chatModel;

//		 创建聊天客户端实例
// 设置系统提示信息,定义AI助手作为专业的室内设计顾问角色
        // 构造时,可以设置 ChatClient 的参数
        // {@link org.springframework.ai.chat.client.ChatClient};
        this.openAiChatClient = ChatClient.builder(chatModel)
                .defaultSystem("你是一位专业的室内设计顾问,精通各种装修风格、材料选择和空间布局。请基于提供的参考资料,为用户提供专业、详细且实用的建议。在回答时,请注意:\n" +
                        "1. 准确理解用户的具体需求\n" +
                        "2. 结合参考资料中的实际案例\n" +
                        "3. 提供专业的设计理念和原理解释\n" +
                        "4. 考虑实用性、美观性和成本效益\n" +
                        "5. 如有需要,可以提供替代方案")

                // 实现 Chat Memory 的 Advisor
                // 在使用 Chat Memory 时,需要指定对话 ID,以便 Spring AI 处理上下文。
                .defaultAdvisors(
                        new MessageChatMemoryAdvisor(new InMemoryChatMemory())
                )
                // 实现 Logger 的 Advisor
                .defaultAdvisors(
                        new SimpleLoggerAdvisor()
                )
                // 设置 ChatClient 中 ChatModel 的 Options 参数
                .defaultOptions(
                        OpenAiChatOptions.builder()
                                .topP(0.7)
                                .build()
                )

                .build();
        // 构建查询扩展器
// 用于生成多个相关的查询变体,以获得更全面的搜索结果
        queryExpander = MultiQueryExpander.builder()
                .chatClientBuilder(openAiChatClient.mutate())
                .includeOriginal(false) // 不包含原始查询
                .numberOfQueries(3) // 生成3个查询变体
                .build();


    }

在这个过程中,系统会自动生成多个相关的查询变体,例如当用户查询”请提供几种推荐的装修风格?”时,系统会生成多个不同角度的查询。这种方式不仅提高了检索的全面性,还能捕获用户潜在的查询意图。

完整代码

package com.alibaba.cloud.ai.example.chat.openai.controller;

import jakarta.servlet.http.HttpServletResponse;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
import org.springframework.ai.chat.memory.InMemoryChatMemory;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.openai.OpenAiChatOptions;
import org.springframework.ai.rag.Query;
import org.springframework.ai.rag.preretrieval.query.expansion.MultiQueryExpander;
import org.springframework.http.MediaType;
import org.springframework.http.codec.ServerSentEvent;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;

import java.util.List;

/**
 * @Author: wst
 * @Date: 2024-12-16
 */

@RestController
@RequestMapping("/rag")
public class RagController {

    private final ChatClient openAiChatClient;

    private final ChatModel chatModel;

    private final MultiQueryExpander queryExpander;

    public RagController(ChatModel chatModel) {

        this.chatModel = chatModel;

//		 创建聊天客户端实例
// 设置系统提示信息,定义AI助手作为专业的室内设计顾问角色
        // 构造时,可以设置 ChatClient 的参数
        // {@link org.springframework.ai.chat.client.ChatClient};
        this.openAiChatClient = ChatClient.builder(chatModel)
                .defaultSystem("你是一位专业的室内设计顾问,精通各种装修风格、材料选择和空间布局。请基于提供的参考资料,为用户提供专业、详细且实用的建议。在回答时,请注意:\n" +
                        "1. 准确理解用户的具体需求\n" +
                        "2. 结合参考资料中的实际案例\n" +
                        "3. 提供专业的设计理念和原理解释\n" +
                        "4. 考虑实用性、美观性和成本效益\n" +
                        "5. 如有需要,可以提供替代方案")

                // 实现 Chat Memory 的 Advisor
                // 在使用 Chat Memory 时,需要指定对话 ID,以便 Spring AI 处理上下文。
                .defaultAdvisors(
                        new MessageChatMemoryAdvisor(new InMemoryChatMemory())
                )
                // 实现 Logger 的 Advisor
                .defaultAdvisors(
                        new SimpleLoggerAdvisor()
                )
                // 设置 ChatClient 中 ChatModel 的 Options 参数
                .defaultOptions(
                        OpenAiChatOptions.builder()
                                .topP(0.7)
                                .build()
                )

                .build();
        // 构建查询扩展器
// 用于生成多个相关的查询变体,以获得更全面的搜索结果
        queryExpander = MultiQueryExpander.builder()
                .chatClientBuilder(openAiChatClient.mutate())
                .includeOriginal(false) // 不包含原始查询
                .numberOfQueries(3) // 生成3个查询变体
                .build();


    }


    @GetMapping("/multiQuery")
    public List<Query> multiQuery() {
// 执行查询扩展
// 将原始问题"请提供几种推荐的装修风格?"扩展成多个相关查询
        List<Query> queries = queryExpander.expand(
                new Query("请提供几种推荐的装修风格?"));
        return queries;
    }


}

效果如下:

多查询扩展的主要优势:

  1. 提高召回率:通过多个查询变体,增加相关文档的检索机会
  2. 覆盖不同角度:从不同维度理解和扩展用户的原始查询
  3. 增强语义理解:捕获查询的多种可能含义和相关概念
  4. 提升检索质量:综合多个查询结果,获得更全面的信息

网站公告

今日签到

点亮在社区的每一天
去签到