当前位置:首页 > 文章列表 > 科技周边 > 人工智能 > Batch API 怎样提交离线任务

Batch API 怎样提交离线任务

来源:17golang原创 2026-10-25 12:04:26 0浏览 收藏

我第一次把一批不需要即时返回的文本任务从同步接口改成 Batch API 时,真正容易出错的不是“异步”两个字,而是把请求集合、输入文件和 Batch 任务混成了一个对象。正确做法是:先按 JSONL 每行一个请求准备输入文件,再用 Files API 上传,最后用返回的文件 ID 创建 Batch。

官方地址:https://platform.openai.com/docs/guides/batch

Batch API 适合评测、批量分类、批量生成嵌入等不要求立即返回的任务。它的入口顺序固定为“JSONL → purpose=batch 文件 → Batch → output_file_id”,不要把它当成一次普通的同步请求。

先看清这次能力变化

Batch API 把一组请求放进一个 JSONL 文件,任务提交后在后台处理。官方文档当前列出的 endpoint 包括 Responses、Chat Completions、Embeddings、Completions、Moderations,以及图像生成和编辑接口;同一个输入文件中的请求应面向同一个模型。它提供独立的批处理限额,完成窗口当前使用 24h,适合能容忍延迟的工作。

这和同步调用的关键差别是返回时机,而不是请求体被“批量改写”。每行的 body 仍然使用对应 endpoint 的参数,custom_id 则负责把最终结果认回原始任务。

准备 JSONL:一行就是一个请求

先写一个 batchinput.jsonl。下面只放两个 Chat Completions 请求,字段保持严格 JSON,不在其中加入注释;custom_id 要在这份文件里唯一,后续处理输出时就用它做关联键。

{"custom_id":"summary-001","method":"POST","url":"/v1/chat/completions","body":{"model":"gpt-6-sol","messages":[{"role":"user","content":"把这段会议纪要整理成三条要点"}],"max_tokens":300}}
{"custom_id":"summary-002","method":"POST","url":"/v1/chat/completions","body":{"model":"gpt-6-sol","messages":[{"role":"user","content":"把这段产品反馈归纳成问题清单"}],"max_tokens":300}}

每行包含四个核心部分:唯一标识 custom_id、请求方法 method、目标 url 和透传给目标接口的 body。如果你的任务换成 Embeddings,就让每行的 url 和 body 都切换到 Embeddings 的形态,不要在同一个输入文件里混用不同模型。

上传文件,再创建离线任务

上传阶段的目的不是立即执行请求,而是取得可供 Batch 引用的文件对象。Python SDK 的最小骨架如下;示例中的文件关闭交给 with,异常则交给调用方处理,避免把一个失败的上传误判成任务已创建。

from openai import OpenAI

client = OpenAI()

with open("batchinput.jsonl", "rb") as batch_file:
    # purpose=batch 表示该文件会作为 Batch API 的输入。
    input_file = client.files.create(file=batch_file, purpose="batch")

# 只把上传返回的文件 ID 交给 Batch,不把本地路径当作 input_file_id。
batch = client.batches.create(
    input_file_id=input_file.id,
    endpoint="/v1/chat/completions",
    completion_window="24h",
)

print(batch.id)

这里最容易写错的是三个值:input_file_id 必须使用上传结果里的 ID;endpoint 必须和 JSONL 每行的 url 对应;completion_window 当前按官方接口使用 24h。创建成功后,状态通常会从 validating 开始。

Batch API 输入文件、上传文件和离线任务之间的静态关系说明图
图1:Batch 输入装配结构说明图,展示 JSONL 请求、purpose=batch 文件和 Batch 任务之间的关系;这是说明图,不是运行截图。

状态完成后,按文件 ID 取结果

提交后不要用创建接口的返回值猜测最终答案,而是根据任务状态处理。validating 表示输入还在校验,in_progress 表示正在执行,finalizing 表示结果整理中,completed 才表示结果文件可取。若状态为 failed、expired 或 cancelled,先读取任务对象中的错误信息或错误文件,再决定如何修复输入。

from openai import OpenAI

client = OpenAI()
batch = client.batches.retrieve("batch_abc123")

if batch.status == "completed":
    # output_file_id 指向结果文件,不能拿 input_file_id 代替。
    result_file = client.files.content(batch.output_file_id)
    with open("batch_output.jsonl", "wb") as output:
        # 结果文件按行保存,后续用 custom_id 关联业务记录。
        output.write(result_file.read())
else:
    print(f"当前状态:{batch.status}")

结果行不保证按输入文件的原顺序返回,所以业务层应读取每行的 custom_id,再写回自己的任务表。这样即使输入顺序和完成顺序不同,也不会把一个客户的结果写到另一个任务上。

Batch API 状态对象、输出文件和错误文件之间的静态关系说明图
图2:Batch 状态与结果文件说明图,展示状态对象、output_file_id、错误文件和 custom_id 的静态关系;这是说明图,不是运行截图。

我的最小迁移清单

  • 能延迟返回的任务才放入 Batch;需要用户马上看到结果的请求继续使用同步接口。
  • 每个 custom_id 都绑定一条业务记录,输出处理不要依赖行号。
  • 创建前确认 JSONL 的 url、body.model 与 Batch 的 endpoint 一致。
  • 把 failed、expired 和单行错误分开记录,不要只保存一个“批次失败”字符串。

相关问题

Batch API 能不能混用多个模型? 同一个输入文件按官方说明只面向一个模型;需要不同模型时拆成不同输入文件和 Batch。

为什么创建后还没有 output_file_id? 任务仍处于校验、执行或整理阶段,等状态变为 completed 再取结果。

离线任务过期怎么办? 读取错误文件定位未完成的 custom_id,缩小任务或修正输入后重新提交新的批次。

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
ONNX 形状推断怎样保留符号维度ONNX 形状推断怎样保留符号维度
上一篇
ONNX 形状推断怎样保留符号维度
Moderation 怎样组合多类别判断
下一篇
Moderation 怎样组合多类别判断
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • PubMedQA数据集详解:生物医学问答基准、功能与应用指南
    PubMedQA
    深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
    684次使用
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    699次使用
  • LMArena是什么?伯克利AI模型评估平台使用指南与功能解析
    LMArena
    LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
    749次使用
  • 斯坦福HELM:大语言模型Holistic Evaluation整体评估框架详解
    HELM
    深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
    714次使用
  • MMBench详解:多模态大模型基准测试、功能特点与使用指南
    MMBench
    MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
    551次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议 和 隐私政策
返回登录
  • 重置密码