当前位置: 首页 > news >正文

Spring AI高级RAG功能查询重写和查询翻译

1、创建查询重写转换器

// 创建查询重写转换器
         queryTransformer = RewriteQueryTransformer.builder()
                .chatClientBuilder(openAiChatClient.mutate())
                .build();

查询重写是RAG系统中的一个重要优化技术,它能够将用户的原始查询转换成更加结构化和明确的形式。这种转换可以提高检索的准确性,并帮助系统更好地理解用户的真实意图。

Spring AI提供了RewriteQueryTransformer来实现查询重写功能。以下是一个具体的示例:

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.ai.rag.preretrieval.query.transformation.QueryTransformer;
import org.springframework.ai.rag.preretrieval.query.transformation.RewriteQueryTransformer;
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;

   private final QueryTransformer queryTransformer;

    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();
// 创建查询重写转换器
         queryTransformer = RewriteQueryTransformer.builder()
                .chatClientBuilder(openAiChatClient.mutate())
                .build();


    }


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

    @GetMapping("/rewriteQuery")
    public String rewriteQuery( ) {
//        查询重写的主要优势:查询明确化:将模糊的问题转换为具体的查询点
//
//这种转换不仅有助于系统检索到更相关的文档,还能帮助生成更全面和专业的回答。

        // 创建一个模拟用户学习AI的查询场景
        Query query = new Query("我正在学习人工智能,什么是大语言模型?");
// 执行查询扩展
// 将原始问题"请提供几种推荐的装修风格?"扩展成多个相关查询
        // 执行查询重写
        Query transformedQuery = queryTransformer.transform(query);
        String rewirte = transformedQuery.text();

// 输出重写后的查询
        System.out.println(rewirte);
        return rewirte;
    }


}

重写后的查询可能会变成:

什么是大语言模型?

查询重写的主要优势:查询明确化:将模糊的问题转换为具体的查询点

这种转换不仅有助于系统检索到更相关的文档,还能帮助生成更全面和专业的回答

2、查询翻译

查询翻译是RAG系统中的一个实用功能,它能够将用户的查询从一种语言翻译成另一种语言。这对于多语言支持和跨语言检索特别有用。Spring AI提供了TranslationQueryTransformer来实现这一功能。

// 创建查询翻译转换器,设置目标语言为中文
        
 translationQueryTransformer = TranslationQueryTransformer.builder()
                .chatClientBuilder(openAiChatClient.mutate())
                .targetLanguage("chinese")  // 设置目标语言为中文
                .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.ai.rag.preretrieval.query.transformation.QueryTransformer;
import org.springframework.ai.rag.preretrieval.query.transformation.RewriteQueryTransformer;
import org.springframework.ai.rag.preretrieval.query.transformation.TranslationQueryTransformer;
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;

   private final QueryTransformer queryTransformer;

    private  QueryTransformer translationQueryTransformer;

    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();
// 创建查询重写转换器
         queryTransformer = RewriteQueryTransformer.builder()
                .chatClientBuilder(openAiChatClient.mutate())
                .build();


// 创建查询翻译转换器,设置目标语言为中文
         translationQueryTransformer = TranslationQueryTransformer.builder()
                .chatClientBuilder(openAiChatClient.mutate())
                .targetLanguage("chinese")  // 设置目标语言为中文
                .build();

    }


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

    @GetMapping("/rewriteQuery")
    public String rewriteQuery( ) {
//        查询重写的主要优势:查询明确化:将模糊的问题转换为具体的查询点
//
//这种转换不仅有助于系统检索到更相关的文档,还能帮助生成更全面和专业的回答。

        // 创建一个模拟用户学习AI的查询场景
        Query query = new Query("我正在学习人工智能,什么是大语言模型?");
// 执行查询扩展
// 将原始问题"请提供几种推荐的装修风格?"扩展成多个相关查询
        // 执行查询重写
        Query transformedQuery = queryTransformer.transform(query);
        String rewirte = transformedQuery.text();

// 输出重写后的查询
        System.out.println(rewirte);
        return rewirte;
    }

    @GetMapping("/translationQuery")
    public String translationQuery( ) {
        Query query = new Query("What is LLM?");
// 执行查询翻译
        Query transformedQuery = translationQueryTransformer.transform(query);
// 输出翻译后的查询
        String transforme = transformedQuery.text();
        System.out.println(transforme);
        return transforme;
    }


}

查询翻译的主要优势:

  1. 多语言支持:支持不同语言之间的查询转换
  2. 本地化处理:将查询转换为目标语言的自然表达方式
  3. 跨语言检索:支持在不同语言的文档中进行检索
  4. 用户友好:允许用户使用自己熟悉的语言进行查询

相关文章:

  • 掌趣科技前端面试题及参考答案
  • 用AI改写生意底层逻辑 深圳天天送为线下万店赋能“数字飞轮”
  • 2025年常见渗透测试面试题- 常见中间件(题目+回答)
  • 山东大学软件学院项目实训-基于大模型的模拟面试系统-专栏管理部分
  • 代码随想录算法训练营Day27
  • vulkanscenegraph显示倾斜模型(5.9)-vsg中vulkan资源的编译
  • 多模态大语言模型arxiv论文略读(十三)
  • 【使用jenkins+docker自动化部署java项目】
  • MacOs下解决远程终端内容复制并到本地粘贴板
  • Web渗透之文件包含漏洞
  • 分层对象模型:PO、DTO、VO、BO定义区别与使用场景
  • win10中快速访问部分外网的快捷设置方法
  • 【已更新完毕】2025泰迪杯数据挖掘竞赛B题数学建模思路代码文章教学:基于穿戴装备的身体活动监测
  • MySQL中的隐式转换和显式转换
  • 2025认证杯挑战赛B题【 谣言在社交网络上的传播 】原创论文讲解(含完整python代码)
  • java学习总结(if switch for)
  • Go:方法
  • 【Java】查看当前 Java 使用的垃圾回收器
  • 【GitHub探索】mcp-go,MCP协议的Golang-SDK
  • AVL搜索树
  • 山东:小伙为救同学耽误考试属实,启用副题安排考试
  • 佩斯科夫:若普京认为必要,将公布土耳其谈判俄方代表人选
  • 普京提议恢复直接谈判,泽连斯基:望俄明日停火,乌愿谈判
  • 报告:4月份新增发行的1763亿元专项债中,投向房地产相关领域约717亿元
  • 国家发改委:美芯片药品等领域关税影响全球科技发展,损害人类共同利益
  • 欧洲承诺投资6亿欧元吸引外国科学家