Chapter 03

多家 API 横向对比与选型

前两章讲清了原语和机制——它们在三家之间是共通的。这一章把 OpenAI、Anthropic、Google、开源本地放在一起:它们在哪些维度上不同、怎么按场景选、迁移时具体什么会断。数据截至 2026-06,定价为约数。

本章你将建立的 schema

  • 一张对照表:上下文、价格、多模态、工具、结构化输出,各家的位置
  • "OpenAI-compatible API"为什么成了通用语,以及它的边界
  • 网关与本地部署各解决什么问题
  • 按场景选型的决策树,以及迁移到另一家时具体哪些代码会断

3.1对照表:四类供应方

原语相同,但每家在能力边界、价格、强项上分化明显。下表是选型的起点,不是终点——具体数字会变,结构性差异不太会变。

表 3.1 · 主要 LLM 供应方对照(约数,截至 2026-06,价格为 USD / 1M token)
供应方 / 代表模型上下文输入 / 输出价多模态(输入)结构化输出突出强项
OpenAI · GPT-5.5 / 5.4~400K5/30(5.4 档 2.5/15)图 + 音频strict json_schema(最强)schema 可靠性、生态最广
Anthropic · Opus 4.8 / Sonnet 4.61M5/25 ; 3/15图(无音视频)原生 + 工具 schemaagentic / 长程任务、长上下文无附加费
Google · Gemini 3.5 Flash / 3.1 Pro1M(Pro 至 2M)1.5/9 ; Lite 0.10/0.40图 + 音频 + 视频responseSchema原生视频、质价比、Flash-Lite 极廉
开源本地 · DeepSeek V4 / Qwen / Llama 41M(Llama Scout 至 10M)自托管按算力;DeepSeek 托管约 0.44/0.87图(视模型)看推理引擎(vLLM)可私有部署、license 宽松、价格极低
读表方式

别只比"每 token 单价"。回到 §01.2:同一段文本各家 tokenizer 切出的 token 数不同;再叠加上下文是否有长度附加费、是否含 reasoning token、能否命中缓存。真实成本 = 单价 × token 数 × (1 − 缓存命中率),单价只是其中一个因子。

3.2通用语:OpenAI-compatible API

OpenAI 的 /v1/chat/completions 请求形态成了事实标准,几乎所有供应方都额外提供一个"OpenAI 兼容"端点。

为什么这件事重要

因为它把"换供应方"从"重写调用层"压缩成"改三个东西":base_url、API key、model 字符串。Gemini(/v1beta/openai/)、Anthropic(api.anthropic.com/v1/)、DeepSeek、Mistral、Groq、Together、以及本地的 vLLM / Ollama / LM Studio 都暴露这个形态。一套代码,可在多家之间做 A/B 与回退。

同一段代码,改 base_url + model 即换家Python
# 未在本机验证——示例用途
from openai import OpenAI

# 指向 OpenAI
client = OpenAI(base_url="https://api.openai.com/v1", api_key=KEY_OAI)
# 指向本地 Ollama —— 只换了 base_url 和 model
client = OpenAI(base_url="http://localhost:11434/v1", api_key="ollama")

resp = client.chat.completions.create(
    model="qwen3.5",                       # 换家就换这个字符串
    messages=[{"role": "user", "content": "订单 123 到哪了?"}],
)
你的代码 写一次 · OpenAI 形态 网关 LiteLLM / OpenRouter 统一接口 · 路由 · 回退 · 计费 OpenAI 原生 Claude /v1/ 兼容 Gemini /openai/ 兼容 本地 vLLM / Ollama
图 3.1兼容层把四个后端收敛成一个接口。注意:兼容是为可移植,不是为全功能——兼容层会抹掉各家原生特性(见下方边界)。
兼容层的边界

OpenAI 兼容端点只覆盖"最大公约数"。各家原生独有的能力——Claude 的 prompt caching、extended thinking、原生结构化输出,OpenAI 的 strict 保证——经兼容层调用时往往被静默忽略。strict:true 走兼容层不报错,但也不再保证形状(回到 §2.2 的"没有掩码就只是倾向")。结论:用兼容层做评测和原型可以,上生产要用原生 SDK 才能拿到全部特性。

3.3网关与本地部署

网关:一个接口,多家后端

  • LiteLLM——开源、可自托管的代理 / SDK。统一成 OpenAI 形态,带按请求成本统计、回退、重试、预算上限。适合:要数据自控、要复杂路由与成本归因。
  • OpenRouter——托管聚合器,一个 key 接 200+ 模型,响应里直接带 usage.cost,开箱即用。适合:要快、要简单;代价是流量过第三方 + 抽成。不少团队两者并用。

