这个坑值得记一笔。PostgreSQL 16.2 上装的是 pgvector 0.6.0,建表时把字段写成 halfvec(1024),直接报 ERROR: type “halfvec” does not exist,同一个库里的 vector 字段完全正常,扩展目录和版本号都确认过一遍。
刚开始盯着「升级只替换了控制文件,没执行 ALTER EXTENSION UPDATE,目录里仍是旧记录」,折腾了半个多小时,排掉了。
原因不止一个,得分开看。halfvec 是 0.7.0 才加入的类型,0.6.0 的扩展脚本里没有这个定义;扩展只装在 template1,当前业务库是克隆来的,元数据还停在旧版本;新类型装在别的 schema 下,search_path 里排不到,解析时找不到。
上来先查当前库里扩展的真实版本和安装 schema
psql -d kb -c "SELECT extversion, extnamespace::regnamespace FROM pg_extension WHERE extname='vector';"
然后在实例上看可选版本,确认二进制包已经换成 0.7.x
psql -d kb -c "SELECT name, default_version, installed_version FROM pg_available_extensions WHERE name='vector';"
升级扩展定义,让新类型注册进系统目录
psql -d kb -c "ALTER EXTENSION vector UPDATE TO '0.7.1';"
剩下的就是把列改成 halfvec 并核对存储宽度
psql -d kb -c "ALTER TABLE docs ALTER COLUMN emb TYPE halfvec(1024);"
怎么算真的好了,看的是同一批现象。pg_available_extensions 里 installed_version 与 default_version 一致,建表不再报类型不存在,\d+ docs 显示的列类型是 halfvec(1024)。
这里还有个坑。halfvec 只占一半字节,召回会略降,索引参数要按半精度重算,别直接沿用 vector 那套 lists。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。
