我花了40小时为副业测试AI API基准
上周二,我最大的客户抛弃了我。好吧,"抛弃"有点苛刻。他们只是说我构建的聊天机器人感觉"迟钝",并要求退款。迟钝。一个词。两个音节。没了:4,800美元的经常性收入。我把整个东西建立在我认为很牢靠的模型上。结果模型没问题。延迟要了我的命。用户要盯着闪烁的光标超过一秒钟,第一个字才会出现。对他们来说,感觉像是坏了。对我来说,感觉像是看着钱蒸发。
所以我做了任何一个有点强迫症的自由职业者都会做的事:接下来两周,我通过Global API测试了我能接触到的每一个模型。我花了40个可计费小时却无法收费,自掏腰包,从两个大洲用相同提示词测试了15个模型。以下是我的发现,更重要的是,以下是我实际会为客户项目部署的方案。
为什么我不能相信营销页面
每个模型提供商都声称他们的API"速度飞快"且"可用于生产环境"。但没有一个会告诉你,当你的用户坐在俄亥俄州等待来自新加坡服务器农场的令牌时,这究竟意味着什么。登陆页面上声称的"高达200 tok/s"基本是虚构的,一旦你考虑TTFT(首次令牌时间)、网络跳数以及模型在持续负载下的实际表现。我需要真实数据。我需要在上午9点和下午5点获取数据,而不只是营销团队在半夜运行内部测试时。我需要知道我的客户的用户实际会看到什么。所以我写了一个小基准测试脚本,然后跑了很多次。
测试设置(无聊但必要)
下面是我确切的做法,你可以复制它,或者如果你觉得我篡改了数字,可以质疑我:
| 参数 | 我使用的值 |
|---|---|
| 日期范围 | 2026年5月20日 |
| 运行地点 | 美国东部(俄亥俄州)和亚洲(新加坡) |
| 测试提示词 | "用200字解释递归" |
| 输出长度 | 每次运行约150个令牌 |
| 运行次数 | 每个模型10次,取平均值 |
| 是否流式? | 是,SSE(服务器推送事件) |
| 端点 | Global API,地址 https://global-apis.com/v1 |
速度排行榜,毫不留情
我按从快到慢排序,以下是完整排名,包含TTFT(首个token用时,对用户体验最重要的指标)和持续每秒token数:
| 排名 | 模型 | TTFT | tok/s | 提供商 | $/M 输出 |
|---|---|---|---|---|---|
| 1 | Step-3.5-Flash | 120ms | 80 | StepFun | $0.15 |
| 2 | DeepSeek V4 Flash | 180ms | 60 | DeepSeek | $0.25 |
| 3 | Hunyuan-TurboS | 200ms | 55 | 腾讯 | $0.28 |
| 4 | Qwen3-8B | 150ms | 70 | Qwen | $0.01 |
| 5 | Qwen3-32B | 250ms | 45 | Qwen | $0.28 |
| 6 | Doubao-Seed-Lite | 220ms | 50 | 字节跳动 | $0.40 |
| 7 | Hunyuan-Turbo | 280ms | 42 | 腾讯 | $0.57 |
| 8 | GLM-4-32B | 300ms | 38 | 智谱 | $0.56 |
| 9 | Qwen3.5-27B | 350ms | 35 | Qwen | $0.19 |
| 10 | DeepSeek V4 Pro | 400ms | 30 | DeepSeek | $0.78 |
| 11 | MiniMax M2.5 | 450ms | 28 | MiniMax | $1.15 |
| 12 | GLM-5 | 500ms | 25 | 智谱 | $1.92 |
| 13 | Kimi K2.5 | 600ms | 20 | Moonshot | $3.00 |
| 14 | DeepSeek-R1 | 800ms | 15 | DeepSeek | $2.50 |
| 15 | Qwen3.5-397B | 1200ms | 10 | Qwen | $2.34 |
需要提一点:重推理模型(R1、K2.5、K2-Thinking)的TTFT惨不忍睹,因为它们在说话前会先思考。DeepSeek-R1的800ms并非网络延迟,而是模型在默默推演。对难题有用,对聊天体验却糟糕透顶。
我实际会用于客户工作的模型
这里要算算计费工时账。我按实际目标来分类我的选择。
“我需要它感觉瞬间响应”梯队(TTFT低于200ms):
"快速且精准"层级:
Step-3.5-Flash,120毫秒TTFT(首Token生成时间),胜出。对于简单的客服机器人、常见问题解答器,以及任何用户只想得到答案的场景,这就是最佳选择。每秒80个Token的速度意味着,用户还没读完问题,回答就已经生成完毕。按每百万输出Token 0.15美元的价格计算,处理一千张客服工单的API费用不到1美元。我可以向客户收取每张工单5美元的费用,赚取差价。
"既要聪明又要快"层级:
DeepSeek V4 Flash。180毫秒的TTFT仍在"即时"阈值以内,每秒60个Token的速度足够快,质量也确实不错。这几乎成了我处理所有任务的新默认选项。按每百万Token 0.25美元计算,我完全不用担心因为定价过高而失去任何一个合同。
"囤积狂兼极致性价比爱好者"层级:
Qwen3-8B,每百万Token只需0.01美元,每秒70个Token。让我再说一遍:每百万输出Token仅需一美分。我反复核对了三遍这个数字。对于批量处理任务、内容审核,以及任何只需要一个合理模型以规模化完成合理工作的场景,这个选择无与伦比。我一直用它运行内部数据分类管道,并没有发现与之前使用的贵四倍的模型相比,质量有明显下降。
"我追求质量,不在乎速度"层级:
GLM-5 或 Kimi K2.5。这些模型适用于代码审查、复杂分析,以及任何我宁愿等待2秒钟也要得到正确答案的场景。我会向客户为这类任务收取溢价,因为工作本身值这个价。
地理因素带来的成本差异
我在美国东部和新加坡两地进行了测试。差异真实存在,并且应该影响你对合同的定价方式:
| 模型 | 美国东部 TTFT | 亚洲 TTFT | 改善幅度 |
|---|---|---|---|
| DeepSeek V4 Flash | 180ms | 150ms | -30ms |
| Qwen3-32B | 250ms | 210ms | -40ms |
| GLM-5 | 500ms | 420ms | -80ms |
| Kimi K2.5 | 600ms | 480ms | -120ms |
模式很清晰:当你的用户靠近数据中心时,中国起源的模型(Qwen、GLM、Kimi)在延迟上能领先16-20%。如果我的客户主要面向亚洲用户群,我会为他们路由到 Qwen3-32B 而不是 DeepSeek,即使价格相同——因为对这些用户来说,体验明显更好。DeepSeek 在全球的分布最均衡。如果客户不知道用户在哪里,或者用户群遍布全球,那么 DeepSeek 是更稳妥的选择。
我贴在墙上的用户感知速查表
我打印了这张表,贴在了显示器旁边:
| TTFT | 用户会说出的话 |
|---|---|
| 低于 200ms | "哇,真快!" |
| 200-400ms | "行,正在工作" |
| 400-800ms | "是不是坏了?" |
| 800ms+ | 直接关掉标签页 |
对于交互式聊天产品,我拒绝部署任何 TTFT 超过 400ms 的模型。参与度的下降非常严重,绝对会侵蚀客户正在关注的留存指标。我那 4800 美元的教训,核心就在 TTFT,而不是吞吐量。模型生成令牌的速度够快,但用户就是没能尽快看到第一个令牌。
我实际使用的代码
下面是我用来运行这些基准测试的 Python 脚本。我使用 openai 库,因为 Global API 兼容 OpenAI 接口,只需改一个字符串就能切换模型。所有上面的数据都是用同样的脚本、同样的提示词跑出来的:
import time
import statistics
from openai import OpenAI
client = OpenAI(
api_key="YOUR_GLOBAL_API_KEY",
base_url="https://global-apis.com/v1"
)
def benchmark_model(model_name, iterations=10):
ttft_list = []
tps_list = []
for _ in range(iterations):
start = time.perf_counter()
first_token_time = None
token_count = 0
stream = client.chat.completions.create(
model=model_name,
messages=[
{"role": "user", "content": "用200字解释递归"}
],
stream=True,
max_tokens=200
)
for chunk in stream:
if first_token_time is None:
first_token_time = time.perf_counter() - start
if chunk.choices[0].delta.content:
token_count += 1
total_time = time.perf_counter() - start
ttft_list.append(first_token_time * 1000) # to ms
tps_list.append(token_count / (total_time - first_token_time))
return {
"model": model_name,
"avg_ttft_ms": round(statistics.mean(ttft_list), 1),
"avg_tok_per_sec": round(statistics.mean(tps_list), 1)
}
# Run the actual benchmark
models = [
"step-3.5-flash",
"deepseek-v4-flash",
"hunyuan-turbos",
"qwen3-8b",
"qwen3-32b",
]
for m in models:
result = benchmark_model(m)
cost_per_m = {"step-3.5-flash": 0.15, "deepseek-v4-flash": 0.25,
"hunyuan-turbos": 0.28, "qwen3-8b": 0.01,
"qwen3-32b": 0.28}[m]
avg_output_per_request = 150
requests_per_hour = 1000
hourly_cost = (avg_output_per_request / 1_000_000) * cost_per_m * requests_per_hour
print(f"{result['model']}: {result['avg_ttft_ms']}ms TTFT, "
f"{result['avg_tok_per_sec']} tok/s, "
f"cost: ${hourly_cost:.2f}/hour")