一、什么是向量數據庫?
向量數據庫用于存儲、檢索稠密語義向量(Embedding),是構建 RAG(檢索增強生成)系統的核心組件。它支持近似最近鄰搜索(ANN),可根據語義相似度找出最相關的文本。
二、Spring AI 的向量庫支持
Spring AI 提供統一接口 VectorStore
,支持以下數據庫作為向量存儲:
向量數據庫 | 模塊依賴 | 特點 |
---|---|---|
Redis | spring-ai-redis-store | 快速、適合中小規模 |
PGVector | spring-ai-pgvector-store | PostgreSQL 擴展 |
Milvus | spring-ai-milvus-store | 高性能向量引擎 |
Qdrant | spring-ai-qdrant-store | Rust 編寫,支持 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 | 部署輕便,速度快 |
需要持久化 + 查詢 | PGVector | SQL 強大,易集成 PostgreSQL 項目 |
大規模檢索系統 | Milvus/Qdrant | 高并發 + ANN 檢索優化 |
八、可視化與測試工具
- RedisInsight 查看 Redis 向量數據
- pgAdmin/Beekeeper 查看 PG 向量字段
- Qdrant Console / Milvus UI
九、RAG 流程圖
十、總結
- Spring AI 使用統一的
VectorStore
接口封裝向量數據庫操作 - 向量生成通過
EmbeddingClient
與 OpenAI/Ollama 接口 - 可基于向量檢索構建 RAG 問答系統,支持常見向量庫(PGVector、Redis、Milvus)
- Java 開發者可零門檻快速搭建企業級智能問答系統