
譯者 | 李睿
審校 | 重樓
引言
本文探討了如何使用Spring AI為家庭用戶設計并部署一款安全的、基于檢索增強生成(RAG)的聊天機器人。通過Spring AI的模塊化編排功能、本地向量數據庫以及嵌入模型的結合,這款聊天機器人能夠針對日常查詢提供基于上下文、有依據的回答,包括查找個人文檔和提供技術指導等場景。該系統強調隱私性和易用性,確保敏感數據始終處于可信任的家庭環境中,同時提供直觀的語音輔助功能。
為了保證完全的控制和數據安全,聊天機器人將完全構建和托管在個人基礎設施上,人工智能模型和向量數據庫都在基于Linux系統的家用電腦運行。選擇Spring AI是因為其跨平臺兼容性和與基于JVM工具的無縫集成,這使得它成為在不同環境中實現可復現、安全部署的理想選擇。本項目展示了如何重新利用現代人工智能框架來簡化非技術用戶的生活,為家庭場景中的個性化、安全和可復制的人工智能解決方案提供了藍圖。
核心要點
1.面向家庭環境的系統設計:學習如何構建可以在普通硬件(包括Linux家用電腦)上流暢運行的RAG聊天機器人,無需依賴云計算基礎設施。
2.保障個人數據安全:了解如何通過本地托管人工智能模型和向量數據庫,確保敏感的家庭文檔和查詢的私密性,并完全掌控訪問權限與加密。
3.零成本家庭計算部署:探索利用開源工具、Spring Boot和Spring AI,將現有的筆記本電腦或臺式機升級改造為人工智能助手,無需支付高昂云計算服務費用。
4.便于非技術家庭成員使用:為所有家庭成員設計統一的訪問入口,無論是通過筆記本、智能手機還是智能電視,都能借助直觀的界面和語音支持處理日常事務。
5.Spring AI的實踐體驗:通過適合初學者的教程,了解Spring AI的編排工具、檢索器和聊天記憶功能,并可參考源代碼示例和演示視頻進行深入學習。
為何需要家庭聊天機器人?
在大多數家庭中,家庭日常的瑣碎問題帶來持續的困擾——尤其對非技術型家庭成員而言。無論是查找掃描的PAN卡、記住WiFi密碼、了解電費繳納流程,還是設置用藥提醒,這些場景往往導致困惑、延誤或求助更懂技術的家庭成員。家庭聊天機器人通過構建單一、直觀的求助入口,完美解決了這一問題——可以通過筆記本、智能手機甚至智能電視隨時訪問。
與通用人工智能助手不同,家庭聊天機器人具有上下文感知能力,能夠根據家庭的語言、習慣和文檔進行調整。它不僅能回答日常問題,還能理解家庭的專屬需求?;赟pring AI和RAG構建的這款聊天機器人能夠從本地文件中獲取相關信息,并以有益、有依據的方式做出回應。
最重要的是,它具備高度的私密性和個性化:部署在個人設備上,不與第三方共享任何數據,這確保了敏感文檔和查詢始終處于家庭受信任的環境中。無論是老人還是孩子,都能輕松使用;而對于開發者而言,這將是引入家庭的絕佳方式,讓身邊人的生活更便捷、更安全、更緊密。它不止是一款聊天機器人,更是一個家庭數字助手。
技術棧概述
這款家庭聊天機器人采用模塊化RAG架構,核心基于Spring AI構建——其JVM原生設計、跨平臺兼容性和易于編排的特點是選擇它的關鍵因素。該系統可以運行在一臺配備酷睿i3處理器和8GB內存的電腦上,搭載Arch Linux系統以實現輕量化運行和完全控制。盡管硬件配置不高,但通過高效的資源分配和局域網WiFi連接,該設備能流暢處理本地推理、檢索任務及Spring Boot編排。
在其核心架構中,Spring AI的ChatClient組件負責協調用戶輸入、檢索器與大型語言模型(LLM)的交互流程。本地向量數據庫采用PostgreSQL(搭配pgvector擴展),用于索引家庭文檔;嵌入模型采用本地部署的Nomic Embed Text,負責將查詢內容和文檔轉換為可搜索的向量數據。聊天機器人還集成了QuestionAndAnswerAdvisor組件實現RAG邏輯、ChatMemory組件保留上下文,并可選配工具接口實現提醒、文件搜索或語音輸入功能。
該技術棧旨在實現可選云服務、可復現和安全的特點,非常適合隱私和簡單性至關重要的家庭環境。它展示了即使在低端硬件上也能托管有意義的人工智能體驗,使Spring AI成為家庭人工智能使用和實戰學習的理想選擇。
系統設計
索引階段
索引階段將原始家庭文檔轉化為聊天機器人可搜索的智能信息。首先進行攝取,使用Java和Spring Boot構建的自定義管道掃描文件夾、解析PDF或文本文件,并標記元數據,例如文檔類型、所有者和時間戳。該攝取層具有模塊化和可復現的特點,非常適合指導初學者或跨家庭設置擴展。這可以處理各種類型的可用文檔。雖然不會直接處理圖像,但是像所有其他文檔一樣,生成指向這些文檔和圖像的內部網鏈接,并將其保存在結構化數據庫中,以便可以按需下載。
接下來是分塊,將大型文檔拆分為更小、語義連貫的部分。這提高了檢索精度,并確保響應內容與上下文精準匹配。每個分塊隨后通過nomic-embed-text-v1.5嵌入模型,將文本轉換為捕捉語義的高維向量。
這些向量存儲在通過pgvector增強的PostgreSQL數據庫中,選擇它是因為其可靠性、開源性質和與Spring AI的VectorStoreRetriever的兼容性。整個管道運行在配備8GB內存和Core i3 CPU的電腦上,使用Arch Linux實現輕量級性能和Wi-Fi連接以訪問局域網。盡管設置簡單,但它能夠實現快速、安全和私密的索引,非常適合人工智能至關重要并且沒有采用云計算服務的家庭環境。其結果是一個基于用戶自己的數據,并且響應迅速、基于上下文的聊天機器人。
每當文件被添加或修改時,系統會通過事件驅動的Webhook機制觸發版本感知的重新索引過程。這確保最新內容被準確嵌入、分塊并存儲在向量數據庫中,從而在整個檢索管道中保持一致性和新鮮度。

