模型选错没法回退,决策没留痕——我给团队定的A/B对比测试规范
为什么这件事需要管理者操心
上个月我们团队要做一次客服回复的模型替换。我原以为这只是一行代码的事,结果在评审会上被问住了:凭什么选这个模型?谁测的?测试数据是什么?结论能复现吗?
一问三不知。程序员小张说“我试了几条 prompt,感觉新模型回复更顺”。这种“感觉”,在出问题的时候是撑不住的。客户投诉一来,你连当时的对比依据都拿不出来。
所以我定了一条规矩:任何模型切换决策,必须先跑一轮可留痕的本地A/B对比测试,测试脚本和数据入库,结论附在评审记录里。 这篇文章就讲我们是怎么落地这套流程的,适合独立开发者和小团队直接抄走。
流程设计:三个角色,四步闭环
小团队不需要复杂分工,但责任要清楚。我们的做法是:
- 负责人(通常是我):定义评估维度(准确性、响应速度、成本占比、内容安全性),准备测试集,验收结论。
- 执行者(开发同学):写脚本、跑测试、产出对比报告。
- 评审人:看报告里的量化数据,决定是否切换。
四步闭环是:准备测试集 → 接入统一网关跑对比 → 产出量化报告 → 归档留痕。每一步都有产物,缺一不可。测试集尤其重要——我们会从真实业务日志里脱敏抽取,每次扩到 100 条以上才算有效样本,避免三五条 prompt 就下结论。
为什么必须走统一网关,而不是每家直连
这是我要重点强调的风控点。如果脚本里分别对接各家的原生 SDK,会发生三件事:
- 某家供应商接口一调整,你的测试脚本跟着崩,历史对比数据失去可比性;
- API Key 散落在多个脚本里,人员流动时泄露风险陡增;
- 换一个候选模型,就要重写一遍接入代码。
统一网关把这三件事一次性解决:所有请求走同一套 OpenAI 兼容协议,Key 只有一份,换模型只是改一个模型名参数。我们用的是 ThisToken.AI 的统一接口,注册后在控制台就能拿到 Key,具体能调用哪些模型以官网的模型列表为准。
第一步:注册与获取 Key
打开 ThisToken.AI 官网,注册账号后进入控制台,创建一个 API Key。建议的做法是:给每个用途单独建 Key(比如一个专门用于A/B测试),这样账单和权限都好管。Key 建好后不要写死在代码里,放到环境变量或本地 .env 文件中,.env 务必加入 .gitignore——这是我们代码评审的硬性检查项。费用问题不用提前纠结,以官网价格页为准,测试阶段消耗通常很小。
第二步:跑通第一段代码
下面这段 Python 脚本就是我们入库的标准版:对同一批测试问题,依次调用两个模型,记录回复和耗时,最后输出对比摘要。
import os
import time
import json
from datetime import datetime
from openai import OpenAI
client = OpenAI(
api_key=os.getenv("THISTOKEN_API_KEY"),
base_url="https://api.thistoken.ai/v1"
)
TEST_SET = [
{"id": 1, "question": "你们的退货流程是怎样的?"},
{"id": 2, "question": "订单显示已发货但查不到物流,怎么处理?"},
{"id": 3, "question": "发票多久能开出来?"},
]
MODELS = ["model-a-name", "model-b-name"] # 替换为控制台里可用的模型名
def ask(model: str, question: str):
start = time.time()
resp = client.chat.completions.create(
model=model,
messages=[{"role": "user", "content": question}],
)
elapsed = round(time.time() - start, 2)
return resp.choices[0].message.content, elapsed
def main():
report = {"run_at": datetime.now().isoformat(), "results": []}
for case in TEST_SET:
for model in MODELS:
answer, elapsed = ask(model, case["question"])
report["results"].append({
"case_id": case["id"],
"model": model,
"latency_s": elapsed,
"answer": answer,
})
print(f"[{case['id']}] {model} | {elapsed}s | {answer[:50]}...")
# 归档留痕,评审时直接引用
with open("ab_report.json", "w", encoding="utf-8") as f:
json.dump(report, f, ensure_ascii=False, indent=2)
if __name__ == "__main__":
main()运行方式:
pip install openai
export THISTOKEN_API_KEY="你的Key"
python ab_test.py跑完会在当前目录生成 ab_report.json,里面是带时间戳的完整对比记录。这份文件就是我们归档的决策依据——谁跑的、什么时候跑的、每个模型每道题答了什么、耗时多少,全部可追溯。
第三步:把结论变成决策依据
拿到原始报告后,我们要求执行者补三样东西再上会:
- 平均延迟对比:各模型耗时均值和分位数;
- 人工评分:负责人对回复质量打分(1-5分),附评分标准;
- 风险备注:有没有出现幻觉、答非所问、内容安全隐患。
评审会只看这三个数字和抽样原文,十分钟内给出“切换 / 保留 / 再测一轮”的结论。结论写进评审记录,和 ab_report.json 一起归档。三个月后如果有人问“当初为什么换模型”,直接调档,不用靠谁的回忆。
几条踩坑后定下的纪律
- 测试集版本化:测试集文件纳入版本控制,每次测试注明用的是哪个版本,否则不同批次的对比没有意义。
- Key 轮换:参与测试的人员离职或转岗,第一时间在控制台吊销对应 Key。
- 控制变量:同一批测试里,两个模型用相同的 prompt 和参数(temperature 等),否则结论站不住。
- 不测就切,一律打回:哪怕供应商宣传得再好,没有本地数据就不进评审。
写在最后
这套流程跑顺之后,我们做模型决策的时间从“吵一下午”变成了“看十分钟报告”。而整个流程的地基,就是那个统一网关和一个可复现的测试脚本。如果你也想让团队的模型选型有据可查,可以先去注册一个账号、拿到 Key、把上面那段脚本跑通:https://api.thistoken.ai/register ——第一份对比报告出来之后,你会明白为什么我把它写进了团队规范。
---
本文的示例只需一个 API Key 就能复现:在 https://api.thistoken.ai/register 注册即用。