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