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

发布于:2025-05-10 ⋅ 阅读:(14) ⋅ 点赞:(0)

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


网站公告

今日签到

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