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

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功能的详细介绍及示例代码,涵盖了从简单到复杂的知识库检索与增强生成流程。

相关文章:

  • RAG 技术详解:如何让大模型更 “懂” 知识库?
  • O2O上门服务如何颠覆传统足浴行业?真实案例分析
  • 5 种距离算法总结!!
  • 详解 c++17 重载类 overload的每一条语句,附实例.
  • LintCode1343-两字符串和,1535-转换成小写字母
  • 强化学习三大基本方法-DP、MC、TD
  • setData执行后操作方法-微信小程序
  • AD 绘制原理图--元件的放置
  • 服务器多客户端连接核心要点(1)
  • 11.多用组合和少继承
  • 关税新政冲击波:海外仓成跨境电商角逐美国市场“利刃”?
  • OpenHarmony SystemUI开发——实现全局导航栏和状态栏关闭
  • powershell_bypass.cna 插件(适配 Cobalt Strike 4.0 的免费版本下载地址)
  • selenium替代----playwright
  • 分析NVIDIA的股价和业绩暴涨的原因
  • 计算机二级WPS Office第三套电子表格
  • 苍穹外卖--公共字段自动填充
  • Windows 忘记密码怎么办?
  • 深度解析动态IP业务核心场景:从技术演进到行业实践
  • 使用Python删除PDF中多余或空白的页面
  • 101条关于减重的知识,其中一定有你不知道的
  • 外卖员投资失败负疚离家流浪,经民警劝回后泣不成声给父母下跪
  • 教育部、国家发改委联合启动实施教师教育能力提升工程
  • 成立6天的公司拍得江西第三大水库20年承包经营权,当地回应
  • 陈雯出任外交部离退休干部局局长,此前为外交部办公厅副主任
  • 马上评|颜宁“简历打假”的启示