批量 API
了解如何使用 OpenAI 的批处理 API 以异步方式发送请求组,该方式具有 50% 的较低成本、单独的显着更高的速率限制池以及明确的 24 小时周转时间。该服务非常适合处理不需要即时响应的作业。您还可以在此处直接探索 API 参考。
概述
虽然 OpenAI 平台的一些使用要求您发送同步请求,但对于许多情况,请求不需要即时响应或速率限制会阻止您快速执行大量查询。批处理作业通常适用于以下用例:
- 运行评估
- 对大型数据集进行分类
- 嵌入内容存储库
与直接使用标准端点相比,批处理 API 具有以下优势:
- **更好的成本效率:**与同步 API 相比节省 50% 的成本
- **更高的速率限制:**与同步 API 相比,更高的上限
- **快速完成时间:**每个批处理在 24 小时内完成(通常更快)
入门
1.准备批处理文件
批处理以 .jsonl
文件开始,其中每行包含对 API 的单个请求的详细信息。目前,可用的端点是 /v1/chat/completions
(聊天完成 API) 和 /v1/embeddings
(嵌入 API)。对于给定的输入文件,body
字段中的参数与基础端点的参数相同。每个请求都必须包含唯一的 custom_id
值,您可以使用此值在完成后引用结果。以下是包含 2 个请求的示例输入文件。请注意,每个输入文件只能包含对单个模型的请求。
{
"custom_id": "request-1",
"method": "POST",
"url": "/v1/chat/completions",
"body": {
"model": "gpt-3.5-turbo-0125",
"messages": [
{
"role": "system",
"content": "You are a helpful assistant."
},
{
"role": "user",
"content": "Hello world!"
}
],
"max_tokens": 1000
}
}
{
"custom_id": "request-2",
"method": "POST",
"url": "/v1/chat/completions",
"body": {
"model": "gpt-3.5-turbo-0125",
"messages": [
{
"role": "system",
"content": "You are an unhelpful assistant."
},
{
"role": "user",
"content": "Hello world!"
}
],
"max_tokens": 1000
}
}
2.上传批处理输入文件
与我们的微调 API一样,您必须首先上传输入文件,以便在启动批处理时正确引用该文件。使用文件 API上传 .jsonl
文件。
from openai import OpenAI
client = OpenAI()
batch_input_file = client.files.create(
file=open("batchinput.jsonl", "rb"),
purpose="batch"
)
3.创建批处理
上传输入文件后,您可以使用输入文件对象的 ID 创建批处理。在本例中,假设文件 ID 为 file-abc123
。对于现在,完成窗口只能设置为 24h
。您还可以通过可选的 metadata
参数提供自定义元数据。
batch_input_file_id = batch_input_file.id
client.batches.create(
input_file_id=batch_input_file_id,
endpoint="/v1/chat/completions",
completion_window="24h",
metadata={
"description": "nightly eval job"
}
)
此请求将返回一个批处理对象,其中包含有关您的批处理的信息:
{
"id": "batch_abc123",
"object": "batch",
"endpoint": "/v1/chat/completions",
"errors": null,
"input_file_id": "file-abc123",
"completion_window": "24h",
"status": "validating",
"output_file_id": null,
"error_file_id": null,
"created_at": 1714508499,
"in_progress_at": null,
"expires_at": 1714536634,
"completed_at": null,
"failed_at": null,
"expired_at": null,
"request_counts": {
"total": 0,
"completed": 0,
"failed": 0
},
"metadata": null
}
4.检查批处理状态
您可以随时检查批处理的状态,这也会返回批处理对象。
from openai import OpenAI
client = OpenAI()
client.batches.retrieve("batch_abc123")
批处理对象的状态可以是以下任何状态:
validating
:正在验证输入文件,然后批处理才能开始failed
:输入文件未通过验证过程in_progress
:输入文件已成功验证,批处理正在运行finalizing
:批处理已完成,正在准备结果completed
:批处理已完成,结果已准备就绪expired
:批处理无法在 24 小时时间窗口内完成cancelling
:已启动批处理取消cancelled
:批处理已取消
5.获取结果
一旦批处理完成,您可以通过文件 API下载输出,方法是对批处理的 output_file_id
字段进行请求,并将结果写入您机器上的文件,在本例中为 batch_output.jsonl
from openai import OpenAI
client = OpenAI()
content = client.files.content("file-xyz123")
输出 .jsonl
文件将包含对输入文件中每个成功请求的单个响应行。批处理中任何失败的请求都会将其错误信息写入可以通过批处理的 error_file_id
找到的错误文件。
注意:输出行顺序可能不匹配输入行顺序。不要依赖顺序来处理结果,而是使用自定义 ID 字段,该字段将存在于输出文件的每行中,并允许您将输入中的请求映射到输出中的结果。
{
"id": "batch_req_123",
"custom_id": "request-2",
"response": {
"status_code": 200,
"request_id": "req_123",
"body": {
"id": "chatcmpl-123",
"object": "chat.completion",
"created": 1711652795,
"model": "gpt-3.5-turbo-0125",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "Hello."
},
"logprobs": null,
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 22,
"completion_tokens": 2,
"total_tokens": 24
},
"system_fingerprint": "fp_123"
},
"error": null
}
}
{
"id": "batch_req_456",
"custom_id": "request-1",
"response": {
"status_code": 200,
"request_id": "req_789",
"body": {
"id": "chatcmpl-abc",
"object": "chat.completion",
"created": 1711652789,
"model": "gpt-3.5-turbo-0125",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "Hello! How can I assist you today?"
},
"logprobs": null,
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 20,
"completion_tokens": 9,
"total_tokens": 29
},
"system_fingerprint": "fp_3ba"
},
"error": null
}
}
6.取消批处理
如果需要,您可以取消正在进行的批处理。批处理的状态将更改为 cancelling
,直到正在进行的请求完成,之后状态将更改为 cancelled
。
from openai import OpenAI
client = OpenAI()
client.batches.cancel("batch_abc123")
7.获取所有批处理列表
您可以随时查看所有批处理。对于拥有许多批处理的用户,您可以使用 limit
和 after
参数对结果进行分页。
from openai import OpenAI
client = OpenAI()
client.batches.list(limit=10)
模型可用性
批处理 API 目前可用于执行对以下模型的查询。批处理 API 支持与这些模型相同的格式的文本和视觉输入:
gpt-4o
gpt-4-turbo
gpt-4
gpt-4-32k
gpt-3.5-turbo
gpt-3.5-turbo-16k
gpt-4-turbo-preview
gpt-4-vision-preview
gpt-4-turbo-2024-04-09
gpt-4-0314
gpt-4-32k-0314
gpt-4-32k-0613
gpt-3.5-turbo-0301
gpt-3.5-turbo-16k-0613
gpt-3.5-turbo-1106
gpt-3.5-turbo-0613
text-embedding-3-large
text-embedding-3-small
text-embedding-ada-002
批处理 API 还支持经过微调的模型。
速率限制
批处理 API 的速率限制与现有每个模型的速率限制分开。批处理 API 有两种新的速率限制类型:
- **每个批处理的限制:**单个批处理最多可以包含 50,000 个请求,批处理输入文件的大小可以达到 100 MB。请注意,
/v1/embeddings
批处理还限制为每个批处理最多 50,000 个嵌入输入。 - **每个模型排队的提示令牌:**每个模型都有批处理处理允许的最大排队提示令牌数。您可以在平台设置页面上找到这些限制。
目前,批处理 API 没有输出令牌或已提交请求数量的限制。因为批处理 API 的速率限制是一个新的单独的池,所以使用批处理 API 不会消耗标准每个模型速率限制中的令牌,从而为您提供了增加可用于查询 API 的请求和处理令牌数量的便捷方法。
批处理过期
未及时完成的批处理最终会进入 expired
状态;未完成的请求将在批处理中取消,并且将提供对已完成请求的响应,作为批处理的输出文件的一部分。您将为已完成的请求消耗的令牌付费。
其他资源
有关更具体的示例,请访问OpenAI 食谱(The OpenAI Cookbook),其中包含分类、情绪分析和摘要生成等用例的示例代码。