查詢階段
查詢階段是將用戶輸入轉化為智能、基于上下文響應的過程。它從查詢編碼開始,使用與索引階段相同的嵌入模型(如nomic-embed-text-v1.5)將用戶的問題轉換為高維向量。這確保了查詢與存儲的文檔分塊之間的語義一致性。在編碼后,向量被傳遞給檢索器,檢索器在向量存儲(PostgreSQL和pgvector)中搜索基于余弦相似度或其他距離度量最相關的分塊。這些檢索到的分塊作為增強上下文,確保響應內容基于用戶擁有的真實數據。

Spring AI使用其Retriever和ChatClient接口編排這一流程。檢索到的上下文被注入到提示模板中,形成一個包含用戶查詢和支持證據的復合輸入。然后將其發送給大型語言模型(LLM),通過OpenAI、Ollama或本地網關(如OpenRouter)進行生成。本項目使用Gemma 3模型。該模型生成的響應不僅流暢,而且基于檢索到的上下文,確保事實相關性和個性化。
這一RAG循環在配備8GB內存的Core i3電腦上高效運行,非常適合家庭使用。其結果是一個安全、響應迅速的聊天機器人,能夠以清晰和上下文感知的方式回答問題。
設計家用人工智能系統不僅關注成本效益,還關注可訪問性、可復現性和信任。這個項目演示了如何構建一個RAG聊天機器人,它可以在性能普通的老舊Linux筆記本電腦或臺式機上可靠地運行,而不依賴于云計算基礎設施或昂貴的GPU。
關鍵設計原則
- 本地優先架構:所有組件(LLM網關、向量存儲、嵌入模型和Spring AI編排)都在用戶自己的機器或局域網內運行。這確保完全不依賴外部API或云服務。
- 輕量級工具:Spring AI的JVM原生設計允許用戶使用現有的Java/Spring Boot設置,而無需Docker、Kubernetes或重型編排層。
- 模塊化部署:每個部分(檢索器、模型、內存、工具)都是可插拔的。你可以從基本設置開始,僅在需要時擴展,非常適合指導初學者或逐步引入家庭成員。
硬件設置
1.支持設備:老舊家用電腦(甚至內存僅4~8GB)均可運行。
- 本地向量數據庫(PostgreSQL和pgvector)
- 輕量級嵌入模型(nomic embed text)
- 集成Spring AI的Spring Boot應用(負責RAG流程編排)。
2.無需GPU:嵌入計算和檢索任務的速度足以滿足家庭場景的查詢需求。
3.離線可用:通過預加載文檔和本地模型,聊天機器人無需互聯網即可運行,適用于農村或低網絡覆蓋率場景。
Spring AI RAG基礎示例
Spring AI RAG基礎示例的完整示例代碼可訪問:
https://github.com/trainerpb/simple-spring-ai-rag-example/tree/feature/article-manuscript。
本項目使用Java 17、Spring Boot 3.5.5、Spring AI 1.0.3和Maven構建項目。添加以下依賴項以引入Spring-ai和Rag庫。
XML
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-advisors-vector-store</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-openai</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-vector-store-pgvector</artifactId>
</dependency>使用Apache Tika解析PDF等文檔。
XML
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-core</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-parsers-standard-package</artifactId>
<version>2.9.0</version>
</dependency>RAG應用程序由幾個關鍵組件組成:RagService用于編排檢索和生成,PDFService用于處理文檔獲取和分塊,PdfChunkIngestorOnStartup用于啟動時索引,WebMvcController用于管理用戶交互。這些后端服務由基于thymleaf的HTML前端補充,該前端利用服務器發送事件(Server-Sent Events,SSE)實時流式傳輸聊天響應。
1. PDFService類
該類是Spring管理的服務(@Service),負責將PDF文件轉換為向量搜索塊,以便在Spring AI驅動的RAG管道中使用。
向量存儲集成
核心Spring AI組件是注入的向量數據庫(VectorStore),它封裝了底層向量數據庫(如Chroma、PostgreSQL+pgvector),支持添加嵌入式文檔以實現語義相似度檢索。
private final VectorStore
這是通過構造函數注入的,遵循Spring的依賴注入模式。
saveChunks(File file)
該方法編排索引流程:
- 調用loadChunkPdf()提取PDF并分塊。
- 使用Spring AI的.add()方法將結果列表添加到VectorStore。
- 返回分塊列表以供可選驗證或日志記錄。
vectorStore.add(chunks)
該方法處理分塊邏輯:
- 從PDF中提取原始文本。
- 將其拆分為500個字符的分塊。
- 將每個塊包裝在Spring AI Document對象中。
這些文檔實例是Spring AI用于嵌入和檢索的對象。
extractText(InputStream pdfInputStream)
該方法使用Apache Tika從PDF中提取文本。雖然它不是Spring AI的一部分,但它為管道提供了用于分組和嵌入的原始內容。
2. RagService類

