跳到主要内容
📖 本章预览

本章为预览版本,展示部分核心内容。完整内容包含详细源码解析、实战代码和面试要点,加入知识星球即可解锁全部章节。

第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 章完整内容 + 持续更新
  • ✅ 配套源码 + 实战项目
  • ✅ 一对一答疑 + 面试辅导
  • ✅ 简历优化 + 内推机会

📚 本章完整目录

以下为本章完整目录结构,加入知识星球即可解锁全部内容。

7.4 文档切分

7.5 其他向量库接入