RAG Agent 實現
RAG(Retrieval Augmented Generation,檢索增強生成)是用來改善大模型生成內容質量的一種技術,通過 ETL(Extract,Transform 和 Load)流程對數據進行處理,即先從文檔讀取數據,進行轉換,之後寫入到向量數據庫供檢索。
ETL 流程包括了數據提取、數據轉換和加載數據:
(1)數據提取:通常從 pdf、markdown、csv 等文件中提取數據。
**(2)數據轉換:**提取數據之後,需要將數據切分為更小的塊,便於存儲和檢索,分塊的方式通常有:
- **按語義分塊:**確保塊內的語義連貫性,並且通常會設置分段重疊長度,即。
- **按樹分塊:**將章、節、小節等內容組裝成樹後入庫,增強對文檔結構的感知能力。例如章節 A 下邊包含了 a、b、c 三個小節,通過按樹分塊的方式就可以感知到 A 和 a、b、c 之間的關聯關係,如果按照語義分塊就不行。
- **壓縮存儲:**增強對重點內容的感知。比如對於大段文字,可以通過大模型提煉成摘要(重點內容可以通過關鍵詞的方式引導大模型生成摘要),降低相關性較低的內容對大模型的影響。
**(3)加載數據:**數據轉換之後就可以加載到向量數據庫中進行存儲。
傳統 RAG 與 Agentic RAG
傳統 RAG 通常基於用户提問內容,到向量數據庫中進行檢索,存在以下侷限性:
- 數據源單一:從單一數據源檢索數據,缺乏網頁檢索、第三方 API 檢索方式,數據豐富度不足。
- 檢索結果受用户輸入影響:直接根據用户問題進行檢索,如果用户問題與意圖偏離較大,可能會檢索不到用户想要的數據。
基於傳統 RAG 存在的侷限性,Agentic RAG 從以下幾種方面解決:
- Agent 工具調用能力:基於多 Agent 能力,為不同 Agent 添加不同的 MCP 工具,可以從網頁、第三方平台等多種數據源中檢索數據。
- 查詢擴展:基於大模型的內容生成能力,從多個角度將用户問題擴展為多個,分別進行檢索。
- 檢索結果評估:基於 Agent 能力對檢索結果進行評估,如果評估缺少內容,則給出反饋循環進行檢索。
Spring AI Alibaba 集成百鍊知識庫
Spring AI Alibaba 深度集成了阿里雲百鍊,基於百鍊的知識庫可以快速搭建一個 RAG 應用,本節代碼位於:https://github.com/1020325258/spring-ai-alibaba-tutorial/tree/master/02-spring-ai-alibaba-rag。
上邊我們介紹了 ETL 流程,包括了數據提取、數據轉換、加載數據,藉助於百鍊知識庫已經實現的 ETL 能力,我們可以在代碼中直接連接百鍊知識庫進行數據檢索。
知識庫創建
首先需要在百鍊平台創建一個知識庫:https://bailian.console.aliyun.com/?tab=app#/knowledge-base
定義 Retriever
Spring AI 提供了 DocumentRetriever 接口,定義了文檔檢索的規範。
Spring AI Alibaba 基於該接口實現了 DashScopeDocumentRetriever,用於快速整合百鍊的知識庫,如下:
@Test
public void test_rag_retrieval() throws GraphStateException {
DashScopeApi dashScopeApi = DashScopeApi.builder().apiKey(System.getenv("AI_DASHSCOPE_API_KEY")).build();
DashScopeDocumentRetriever documentRetriever = new DashScopeDocumentRetriever(dashScopeApi, DashScopeDocumentRetrieverOptions.builder()
// IndexName 就是百鍊知識庫的名稱
.withIndexName("面試解析生成")
// 最小相關性分數閾值
.withRerankMinScore(0.6f)
// 不重寫結果
.withEnableRewrite(false)
.build());
List<Document> retrieve = documentRetriever.retrieve(new Query("sql的更新流程"));
for (Document document : retrieve) {
logger.info(document.getText());
}
}
整合百鍊的知識庫只需要兩個步驟:
- 定義 DashScopeApi:內部封裝了和百鍊平台進行 API 交互的邏輯。
- 定義 DashScopeDocumentRetriever:內部封裝了從百鍊知識庫檢索數據的邏輯,通過 DashScopeApi 向百鍊平台發送請求,檢索數據。
知識庫檢索請求參數
在定義 DashScopeDocumentRetriever 可以設置請求參數(DashScopeDocumentRetrieverOptions),參含義如下:
- index_name:在百鍊平台創建的知識庫的名稱。
- rerank_min_score:最小相關性分數閾值,低於該閾值的文檔不返回。
- enable_rewrite:是否允許重寫檢索後的結果。
- rerank_top_n:返回排名前 n 條數據。
- …
最終,通過 documentRetriever.retrieve() 得到的檢索結果如下:
1.連接器接收客户端連接,並進行認證、授權操作。
2.對SQL進行語法分析、詞法分析,並通過優化器決定要使用的索引,並生成執行計劃。
3.通過執行器進行數據更新。在執行器進行數據更新時,涉及到對兩個很重要的日誌binlog和redo log的寫入,流程如下:
4.判斷update更新的數據所在的數據頁是否在內存中,如果不在,則需要將數據從磁盤讀入BufferPool (MySQL中的一個內存結構)。
5.執行器更新BufferPool中的該行數據。
6.存儲引擎InnoDB將該更新操作記錄到redo log中, 並將該redo log 的狀態設置為 prepare。
7.執行器生成binlog, 並將binlog寫入磁盤。
8.此時,提交事務, 存儲引擎InnoDB會將該更新操作的 redo log 狀態設置為 commit狀態, 表示事務已提交。
9.IO線程會不定期把 BufferPool中的髒數據(僅在內存中更新,還未刷入磁盤中的數據)刷入磁盤,完成數據的持久化。
由於關閉了重寫(enable_rewrite),檢索結果與知識庫中的內容是完全一致的,下圖為知識庫中的 pdf 文檔:
RagAgent
上邊介紹瞭如何通過 Spring AI Alibaba 快速集成百鍊的知識庫,但是這種方式需要我們手動調用 retrieve() 方法來檢索數據。
Spring AI 提供了 Advisors API,作為切面用於增強應用與 AI 模型的交互,創建好 Advisor 之後,直接配置在 ChatClient 內部,就可以自動執行 Advisor 內部的邏輯。
Spring AI Alibaba 基於 DashScopeDocumentRetriever 封裝了 DocumentRetrievalAdvisor,可以直接配置在 ChatClient 內部,快速實現一個具備 RAG 能力的 Agent。
RagAgent 定義
以 Spring AI Alibaba 實現的 RAG 數據檢索 DocumentRetrievalAdvisor 為例,只需要通過以下方式創建 Advisor 配置到 ChatClient 即可:
@Bean
public ChatClient ragAgent(ChatClient.Builder builder, DashScopeApi dashScopeApi) {
// 定義 DocumentRetriever 檢索器
DashScopeDocumentRetriever documentRetriever = new DashScopeDocumentRetriever(dashScopeApi, DashScopeDocumentRetrieverOptions.builder()
.withIndexName("面試解析生成")
// 最小相關性分數閾值
.withRerankMinScore(0.6f)
// 是否允許答案進行重寫
.withEnableRewrite(false)
.build());
// 定義 Advisor
DocumentRetrievalAdvisor documentRetrievalAdvisor = new DocumentRetrievalAdvisor(documentRetriever);
return builder.defaultAdvisors(List.of(documentRetrievalAdvisor)).build();
}
ChatClient 配置好 Advisor 之後,在 ChatClient 與 AI 模型交互的前後,會執行 Advisor 中的邏輯,DocumentRetrievalAdvisor 內部的邏輯如下:
- 請求 AI 模型前:通過 DocumentRetriever 從知識庫檢索數據,並將檢索到的數據拼接到用户提示詞的後邊,之後一起發送給 AI 模型。
- 請求 AI 模型後:將基於 RAG 檢索到的數據放入到 Response 的 metadata 中,記錄生成內容所參考的數據。
總結
本節主要介紹了 RAG 中的 ETL 流程中涉及的技術,並且分析了傳統 RAG 存在的侷限性,以及 Agentic RAG 如何去解決。
基於 Spring AI Alibaba 提供了 RAG Advisor 快速實現了 RagAgent,集成了百鍊的知識庫,實現了 ETL 流程中的數據檢索。
數據轉換、數據存儲對應的處理類為 DashScopeCloudStore、DashScopeDocumentTransformer,這裏由於數據的存儲和轉換直接利用了百鍊知識庫的能力,因此沒有配置這兩個處理類,原理都與 DashScopeDocumentRetriever 類似,內部基於 DashScopeApi 與百鍊進行交互。