SpringAI框架中的RAG知识库检索与增强生成模型详解

news2025/5/12 10:08:09

SpringAI框架中的RAG知识库检索与增强生成模型详解

一、RAG简介

RAG(Retrieval-Augmented Generation)可以通过检索知识库,克服大模型训练完成后参数冻结的局限性,携带知识让大模型根据知识进行回答。

二、SpringAI框架支持的RAG模块

SpringAI框架提供了模块化的API来支持RAG,主要包括:

  • QuestionAnswerAdvisor
  • RetrievalArgumentAdvisor

1. QuestionAnswerAdvisor

提供简单便捷的RAG流功能,只需指定简单参数即可进行知识库检索。 示例代码:

QuestionAnswerAdvisor questionAnswerAdvisor = QuestionAnswerAdvisor.builder(vectorStore)
    .searchRequest(SearchRequest.builder()
        .similarityThreshold(0.5)  // 只返回相似度高于0.5的结果
        .topK(3)                  // 只返回前三个结果
        .filterExpression(newFilterExpressionBuilder().eq("a","b").build())  // 只检索a==b的文档
        .build())
    .build();

ChatClient chatClient = ChatClient.builder(openAiChatModel)
    .defaultOptions(OpenAiChatOptions.builder().model("gpt-3.5-turbo").build())
    .build();

ChatResponse response = chatClient.prompt().advisors(questionAnswerAdvisor)
    .user(u -> u.text("你好"))
    .call().chatResponse();

动态添加过滤条件示例:

chatClient.prompt().user(u -> u.text("hello"))
    .advisors(a -> a.param(QuestionAnswerAdvisor.FILTER_EXPRESSION, "a==b"))
    .call().chatResponse();

这里的lambda表达式中的aAdvisorContext.Builder实例,param()用于共享参数,advisor自动完成检索和拼接。

2. RetrievalArgumentAdvisor

提供更丰富功能,支持自定义检索前预处理、检索、检索后处理及生成。

简单RAG实现示例:
Advisor retrievalAugmentationAdvisor = RetrievalAugmentationAdvisor.builder()
    .documentRetriever(VectorStoreDocumentRetriever.builder()
        .similarityThreshold(0.50)
        .vectorStore(vectorStore)
        .build())
    .build();

String answer = chatClient.prompt()
    .advisors(retrievalAugmentationAdvisor)
    .user(question)
    .call()
    .content();
检索前预处理
  • CompressionQueryTransformer:压缩用户提问,适合长对话上下文。

    Query query = Query.builder()
        .text("And what is its second largest city?")
        .history(newUserMessage("What is the capital of Denmark?"),
                 newAssistantMessage("Copenhagen is the capital of Denmark."))
        .build();
    
    QueryTransformer transformer = CompressionQueryTransformer.builder()
        .chatClientBuilder(chatClientBuilder)
        .build();
    
    Query transformedQuery = transformer.transform(query);
    

    也可让advisor自动完成:

    CompressionQueryTransformer compressionQueryTransformer = CompressionQueryTransformer.builder()
        .chatClientBuilder(ChatClient.builder(openAiChatModel))
        .build();
    
    RetrievalAugmentationAdvisor retrievalAugmentationAdvisor = RetrievalAugmentationAdvisor.builder()
        .documentRetriever(VectorStoreDocumentRetriever.builder().build())
        .queryTransformers(compressionQueryTransformer)
        .build();
    
    ChatClient.builder(openAiChatModel).build().prompt()
        .user(u -> u.text("中国第二大的城市是哪里"))
        .messages(newUserMessage("中国首都城市是哪里"))
        .messages(newAssistantMessage("北京"))
        .advisors(retrievalAugmentationAdvisor)
        .call().chatResponse();
    
  • RewriteQueryTransformer:重写用户输入以优化检索。

    QueryTransformer queryTransformer = RewriteQueryTransformer.builder()
        .chatClientBuilder(chatClientBuilder)
        .build();
    
  • TranslationQueryTransformer:翻译查询为目标语言。

    QueryTransformer transformer = TranslationQueryTransformer.builder()
        .chatClientBuilder(chatClientBuilder)
        .targetLanguage("english")
        .build();
    
  • MultiQueryExpander:生成多个查询拓展以获取更多相关结果。

    MultiQueryExpander expander = MultiQueryExpander.builder()
        .chatClientBuilder(chatClientBuilder)
        .numberOfQueries(3)
        .includeOriginal(false)
        .build();
    
