这类问题我又碰上了一次。一次提交五千条文本算向量,接口返回 400,提示单次请求的输入条数超过上限。
第一反应是「并发多个大批次,触发速率限制」,验证下来不成立。
排查方向其实有限,先把可能性排一排。接口对单次条数有硬限制;单条文本过长,合计 token 超出配额;重试时把整批原样重发,进一步放大请求。
第一件事是按条数与 token 双重限制分批
python embed.py --batch 64 --max-tokens 8000
单条过长时先截断或分片
python -c "print(len(text.split()))"
失败批次拆半重试而不是整批重发
python -c "print(len(batch)//2)"
末了统计每批耗时与失败率
python -c "print({'ok': ok, 'fail': fail})")
手上没有现成的复现脚本,就照着线上请求手工拼了一个。
恢复的判定其实很直接。全部文本的向量计算完成,条数与输入一致,失败重试次数控制在个位数。
分批大小要同时看条数和 token 两个维度,只按条数分会在大文本上超限,只按 token 分又会产生过多请求。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。