本地 / 自托管:什么时候值得

  • vLLM——生产级多用户服务,PagedAttention + 连续批处理,吞吐远高于单机玩具方案。代价:要 GPU、要运维。
  • Ollama——单机 / 工作站友好,Apple Silicon 上走 MLX,运维近乎零。
  • LM Studio——图形界面优先,方便浏览和试模型。
何时自托管

数据不能出境 / 强隐私、可预测的高并发(按算力比按 token 更划算)、想要无每-token 账单时,自托管成立。代价:放弃前沿模型质量、零运维、弹性扩缩容,以及各家托管自带的多模态与工具基建。

3.4按场景选型

把上面的差异收敛成一棵决策树。先回答"能不能上云",再按首要诉求分流。

选型开始 数据不出境 / 需私有部署? 是 本地 vLLM + 开源模型 否 需 >200K 超长上下文? 是 Gemini / Claude Sonnet(1M) 否 首要省钱 + 高并发? 是 Flash-Lite / DeepSeek Flash 否 agentic 工具为主? 是 Claude Opus / DeepSeek V4 否 · 强推理 GPT-5.5 / Claude Opus
图 3.2四个二元判断把绝大多数场景分流到位。注意:第一个问的是"能不能上云"——它一票否决,先于任何能力 / 价格考量;私有要求直接把你锁进开源 + 自托管那一支。

3.5迁移会破坏什么

"换 base_url 就行"只在兼容层的最大公约数内成立。一旦用了原生 SDK 或原生特性,迁移会在这些点上断——每一点都回扣前两章的某个原语 / 机制。

表 3.2 · 跨供应方迁移的断点
断点差异回扣
system prompt 放哪OpenAI 当 message / 顶层 instructions;Claude 顶层 system;Gemini systemInstruction。对话中间插 system 在 Claude 会被合并§01.1
助手角色名assistant(OpenAI/Claude) vs model(Gemini)§01.1
工具调用格式请求里的 schema 包法、响应里 tool_use / tool_calls / functionCall 的结构都不同§01.4
结构化输出机制strict json_schema / 原生 / responseSchema 不可互换;兼容层会丢掉 strict 保证§2.2
流式事件名chat.completion.chunk vs content_block_delta vs content.delta§01.3
必填 / 互斥参数Claude max_tokens 必填;新 Claude 不许同设 temperature + top_p§01.6

§本章 self-check

先合上教程作答。更系统的跨章辨析在下一章。

  1. 为什么"OpenAI 兼容端点能跑通"不代表"原生特性都能用"?举一个会被静默忽略的特性。
  2. 一个团队要做"内部合同审阅,合同最长 30 万字,数据绝对不能出公司"。按决策树走,落在哪个分支?为什么第一个判断就基本定了结果?
  3. 把一段 OpenAI 代码迁到 Claude,只改了 base_url 和 model,第一个最先炸的参数是什么?(提示:回扣 §01)
答案(先做完再展开)
  1. 因为兼容层只暴露"最大公约数",原生独有能力(Claude 的 prompt caching / extended thinking / 原生结构化输出、OpenAI 的 strict 形状保证)经兼容层调用会被静默忽略——比如 strict:true 不报错但不再保证形状。
  2. 落在"本地 vLLM + 开源模型"分支。因为决策树第一个问的就是"数据是否不能出境 / 需私有部署"——"绝对不能出公司"是硬约束,一票决定走自托管那一支,后面的上下文 / 价格 / 能力都在这个前提下再谈。30 万字(约 30 万+ token)还要求模型支持超长上下文,进一步指向长上下文的开源模型 + vLLM。
  3. 最可能炸的是 max_tokens:Claude 把它列为必填,而 OpenAI 可选——照搬不带就直接 400。其次是同时设了 temperature 和 top_p(新 Claude 不允许)。
进阶挑战 · 刚好够不着

给"既要省钱又要可靠形状"的客服系统设计供应方组合

客服助手 90% 的请求是简单查询(要便宜),10% 是复杂理赔判断(要强推理 + 严格结构化输出给下游系统)。只用一家、或用网关分流,你会怎么搭?说明每条请求路径选了谁、为什么,以及结构化输出在这里为什么不能图省事走兼容层。

提示(卡住再展开)

考虑用网关按请求复杂度路由:简单查询 → Gemini Flash-Lite / DeepSeek Flash(§3.1 极廉档);复杂理赔 → 走原生 SDK 的 OpenAI strict json_schema 或 Claude 原生结构化(§2.2 形状保证),因为下游系统消费这些字段,valid-but-wrong 会引发理赔错误。结构化那条路径不能走兼容层——§3.2 边界说明 strict 会被丢。