检索阶段
  • VectorStoreDocumentRetriever:向量库检索相似文档。
    VectorStoreDocumentRetriever vectorStoreDocumentRetriever = VectorStoreDocumentRetriever.builder()
        .vectorStore(vectorStore)
        .topK(4)
        .filterExpression(newFilterExpressionBuilder().eq("a","b").build())
        .similarityThreshold(0.4)
        .build();
    
    List<Document> documents = vectorStoreDocumentRetriever.retrieve(newQuery("What is the main character of the story?"));
    

    也可以交给advisor自动完成。

检索后处理
  • 重新排序文档
  • 删除无关或重复文档
  • 压缩文档内容减少干扰
生成阶段
  • ContextualQueryAugmenter:将检索到的内容拼接到用户提问中。
    ContextualQueryAugmenter contextualQueryAugmenter = ContextualQueryAugmenter.builder()
        .allowEmptyContext(false) // 不允许空内容
        .build();
    

    主要功能:

    • 检查检索结果是否为空
    • 非空时拼接检索结果注入提示模板
    • 空且不允许空上下文时,设置空变量并指示模型不根据知识回答
    • 允许空上下文时直接放行

以上即为SpringAI框架中RAG功能的详细介绍及示例代码,涵盖了从简单到复杂的知识库检索与增强生成流程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2372862.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第三节:Vben Admin 最新 v5.0 对接后端登录接口(下)

文章目录 前言一、处理请求头Authorization二、/auth/user/info 接口前端接口后端接口三、/auth/codes 接口1.前端2.后端四、测试接口前言 上一节内容,实现了登录的/auth/login 接口,但是登陆没有完成,还需要完成下面两个接口。才能完成登录。 一、处理请求头Authorizatio…

爬虫学习————开始

&#x1f33f;自动化的思想 任何领域的发展原因————“不断追求生产方式的改革&#xff0c;即使得付出与耗费精力越来愈少&#xff0c;而收获最大化”。由此&#xff0c;创造出方法和设备来提升效率。 如新闻的5W原则直接让思考过程规范化、流程化。或者前端框架/后端轮子的…

Ubuntu18.04搭建samda服务器

一.什么是Samba服务器&#xff1f; Samba服务器是一种基于开源协议实现的网络共享服务软件&#xff0c;主要用于在不同操作系统&#xff08;如Windows、Linux、Unix&#xff09;之间实现文件和打印机共享功能。其核心目标是解决跨平台资源共享的兼容性问题&#xff0c;尤其是在…

2025-05-10-FFmepg库裁切有水印的视频

裁后 代码 import subprocess# 文件路径 input_video_path "bg_video.mp4" output_video_path "output_video_cropped.mp4"# 裁剪视频下方的水印 def crop_video(input_video_path, output_video_path, crop_height):# 获取视频的分辨率def get_video…

opencv+opencv_contrib+cuda和VS2022编译

本文介绍使用OpenCV和OpenCV_Contrib源码及Cuda进行编译的过程&#xff0c;编译过程中会用到OpenCV、OpenCV_Contrib、CUDA Toolkit、cuDNN、Cmake、VS2022等工具&#xff0c;最终编译OpenCV的Cuda版本。 一、OpenCV下载地址 OpenCV官网下载地址:https://opencv.org/releases…

网工实验——OSPF配置

网络拓扑图 配置 1.为每个路由器配置接口&#xff08;略&#xff09;&#xff08;详细见RIP实验&#xff09; 2.配置OSPF AR1 [AR1]ospf [AR1-ospf-1]area 1 [AR1-ospf-1-area-0.0.0.1]network 172.16.1.1 0.0.0.0 #精确配置网络&#xff0c;也可以像下面那条命令那样配置 …

数据库系统概论-基础理论

数据库系统概述&#xff1a; 1、记录&#xff1a;计算机中表示和存储数据的一种格式或方法。 2、数据库&#xff08;DataBase, DB&#xff09;&#xff1a;数据库是长期储存在计算机内、有组织、可共享的大量数据集合。可为各种用户共享。 3、数据库管理系统&#xff08;Dat…

从零开始学习人工智能(Python高级教程)Day6-Python3 正则表达式

一、Python3 正则表达式 正则表达式是一个特殊的字符序列&#xff0c;它能帮助你方便的检查一个字符串是否与某种模式匹配。 在 Python 中&#xff0c;使用 re 模块来处理正则表达式。 re 模块提供了一组函数&#xff0c;允许你在字符串中进行模式匹配、搜索和替换操作。 r…

Qt开发:项目视图(Item Views)的介绍和使用

文章目录 一、清单视图&#xff08;List View&#xff09;1.1 基本概念1.2 使用示例&#xff08;文字列表&#xff09;1.3 图标文字&#xff08;图标模式&#xff09;1.4 常用设置1.5 完整示例 二、树视图&#xff08;Tree View&#xff09;2.1 基本概念2.2 常用类简介2.3 快速…

