摘要
本文介紹了 Spring AI。在 LLM 驅動的應用中,支援資料庫是關鍵儲存技術,以前 Spring 結合 Redis 建構推出 AI 應用選擇少,Spring 社群 Spring AI 專案來簡化開發。搜尋增強生成(RAG)技術可結合資料與 AI 模型,文中以啤酒資料集為例,講述如何將資料載入 Redis 實現 RAG 工作流程。其程式碼在 GitHub,依賴 Spring Boot、Azure OpenAI 等,也介紹了負責資料載入、RAG流程、封裝 HTTP 端點的相關類,以及 React 介面與 Spring 端點交互,讓 Java 開發者建構 AI 應用更加便捷。

Spring AI簡介
在大型語言模型(LLM)驅動的應用程式中,提供資料庫常作為人工智慧應用程式的核心儲存技術。此類資料庫需要支援語義搜索,並為LLM提供相關的上下文環境。
在此之前,透過Spring和Redis來建立人工智慧應用程式的選項還相對有限。而最近,Redis作為一種高效能的支援資料庫方案,現已引起廣泛關注。 Spring社群推出了一個名為Spring AI的新項目,旨在簡化人工智慧應用程序,特別是那些涉及支援資料庫的應用的開發流程。
以下將介紹如何使用Redis作為支撐資料庫建立一個Spring AI應用程序,實現搜尋增強生成(RAG)工作流程。
搜尋增強生成
檢索增強生成(RAG)是一種結合資料與人工智慧模型的技術方法。在RAG工作流程中,首先需要將資料載入到支援資料庫(例如Redis)。接收到使用者查詢後,支援資料庫會檢索出一組與類似查詢的文件。這些文件將作為解答使用者問題的上下文,並結合使用者的查詢,通常透過人工智慧模型來產生回應。
本例中,我們將利用一個包含各類啤酒資訊的資料集進行演示,資料集中包含啤酒的名稱、酒精含量(ABV)、國際苦味單位(IBU)和描述等屬性。該資料集將載入到Redis中,以展示RAG工作流程的實際應用。
代碼和依賴關係
可以在GitHub上找到Spring AI和Redis演示的全部程式碼。
本專案使用了Spring Boot作為Web應用程式的啟動依賴項,並結合了Azure OpenAI和Spring AI Redis。
數據加載
我們的應用程式將採用提供啤酒資訊的 JSON 文件作為資料來源。每個文檔的結構如下:
“id”: “00gkb9”,
“name”: “Smoked Porter Ale”,
“description”: “The Porter Pounder Smoked Porter is a dark rich flavored ale that is made with 5 malts that include smoked and chocolate roasted malts. It has coffee and mocha notes that create a long finish that ends clean with the use of just a bit of dry hopping”,
“abv”: 8,
“ibu”: 36
}
為了將啤酒資料集載入到Redis中,我們將使用RagDataLoader類別。該類別包含一個方法,在應用程式啟動時執行。在該方法中,我們使用一個JsonReader來解析資料集,然後使用自動連接的VectorStore將文件插入Redis。
至此,我們得到了一個包含約22,000種啤酒及其相應嵌入的資料集。
RAG服務
RagService 類別實作了 RAG 工作流程。當收到使用者提示時,會呼叫檢索方法,執行下列步驟:
- 計算使用者提示的管理
- 查詢Redis資料庫,檢索最相關的文檔
- 使用文件和用戶提示的搜尋建立提示訊息
- 使用提示呼叫聊天客戶端以產生回應
SearchRequest request = SearchRequest.query(message).withTopK(topK);
// Query Redis for the top K documents most relevant to the input message
List<Document> docs = store.similaritySearch(request);
Message systemMessage = getSystemMessage(docs);
UserMessage userMessage = new UserMessage(message);
// Assemble the complete prompt using a template
Prompt prompt = new Prompt(List.of(systemMessage, userMessage));
// Call the autowired chat client with the prompt
ChatResponse response = client.call(prompt);
return response.getResult();
}
控制器
現在我們已經實現了RAG服務,可以將其封裝在HTTP端點中。
RagController 類別將服務作為 POST 端點公開:
@ResponseBody
public Message chatMessage(@PathVariable(“chatId”) String chatId, @RequestBody Prompt prompt) {
// Extract the user prompt from the body and pass it to the autowired RagService
Generation generation = ragService.retrieve(prompt.getPrompt());
// Reply with the generated message
return Message.of(generation.getOutput().getContent());
}
使用者介面
在使用者介面方面,創建一個簡單的React前端,讓使用者可以提出有關啤酒的問題。前端透過向 /chat/{chatId} 端點發送 HTTP 請求並顯示回應來與 Spring 互動。

只需透過簡單的幾個類,我們就用 Spring AI 和 Redis 實作了一個 RAG 應用程式。
接下來,我們建議您查看 Github 上的範例程式碼。將 Redis 的高效性和易用性與 Spring AI 提供的便利抽象相結合,Java 開發人員使用 Spring 建構式回應 AI 應用程式將變得更加容易。
相關支援資料庫的更多訊息,歡迎與我們溝通交流~
了解更多產品資訊
如果您對此感興趣,歡迎您關注我們獲取更多文章資訊,如有任何問題,也歡迎聯絡我們!
