# Batch API 与实时请求：什么时候批处理更划算

> 比较原生 Batch、应用队列和实时推理，计算折扣是否覆盖工程成本，并正确处理乱序结果、截止时间和失败重试。

_发布 2026-09-29 · 更新 2026-09-29 · [KeepRouter Editorial](https://keeprouter.com/editorial-policy#editorial-team) · 4 分钟阅读_

![展示 token、缓存、重试、回退与归属的多模型 API 成本账本](https://keeprouter.com/editorial/blog/control-multi-model-api-costs.png)

_在明确工作量假设下，比较合格任务的完整成本。示意图，不代表厂商报价。_

原生 Batch API 可以降低允许等待的离线任务费用。把普通请求放进自己的后台队列，不会自动获得供应商的批处理价格。首先要确认处理端点、完成窗口，以及该端点对所选型号的计费规则。

离线分类、评估和文档补全适合考虑 Batch；有人等待下一句话，或下一步马上依赖工具结果时，通常不适合。

## 区分三种执行方式

| 方式 | 任务在哪里等待 | 需要确认 |
| --- | --- | --- |
| 实时请求 | 当前请求链路 | 交互延迟、限流与正常费率 |
| 应用队列 | 自己的任务基础设施 | Worker 容量、重试与实际 API 价格 |
| 原生 Batch | 供应商批处理系统 | 操作资格、完成窗口与批处理价格 |

截至 2026 年 9 月 29 日，[OpenAI Batch 文档](https://developers.openai.com/api/docs/guides/batch)和 [Claude Batch 文档](https://platform.claude.com/docs/en/build-with-claude/batch-processing)都说明相对各自标准接口的 50% 价格，以及最长可到 24 小时的批处理窗口。这是原生供应商条款，不代表 KeepRouter 提供相同 Batch 端点或折扣。

上传任务前确认当前型号、操作与价格。聊天端点兼容，不能证明批次创建、文件上传、结果取回和取消操作也兼容。

## 按工作量核算节省

假设离线分类器每月处理 100,000 条独立记录，标准费用每条 0.002 美元，总计 200 美元。若实际符合 50% 批处理价格，同样 token 工作量就是 100 美元，未计工程和运行费用前节省 100 美元。

如果新增任务管理与结果核对工作每月分摊 60 美元，净节省只有 40 美元。每月只有 10,000 条时，毛节省 10 美元，同样的运行投入反而超过收益。这些是演算假设，不是报价或实测成本。

```python
standard_cost_per_record = 0.002
batch_fraction = 0.5
monthly_operations = 60
saving_per_record = standard_cost_per_record * (1 - batch_fraction)
break_even_records = monthly_operations / saving_per_record
print(round(break_even_records))  # 每月 60000 条记录
```

应替换成团队自己的分摊。已有可靠任务系统，会改变计算结果；一次性开发工作也应按明确期限分摊。还要核对不同模式对缓存、token 用量和其他费用的影响，不能把折扣直接当成最终账单降幅。

## 每条记录都要有稳定标识

先创建三个虚构工单：billing-001、delivery-002、account-003。无论结果按什么顺序返回，都必须关联到原工单。

OpenAI 官方文档明确说明结果顺序可能不同于输入。应通过标识关联，不能按行号配对。下面是本地演示数据，并非供应商响应结构：

```python
inputs = {"billing-001": "Duplicate charge",
          "delivery-002": "Package late",
          "account-003": "Cannot sign in"}
results = [("account-003", "account"), ("billing-001", "billing")]
joined = {record_id: label for record_id, label in results}
missing = set(inputs) - set(joined)
assert missing == {"delivery-002"}
```

写入业务结果前，还应拒绝重复 ID 与未知 ID。保留输入摘要、型号、提示词版本和批次 ID。整个批次结束，不代表每条记录都成功或内容正确。

## 分别设计截止时间与恢复

业务截止时间不能直接等同于供应商处理窗口。结果 09:00 就要使用，08:55 才提交到可能等待数小时的服务显然不合适；还需预留下载、验证和修复时间。

只重试确实需要重跑的记录。因为 200 条失败就重新提交全部 100,000 条，会浪费费用，也可能重复更新下游。应用记录 ID 在重跑时应保持稳定，尝试 ID 则分别保留。取消后部分成功、部分未完成也按同样方法处理。

需要把紧急子集转实时请求时，单独记录升级，并阻止晚到的 Batch 结果覆盖较新的已验收结果。以版本和任务状态决定采用哪份结果，而不是谁最后到达。

## 从小规模实验做选择

选取正常、非法和模糊记录，检查合格率、完成时间、结果取回失败与全部尝试费用。下游需要固定结构时使用[结构化输出指南](/zh/blog/structured-outputs-json-mode)，实时恢复遇到限流时查看 [429 排错](/zh/blog/openai-compatible-api-429-errors)。

用 [API 成本计算器](/tools/api-cost-calculator)估计支持型号的实时基准，仅在目标服务明确提供该操作折扣时才套用 Batch 价格。若任务需要即时响应，或当前线路没有批处理能力，就继续优化实时请求的提示词、模型选择和重试。

## 常见问题

### 自己的后台队列能获得 Batch 价格吗？

不会自动获得。必须使用目标服务有批处理价格的合格操作，排队后的普通 API 调用仍适用对应普通费率。

### 批处理结果可以按行号关联吗？

不要假定顺序相同。应使用稳定请求标识，检查逐条状态，并在应用更新前处理缺失、重复与未知结果。

### 本文是否代表 KeepRouter 已支持 Batch API？

不代表。本文讨论原生供应商批处理条款用于比较，KeepRouter 线路可用操作应以公开 API 文档为准。

## 参考的一手资料

_本文最近复核 2026-09-29_

1. [OpenAI Batch API](https://developers.openai.com/api/docs/guides/batch)
2. [Claude Message Batches](https://platform.claude.com/docs/en/build-with-claude/batch-processing)

## 继续阅读

- [Structured Outputs 与 JSON Mode：如何验证真实数据](https://keeprouter.com/zh/blog/structured-outputs-json-mode.md)
- [OpenAI 兼容 API 的 429 错误：限流、额度与重试](https://keeprouter.com/zh/blog/openai-compatible-api-429-errors.md)
- [api cost calculator](https://keeprouter.com/tools/api-cost-calculator)

## 用你的工作量估算费用

选择型号并填写预计用量，先把估算与一条小规模真实请求对上，再扩大使用。

[估算 API 费用](https://keeprouter.com/tools/api-cost-calculator)

[创建 Key，测试免费模型](https://keeprouter.com/login?returnTo=%2Fconsole%2Fkeys%3Fmodel%3Dfree)

免费测试使用 free 模型；其他付费型号需要足够预付额度。

[全部文章](https://keeprouter.com/zh/blog.md) · [模型与价格](https://keeprouter.com/models.md)
