Spring AI 向量數據庫詳解與 RAG 簡單實戰項目

一、什么是向量數據庫?

向量數據庫用于存儲、檢索稠密語義向量(Embedding),是構建 RAG(檢索增強生成)系統的核心組件。它支持近似最近鄰搜索(ANN),可根據語義相似度找出最相關的文本。


二、Spring AI 的向量庫支持

Spring AI 提供統一接口 VectorStore,支持以下數據庫作為向量存儲:

向量數據庫模塊依賴特點
Redisspring-ai-redis-store快速、適合中小規模
PGVectorspring-ai-pgvector-storePostgreSQL 擴展
Milvusspring-ai-milvus-store高性能向量引擎
Qdrantspring-ai-qdrant-storeRust 編寫,支持 REST

三、核心接口結構

public interface VectorStore {void add(List<Document> documents);List<Document> similaritySearch(String query, int topK);
}

文檔結構

public class Document {private String content;private Map<String, String> metadata;
}

四、文本轉向量底層原理

Spring AI 使用 EmbeddingClient 調用 LLM 服務(如 OpenAI)將文本轉為向量:

EmbeddingResponse embed(String input);
  • 背后原理是 Transformer 模型中的 Encoder,將語義映射到向量空間
  • 常用模型:text-embedding-ada-002(1536維)

五、以 PGVector 為例的工作流程

添加向量

EmbeddingResponse response = embeddingClient.embed("企業文化內容");
Document doc = new Document("企業文化內容", Map.of("topic", "文化"));
vectorStore.add(List.of(doc));

底層使用 SQL 插入向量字段(float8[]):

INSERT INTO documents (content, metadata, embedding)
VALUES (?, ?, ?::vector)

查詢向量

List<Document> docs = vectorStore.similaritySearch("公司節假日安排", 3);

生成查詢 embedding,執行 SQL:

SELECT * FROM documents
ORDER BY embedding <-> ?::vector
LIMIT 3;

六、RAG 實戰項目結構(Spring AI)

項目目標:上傳知識文檔,生成向量庫,用戶提問返回智能回答。

項目結構

spring-ai-rag-demo/
├── config/
│   └── AiConfig.java
├── controller/
│   └── QaController.java
├── service/
│   └── RagService.java
├── util/
│   └── TextSplitter.java
├── application.yml

application.yml 示例

spring:ai:openai:api-key: sk-xxxchat:model: gpt-3.5-turboembedding:model: text-embedding-ada-002vectorstore:type: pgvectorindex-name: rag_documentsdimensions: 1536

配置類

@Configuration
public class AiConfig {@Beanpublic EmbeddingClient embeddingClient(OpenAiEmbeddingClient client) {return client;}
}

TextSplitter 工具類

public class TextSplitter {public static List<String> split(String text, int chunkSize) {List<String> chunks = new ArrayList<>();for (int i = 0; i < text.length(); i += chunkSize) {chunks.add(text.substring(i, Math.min(i + chunkSize, text.length())));}return chunks;}
}

RagService

@Service
@RequiredArgsConstructor
public class RagService {private final EmbeddingClient embeddingClient;private final VectorStore vectorStore;private final ChatClient chatClient;public void uploadDoc(String rawText) {List<String> chunks = TextSplitter.split(rawText, 300);List<Document> docs = chunks.stream().map(text -> new Document(text, Map.of())).toList();vectorStore.add(docs);}public String ask(String question) {List<Document> relevant = vectorStore.similaritySearch(question, 3);String context = relevant.stream().map(Document::getContent).collect(Collectors.joining("\n\n"));Prompt prompt = Prompt.builder().system("你是公司智能問答助手,請結合提供的資料回答問題。").user("資料如下:\n" + context + "\n\n問題:" + question).build();return chatClient.call(prompt).getResult().getOutput().getContent();}
}

控制器

@RestController
@RequiredArgsConstructor
@RequestMapping("/qa")
public class QaController {private final RagService ragService;@PostMapping("/upload")public String upload(@RequestBody String text) {ragService.uploadDoc(text);return "文檔已上傳并向量化";}@GetMapping("/ask")public String ask(@RequestParam String question) {return ragService.ask(question);}
}

七、向量庫選擇建議

使用場景推薦向量庫原因
小型項目 / 內存快讀Redis部署輕便,速度快
需要持久化 + 查詢PGVectorSQL 強大,易集成 PostgreSQL 項目
大規模檢索系統Milvus/Qdrant高并發 + ANN 檢索優化

八、可視化與測試工具

  • RedisInsight 查看 Redis 向量數據
  • pgAdmin/Beekeeper 查看 PG 向量字段
  • Qdrant Console / Milvus UI

九、RAG 流程圖

