latency-benchmark-per-model · ZH · 2026-10-12

一把 key 跑六家模型延迟实测:首 token、总时长与波动怎么记

本文提供一套可复跑的基准测试脚本,用于测量同一提示下多个模型(如 Claude、GPT、DeepSeek、Qwen、GLM、Kimi)的首 token 延迟、总响应时间与 p95 抖动。通过标准化测试流程,帮助读者建立自己的延迟表,避免依赖厂商宣传数据。文章涵盖指标定义、脚本设计、多模型调用方法及结果解读,强调可控环境下的实际测量。

为什么需要自建延迟表

厂商公布的延迟数据通常来自理想环境,与你的实际网络、地理位置、并发情况差异很大。首 token 延迟(TTFT)和总时长(TTLT)受模型规模、服务端负载、网络路径影响显著。与其相信宣传,不如用统一脚本在同一台机器上测量。

关键指标定义

测量前需明确三个核心指标:

  • 首 token 延迟(TTFT):从发送请求到收到第一个流式响应 token 的时间,反映模型启动速度。
  • 总时长(TTLT):从发送请求到最后一个 token 到达的时间,反映完整响应耗时。
  • p95 抖动:多次测量中第 95 百分位的延迟值,用于评估长尾波动。

通常进行多次重复测量(如 10 次),取中位数或平均值作为稳定参考,p95 则帮助识别偶发高延迟。

测试脚本设计原则

一个可复跑脚本应满足:

  1. 同一提示:对所有模型使用完全相同的输入文本和参数(如 max_tokens、temperature)。
  2. 顺序调用:避免并发干扰,依次调用每个模型。
  3. 流式响应:必须开启流式,才能准确捕获首 token 时间。
  4. 统一计时:使用高精度计时器记录请求发起、首 token 到达、最后 token 到达三个时间点。
  5. 重复运行:每个模型至少运行 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 即可覆盖多个模型,无需分别注册和管理。