SpringAI框架中的RAG模塊詳解及應用示例

SpringAI框架中的RAG模塊詳解及應用示例

RAG(Retrieval-Augmented Generation)可以通過檢索知識庫,克服大模型訓練完成后參數凍結的局限性,攜帶知識讓大模型根據知識進行回答。SpringAI框架提供了模塊化的API來支持RAG,主要包括QuestionAnswerAdvisorRetrievalArgumentAdvisor

QuestionAnswerAdvisor

QuestionAnswerAdvisor主要提供便捷簡單的RAG流功能,只需指定一些簡單的參數即可。例如,假設數據已加載到vectorStore中,可以通過以下方法進行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();

如果構造advisor時未指定過濾條件,構建請求時也能動態添加:

chatClient.prompt().user(u -> u.text("hello")).advisors(a -> a.param(QuestionAnswerAdvisor.FILTER_EXPRESSION, "a==b")).call().chatResponse();

這里的lambda表達式中的a是一個AdvisorContext.Builder實例,param()用于向AdvisorContext中添加參數,這些參數在advisor鏈中共享,advisor會自動調用相應方法完成知識庫檢索和拼接。

RetrievalArgumentAdvisor

RetrievalArgumentAdvisor提供了更豐富的功能,允許程序員定義整個RAG過程的操作,包括檢索前預處理、檢索、檢索后處理以及生成。

簡單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();

高級RAG流程

檢索前預處理
  1. 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();
  1. RewriteQueryTransformer:使用大語言模型重寫用戶輸入,適合語義模糊或冗長的查詢。
QueryTransformer queryTransformer = RewriteQueryTransformer.builder().chatClientBuilder(chatClientBuilder).build();
  1. TranslationQueryTransformer:翻譯用戶查詢為目標語言(通常為嵌入模型支持的語言)。
QueryTransformer transformer = TranslationQueryTransformer.builder().chatClientBuilder(chatClientBuilder).targetLanguage("english").build();
  1. MultiQueryExpander:多查詢擴展器,將原始查詢擴展為多個不同形式的查詢以獲取更多相關結果。
MultiQueryExpander expander = MultiQueryExpander.builder().chatClientBuilder(chatClientBuilder).numberOfQueries(3) // 生成三個查詢.includeOriginal(false) // 不包含原始查詢.build();
檢索

負責從數據庫中檢索最相關文檔。

VectorStoreDocumentRetriever vectorStoreDocumentRetriever = VectorStoreDocumentRetriever.builder().vectorStore(vectorStore).topK(4) // 返回最相關的4個.filterExpression(newFilterExpressionBuilder().eq("a", "b").build()) // 過濾條件:a==b.similarityThreshold(0.4) // 只返回相關度大于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();
  • .allowEmptyContext(false)時,若無檢索內容,模型通常不會回答或回答不知道。
  • .allowEmptyContext(true)時,即使檢索內容為空,也會嘗試回答。

