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