Batch JSONL 按字节分包,为什么同样行数的中文请求大小不同
两个 Batch 文件都有一百行,大小可能相差很多。中文与 ASCII 字符的 UTF-8 字节不同,JSON 转义和换行也占空间。分包应对实际将要写出的字节计算预算,而不是用行数或字符串长度估算文件大小。
固定序列化,再计算大小
本文使用紧凑 JSON、保留中文文本,并在每条记录末尾加一个 LF。每行先得到完整编码字节,行长包含这个换行。示例预算只为二百字节,便于肉眼复算,它不是 OpenAI 当前文件限制,也不适合作为普遍生产参数。官方平台限制应在真实提交前重新核对。
输入包含三条不同长度的中文与英文合成请求。分包器逐行累计,如果下一行会超预算,先结束当前包再开新包;不会拆开一个 JSON 对象。每个包索引保存文件名、字节数、行数和 ID 序列,后续才能复核没有漏行或重复。
单行过大不能另开超限包
如果某一条本身就超过预算,必须报单行超限。把它单独塞进一个大包只是隐藏了问题,仍然不满足合同。调用方可以缩短输入、改任务粒度或调整经过批准的本地预算,不能在分包器里无声忽略超限记录。
附件生成三份 JSONL 分片,并把它们按索引重新连接读取。重合并后记录顺序、custom_id 和完整对象都应等于原输入,每份文件的实际字节数也应不超示例预算。另有超大单行反例,必须拒绝且不生成伪合规分包。
字符数检查为什么会误判
失败反例是用 len(json_text) 累加。一个中文字符在 UTF-8 中通常占多字节,字符串长度小于预算并不保证文件长度小于预算。若改为 ASCII 转义序列化,大小又会变化,因此同一批数据必须使用与最终写盘完全一致的序列化设置来计算。
换行也不能漏算。前三条恰好各占一百字节时,不含 LF 的计算会让边界包多出字节。空输入应生成空索引,而不是一个无法解释的空包;输入 ID 重复应在上游阻断,分包不负责掩盖身份冲突。
本文只在本地生成与验证文件,没有上传 Batch,也没有验证服务端队列和模型兼容性。通过表示文件分片在示例预算内且重合并无损,仍需逐行检查真实请求合同。分包完成和任务完成是两个阶段,后续结果应继续按 custom_id 对账,不能根据分片数量宣布全部处理成功。
配套文件与依据
本文的合成输入和参考结果可下载独立样本 a032.json,离线检查器 a032.py与样本放在同一目录后运行。检查器不调用模型接口。 使用 Python 3.12 或兼容版本,将上述文件下载到同一目录,执行 python a032.py。 同篇运行还需要:a032-part-1.jsonl、a032-part-2.jsonl、a032-part-3.jsonl,请一并下载。
留言讨论
评论发布后会被人工复核,违规内容将被删除。
如果发表没有反应,可以前往联系我们告诉我们。