📖 本章预览
本章为预览版本,展示部分核心内容。完整内容包含详细源码解析、实战代码和面试要点,加入知识星球即可解锁全部章节。
第7章 向量数据库实战:给 AI 装上记忆
7.1 核心概念
7.1.1 为什么需要向量数据库
上一章的 SimpleSemanticSearch 把向量存在内存里,数据量大时有两个致命问题:
- 内存放不下:百万级文档的向量需要 GB 级内存
- 暴力搜索太慢:逐一计算相似度,O(n) 复杂度
向量数据库通过索引算法(如 HNSW)实现近似最近邻搜索(ANN),将搜索复杂度降到 O(log n)。
7.1.2 HNSW 索引原理(简化版)
HNSW(Hierarchical Navigable Small World):
- 构建多层图结构,上层稀疏、下层稠密
- 搜索时从顶层开始,逐层向下"跳跃"到目标附近
- 类比:先看世界地图定位到国家,再看省地图,再看城市地图
层级示意:
Layer 2: A -------- D (稀疏,快速定位)
Layer 1: A --- B --- D --- F (中等密度)
Layer 0: A-B-C-D-E-F-G-H-I-J (全量数据,精确搜索)
7.2 Spring AI VectorStore 统一抽象
public interface VectorStore {
/** 添加文档(自动向量化) */
void add(List<Document> documents);
/** 删除文档 */
void delete(List<String> idList);
/** 相似度搜索 */
List<Document> similaritySearch(SearchRequest request);
}
所有向量数据库实现同一接口,切换只改配置。
7.3 PgVector 接入实战
7.3.1 环境准备
-- PostgreSQL 安装 pgvector 扩展
CREATE EXTENSION IF NOT EXISTS vector;
-- Spring AI 会自动创建向量表,无需手动建表
spring:
ai:
vectorstore:
pgvector:
index-type: HNSW
distance-type: COSINE_DISTANCE
dimensions: 1024
datasource:
url: jdbc:postgresql://localhost:5432/ai_demo
username: postgres
password: postgres
7.3.2 文档入库与检索
@Service
public class VectorStoreService {
@Autowired
private VectorStore vectorStore;
/** 添加文档 */
public void addDocuments(List<String> texts) {
List<Document> documents = texts.stream()
.map(text -> new Document(text))
.toList();
vectorStore.add(documents); // 自动向量化 + 存储
}
/** 带元数据的文档 */
public void addWithMetadata(String text, String source, String category) {
Map<String, Object> metadata = Map.of(
"source", source,
"category", category,
"createTime", System.currentTimeMillis()
);
vectorStore.add(List.of(new Document(text, metadata)));
}
/** 相似度搜索 */
public List<Document> search(String query, int topK) {
SearchRequest request = SearchRequest.builder()
.query(query)
🔒 解锁完整内容
本章剩余内容需要解锁后查看
以上仅为本章部分预览内容,完整内容包含更多深度源码解析、实战代码和面试要点。
加入知识星球你将获得:
- ✅ 全部 26 章完整内容 + 持续更新
- ✅ 配套源码 + 实战项目
- ✅ 一对一答疑 + 面试辅导
- ✅ 简历优化 + 内推机会
📚 本章完整目录
以下为本章完整目录结构,加入知识星球即可解锁全部内容。