Spring AI 08 · VectorStore 抽象与 pgvector 配置
08 · VectorStore 抽象与 pgvector 配置 学完能做什么理解 VectorStore 统一抽象正确配置 PgVectorStore自动建表、索引、距离、维度看懂它建出来的表结构。⏱️ 预计耗时45 分钟含动手 依赖前置第 07 章 pgvector 文档07、08、19、20 难度一句话VectorStore 是向量的「统一 DAO」PgVectorStore 是它的 pgvector 实现配好数据源 四个关键参数维度/距离/索引/建表就能自动建表并读写向量。1. VectorStore 是什么一个统一接口屏蔽底层是 pgvector、Redis、Milvus 还是别的。核心就三个方法publicinterfaceVectorStore{voidadd(ListDocumentdocuments);// 写入自动转向量voiddelete(ListStringidList);// 删除ListDocumentsimilaritySearch(SearchRequestrequest);// 相似检索}换向量库实现业务代码几乎不用改——这就是抽象的价值。本教程始终用 pgvector。2. 依赖与配置依赖第 06 章已加过dependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-starter-vector-store-pgvector/artifactId/dependency配置spring:datasource:url:jdbc:postgresql://localhost:5432/ragdemousername:postgrespassword:postgresai:vectorstore:pgvector:initialize-schema:true# 是否自动建表 建索引schema-name:publictable-name:vector_store# 表名默认就是 vector_storedimensions:1536# ★必须等于 embedding 模型维度distance-type:cosine_distance# 距离度量index-type:hnsw# 索引类型3. 四个关键参数详解① dimensions维度—— 最容易错必须与 embedding 模型输出维度完全相等text-embedding-3-small → 1536 bge-large-zh → 1024不一致会在写入/查询时报错。换 embedding 模型时这里也要跟着改并重建数据。② distance-type距离取值含义适用cosine_distance余弦距离文本语义检索首选euclidean_distance欧氏距离 (L2)一般场景negative_inner_product负内积向量已归一化、追求性能回顾 pgvector 文档03、12。文本 RAG 用cosine_distance基本不会错。③ index-type索引取值说明hnsw图索引召回高、查询快生产首选pgvector 文档 19、20ivfflat聚类索引需先有数据再建pgvector 文档 17、18none不建索引走暴力搜索仅小数据量/测试④ initialize-schema自动建表trueSpring AI 启动时自动建表和索引学习期方便。生产建议false改用第 15/32 章的手动 DDL 版本化脚本避免自动改库风险。4. 它自动建出来的表长什么样initialize-schema: true时Spring AI 大致建出这样一张表CREATETABLEvector_store(id uuidPRIMARYKEYDEFAULTuuid_generate_v4(),contenttext,-- 原始文本metadata json,-- 元数据来源、分类等embedding vector(1536)-- 向量维度 dimensions);-- HNSW 索引距离与 distance-type 对应CREATEINDEXONvector_storeUSINGhnsw(embedding vector_cosine_ops);看懂这张表很关键contentmetadataembedding就是一条Document的落地形态。检索时按embedding算距离用metadata做过滤第 11 章。5. 自定义 VectorStore Bean进阶多数情况自动配置够用。若要精细控制如复用已有表、自定义批量大小可手动建 BeanBeanVectorStorevectorStore(JdbcTemplatejdbcTemplate,EmbeddingModelembeddingModel){returnPgVectorStore.builder(jdbcTemplate,embeddingModel).dimensions(1536).distanceType(PgVectorStore.PgDistanceType.COSINE_DISTANCE).indexType(PgVectorStore.PgIndexType.HNSW).initializeSchema(true).build();}6. 验证是否配好写一条、查一条跑通即成功vectorStore.add(List.of(newDocument(Spring AI 用 pgvector 存向量)));ListDocumenthitsvectorStore.similaritySearch(SearchRequest.builder().query(向量存储).topK(1).build());System.out.println(hits.get(0).getText());也可直接到数据库确认SELECT count(*) FROM vector_store;7. 一句话总结VectorStore 是统一的向量 DAOpgvector 实现只需配好数据源 维度 距离 索引 是否自动建表建出的表就是content/metadata/embedding三件套维度对齐是第一铁律。➡️ 下一章09-写入向量数据add.md深入 Document、metadata 与批量写入的正确姿势。