一、什么是向量数据库?
向量数据库用于存储、检索稠密语义向量(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 开发者可零门槛快速搭建企业级智能问答系统