先看现象。用 Ollama 0.4 的 api/embed 一次传 32 条文本做批量向量化,返回的 embeddings 只有 3 条有值,其余位置是空数组,单条调用则完全正常。

排查方向其实有限,先把可能性排一排。输入里混了空字符串,服务端提前停止处理。也可能是单条文本过长,超过模型上下文。

少数情况下是请求体里的 input 传成了对象数组。

不容易想到的是,并发调用同一模型触发显存不足被静默跳过。

过滤空串后再发一次

python -c "import requests;r=requests.post('http://127.0.0.1:11434/api/embed',json={'model':'bge-m3','input':['a','b']});print(len(r.json()['embeddings']))"

然后检查每条输入的长度分布

python text_stat.py --file texts.txt --show-len

再往下按长度分批并截断超长文本

python batch_embed.py --max-chars 2000 --size 16

剩下的就是核对返回条数与输入条数

python -c "import json;d=json.load(open('emb.json'));print(len(d['embeddings']))"

隔了一天再看,现象没变,说明不是偶发。

改完先别撤,确认这几项。返回条数与输入条数一致,空数组数为零,向量维度统一为 1024。

补一句。批量接口对个别坏输入常常静默跳过,一定要拿返回条数跟输入对一遍。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189