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功能的詳細介紹及示例代碼,涵蓋了從簡單到復雜的知識庫檢索與增強生成流程。