該類是spring管理的服務(@Service),負責編排RAG應用程序的查詢階段。它使用Spring AI組件處理檢索、提示構建和流響應生成。
依賴項:
- ChatClient:Spring AI與LLM交互的接口(例如,OpenAI、Ollama、OpenRouter)交互。它通過ChatClient.Builder構建,允許靈活配置。
- VectorStore:抽象底層的向量數據庫(例如PostgreSQL的pgvector),用于語義搜索。
- promptResource:從類路徑(rag-prompt.st)加載一個系統提示模板,以指導LLM的響應行為。
retrieveAndGenerateStreaming(String msg)
該方法為RAG循環提供動力:
- 使用用戶查詢和topK=3構建SearchRequest,以獲取最相關的分塊。
- 通過vectorStore.similaritySearch(…)執行語義搜索,檢索匹配的Document對象。
- 將檢索到的文本連接到單個字符串(informationAsString)中以進行提示注入。
- 使用SystemPromptTemplate和用戶消息構造提示。
- 調用chatClient.prompt(…),它返回生成的內容流。
- 將阻塞邏輯封裝在Mono.fromCallable(...)中,并將執行轉移到Schedulers.boundedElastic()中以實現安全線程處理。
- 返回Flux,在前端通過服務器發送事件(SSE)實現實時流傳輸。
3. PdfChunkIngestorOnStartup

