事情本身不复杂,线索都在日志里。把一天的 3000 条工单一次性传给 text-embedding-3-small,输入是字符串数组,接口返回 400,原文是 array too long,单条请求的 tokens 只有 12 万左右。

第一反应是「个别工单正文上万字,单条就超模型上下文」,验证下来不成立。

真正麻烦的地方在于,几个原因的现象几乎一样。单次请求的输入条数有上限,超了直接拒。还有一种是总 token 数也有限制,两条都满足才放行。

少数情况下是重试时把整批原样再发,重复消耗配额。

上来先统计条数与单条最大长度

python -c "import json;d=json.load(open('tickets.json'));print(len(d), max(len(x) for x in d))"

然后按条数与 token 双维度切片

python -c "print({'batch':256,'max_tokens':60000})"

超长文本先截断或分段再取均值

python -c "print('truncate to 6000 chars then embed')"

剩下的就是分批写入并用 id 对齐结果

python -c "print({'input':['id_1','id_2'],'dimensions':1536})"

怎么算真的好了,看的是同一批现象。全部工单都拿到 1536 维向量,条数与源数据一致,接口不再返回 array too long。

容易忽略的是,批量接口的上限通常同时约束条数和 token,两个维度都要切,只按条数分很容易在长文本上翻车。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189