最近一段时间,我帮好几个团队做模型选型和 API 接入的方案评审,发现大家问得最多的问题已经从“哪个大模型最强”变成了“我到底该怎么衡量一个 API 服务好不好用”。这个变化其实是好事,说明大家开始意识到,真正的工程问题不是追逐纸面分数,而是把大模型 API 服务评测放进自己的业务场景里,用一套可重复的指标、方法和工具去验证。
这篇内容我就围绕这个大模型 API 服务评测主题展开,把我这一年多来实际踩过的坑、沉淀下来的指标体系和工具链,一次性梳理明白。里面不会堆概念,全部是能直接抄的作业。无论你是刚接触 API 调用的后端开发,还是负责模型选型的技术负责人,看完之后都能搭出一套自己的评测流程。
1. 评测之前先想清楚:你测的是模型还是服务
很多人上来就测 API,测完发现结果很虚,换个时间、换个账号、换个并发量,结论完全不一样。问题不在于测试方法,而在于评测目标没有定清楚。
1.1 你的业务到底需要哪一档模型能力
先说一个最常见的问题:业务场景根本不需要最强模型。
以我接触过的项目为例,做客服意图识别、工单自动分类、邮件摘要这类任务,一个 7B~14B 级别的模型往往就够了,用超大参数模型反而带来高延迟和高成本。反过来,做复杂代码生成、长文档分析推理、多步 Agent 规划,小模型就是顶不住,必须上大参数模型或者推理增强型模型。
所以评测的第一个动作不是跑 Benchmark,而是先给自己的业务定义一个“最低可用线”。比如:
- 意图分类任务:人工分类准确率是 85%,模型至少要达到 90% 才有替换价值。
- 客服回复草稿生成:格式可用率要求 95% 以上,生成内容不允许出现明显事实错误。
- 代码补全:语法正确率是底线,进一步还要看单元测试通过率。
这个“最低可用线”就是你后续评测所有模型的及格线。没有这个线,任何指标对比都是空谈。我见过不少团队花了两周评测十个模型,最后却发现最便宜的模型早就满足需求了,白白浪费大量时间。
1.2 评测边界条件必须固化,否则结果就是噪声
这一步是评测的“底座工程”。你以为你在对比两家 API,实际却可能是模型版本、参数配置、输入长度全都在变,最后拿到一组完全无法解释的数据。
我建议评测前把下面这组条件固定下来:
- 模型版本:记录具体版本号,比如 deepseek-chat、qwen-plus-2024-11-30 这种带日期的版本标识,不能只写“Qwen”或“DeepSeek”。
- 采样参数:temperature、top_p、max_tokens、frequency_penalty 全部固定。尤其是 temperature,同一个任务 0 和 0.7 的结果差异可能比换一个模型还大。
- 输入输出长度:评测任务要限制 max_tokens,否则长输出任务的延迟天然比短输出任务高,对比不成立。
- API 账号类型:按量付费和企业专属账号的限流配额、最高并发通常不一样,评测时要明确账号类型。
- 调用时间段:别让评测跨过服务商的调度高峰期,如果必须跨时段,记录匹配的时间戳。
- 重试策略:关闭自动重试,或者在代码里记录重试次数,否则一次网络抖动会拉低整体指标,误导判断。
把这些条件写进一个配置文件里,评测脚本读取配置执行。条件变化就改版本号,而不是在代码里悄悄改参数。这个习惯能帮你省掉后面 80% 的“为什么结果不对”的排查时间。
2. 核心评测指标体系:从可用性到成本逐层拆解
大模型 API 服务评测不是单一指标,而是一组指标的组合。我的习惯是把指标分成四层:可用性、性能、质量、成本。四层缺一不可,只看其中一两项很容易掉坑。
2.1 可用性指标:稳定性比峰值能力重要
可用性指标衡量的是一个 API 服务“能稳定提供服务”的能力。它包含几个细分维度:
- 请求成功率:有效请求数除以总请求数。注意要区分 4xx 和 5xx,4xx 通常是调用方参数问题,5xx 才是服务端问题。
- 限流与配额:请求被 429 拒绝的次数和比例。这是一个极其容易被忽略的指标,不同服务商的限流策略差别非常大,有的按每秒请求数(RPM)限,有的按每分钟 Token 数(TPM)限,还有的用滑动窗口在 5 小时维度上做累计配额。
- 错误响应质量:服务端返回错误时有没有明确的错误码和提示信息,这直接决定排查问题的时间成本。
- 可用性波动:以小时为粒度统计请求成功率,画出曲线。很多 API 白天稳定、晚上或高峰时段出现波动,只看全天平均数据会掩盖这种问题。
我记得有一次评测某平台,平均成功率 99.8%,看着很美。后来按小时拆开看,发现每天晚间八到十点成功率掉到 92%,而且延迟翻倍。这就是典型的高峰时段资源不足,如果你业务正好在晚高峰有流量,这个数据就是致命项。
这里多说一句里约热内卢……不对,是说回 429 限流。很多平台文档里写“每分钟 60 次调用”,实际实现却是 5 小时滚动窗口内累计 token 配额,超了就直接拒绝。最近有热搜词里提到“api error: request rejected (429) you have exceeded the 5-hour usage quota”,这就是典型的滑动窗口配额控制。所以评测时一定要读清楚响应头里的 Retry-After 字段和错误体里的 quota 说明,不能只看状态码猜原因。
2.2 性能指标:首 Token 延迟比总延迟更贴近用户感受
性能指标是大模型 API 评测里最常用、也最容易测错的维度。两个核心指标必须先搞清楚:
- TTFT(Time To First Token):从发起请求到收到第一个 Token 的时间。这个指标直接影响用户可感知的“响应速度”。对交互式应用来说,TTFT 超过三秒用户就会明显觉得卡顿。
- TPS / Token 吞吐量:每秒生成的 Token 数。这个指标决定单位时间内能处理多少内容,对批量处理场景尤其重要。
这两个指标的关系很有意思。同一个模型服务,TTFT 快不代表整体吞吐高。有的服务用小批量抢占式调度,抢到先机发第一个 Token,但后面生成速度慢;有的服务相反,预热时间稍长,但一旦开始输出就非常稳定。
我实际测试过某服务,TTFT 平均只要 0.8 秒,看起来相当优秀,但在长文本输出场景下,总耗时比另一家 TTFT 需要 2 秒的服务多了三分之一。这就是典型的“首 Token 抢占型”服务,适合短交互场景,不适合长文档生生成。所以评测一定要同时记录 TTFT 和总耗时,不能单看一个。
性能测试还需要注意并发维度。单请求延迟和并发下的延迟是两个世界。我用 20 并发压测某 API,单请求 TTFT 从 1 秒恶化到 6 秒,错误率也从 0 升到 12%。这种数据在官方文档里永远看不到,只能自己实测出来。
2.3 质量能力指标:别只看 MMLU 那些跑分
模型质量评测是最难量化、也最容易被误导的一层。我的建议是分层处理。
第一层是国家队跑分,也就是公开 Benchmark。MMLU、GSM8K、HumanEval、C-Eval 这些是模型能力的初步参考,相当于高考成绩,能说明基本水平,但说明不了实际工作能力。
第二层是自己的任务集评测。这才是决定选型的核心依据。拿你自己的 Prompt、业务数据、验收标准,去测每一个候选模型。比如你的业务是做合同关键信息抽取,那就准备好 200 份真实脱敏合同,跑抽取结果,然后人工核对准确率和格式可用率。
第三层是专项能力测试。针对你的场景做定向测试,比如长文本理解能力、多轮对话一致性、结构化输出(JSON)的格式正确率、指令遵循能力。这些能力在通用跑分里往往覆盖不全,但在实际业务里影响巨大。
举一个实际例子。我之前做结构化抽取评测,发现某个模型推理能力跑分很高,但输出 JSON 时经常混入解释性文字,导致解析失败率超过 30%。用 JSON Mode 也不行,因为它偶尔会输出非法转义字符。这种问题跑分看不出来,只有自己拿真实任务测才暴露得出来。
2.4 成本指标:Token 单价低不一定代表便宜
大模型 API 的计费比大多数人想的复杂,评测时必须把成本算到“单个业务任务的完成成本”,而不是单纯对比每百万 Token 价格。
常见的计费维度包括以下几项,每一项都可能是隐藏的成本陷阱:
- 输入 Token 价格与输出 Token 价格:几乎所有平台都是输出比输入贵,差别从三倍到十倍不等。如果业务是生成型任务,输出占比高,实际成本远比按输入算要高。
- 缓存命中价格:服务商会区分未命中缓存和命中缓存 Token 的价格。上下文越长、复用率越高,缓存命中的收益越明显。评测时可以用重复请求模拟缓存命中,看实际计费变化。
- 上下文超长计费:超长上下文往往有独立的计费档位,比如超过 32K 后单价上浮。如果你的输入本来就在这个区间,这个成本是刚性的。
- 免费额度和套餐时效:有些平台赠送的免费额度有使用期限,过期作废。评测时不要被首月免费吸引,要看长期稳定价格。
我曾经纠结过两个 API:A 平台输出价格便宜 30%,B 平台贵一些但自带上下文缓存。我的实际任务里有大量重复的系统提示词和历史对话,B 平台靠缓存命中能省下接近一半的输入成本,最终综合成本反而比 A 平台低 20%。所以成本评测一定要基于真实请求分布,用模拟数据算出每万次任务总成本,再对比不同平台。
3. 评测方法与流程:把评测跑起来,别只停在论文上
有了指标,没有一套能重复执行的方法和流程,指标就只是空谈。这一节我直接给出我常用的评测流程和可落地的方法。
3.1 第一波筛查:用固定测试集快速横向对比
第一轮评测不需要复杂脚本,我的做法是准备一个包含 10~20 条典型业务请求的测试集,覆盖多种难度。用写好的 Python 脚本分别调用候选 API,记录返回内容、TTFT、总耗时、Token 消耗、成本,汇总成一张对比表。
这个阶段的目标是快速淘汰明显不合格的服务商。比如格式可用率低于及格线、TTFT 持续超过告警阈值、频繁报 5xx 的平台,可以直接划掉。第一轮留下的服务商再去跑大数据量的压测和专项评测,节省时间和成本。
以下是简化版的横向对比脚本,用来统计一个请求从发出到返回全过程的耗时和 Token 用量,替换 api_key 和 model 即可运行:
import time import json from openai import OpenAI client = OpenAI( api_key="your-api-key", base_url="https://api.example.com/v1" ) messages = [ {"role": "system", "content": "你是一个专业的中文客服助手,请用简洁语言回答用户问题。"}, {"role": "user", "content": "我的订单已经付款三天了,为什么还没有发货?"} ] start = time.time() resp = client.chat.completions.create( model="example-chat", messages=messages, temperature=0.3, max_tokens=256 ) end = time.time() print("模型:", resp.model) print("总耗时: %.2f 秒" % (end - start)) print("回复:", resp.choices[0].message.content) print("Token 用量:输入 %d,输出 %d" % ( resp.usage.prompt_tokens, resp.usage.completion_tokens ))这个小脚本看着简单,但它是整个评测流程的基础组件。实际使用时我会加一个最长等待时间和重试上限,防止个别请求卡死拖慢整体评测。
3.2 第二步:并发压测,测出服务的真实上限
单请求测试通过之后,必须做并发压测。我不推荐一上来就用复杂工具,先用 Python 的多线程脚本跑一轮,观察服务的响应变化,再考虑是否引入专业压测工具。
压测脚本的核心逻辑是:固定一个 prompt,设置并发数,每个线程独立发起请求,记录每次请求的 TTFT、总耗时、错误状态码,最后汇总统计。需要注意的是,压测时一定要把请求数据和响应数据落盘存下来,别只打印到控制台,否则事后分析没有数据可查。
并发压测的轮次设计也很关键。我一般从 1 并发、5 并发、10 并发、20 并发、50 并发逐步往上加,每次持续三到五分钟。观察几个核心数据:成功率的掉点出现在哪个并发度,TTFT 的 P95 和 P99 在哪里开始恶化,429 和 5xx 错误什么时候开始密集出现。这些数据就是你做容量评估和限流配置的依据。
实测中我发现,有些平台的 API 对 Token 消耗速率也有限制。即使你并发请求数不高,只要 prompt 长度大,Token 量很快就能把配额打满。所以压测时要同时统计每分钟消耗 Token 数,并对照服务商文档里的 TPM 限制,否则压测结束时会看到一片 429,误判成服务不稳定。
3.3 第三步:业务回放评测,拿真实数据说话
前面两步解决的是“服务行不行”,业务回放评测解决的是“服务适不适合这个业务”。这是整个评测流程里最有价值的一步。
具体做法是,从线上请求日志里抽取一批真实业务请求,脱敏后按比例组成评测数据集。数据分成三块:验证集、测试集、压力集。验证集用来选 prompt 版本,测试集用来做最终评分,压力集专门用来测试异常输入和边界情况。
对于每一组 prompt 和候选模型,我建议让同一条数据跑三次,取多数结果或平均分,降低随机性干扰。评测打分方式可以分两种:一种是你自己定义规则,比如抽取任务的字段准确率、代码生成的编译通过率,这类客观指标直接算分;另一种是主观质量分,比如回复通不通顺、有没有事实错误,可以采用人工评分或者用更强的模型辅助评分。
我给一个简单但实用的评测评分模板:
| 评测维度 | 权重 | 评分标准 | 得分口径 |
|---|---|---|---|
| 内容准确性 | 30% | 事实错误率、关键要素遗漏率 | 人工核对 |
| 格式可用性 | 20% | 输出是否可按约定格式解析 | 程序校验 |
| 延迟体验 | 20% | P95 TTFT 是否在 3 秒内 | 脚本统计 |
| 服务稳定性 | 15% | 错误率、超时率 | 脚本统计 |
| 单任务成本 | 15% | 每完整任务折合人民币 | 脚本统计 |
这个模板的权重不是固定的,按业务场景调整。比如你做离线批量抽取,延迟权重可以调到 5%,成本权重提到 30%;你做在线客服助手,延迟权重就要拉高。
4. 评测工具链:命令行、压测、监控与记账
评测流程跑起来之后,工具决定了你的效率。这里我把常用的工具按用途分组,全部是大模型 API 评测过程中真正用得上、且我亲自试过的方案。
4.1 快速调试与功能验证工具
先用最简单的工具把 API 的响应格式、参数行为摸清楚。
- curl:验证 API 连通性最简单直接的手段,POST 一个 JSON 请求,观察返回结构和错误信息。
- Apifox 或 Postman:适合调试请求头的认证参数、查看返回头和响应体,还能保存历史请求方便回放。
- OpenAI SDK 兼容层:现在大部分国内 API 平台都提供 OpenAI 兼容接口,直接用 OpenAI SDK 填 base_url 就能调,这是降低接入成本的一个关键设计,也是评测时最高效的调用方式。
调试阶段出现 400 错误时,不要直接改参数重试,先完整读一下错误返回中的 message 字段。很多平台会把支持的模型名列表、参数范围写在错误提示里,看一眼就能定位问题,避免盲目试错。
4.2 压测与性能分析工具
并发压测环节,不同工具适用不同场景。
- 轻量压测:Python 的 concurrent.futures 自写脚本,适合几十并发的摸底测试,完全够用,还能和后续数据统计逻辑无缝衔接。
- 专业 HTTP 压测:k6、Vegeta、Apache Bench 都可以,适合对 HTTP 层的并发表现做更规范的测试。个人更常用 k6,因为可以用 JavaScript 写场景,做阶梯加压比较方便。
- 模型专项延迟测试:如果你想在多种输入输出长度下拆解 TTFT 和 TPS,我推荐一个思路——把输入 token 数固定到 512、2048、4096 三档,分别测 TTFT 和总耗时,用脚本自动统计 P50、P95、P99。这种分长度压测能更真实地还原业务场景,因为实际请求的 prompt 长度往往分布很广。
这里提醒一个常见坑:性能测试一定要把网络延迟和数据传输时间分开看待。如果 API 服务商和你之间网络跨越了很长的链路,测出来的延迟会虚高,这反映不了服务端真实性能。严谨的做法是在服务商同一地域的服务器上跑压测,或者至少记录网络链路信息作为参考。如果没有同地域机器,那就用相对值来对比不同服务商,而不是拿绝对值当权威结论。
4.3 调用链监控与成本统计工具
评测不是测一次就结束,后续日常监控同样需要工具。推荐几个开源方案:
- Langfuse:自托管 LLM 可观测平台,支持记录每次请求的 Prompt、输出、Token 用量和延迟,能自动聚合出成本统计,适合评测和上线后的持续跟踪。
- Helicone:可以把它看成一个 LLM API 的代理层,拦截请求并记录指标与成本,接入成本比较低。
- One API / 同类网关:如果你同时用到多家 API,可以接一个网关做统一转发和记账,这样横向对比和切换模型都很方便,还能自定义限流规则。
我的习惯是,在测试阶段就把 Langfuse 这种观测工具接入评测脚本。别小看这一步,它能把评测数据和后续线上数据放进同一个体系里对比,这样“评测结果”和“真实表现”之间的差异就一目了然。否则你可能今天用脚本测出一个结论,明天上线后用另一个监控工具看数据,两边完全对不上,又要重新排查。
4.4 在线评测榜单与模型路由平台
在线榜单可以作为选型的起点,但不建议作为终点。开源大模型评测榜单、各类综合榜单能帮你快速确定候选池,知道有哪些模型值得测。不过要记住,榜单是考试分数,业务是实际工作,两者有关联但不完全等同,最终决定必须在自己的测试集上跑完才能下结论。
模型路由平台的意义在于,当你手上有多个可用的模型,并且希望按任务难度动态选择模型时,它可以帮你在不同服务商和模型之间做路由转发。但对多数中小团队来说,前置一个路由层会增加复杂度,建议先评测出最优解,再考虑是否需要路由策略。
5. 常见问题与排查技巧实录
评测过程中踩过的坑,十有八九是重复出现的。我把几个高频问题和他们背后的门道写出来,帮你少走弯路。
5.1 429 限流:是并发太高还是额度超了
429 是评测和上线阶段最常见的错误,但不同平台返回 429 的原因可能完全不同。一种是因为瞬时请求量超过了 RPM 限制,另一种是滚动时间窗口内的 Token 使用量超过了配额上限。
判断方法很简单:看错误体里的提示和响应头。如果提示里写的是 per-minute limit,通常是瞬时限流;如果写的是 hourly quota 或 5-hour usage quota,说明你在这个时间窗口内的累计用量已经用完。处理方法也不一样。瞬时限流可以退避重试或者降低并发;滚动配额超了只能等窗口刷新,或者去控制台扩充配额。
从实测经验看,很多刚接入的团队会忽略滚动配额,因为在线压测时每轮请求并不密集,但累加起来的 Token 量很快就超过了窗口额度。我建议压测前记录一下自己的初始配额余量,压测过程中随时监控余量变化,不要等 429 一片才开始排查。
5.2 400 参数错误:先读错误信息再改参数
400 错误在评测初期非常常见,尤其是模型名写错、请求格式不对。最近一个热门例子是错误提示 “api error: 400 the supported api model names are deepseek-flash, deepseek-v4”,它已经把支持哪些模型名直接写出来了。遇到这种错误,把 model 字段改成提示里给出的合法名称就行,非常直白。
但有些 400 错误没那么友好,比如只返回 “bad request” 没有细节,这时候按顺序排查:请求头 Authorization 是不是正确;请求体的 JSON 格式是否合法;messages 数组是否是空的;content 字段是不是字符串而不是数组;max_tokens 是否超过上限;temperature 是否在合法范围内。把这六项全查一遍,80% 的 400 都能解决。
真正想提高排查效率,我的做法是在评测脚本里把每个请求的完整请求参数打印出来,一旦出错可以直接拷贝请求体到 API 调试工具里复现,逐字段排查。与其对着错误码猜,不如直接构造一个可复现的最小问题集。
5.3 本地部署还是云端 API:评测方案也要分场景
评测过程中,经常有人问我一个问题:我到底应该测云端 API,还是直接本地部署开源模型?
我的判断逻辑是三条:数据敏感度、业务弹性需求、工程维护能力。数据敏感度高的场景,比如医疗、金融内部数据,尽量选择私有化部署,主流方案是 vLLM 做推理加速,Ollama 做本地快速验证。业务流量波动大、需要快速扩展的场景,云端 API 更有优势,省去自己压测和限流的运维成本。工程团队规模很小、没有 GPU 资源的,直接云 API 是最省预算的方案,别硬上私有化。
如果决定本地部署做评测,需要注意推理引擎的差异。同样是 7B 参数模型,用 vLLM 部署和用原生 Hugging Face Transformers 跑,吞吐量可以差好几倍。评测结论要注明推理引擎和部署环境,否则结论换个环境就不成立。如果只是验证模型效果而不是服务性能,优先用已有的开源推理框架,先确认模型效果达标,再考虑性能优化。
5.4 评测结果不稳定:模型随机性和版本漂移
遇到同一请求两次调用返回不同结果,这不是 API 故障,而是大模型的固有随机性。评测中要控制这种随机性,需要注意几件事。
第一,temperature 尽量固定,评测对比时统一用 0.2 或 0.3,不要一组用 0 一组用 0.7。有些平台支持 seed 参数,设置相同 seed 可以降低结果差异,但不同平台对 seed 语义的支持不一致,评测时需要逐一确认。
第二,同一条测试数据至少跑三遍,取多数结果。回答类任务随机性大,三遍能显著压低噪声;抽取类的规则任务可重复性高一些,两遍基本就够。
第三,要警惕模型版本漂移。API 平台的模型版本随时可能更新,今天测的和上周测的可能不是一个版本。评测时把每个平台返回的 model 字段记录下来,建立版本日志。线上表现出现波动时,先查是不是模型悄悄升级了。
5.5 输出格式解析失败:大模型评测里最隐蔽的坑
最后再单独说一个很多人忽视的问题:非法输出。很多团队测评候选模型时,用人工看回答内容的质量,却忽略了程序化解析的成功率。在上线做自动化任务时,模型输出无法按预期格式解析,会直接导致业务流程中断,这种情况比内容质量稍差更致命。
比如让模型输出 JSON,有的模型会在 JSON 外附带解释文字,有的会在代码块里包一层 Markdown 标记,有的甚至会输出截断的半截 JSON。评测时一定要做格式自动校验,判断输出是否严格匹配预期的 JSON Schema、是否可以安全解析。格式解析这一关过不去的模型,就算内容生成得再准,也不能用于自动化流水线。
抛开所有方法论,我在实际评测里最大的体会是:大模型 API 服务评测这件事没有一劳永逸的答案。模型更新换代太快、各家服务的限流策略和价格策略也在持续调整,所以真正重要的是建立一套可以重复迭代的评测机制,而不是记住某一个平台的某一个指标。把测试集、评测脚本、评分规则沉淀成固定资产,下次有新模型、新任务、新需求,直接跑一遍就好。
如果你准备开始做自己的评测,我的建议是不要想着一口吃成胖子。先准备一份 20 条以内的典型请求测试集,写一个几十行的便捷调用脚本,跑出第一版横向对比数据,从这开始逐步完善你的指标和工具链。搭好这个框架之后,以后每一次模型选型都会轻松很多。