這個Spring組件PdfChunkIngestorOnStartup負責在應用程序啟動時自動攝取PDF文件并將其索引到向量存儲中。它使用@ConditionalOnProperty根據app.vector.load-on-start-up標志有條件地激活。文件路徑從應用程序屬性中注入,PDFService處理文本提取、分塊和向量存儲。實現CommandLineRunner,它在啟動時執行run()方法,調用saveChunks()來處理指定的PDF。生成的文檔塊被添加到Spring AI VectorStore中,實現語義搜索。日志條目確認初始化期間索引了多少個塊。使用的屬性文件如下所示:
Properties files
############### Comment this property if you need to load the file on startup ##
app.vector.load-on-start-up=false
app.vector.pdf.file-path=YourLocalPath\\YourDocument.pdf
##################################- 控制啟動時是否自動索引PDF文件。
- 如果load-on-start-up=true, PdfChunkIngestorOnStartup將指定文件攝入向量數據庫中。
# PostgreSQL配置
Properties files
spring.datasource.url=jdbc:postgresql://yourHostOrLocalhost:5432/ragdb?options=-c%20TimeZone=yourTimeZone
spring.datasource.username=yourDbUsername
spring.datasource.password=yourDbPassword
spring.datasource.driver-class-name=org.postgresql.Driver# Spring AI OpenAI配置
Properties files
spring.ai.openai.base-url=http://localhost:1234
spring.ai.openai.api-key=""
spring.ai.openai.embedding.options.model=text-embedding-nomic-embed-text-v1.5
spring.ai.openai.chat.options.model=ai/gemma3
spring.ai.openai.chat.base-url=http://localhost:12434/engines
spring.ai.openai.chat.api-key=ignore控制器和用戶界面
這個方法是一個映射到URL路徑/home的Spring MVC控制器處理程序。當用戶訪問http://localhost:8080/home時,該方法執行并返回字符串“ChatClient”。
因為Thymeleaf被配置為項目中的視圖解析器,所以Spring不會將這個返回值解釋為原始文本,而是將其解釋為模板的邏輯名稱。在本例中,它將在src/main/resources/templates/目錄中查找一個名為ChatClient.html的文件。然后,用Thymeleaf 標簽編寫的HTML文件將被呈現并發送回瀏覽器。
總結:
- @GetMapping("/home") – 將/home URL映射到此方法。
- 返回“ChatClient”;告訴Spring渲染ChatClient.html Thymeleaf模板。
- 結果是在訪問/home端點時顯示一個動態HTML頁面(例如chatbot UI)。
前端通過SSE與控制器搜索API通信。
JavaScript
const source = new EventSource('/search/stream?q='+encodeURIComponent(userText));- 當用戶提交文本時,瀏覽器打開到/search/stream的持久連接。
EventSource自動偵聽來自服務器的傳入數據消息。
后端(Spring WebFlux Controller)
- 控制器端點/search/stream返回一個Flux(來自RagService.retrieveAndGenerateStreaming)。
- Spring將其序列化為文本/事件流,發送LLM生成的每個塊。
用戶體驗
- 聊天用戶界面不再等待完整的響應,而是隨著模型流輸出逐步更新。
- 模擬實時打字效果,交互更自然、響應更迅速。
SSE技術適配場景的核心原因:
- 輕量級:瀏覽器原生支持,無需額外依賴庫。
- 可靠性:如果連接斷開,自動重新連接。
- 適配RAG:實時流式傳輸基于上下文的答案。
簡而言之:EventSource片段是Thymeleaf聊天頁面和Spring AI后端之間的橋梁,支持聊天機器人響應的流暢、實時流式傳輸。
用戶可訪問性
這款基于Spring AI的RAG聊天機器人旨在在家庭網絡內的多臺設備上實現可訪問性,確保所有家庭成員都能獲得無縫和統一的體驗。由于它托管在基于Linux的個人電腦上,任何連接到家庭Wi-Fi的設備(無論是筆記本電腦、智能手機還是平板電腦)都可以直接通過瀏覽器訪問聊天機器人,無需額外配置。這種跨瀏覽器兼容性使用戶能夠從其偏好設備與系統交互,保持響應和功能的一致性。
其關鍵的優勢是它能夠與通過輸入法編輯器(IME)實現語音輸入的設備集成。智能電視、機頂盒、亞馬遜Firestick和類似的平臺通常都有內置的語音識別功能。通過利用這一功能,聊天機器人可以自然地進行語音控制,允許家庭成員可以通過自然語音指令與聊天機器人交互,無需手動輸入——這對非技術用戶、兒童或老人尤為友好。
雖然當前設計強調通過將所有數據保留在家庭網絡內來保護隱私,但后續將引入額外安全功能(涵蓋身份驗證、訪問控制和加密),以確保長期安全性和受控訪問。
包含PDF攝取和查詢的演示視頻可在以下鏈接查看:
https://www.youtube.com/watch?v=S2FvDpeNqZk&list=PLreY-Zt4f_bsVHo1u4mwWVtG1sDsuRWn8。 https://youtu.be/gqspiqRbjVg
參考文獻
1.代碼庫:https://github.com/trainerpb/simple-spring-ai-rag-example/tree/feature/article-manuscript
2.設置Pogtgresql:https://github.com/trainerpb/simple-spring-ai-rag-example/blob/feature/article-manuscript/README.md
3.官方Spring AI文檔: https://docs.spring.io/spring-ai/reference/index.html
4.https://www.clarifai.com/blog/what-is-rag-retrieval-augmented-generation
原文標題:Private AI at Home: A RAG-Powered Secure Chatbot for Everyday Help,作者:Soham Sengupta































