隨著AI技術的不斷進步,開發者面臨著如何有效利用現有工具和技術來加速開發過程的挑戰。Redis與Spring AI的結合為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。
// Create a JSON reader with fields relevant to our use caseJsonReader loader = new JsonReader(file, "name", "abv", "ibu", "description");// Use the autowired VectorStore to insert the documents into RedisvectorStore.add(loader.get());
至此,我們得到了一個包含約 22,000種啤酒及其相應嵌入的數據集。
五、RAGService
RagService 類實現了 RAG 工作流程。當收到用戶提示時,會調用 retrieve 方法,執行以下步驟:
計算用戶提示的向量
查詢Redis數據庫,檢索最相關的文檔
使用檢索到的文檔和用戶提示構建一個提示信息
使用提示調用聊天客戶端以生成響應
public Generation retrieve(String message) { SearchRequest request = SearchRequest.query(message).withTopK(topK); // Query Redis for the top K documents most relevant to the input message List 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();}
六、Controller
現在我們已經實現了 RAG 服務,可以將其封裝在 HTTP 端點中。
RagController 類將服務作為 POST 端點公開:
@PostMapping("/chat/{chatId}")@ResponseBodypublic 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 應用程序將變得更加容易。
有關向量數據庫的更多信息,歡迎與我們溝通交流~
-
AI
+關注
關注
87文章
30858瀏覽量
269030 -
spring
+關注
關注
0文章
340瀏覽量
14341 -
Redis
+關注
關注
0文章
374瀏覽量
10872
發布評論請先 登錄
相關推薦
評論