用戶上傳文檔
文本切分
EmbeddingClient 生成向量
存入 VectorStore
用戶提問
生成查詢向量
VectorStore 相似搜索
拼接 Prompt
ChatClient 生成回答

十、總結

  • Spring AI 使用統一的 VectorStore 接口封裝向量數據庫操作
  • 向量生成通過 EmbeddingClient 與 OpenAI/Ollama 接口
  • 可基于向量檢索構建 RAG 問答系統,支持常見向量庫(PGVector、Redis、Milvus)
  • Java 開發者可零門檻快速搭建企業級智能問答系統

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/912957.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/912957.shtml
英文地址,請注明出處:http://en.pswp.cn/news/912957.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【RK3568+PG2L50H開發板實驗例程】Linux部分/FPGA FSPI 通信案例

本原創文章由深圳市小眼睛科技有限公司創作&#xff0c;版權歸本公司所有&#xff0c;如需轉載&#xff0c;需授權并注明出處&#xff08;www.meyesemi.com) 1. 簡介 本案例旨在 ARM端運行 Linux系統&#xff0c;基通過 FSPI測試。 2. ARM端和 FPGA端通信流程 (1)ARM端實現SP…

github如何創建一個自己的倉庫保姆級教程

文章目錄 準備階段(github官網)添加ssh公鑰添加token創建倉庫 本地設置本地代理創建倉庫添加文件到倉庫進行提交 準備階段(github官網) 添加ssh公鑰 創建SSH KEY。先看一下你C盤用戶目錄下有沒有.ssh目錄&#xff0c;有的話看下里面有沒有id_rsa和id_rsa.pub這兩個文件&#…

LabVIEW 網絡流通信功能

LabVIEW 的網絡流技術實現主機 VI&#xff08;Host VI&#xff09;與客戶端 VI&#xff08;ClientVI&#xff09;間的雙向數據交互&#xff0c;包含命令發送與波形數據傳輸&#xff0c;支持跨設備、跨進程的實時通信&#xff0c;滿足分布式系統中數據交互與控制需求。 主機 VI邏…

Prompt 精通之路(一)- AI 時代的新語言:到底什么是 Prompt?為什么它如此重要?

AI 時代的新語言&#xff1a;到底什么是 Prompt&#xff1f;為什么它如此重要&#xff1f; 標簽&#xff1a; #Prompt新手指南 #提示詞入門 #AI指令 #人工智能 #ChatGPT &#x1f680; Prompt 精通之路&#xff1a;系列文章導航 第一篇&#xff1a;AI 時代的新語言&#xff1a…

uniapp 滾動tab

