知识库之前在 3090 上用 vLLM 跑 bge-m3 拿到 1024 维向量,迁到 Ollama 0.5.7 后同样的文本返回 3584 维,pgvector 直接报维度不匹配,旧库三万多条记录全部用不了。

真正麻烦的地方在于,几个原因的现象几乎一样。bge-m3 支持稠密稀疏多向量三种输出,不同后端默认取的不是同一种;Ollama 的 embeddings 接口返回的是拼接后的多向量;建表时把维度写死成 1024,插入别的长度必然失败;同批数据混了两个来源的向量,检索时相似度没有意义。

量一下两边返回的向量长度

curl -sS http://localhost:11434/api/embeddings -d '{"model":"bge-m3","prompt":"测试"}' | jq '.embedding | length'

然后确认目标维度后重建列

psql -c "ALTER TABLE docs ALTER COLUMN emb TYPE vector(3584);"

再往下把新旧数据分开存,避免混用

psql -c "SELECT source, count(*) FROM docs GROUP BY source;"

全量重算新库并记录模型名

python reindex.py --model bge-m3 --dim 3584 --source ollama

改完先别撤,确认这几项。所有向量长度统一为 3584,检索返回的相似度落在合理区间,不再出现维度不匹配的报错。

换向量后端等于换了一个模型,旧向量必须全量重算,只改维度数字检索结果依旧不可信。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189