夜里处理客服工单、商品描述或文档标签,常见做法是把几千条任务打成一个批次,早上下载结果。最危险的故障不是“整批失败”,而是结果文件看起来正常、行数却少了一些;运营又把失败的任务整批重跑,导致成功的部分重复写入业务库。
OpenAI 的Batch API 文档提供了一个很好的数据处理提醒:输出行的顺序不一定与输入相同,应用应使用每行的 custom_id 对回原请求;成功结果和失败结果也可能分别在输出文件与错误文件中。这里引用的是官方 Batch API 的行为,不能据此推断任意“OpenAI-compatible”中转站都支持 /v1/batches。即使不用它的批处理接口,自建队列也应该按同样的 ID 思路设计核对。
每个业务对象有一个稳定 ID,例如 ticket-0042。把一次处理版本也写入 ID 或旁边的元数据:ticket-0042:v2 表示第二版分类规则,不要把两次不同规则的结果混在一行。提交批次前保留脱敏输入清单,记录总任务数、唯一 ID 数、模型 ID、接口、提示词版本与提交时间。输入文件若有重复 ID,先在本地拒绝,别等到回写时才发现冲突。
下载结果后,不要只比较“输入 5,000 行,输出 4,900 行”,因为失败文件、取消的任务和重复 ID 都会影响这个数。先把所有成功 ID、失败 ID 与原始输入 ID 求差集,再决定重试范围:
状态 | 应做的事 | 不应做的事 |
|---|---|---|
成功且内容通过业务校验 | 幂等写入,记录批次与版本 | 因整批不完整而再次提交 |
接口失败、明确未生成结果 | 记录错误类别,按规则重试该 ID | 不限次数地原样重发 |
结果存在但字段不合格 | 留下原响应摘要,单独修复或复核 | 当作“接口没返回” |
输入 ID 找不到成功或失败记录 | 先查批次终态与文件是否下载完整 | 直接猜测模型忽略了它 |
同一 ID 出现多条结果 | 按版本与尝试号仲裁 | 任取最后一行覆盖业务库 |
如果批次尚未完成,下载到的只是中间状态;如果已经完成,也要确认成功文件和错误文件都读取完。只有状态和文件核对齐,差集才有意义。
假设一批 5,000 条演练任务,成功文件 4,850 个不同 ID,错误文件 100 个,剩余 50 个既不在成功也不在失败。此时重跑 5,000 条会让 4,850 条已成功任务至少再次消耗请求;只重跑那 50 条也可能太早,因为批次状态或文件下载未确认。正确顺序是先核对批次终态、两个文件的完整性和输入 ID 的唯一性;确认没有正在写入的结果后,再给那 50 个 ID 单独建“待查”状态。这个算例只说明对账方法,不是某接口的真实丢失率。
假设 input.jsonl、output.jsonl、error.jsonl 每行都有 custom_id。下面的脚本只做本地 ID 对账,不调用模型,也不会重试。具体平台的字段可能不同,使用前按真实文件结构调整:
import { readFileSync } from 'node:fs';
const ids = file => new Set(readFileSync(file, 'utf8').trim().split('\n')
.filter(Boolean).map(line => JSON.parse(line).custom_id));
const input = ids('input.jsonl');
const ok = ids('output.jsonl');
const failed = ids('error.jsonl');
console.log('missing', [...input].filter(id => !ok.has(id) && !failed.has(id)));
console.log('overlap', [...ok].filter(id => failed.has(id)));正式版本还应检查输入中有没有重复 ID、输出中同一 ID 是否出现多次、解析是否失败,以及错误文件是否存在。别把这十行代码当作完整的批处理系统;它的价值是在早晨打开结果文件时,先给你一个可核对的异常名单。
回写业务库时,使用“任务 ID + 规则版本”做唯一键。写入前判断这对键是否已有成功结果;有则跳过或进入显式修订流程,不能把重试结果当新任务累加。记录每次尝试的模型、开始与结束时间、接口状态、业务校验状态和费用。模型调用成功但业务字段失败,两种状态要分开。
官方 Batch API 的价格和额度由官方文档定义;自行把请求排队发送到其他 API,不自动获得官方 Batch 价格。NexoToken 若作为这类离线任务的候选,应分别核对当前账号支持的模型与接口、并发限制、按量单价和会员适用范围。若目标入口没有 Batch API,就用自己的队列逐条提交,并按实际调用计费;不要在方案里写“支持 OpenAI 格式,所以也支持 Batch”。
例如一个周期需要处理 5,000 条标签任务,预算表至少分“成功生成的调用”“明确失败后重试”“内容不合格而复核”三栏。只用 5,000 乘一次请求单价,会低估重试与校验成本。具体数字要从脱敏的真实用量和当前价格页面代入,本文不提供未经实测的平台节省比例。
最后的验收条件不是“任务列表显示完成”,而是:输入 ID 全部在成功、失败或明确取消状态中;成功行已过业务校验;每个业务对象只落库一次;费用能按任务与尝试复算。缺的几百条先找 ID,再决定是否重跑。
资料依据:OpenAI Batch API 官方指南,核对于 2026-11-06。示例工单数量与 ID 为演练数据。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。