A/B Testing
A/B 测试线上同时跑两套 Prompt/模型,用真实流量验证效果。
详解
A/B 测试是在生产环境同时运行两个版本的 Prompt 或模型,把真实流量随机分配给各版本,用实际用户行为数据决定哪个更好。与离线评估不同,A/B 测试的裁判是真实用户,衡量的是满意度、任务完成率等业务指标。常见部署策略:全量 A/B(流量对半,速度快但风险高);金丝雀发布(先切 5–10% 流量,观察稳定后再扩大);影子测试(新版本只记录不返回,零风险但成本翻倍)。工程实现通常用用户 ID 哈希取模做稳定分流。两个常见陷阱:样本量不够就急于下结论(LLM 输出方差大,需数百到数千样本才有统计显著性);同时改多个变量导致无法溯因——每次只改一个变量(Prompt、模型版本或 Temperature 其中之一)。
一个类比
像连锁餐厅的新菜试吃活动:不是全国门店同时换菜单,而是先在 10% 的门店推新配方(实验组),90% 的门店保留原配方(对照组),四周后看实验组门店的回购率和差评率,如果新配方赢了就全国推广,如果没有差异就撤回。整个过程里,大部分顾客感知不到任何变化。
举个例子
import anthropic
import hashlib
client = anthropic.Anthropic()
# 两个版本的 Prompt
PROMPT_A = "你是一个简洁的技术助手,回答不超过三句话。" # 对照组
PROMPT_B = "你是一个耐心的技术导师,用举例子的方式解释。" # 实验组
def get_variant(user_id: str, experiment_ratio: float = 0.1) -> str:
"""按用户 ID 哈希稳定分流,同一用户始终落在同一组"""
hash_val = int(hashlib.md5(user_id.encode()).hexdigest(), 16)
return "B" if (hash_val % 100) < (experiment_ratio * 100) else "A"
def answer(user_id: str, question: str) -> dict:
variant = get_variant(user_id)
system_prompt = PROMPT_B if variant == "B" else PROMPT_A
resp = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=256,
system=system_prompt,
messages=[{"role": "user", "content": question}]
)
return {
"variant": variant,
"answer": resp.content[0].text,
"tokens": resp.usage.output_tokens,
# 实际项目里这里写入数据库,用于后续统计分析
}
# 模拟两个不同用户
for uid in ["user_001", "user_042", "user_099"]:
result = answer(uid, "什么是上下文窗口?")
print(f"{uid} → 版本 {result['variant']},{result['tokens']} tokens")PYTHON 示例
相关概念
- → Evaluation / Eval· 评估
- → Golden Dataset· 黄金数据集