keepalived详细笔记

keepalived 是一种基于VRRP&#xff08;虚拟路由器冗余协议&#xff09;的高可用解决方案&#xff0c;主要是用于服务器的负载均衡和高可用性的保障&#xff0c;自动将服务切换到备份服务器上&#xff0c;确保业务的连续性。 工作原理&#xff1a; VRRP协议&#xff1a;一组路…

xLua笔记

Generate Code干了什么 肉眼可见的&#xff0c;在Asset文件夹生成了XLua/Gen文件夹&#xff0c;里面有一些脚本。然后对加了[CSharpCallLua]的变量寻找引用&#xff0c;发现它被XLua/Gen/DelegatesGensBridge引用了。也可以在这里查哪些类型加了[CSharpCallLua]。 public over…

一周学会Pandas2 Python数据处理与分析-Pandas2数据排序操作

锋哥原创的Pandas2 Python数据处理与分析 视频教程&#xff1a; 2025版 Pandas2 Python数据处理与分析 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili Pandas 2提供了多种灵活的数据排序方法&#xff0c;主要针对 DataFrame 和 Series 对象。 1. 按值排序&#xff1a;s…

lvm详细笔记

LVM简介 逻辑卷管理器&#xff0c;是Linux 系统中用于管理磁盘储存的关键技术。 LVM 则打破了磁盘分区一旦确定&#xff0c;其大小调整往往较为复杂&#xff0c;且难以灵活应对业务变化这种限制&#xff0c;它允许用户将多个物理分区组合卷组。例如&#xff0c;系统中的多个物…

250505_HTML

HTML 1. HTML5语法与基础标签1.1 HTML5特性1.1.1 空白折叠现象1.1.2 转义字符 1.2 HTML注释1.3 基础标签1.3.1 div标签1.3.2 标题标签1.3.3 段落标签1.3.4 title1.3.5 meta 1.4 html骨架1.4.1 DTD1.4.2 html标签1.4.3 head与body标签 1.5 div标签详解1.5.1 常见class类名 2. 列…

【HarmonyOS NEXT+AI】问答05:ArkTS和仓颉编程语言怎么选?

在“HarmonyOS NEXTAI大模型打造智能助手APP(仓颉版)”课程里面&#xff0c;有学员提到了这样一个问题&#xff1a; 鸿蒙的主推开发语言不是ArkTS吗&#xff0c;本课程为什么使用的是仓颉编程语言&#xff1f; 这里就这位同学的问题&#xff0c;统一做下回复&#xff0c;以方便…

【专家库】Kuntal Chowdhury

昆塔尔乔杜里 Kuntal Chowdhury 是 NVIDIA 的 6G 开发者关系经理和技术布道师。他致力于推动与 NVIDIA 平台和工具的开发者和早期采用者生态系统的联系&#xff0c;以促进 6G 研究社区的蓬勃发展。在此之前&#xff0c;他是 BlueFusion, Inc. 的创始人&#xff0c;这是一家创新…

【代码优化篇】强缓存和协商缓存

强缓存和协商缓存 一、强缓存与协商缓存的区别二、Vue2 前端实现强缓存&#xff08;静态资源&#xff09;三、Spring Boot 后端实现协商缓存&#xff08;动态接口&#xff09;四、测试缓存效果五、注意事项 一、强缓存与协商缓存的区别 强缓存&#xff1a;浏览器直接读取本地缓…

电路中的DGND、GROUND、GROUND_REF的区别,VREF、VCC、VDD、VEE和VSS的区别?

目录 1 DGND、GROUND、GROUND_REF的区别 1.1 DGND&#xff08;Digital Ground&#xff09; 1.2 GROUND&#xff08;Ground&#xff09; 1.3 GROUND_REF&#xff08;Ground Reference&#xff09; 1.4 区别 2 VREF、VCC、VDD、VEE和VSS的区别 2.1 VREF&#xff08;Refere…

开始使用WebStorm

目录 开始使用WebStorm打开、检出或创建项目打开项目从版本控制系统检出项目的步骤创建一个空的WebStorm项目在项目中创建新文件的步骤 熟悉WebStorm用户界面找到你要找的代码查找项目符号的调用按名称查找项目符号搜索文本片段转到符号声明历史记录 补全代码实时检查并修复代码…

【计算机视觉】Car-Plate-Detection-OpenCV-TesseractOCR:车牌检测与识别

Car-Plate-Detection-OpenCV-TesseractOCR&#xff1a;车牌检测与识别技术深度解析 在计算机视觉领域&#xff0c;车牌检测与识别&#xff08;License Plate Detection and Recognition, LPDR&#xff09;是一个极具实用价值的研究方向&#xff0c;广泛应用于智能交通系统、安…