隨著AI技術(shù)的不斷進(jìn)步,開發(fā)者面臨著如何有效利用現(xiàn)有工具和技術(shù)來加速開發(fā)過程的挑戰(zhàn)。Redis與Spring AI的結(jié)合為Java開發(fā)者提供了一個(gè)強(qiáng)大的平臺(tái),以便快速構(gòu)建并部署響應(yīng)式AI應(yīng)用。探索這一整合如何通過簡化的開發(fā)流程,讓開發(fā)者能夠更專注于創(chuàng)新而非底層實(shí)現(xiàn)。
一、Spring AI 簡介
由大型語言模型(LLM)驅(qū)動(dòng)的應(yīng)用程序中,向量數(shù)據(jù)庫常作為人工智能應(yīng)用程序的核心存儲(chǔ)技術(shù)。此類數(shù)據(jù)庫需要支持語義搜索,并為LLM提供相關(guān)的上下文環(huán)境。
在此之前,通過Spring和Redis來構(gòu)建人工智能應(yīng)用程序的選項(xiàng)還相對(duì)有限。而最近,Redis作為一種高性能的向量數(shù)據(jù)庫方案,現(xiàn)已引起廣泛關(guān)注。Spring社區(qū)推出了一個(gè)名為Spring?AI的新項(xiàng)目,旨在簡化人工智能應(yīng)用程序特別是那些涉及向量數(shù)據(jù)庫的應(yīng)用的開發(fā)流程。
下面將介紹如何使用Redis作為向量數(shù)據(jù)庫構(gòu)建一個(gè)Spring AI應(yīng)用程序,實(shí)現(xiàn)檢索增強(qiáng)生成(RAG)工作流。
二、檢索增強(qiáng)生成
檢索增強(qiáng)生成(RAG)是一種結(jié)合數(shù)據(jù)與人工智能模型的技術(shù)方法。在RAG工作流中,首先需要將數(shù)據(jù)加載入向量數(shù)據(jù)庫(例如Redis)。接收到用戶查詢后,向量數(shù)據(jù)庫會(huì)檢索出一組與查詢相似的文檔。這些文檔將作為解答用戶問題的上下文,并結(jié)合用戶的查詢,通常通過人工智能模型來生成響應(yīng)。
本例中,我們將利用一個(gè)包含各類啤酒信息的數(shù)據(jù)集進(jìn)行演示,數(shù)據(jù)集中包含啤酒的名稱、酒精含量(ABV)、國際苦味單位(IBU)和描述等屬性。該數(shù)據(jù)集將被加載到Redis中,以展示RAG工作流的實(shí)際應(yīng)用。
三、代碼和依賴關(guān)系
可以在GitHub上找到Spring?AI和Redis演示的全部代碼。
本項(xiàng)目使用了Spring Boot作為Web應(yīng)用程序的啟動(dòng)依賴項(xiàng),并結(jié)合了Azure OpenAI和Spring?AI?Redis。
四、數(shù)據(jù)加載
我們的應(yīng)用程序?qū)⒉捎锰峁┢【菩畔⒌腏SON文檔作為數(shù)據(jù)來源。每個(gè)文檔的結(jié)構(gòu)如下:
{ "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}
為了將啤酒數(shù)據(jù)集加載到 Redis 中,我們將使用 RagDataLoader 類。該類包含一個(gè)方法,在應(yīng)用程序啟動(dòng)時(shí)執(zhí)行。在該方法中,我們使用一個(gè) JsonReader 來解析數(shù)據(jù)集,然后使用自動(dòng)連接的?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());
至此,我們得到了一個(gè)包含約 22,000種啤酒及其相應(yīng)嵌入的數(shù)據(jù)集。
五、RAGService
RagService 類實(shí)現(xiàn)了 RAG 工作流程。當(dāng)收到用戶提示時(shí),會(huì)調(diào)用 retrieve 方法,執(zhí)行以下步驟:
計(jì)算用戶提示的向量
查詢Redis數(shù)據(jù)庫,檢索最相關(guān)的文檔
使用檢索到的文檔和用戶提示構(gòu)建一個(gè)提示信息
使用提示調(diào)用聊天客戶端以生成響應(yīng)
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
現(xiàn)在我們已經(jīng)實(shí)現(xiàn)了 RAG 服務(wù),可以將其封裝在 HTTP 端點(diǎn)中。
RagController 類將服務(wù)作為 POST 端點(diǎn)公開:
@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());}
七、用戶界面
在用戶界面方面,創(chuàng)建一個(gè)簡單的 React 前端,允許用戶提出有關(guān)啤酒的問題。前端通過向/chat/{chatId}端點(diǎn)發(fā)送 HTTP 請(qǐng)求并顯示響應(yīng)來與 Spring 后端交互。

僅通過簡單的幾個(gè)類,我們就用 Spring AI 和 Redis 實(shí)現(xiàn)了一個(gè) RAG 應(yīng)用程序。
若要更進(jìn)一步,我們建議您查看?Github?上的示例代碼。將 Redis 的高效和易用性與 Spring AI 提供的便捷抽象相結(jié)合,Java 開發(fā)人員使用 Spring 構(gòu)建響應(yīng)式 AI 應(yīng)用程序?qū)⒆兊酶尤菀住?/p>
有關(guān)向量數(shù)據(jù)庫的更多信息,歡迎與我們溝通交流~
-
AI
+關(guān)注
關(guān)注
91文章
41305瀏覽量
302685 -
spring
+關(guān)注
關(guān)注
0文章
341瀏覽量
16060 -
Redis
+關(guān)注
關(guān)注
0文章
394瀏覽量
12258
發(fā)布評(píng)論請(qǐng)先 登錄
黑馬-Java+AI新版V16零基礎(chǔ)就業(yè)班百度云網(wǎng)盤下載+Java+AI全棧開發(fā)工程師
[完結(jié)15章]Java轉(zhuǎn) AI高薪領(lǐng)域必備-從0到1打通生產(chǎn)級(jí)AI Agent開發(fā)
Java轉(zhuǎn) AI高薪領(lǐng)域必備 從0到1打通生產(chǎn)級(jí)AI Agent開發(fā) 教程資料
高質(zhì)量RAG系統(tǒng)的五個(gè)核心設(shè)計(jì)要點(diǎn)
構(gòu)建示例應(yīng)用程序MCSPTR2AK396的問題求解
Redis應(yīng)用監(jiān)控指標(biāo)大盤點(diǎn)
如何構(gòu)建藍(lán)牙應(yīng)用程序?
RAG、MCP與智能體:大模型落地的三道關(guān)
請(qǐng)問如何構(gòu)建和運(yùn)行視頻編解碼器示例應(yīng)用程序?
RAG(檢索增強(qiáng)生成)原理與實(shí)踐
使用NVIDIA Nemotron RAG和Microsoft SQL Server 2025構(gòu)建高性能AI應(yīng)用
RAG實(shí)踐:一文掌握大模型RAG過程
請(qǐng)問是否可以在通用Windows平臺(tái)中構(gòu)建OpenVINO? GenAI C++ 應(yīng)用程序?
【幸狐Omni3576邊緣計(jì)算套件試用體驗(yàn)】Redis最新8.0.2版本源碼安裝及性能測試
AI應(yīng)用如何不被淘汰?深耕RAG與數(shù)據(jù)底座是關(guān)鍵
使用Redis和Spring?Ai構(gòu)建rag應(yīng)用程序
評(píng)論