问题出现得很突然,日志倒是留得挺全。为了省存储把向量从 3072 维降到 1024,请求里加上 dimensions=1024,接口 400,原文 This model does not support the dimensions parameter。
刚开始盯着「降维后旧索引里的向量维度不一致,检索直接报错」,折腾了半个多小时,排掉了。
原因不止一个,得分开看。只有 text-embedding-3 系列支持 dimensions,ada-002 固定 1536。另一种情况是维度只能小于等于模型原生维度,放大会被拒。
少数情况下是部分兼容网关只实现默认维度,这个参数被静默忽略。
上来先确认模型是否支持自定义维度
curl -s https://api.openai.com/v1/embeddings -H "Authorization: Bearer $OPENAI_API_KEY" -H "Content-Type: application/json" -d '{"model":"text-embedding-3-small","input":"test","dimensions":512}' | jq '.data[0].embedding|length'
接着用原生维度跑一条做基线
curl -s https://api.openai.com/v1/embeddings -H "Authorization: Bearer $OPENAI_API_KEY" -H "Content-Type: application/json" -d '{"model":"text-embedding-3-small","input":"test"}' | jq '.data[0].embedding|length'
然后按新维度重建索引并清掉旧向量
python -c "print(512*4, 'bytes per vector')"
入库前校验查询向量维度
python -c "import json;print(len(json.load(open('vec.json'))))"
改完先别撤,确认这几项。接口返回的向量长度等于请求的 dimensions,索引 mapping 里的维度与新值一致,检索不再抛维度不匹配的异常。
容易忽略的是,降维省的是存储和带宽,精度损失却是永久的,换维度等于换了一套向量空间,旧数据只能全量重算。报错文案容易误导,真正的原因往往在相邻那一层的日志里。
