报
type "vector" does not exist,十有八九不是 Spring AI 配错了,而是 PostgreSQL 里根本没启用pgvector扩展。initialize-schema=true只能帮你建表,帮不了你安装数据库扩展。
Issue & Env(案发现场与环境)
- 业务场景:项目接入
PgVectorStore,启动时希望由 Spring AI 自动建表并写入 embedding。 - 常见环境:Spring Boot 3.x、Spring AI 1.1.x / 2.0.x、PostgreSQL 15+,本地数据库可能是纯 Postgres 镜像,不是预装 pgvector 的镜像。
StackTrace(堆栈日志)
报错原文直接打在建表 SQL 上:
org.postgresql.util.PSQLException: ERROR: type "vector" does not exist
Position: 146
完整堆栈从 Spring AI 建表一路走到 PG JDBC 驱动:
org.springframework.jdbc.BadSqlGrammarException:
StatementCallback; bad SQL grammar [CREATE TABLE IF NOT EXISTS vector_store (...)];
nested exception is org.postgresql.util.PSQLException: ERROR: type "vector" does not exist
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:414)
at org.springframework.ai.vectorstore.pgvector.PgVectorStore.initializeSchema(PgVectorStore.java:173)
at org.springframework.ai.vectorstore.pgvector.PgVectorStore.afterPropertiesSet(PgVectorStore.java:138)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1863)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1812)
Caused by: org.postgresql.util.PSQLException: ERROR: type "vector" does not exist
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2731)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2420)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:352)
at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:498)
at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:413)
BadSqlGrammarException 是 Spring JDBC 对“SQL 本身语法/类型错误”的统一包装,Caused by 里的 PSQLException 才是 PG 服务端拒绝建表的原始报错。
如果你自己先手写了扩展语句,但数据库里没有安装 pgvector,也可能看到:
ERROR: extension "vector" is not available
DETAIL: Could not open extension control file ".../vector.control": No such file or directory.
Reproduce(复现代码)
只配 Spring AI 的 PGvector starter 和初始化开关,但数据库本身没装扩展:
spring:
datasource:
url: jdbc:postgresql://localhost:5432/ai
username: postgres
password: postgres
ai:
vectorstore:
pgvector:
initialize-schema: true
dimensions: 1536
启动后,框架会尝试创建类似这样的表结构:
CREATE TABLE IF NOT EXISTS vector_store (
id uuid DEFAULT uuid_generate_v4() PRIMARY KEY,
content text,
metadata json,
embedding vector(1536)
);
只要当前数据库里没有 vector 类型,这句 SQL 就会直接失败。
Root Cause(根因分析)
Spring AI 官方文档把前提写得很明确:使用 PGvector 之前,PostgreSQL 实例里要先启用 vector、hstore 和 uuid-ossp 扩展。也就是说,Spring AI 负责的是向量表和索引层;pgvector 这个数据库扩展本身,必须由你或 DBA 先安装。
这里最容易踩的坑有两个:
1. 把“初始化 schema”误解成“安装扩展”
spring.ai.vectorstore.pgvector.initialize-schema=true 的职责是创建 Spring AI 需要的表、索引和字段,不会替你执行操作系统层面的扩展安装,也不会替你把 CREATE EXTENSION vector 变成万能修复。
2. 用了纯 PostgreSQL 镜像
很多人本地起的是官方 postgres 镜像,而不是带 pgvector 的镜像。这样数据库虽然能连,但 vector 类型根本不存在。你直到建表时才会看见 type "vector" does not exist,于是误以为是 ORM、DDL 或维度配置的问题。
The Fix(解决方案)
先确认数据库真的安装了 pgvector
在数据库里执行:
SELECT * FROM pg_extension WHERE extname IN ('vector', 'hstore', 'uuid-ossp');
如果查不到 vector,先安装扩展,再谈 Spring AI。
本地开发直接用带 pgvector 的镜像
最省事的办法是直接起带扩展的镜像,例如:
docker run --name pgvector-demo \
-e POSTGRES_PASSWORD=postgres \
-e POSTGRES_DB=ai \
-p 5432:5432 \
-d pgvector/pgvector:pg16
然后连进去执行:
CREATE EXTENSION IF NOT EXISTS vector;
CREATE EXTENSION IF NOT EXISTS hstore;
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
再让 Spring AI 建表
扩展确认无误后,再保留:
spring:
ai:
vectorstore:
pgvector:
initialize-schema: true
此时 embedding vector(1536) 才能被 PostgreSQL 正常识别。
生产环境别把扩展安装放在应用启动里赌运气
如果是线上数据库,建议把扩展安装和权限开通放进数据库初始化脚本、Terraform、Flyway/Liquibase 或 DBA 流程,而不是指望应用第一次启动时“顺便搞定”。因为很多托管 PostgreSQL 服务默认不允许普通业务账号执行 CREATE EXTENSION。
小结
type "vector" does not exist的本质,是数据库里没有vector类型。- Spring AI 会帮你建向量表,不会替你安装 pgvector 扩展。
- 修复顺序是:安装扩展 -> 执行
CREATE EXTENSION-> 再让 Spring AI 初始化 schema。 - 如果你用的是纯 Postgres 镜像,这个错误几乎必现。
References(参考来源)
- PGvector — Spring AI 官方文档spring-docs
- pgvector READMEgithub
- pgvector Installationgithub