uniapp woui unibest <route lang"json5">{style: {navigationBarTitleText: 知識產權,navigationBarBackgroundColor: #C80F06,navigationBarTextStyle: white,backgroundColorTop: #C80F06,},} </route> <template><view class"bgc-b …

日事清駕駛艙模式上線:實時數據更新+項目管理+數據可視化,提升決策效率?

大家好&#xff01;我們在日事清最新更新中推出了一個令人激動的新功能——駕駛艙模式。這一全新界面將為企業管理者和團隊提供一個全面、實時的數據展示平臺。下面&#xff0c;讓我們詳細了解這個功能如何幫助您更好地把握企業動態和提升決策效率。 快速入口&#xff1a;一鍵激…

【Maven】Maven深度避坑指南:依賴沖突全維度解決方案與工業級實戰(超萬字解析)

注&#xff1a;本文基于50大型企業級項目經驗&#xff0c;結合Maven底層源碼機制&#xff0c;系統化解決依賴沖突問題。包含20個實戰場景、10類特殊案例及5大防御體系構建方案。 Maven深度避坑指南&#xff1a;依賴沖突全維度解決方案與工業級實戰&#xff08;超萬字解析&#…

Rust Web 全棧開發(二):構建 HTTP Server

Rust Web 全棧開發&#xff08;二&#xff09;&#xff1a;構建 HTTP Server Rust Web 全棧開發&#xff08;二&#xff09;&#xff1a;構建 HTTP Server創建成員包/庫&#xff1a;httpserver、http解析 HTTP 請求HTTP 請求的構成構建 HttpRequest 構建 HTTP 響應HTTP 響應的構…

小架構step系列01:小架構初衷

1 概述 小公司做業務服務&#xff0c;需要聚焦到實際的業務上&#xff0c;盡快通過業務服務客戶&#xff0c;給客戶創建價值&#xff0c;公司才能生存下去。在技術上采用的Web應用架構具備以下特點&#xff1a; 主要由開源組件組裝而成。這樣既可以節省成本&#xff0c;也可以把…

蘋果AR/VR頭顯路線圖曝光,微美全息推進AI/AR智能眼鏡新品開啟視覺體驗篇章

日前&#xff0c;郭明錤發表了一篇關于蘋果&#xff08;AAPL.US&#xff09;2025-2028頭戴式產品路線圖的文章&#xff0c;里面提到蘋果正在開發涵蓋MR頭顯、AI眼鏡、AR眼鏡、Birdbath眼鏡等共計7款設備。 蘋果的頭顯設備中&#xff0c;大量出貨的產品是類似于Ray-Ban Meta的智…

python pyecharts 數據分析及可視化(2)

一、任務要求 任務二&#xff1a;感冒高發期分析 【任務說明】 感冒是一種常見的急性上呼吸道病毒性感染性疾病&#xff0c;多由鼻病 毒、副流感病毒、呼吸道合胞病毒、埃可病毒、柯薩奇病毒、冠狀病 毒、腺病毒等引起。臨床表現為鼻塞、噴嚏、流涕、發熱、咳嗽、頭 痛等&#…

React自學 基礎一

React基礎 React 是一個由 Facebook&#xff08;現 Meta&#xff09;開發并維護的、開源的 JavaScript 庫&#xff0c;主要用于 構建用戶界面&#xff08;UI&#xff09;&#xff0c;尤其是單頁面應用程序中的動態、交互式界面。 簡單示例&#xff1a; import React, { useSt…

PHP語法基礎篇(八):超全局變量

超全局變量是在 PHP 4.1.0 中引入的&#xff0c;并且是內置變量&#xff0c;可以在所有作用域中始終可用。 PHP 中的許多預定義變量都是"超全局的"&#xff0c;這意味著它們在一個腳本的全部作用域中都可用。在函數或方法中無需執行 global $variable; 就可以訪問它們…

NumPy-核心函數concatenate()深度解析

NumPy-核心函數concatenate深度解析 一、concatenate()基礎語法與核心參數函數簽名與核心作用基礎特性&#xff1a;形狀匹配規則 二、多維數組拼接實戰示例1. 一維數組&#xff1a;最簡單的序列拼接2. 二維數組&#xff1a;按行與按列拼接對比按行拼接&#xff08;垂直方向&…

aws(學習筆記第四十八課) appsync-graphql-dynamodb

aws(學習筆記第四十八課) appsync-graphql-dynamodb 使用graphql來方便操作dynamodb 理解graphql中的graphql api&#xff0c;schema&#xff0c;resolver 學習內容&#xff1a; graphqlgraphql apischemaresolver 1. 代碼連接和修改 1.1 代碼鏈接 代碼鏈接&#xff08;app…

關于微前端框架micro,子應用設置--el-primary-color失效的問題

設置了manualChunks導致失效,去掉即可,比較小眾的問題 下面是deepseek的分析 關于 manualChunks 導致 Element Plus 主題變量失效的問題 你找到的確實是問題的關鍵所在。這個 manualChunks 配置影響了 Element Plus 樣式和變量的加載順序&#xff0c;從而導致主題變量失效。…

MySQL 學習 之 你還在用 TIMESTAMP 嗎?

目錄 1. 弊端1.1. 取值范圍1.2. 時區依賴1.3. 隱式轉換 2. 區別3. 解決 1. 弊端 1.1. 取值范圍 TIMESTAMP 的取值范圍為 1970-01-01 00:00:01 UTC 到 2038-01-19 03:14:07 UTC&#xff0c;超出范圍的數據會被強制歸零或觸發異常?。 具體表現為在基金債券等業務中&#xff0…

java中字節和字符有何區別,為什么有字節流和字符流?

在Java中&#xff0c;字節&#xff08;byte&#xff09;和字符&#xff08;char&#xff09;是兩種不同的數據類型&#xff0c;它們的主要區別在于所表示的數據單位、用途以及編碼方式,字節流和字符流的區分就是為了解決編碼問題。 字節&#xff08;byte&#xff09;&#xff…

伴隨矩陣 線性代數

伴隨矩陣的定義 伴隨矩陣的作用是什么&#xff1f;我們可以看到其伴隨矩陣乘上自己等于一個數&#xff08;自身的行列式&#xff09;乘以E&#xff0c;所以對于一個方陣來說&#xff0c;其逆矩陣就是自己的伴隨矩陣的倍數。 所以說伴隨矩陣的作用就是用來更好的求解逆矩陣的。…

百勝軟件獲邀走進華為,AI實踐經驗分享精彩綻放

在數字化浪潮席卷全球的當下&#xff0c;零售行業正經歷著深刻變革&#xff0c;人工智能技術成為重塑行業格局的關鍵力量。6月26日&#xff0c;“走進華為——智領零售&#xff0c;AI賦能新未來”活動在華為練秋湖研發中心成功舉辦。百勝軟件作為數字零售深耕者&#xff0c;攜“…