批量推理
批量推理(Batch)让你以 JSONL 文件的形式一次性提交大量请求,由 wylon 在后台异步执行,结果在期限内回传。相较于实时 对话补全,批量推理的并发限制更宽松、价格更优,适合离线评估、数据生成、文档批处理等非实时场景。
何时使用
- 离线数据加工。对大批量历史数据生成摘要、分类、标签或翻译。
- 评估与基准测试。对一组固定输入跑多个模型/参数组合,做对比。
- 合成数据生成。基于种子提示批量构造训练或测试样本。
- 夜间作业。对延迟不敏感、希望避开白天峰值额度的场景。
如果你的请求需要立即返回(在线对话、Agent、RAG 实时响应),请使用 对话补全。
实时 vs. 批量
| 对话补全(实时) | 批量推理 | |
|---|---|---|
| 调用方式 | 同步 HTTP/SSE | 异步任务(轮询或回调) |
| 响应时延 | 毫秒级 | 分钟到小时级,需在窗口期内完成 |
| 定价 | 按 Token,标准价 | 按 Token,享批量折扣 |
| 速率限制 | 受 RPM/TPM 限制,详见 速率限制 | 独立配额,并发更宽松 |
| 支持的接口 | chat completions / completions | chat completions / completions |
使用流程
-
准备 JSONL 文件
每行一个请求对象,结构与单次
/v1/chat/completions请求一致,外层包一个custom_id用于结果回查。 -
上传文件
调用
POST /v1/files,将 JSONL 上传为输入文件,得到file_id。 -
创建批量任务
用
file_id调用POST /v1/batches,指定目标接口与完成期限。 -
轮询状态并下载结果
通过
GET /v1/batches/{id}查看进度。完成后下载output_file_id,每行对应一个请求的响应。
输入文件格式
每行是一个完整请求对象,method 与 url 指明目标接口,body 与对话补全请求体一致。
{"custom_id": "req-001", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "moonshotai/Kimi-K2", "messages": [{"role": "user", "content": "用一句话解释 KV 缓存。"}]}}
{"custom_id": "req-002", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "moonshotai/Kimi-K2", "messages": [{"role": "user", "content": "用一句话解释推测解码。"}]}}
API 调用
整个流程包含三个端点:上传文件、创建任务、查询状态。所有调用均使用账户级 API 密钥。
# 1. 上传输入文件
curl https://api.wylon.cn/v1/files \
-H "Authorization: Bearer $WYLON_API_KEY" \
-F purpose=batch \
-F file=@requests.jsonl
# 响应:{ "id": "file-abc...", ... }
# 2. 创建批量任务
curl https://api.wylon.cn/v1/batches \
-H "Authorization: Bearer $WYLON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"input_file_id": "file-abc...",
"endpoint": "/v1/chat/completions",
"completion_window": "24h"
}'
# 3. 轮询状态
curl https://api.wylon.cn/v1/batches/batch_xxx \
-H "Authorization: Bearer $WYLON_API_KEY"
# 4. 状态变为 completed 后下载结果
curl https://api.wylon.cn/v1/files/file-out.../content \
-H "Authorization: Bearer $WYLON_API_KEY" -o results.jsonl
from openai import OpenAI
import os, time
client = OpenAI(
api_key=os.environ["WYLON_API_KEY"],
base_url="https://api.wylon.cn/v1",
)
# 1. 上传输入文件
file = client.files.create(file=open("requests.jsonl", "rb"), purpose="batch")
# 2. 创建批量任务
batch = client.batches.create(
input_file_id=file.id,
endpoint="/v1/chat/completions",
completion_window="24h",
)
# 3. 轮询完成
while batch.status in {"validating", "in_progress", "finalizing"}:
time.sleep(30)
batch = client.batches.retrieve(batch.id)
# 4. 下载结果
result = client.files.content(batch.output_file_id)
open("results.jsonl", "wb").write(result.read())
任务状态
| 状态 | 含义 |
|---|---|
validating | 正在校验输入文件格式与配额。 |
in_progress | 调度中或正在执行。 |
finalizing | 处理完成,正在写出结果文件。 |
completed | 全部完成;可通过 output_file_id 下载结果。 |
failed | 整体失败。errors 字段给出原因。 |
expired | 未在 completion_window 内完成;已完成的部分仍可获取。 |
cancelling / cancelled | 用户主动取消。 |
输出文件
每行一条响应,与输入的 custom_id 一一对应;失败的请求另存于 error_file_id,便于单独重试。
{"custom_id": "req-001", "response": {"status_code": 200, "body": {"id": "cmpl-...", "choices": [{"message": {"role": "assistant", "content": "…"}, "finish_reason": "stop"}], "usage": {"total_tokens": 128}}}
{"custom_id": "req-002", "response": {"status_code": 200, "body": {"id": "cmpl-...", "choices": [{"message": {"role": "assistant", "content": "…"}}], "usage": {"total_tokens": 96}}}
配额与限制
- 单文件大小:最大 100 MB;建议每文件 ≤ 50,000 行。
- 并发任务数:每个组织默认可同时排队 10 个批量任务;如需更高,请联系销售。
- 完成窗口:支持
24h,超期未完成的部分会标记为expired。 - 计费:按实际处理的 Token 计费,享批量折扣(具体折扣以 价格页 公示为准)。