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

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

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.xdnf.cn/news/5241.html

相关文章:

  • CNN处理图片
  • 关于 OpenGL 的上下文、线程和共享上下文之间的关系
  • Dive into LVGL (1) —— How LVGL works from top to down
  • 期货反向跟单—数据分析误区(二)盘手排名
  • 60分钟示范课设计-《Python循环语句的奥秘与应用进阶》
  • 第J7周:对于ResNeXt-50算法的思考
  • 网上商城系统
  • 【嵌入式系统设计师(软考中级)】第二章:嵌入式系统硬件基础知识——⑤电源及电路设计
  • 全国青少年信息素养大赛 Python编程挑战赛初赛 内部集训模拟试卷四及详细答案解析
  • 解决librechat 前端界面没有google gemini 2.5模型的选项
  • 【c语言】动态内存管理
  • 各种注解含义及使用
  • 心 光 -中小企实战运营和营销工作室博客
  • 微机控制高温扭转试验机
  • 关于AI 大数据模型的基础知识 杂记
  • 数字化与信息化的关系
  • 4.3 Thymeleaf案例演示:图书管理
  • 军事目标无人机视角坦克检测数据集VOC+YOLO格式4003张1类别
  • 44.辐射发射整改简易摸底测试方法
  • 企业名录搜索软件哪家好?
  • 6.01 Python中打开usb相机并进行显示
  • 动态创建链表(头插法、尾插法)
  • RISC-V CLINT、PLIC及芯来ECLIC中断机制分析 —— RISC-V中断机制(一)
  • Linux探秘坊-------12.库的制作与原理
  • java-----------------多态
  • 跨平台编码规范文档
  • c++:标准模板库 STL(Standard Template Library)
  • 【Go底层】http标准库服务端实现原理
  • 设计模式-迭代器模式
  • 【MySQL数据库】--SQLyog创建数据库+python连接