ContextualQueryAugmenter主要做以下工作:

  • 檢查檢索結果是否為空
  • 非空時,拼接檢索結果字符串并注入提示詞模板變量(如{{retrievedDocs}}
  • 為空且.allowEmptyContext(false)時,設置空變量并指示模型“不要根據已有知識回答”
  • 為空且.allowEmptyContext(true)時,放行不插入上下文內容

以上即為SpringAI框架中RAG模塊的詳細介紹及使用示例,涵蓋從簡單到復雜的多種應用場景,幫助開發者靈活構建基于知識庫的問答系統。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/79906.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/79906.shtml
英文地址,請注明出處:http://en.pswp.cn/web/79906.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MySQL-數據查詢(測試)-05-(12-1)

1-數據準備&#xff1a; CREATE TABLE 員工信息表 (員工編號 VARCHAR(10) PRIMARY KEY,姓名 VARCHAR(20),學歷 VARCHAR(20),出生日期 DATE,性別 INT,工作年限 INT,地址 VARCHAR(100),電話號碼 VARCHAR(20),員工部門號 INT ); INSERT INTO 員工信息表 (員工編號, 姓名, 學歷, 出…

5G網絡:能源管理的“智能電網“革命,Python如何成為關鍵推手?

5G網絡:能源管理的"智能電網"革命,Python如何成為關鍵推手? 大家好,我是Echo_Wish。今天咱們聊一個既硬核又接地氣的話題——5G網絡如何用Python代碼重構全球能源管理。 不知道你們有沒有注意過: ? 家里裝了智能電表后,電費突然變"聰明"了,谷時充…

AI背景下,如何重構你的產品?

當AI敲門時&#xff0c;你的產品準備好開門了嗎&#xff1f; 最近和做產品的老張聊天&#xff0c;他愁眉苦臉地說&#xff1a;"現在AI這么火&#xff0c;我們的產品就像個老古董&#xff0c;用戶都跑隔壁用AI產品去了。“這話讓我想起三年前另一個朋友&#xff0c;當時區…

互聯網大廠Java面試實戰:從Spring Boot到微服務的技術問答與解析

&#x1f4aa;&#x1f3fb; 1. Python基礎專欄&#xff0c;基礎知識一網打盡&#xff0c;9.9元買不了吃虧&#xff0c;買不了上當。 Python從入門到精通 &#x1f601; 2. 畢業設計專欄&#xff0c;畢業季咱們不慌忙&#xff0c;幾百款畢業設計等你選。 ?? 3. Python爬蟲專欄…

Apollo學習——aem問題

執行aem指令出現一下問題 lxflxf:~/MYFile/apollo_v10.0 $aem enter permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.49/containers/json?filters%7B%22name%22%…

數字IC后端零基礎入門基礎理論(Day2)

數字IC后端零基礎入門基礎理論&#xff08;Day1&#xff09; Placement Blockage: cell擺放阻擋層。它是用來引導工具做placement的一種物理約束或手段&#xff0c;目的是希望工具按照我們的要求來做標準單元的擺放。 它主要有三種類型&#xff0c;分別是hard placement bloc…

如何遠程執行腳本不留痕跡

通常我們在做遠程維護的時候&#xff0c;會有這么一個需求&#xff0c;就是我想在遠程主機執行一個腳本&#xff0c;但是這個腳本我又不想保留在遠程主機上&#xff0c;那么有人就說了&#xff0c;那就復制過去再登錄遠程執行不就行了嗎&#xff1f;嗯嗯&#xff0c;但是這還不…

【Lua】java 調用redis執行 lua腳本

【Lua】java 調用redis執行 lua腳本 public Object executeLuaScript(String script, List<String> keys, Object... args) {// 注意: 這里 Long.class 是返回值類型, 一定要指定清楚 不然會報錯return this.redisTemplate.execute(RedisScript.of(j腳本, Long.class), k…

利用混合磁共振成像 - 顯微鏡纖維束成像技術描繪結構連接組|文獻速遞-深度學習醫療AI最新文獻

Title 題目 Imaging the structural connectome with hybrid MRI-microscopy tractography 利用混合磁共振成像 - 顯微鏡纖維束成像技術描繪結構連接組 01 文獻速遞介紹 通過多種模態繪制大腦結構能夠增進我們對大腦功能、發育、衰老以及疾病的理解&#xff08;漢森等人&am…

Shell腳本實踐(修改文件,修改配置文件,執行jar包)

1、前言 需要編寫一個shell腳本支持 1、修改.so文件名 2、修改配置文件 3、執行jar包 2、代碼解析 2.1、修改.so文件名 so_file_dir="/opt/casb/xxx/lib" # 處理.so文件 cd "$so_file_dir" || { echo "錯誤: 無法進入目錄 $so_file_dir"; exit …

基于GPUGEEK 平臺進行深度學習

一、平臺簡介 GPUGEEK 是一個專注于提供 GPU 算力租賃服務的平臺&#xff0c;在人工智能與深度學習領域為用戶搭建起便捷的算力橋梁。它整合了豐富多樣的 GPU 資源&#xff0c;涵蓋 RTX - 4090、RTX - 3090、A100 - PCIE 等多種型號&#xff0c;滿足不同用戶在模型訓練、數據處…

Android Framework學習五:APP啟動過程原理及速度優化

文章目錄 APP啟動優化概述APP啟動流程點擊圖片啟動APP的過程啟動觸發Zygote 與應用進程創建Zygote進程的創建應用進程初始化 ApplicationActivity 啟動與顯示 優化啟動時黑白屏現象可優化的階段Application階段相關優化 Activity階段數據加載階段 Framework學習系列文章 APP啟動…

Web 實時通信技術:WebSocket 與 Server-Sent Events (SSE) 深入解析

一、WebSocket&#xff1a; &#xff08;一&#xff09;WebSocket 是什么&#xff1f; WebSocket 是一種網絡通信協議&#xff0c;它提供了一種在單個 TCP 連接上進行全雙工通信的方式。與傳統的 HTTP 請求 - 響應模型不同&#xff0c;WebSocket 允許服務器和客戶端在連接建立…

MySQL(8)什么是主鍵和外鍵?

主鍵&#xff08;Primary Key&#xff09;和外鍵&#xff08;Foreign Key&#xff09;是關系數據庫中用于定義和維護表之間關系的重要概念。以下是詳細的解釋、示例代碼和操作步驟。 主鍵&#xff08;Primary Key&#xff09; 定義 主鍵是表中的一個或多個字段&#xff0c;其…

任意復雜度的 JSON 數據轉換為多個結構化的 Pandas DataFrame 表格

以下是一個 完整、結構清晰、可運行的 Python 工具&#xff0c;用于將任意復雜度的 JSON 數據轉換為多個結構化的 Pandas DataFrame 表格。該工具支持嵌套對象、嵌套數組&#xff0c;并通過主鍵和外鍵建立表之間的關聯關系。 if __name__ "__main__":# 示例 JSON 數…

【SSL部署與優化?】??HTTP/2與HTTPS的協同效應

HTTP/2與HTTPS的協同效應&#xff1a;為何HTTP/2強制要求TLS 1.2&#xff1f; HTTP/2是HTTP協議的現代升級版&#xff0c;旨在通過多路復用、頭部壓縮等技術提升性能。然而&#xff0c;HTTP/2的設計與部署與HTTPS&#xff08;TLS加密&#xff09;緊密相關&#xff0c;甚至強制…

爬蟲請求頻率應控制在多少合適?

爬蟲請求頻率的控制是一個非常重要的問題&#xff0c;它不僅關系到爬蟲的效率&#xff0c;還涉及到對目標網站服務器的影響以及避免被封禁的風險。合理的請求頻率需要根據多個因素來綜合考慮&#xff0c;以下是一些具體的指導原則和建議&#xff1a; 一、目標網站的政策 查看網…

使用Visual Studio將C#程序發布為.exe文件

說明 .exe 是可執行文件&#xff08;Executable File&#xff09;的擴展名。這類文件包含計算機可以直接運行的機器代碼指令&#xff0c;通常由編程語言&#xff08;如 C、C、C#、Python 等&#xff09;編譯或打包生成。可以用于執行自動化操作&#xff08;執行腳本或批處理操…

分布式1(cap base理論 鎖 事務 冪等性 rpc)

目錄 分布式系統介紹 一、定義與概念 二、分布式系統的特點 三、分布式系統面臨的挑戰 四、分布式系統的常見應用場景 CAP 定理 BASE 理論 BASE理論是如何保證最終一致性的 分布式鎖的常見使用場景有哪些&#xff1f; 1. 防止多節點重復操作 2. 資源互斥訪問 3. 分…

常見相機焦段的分類及其應用

相機焦段是指鏡頭的焦距范圍&#xff0c;決定了拍攝時的視角、畫面范圍和透視效果。不同焦段適合不同的拍攝場景和主題&#xff0c;以下是常見焦段的分類及其應用&#xff1a; 一、焦段的核心概念 焦距&#xff1a;鏡頭光學中心到成像傳感器的距離&#xff08;單位&#xff1a…