一把 key 跑六家模型延迟实测:首 token、总时长与波动怎么记
本文提供一套可复跑的基准测试脚本,用于测量同一提示下多个模型(如 Claude、GPT、DeepSeek、Qwen、GLM、Kimi)的首 token 延迟、总响应时间与 p95 抖动。通过标准化测试流程,帮助读者建立自己的延迟表,避免依赖厂商宣传数据。文章涵盖指标定义、脚本设计、多模型调用方法及结果解读,强调可控环境下的实际测量。
为什么需要自建延迟表
厂商公布的延迟数据通常来自理想环境,与你的实际网络、地理位置、并发情况差异很大。首 token 延迟(TTFT)和总时长(TTLT)受模型规模、服务端负载、网络路径影响显著。与其相信宣传,不如用统一脚本在同一台机器上测量。
关键指标定义
测量前需明确三个核心指标:
- 首 token 延迟(TTFT):从发送请求到收到第一个流式响应 token 的时间,反映模型启动速度。
- 总时长(TTLT):从发送请求到最后一个 token 到达的时间,反映完整响应耗时。
- p95 抖动:多次测量中第 95 百分位的延迟值,用于评估长尾波动。
通常进行多次重复测量(如 10 次),取中位数或平均值作为稳定参考,p95 则帮助识别偶发高延迟。
测试脚本设计原则
一个可复跑脚本应满足:
- 同一提示:对所有模型使用完全相同的输入文本和参数(如 max_tokens、temperature)。
- 顺序调用:避免并发干扰,依次调用每个模型。
- 流式响应:必须开启流式,才能准确捕获首 token 时间。
- 统一计时:使用高精度计时器记录请求发起、首 token 到达、最后 token 到达三个时间点。
- 重复运行:每个模型至少运行 5-10 次,计算统计量。
脚本实现示例(Python)
以下代码片段展示核心逻辑,实际使用时需替换 API key 和模型标识。
import time
import openai
client = openai.OpenAI(
api_key="YOUR_API_KEY",
base_url="https://api.example.com/v1" # 替换为聚合站端点
)
MODELS = ["claude-3-sonnet", "gpt-4", "deepseek-chat", "qwen-max", "glm-4", "moonshot-v1"]
PROMPT = "用一句话解释什么是机器学习。"
REPEATS = 10
def measure(model):
times = []
for _ in range(REPEATS):
start = time.perf_counter()
first_token_time = None
last_token_time = None
stream = client.chat.completions.create(
model=model,
messages=[{"role": "user", "content": PROMPT}],
stream=True,
max_tokens=100,
temperature=0
)
for chunk in stream:
now = time.perf_counter()
if first_token_time is None:
first_token_time = now
last_token_time = now
ttft = first_token_time - start
ttl = last_token_time - start
times.append((ttft, ttl))
return times
results = {}
for model in MODELS:
times = measure(model)
ttfts = [t[0] for t in times]
ttls = [t[1] for t in times]
results[model] = {
"ttft_median": sorted(ttfts)[len(ttfts)//2],
"ttft_p95": sorted(ttfts)[int(len(ttfts)*0.95)],
"ttl_median": sorted(ttls)[len(ttls)//2],
"ttl_p95": sorted(ttls)[int(len(ttls)*0.95)]
}
注意:聚合站通常兼容 OpenAI 格式,只需修改 base_url 和模型名称。如果使用非 OpenAI 风格的 API,需调整请求方式。
如何记录与解读结果
运行脚本后,得到每个模型的中位数和 p95 延迟。建议按以下维度分析:
- TTFT 中位数:反映典型情况下的响应速度。
- TTFT p95:若远高于中位数,说明存在显著抖动,可能不适合实时交互。
- TTLT 中位数:与生成长度相关,需确保所有模型输出长度相近再比较。
- 波动范围:多次测量的最大最小值差,可结合标准差评估稳定性。
可将结果整理为表格,例如:
| 模型 | TTFT 中位数 (ms) | TTFT p95 (ms) | TTLT 中位数 (ms) |
|------|------------------|---------------|------------------|
| A | 320 | 580 | 2100 |
| B | 450 | 1200 | 3200 |
注意事项与常见误区
- 网络环境:测量结果受本地网络影响,建议在稳定网络下进行,并多次运行取平均。
- 模型版本:确保所有模型使用相同版本标识,避免混用不同代际。
- 参数一致:maxtokens、temperature、topp 等需完全一致。
- 流式必须开启:非流式响应无法准确测量首 token 时间。
- 并发影响:顺序测试避免并发争抢带宽或服务端资源。
- 时间同步:使用 time.perf_counter() 而非 time.time(),以获得更高精度。
通过这套方法,你可以建立自己的延迟基准,为模型选型提供可靠依据。聚合站提供的多模型统一接口让这一过程更加便捷,只需一个 API key 即可覆盖多个模型,无需分别注册和管理。