「阿茶家」奶茶店老板娘最近犯难了:招牌珍珠奶茶卖了三年,老顾客都说好,但新来的研发小哥拍胸脯保证,他调制的草莓奶昔配方能让顾客满意度再上一个台阶。老板娘不敢直接换掉招牌——万一新配方没人买账怎么办?于是她决定搞一场「试饮会」:随机请顾客品尝两种配方,记录他们的满意度,用数据决定到底该不该上新。这场试饮会,就是今天要讲的「AB实验」;那本记录了每次配方改动、试饮结果、最终决策的「配方本」,就是Prompt版本管理;而店里新装的自动记账系统,就是Langfuse这类可观测性工具。从小白到AI工程师,你将学会如何用这套方法,告别凭感觉调Prompt,让数据替你拍板。

岗位关联

对AI从业者而言,这是把Prompt从“玄学调参”变成“科学迭代”的必备技能:版本管理让你改得清楚,AB实验让你赢得明白——简历上“数据驱动优化LLM应用”的实力证明,就藏在这里。

目录
  1. 可视化演示
  2. 实验设计
  3. 流量分配
  4. 评估指标
  5. 统计显著性
  6. 结果解读
  7. 版本管理
  8. 工具落地
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示Prompt版本AB实验的流量分配机制、多维度评估指标对比及统计显著性检验,交互切换理解数据驱动的Prompt效果评估全流程。

本节配有交互动效(进入视口后自动加载,约 3KB)。

AB实验流量分配 哈希分桶保证用户随机分配 对照组用旧版实验组用新版 hash%100 同一用户始终分到同一组

实验设计

老板娘把研发小哥叫到跟前:「你确定草莓奶昔能让顾客更满意吗?咱们先别急着换配方,先想清楚要验证什么。」她翻开配方本,写下两行字:第一行「当前无愧招牌的珍珠奶茶」,第二行「有待考验的草莓奶昔」。这一问一写,就是AB实验的第一步——把模糊的直觉翻译成可验证的假设。

在统计学里,这个「假设」被拆成两个对立的命题:零假设(H0)和备择假设(H1)。H0是老好人,默认「新配方并没有比旧配方更好」,一切改动都是徒劳;H1是挑战者,声称「新配方确实更好」。实验的目的,就是用数据去审判这对冤家:如果数据强烈反对H0,我们就拥抱H1;如果数据模棱两可,就继续维持现状。对照组的选择也同样关键——经典珍珠奶茶就是对照组,它是所有新配方必须打败的「守擂者」;实验周期则决定了试饮会办多久——太短攒不够样本,太长则会拖慢迭代节奏,通常以覆盖完整的业务周期(如一周,含周末和工作日)为底线。

试饮会办起来的那个下午,老板娘看着两排队伍若有所思:原来做实验和做奶茶一样,配方可以大胆,但验证必须严谨——先把要证明的事写在配方本上,后面的每一步才不会跑偏。

H0:pB≤pAH1:pB>pAH_0: p_B \leq p_A \qquad H_1: p_B > p_A
两个假设互斥且完备:H0说「草莓奶昔的满意率不超过珍珠奶茶」,H1说「它确实超过了」。实验就是这场PK的裁判。
  1. 零假设写作H0用小于等于号,表示新版本效果不优于旧版本,是我们要尝试推翻的默认立场。
    H0:pB≤pAH_0: p_B \leq p_A
  2. 备择假设写作H1用大于号,表示新版本效果显著优于旧版本,是我们要收集证据支持的结论。
    H1:pB>pAH_1: p_B > p_A
  3. 方向性说明这里用的是单侧检验(只关心B是否更好)。如果只关心「有没有差异」,就用双侧检验的「≠」号,但业务上我们通常只关心「是否更优」。
    pB−pA>0p_B - p_A > 0

流量分配

试饮会第二天,老板娘发现一个尴尬的现象:草莓奶昔的队伍排得老长,珍珠奶茶这边门可罗雀。原来顾客听说是「免费新品试饮」都跑去尝草莓了。这么一来,两组顾客根本不是同一类人——爱尝鲜的都去了B组,保守的老主顾都留在A组,比出来的结果自然不公平。老板娘赶紧叫停,改为「发放随机号码牌」:顾客进门抽签,单号尝珍珠,双号尝草莓,谁也没得选。

这就是流量分配的核心——随机分桶。随机化保证了A、B两组在用户特征上「大致同质」:年龄、口味偏好、消费习惯都被均匀打散,两组唯一的差异只剩Prompt版本本身。但在动手之前,老板娘还需要回答一个问题:到底要请多少位顾客来试饮,结论才靠谱?这就要用到样本量估算公式。公式里的p是预估的基准满意率,δ是最小可检测效果差——如果新配方只能提升1%,老板娘觉得没折腾的必要,那δ就设为0.05(5%),样本量会据此而定。分流比例一般默认5:5,但若旧版本是核心业务线,也可以采用9:1的保守比例,代价是实验周期变长。

老板娘盯着计算器上的384,倒吸一口凉气。但她也明白:随机号码牌确保了公平,足够的样本量确保了底气。流量分配不是「把用户随便一劈两半」,而是用科学方法给两组人同样的机会说出真实感受。

n=Zα/22×p(1−p)δ2n = \frac{Z_{\alpha/2}^2 \times p(1-p)}{\delta^2}
n是每组需要的样本量;Z是置信水平对应的临界值(95%置信度取1.96);p是预估满意率;δ是你认为「值得上线」的最小提升幅度。样本量不够,实验结果就像掷骰子——靠运气说话。
  1. Z临界值Z_{\alpha/2}对应置信水平,95%置信度时取1.96,它决定了结论的可信度门槛。
    Z0.025=1.96Z_{0.025} = 1.96
  2. p(1-p)方差项p是基准满意率的预估值,这一项刻画了「好评率」天然存在的随机波动,p越接近0.5,波动越大,需要的样本越多。
    p(1−p)p(1-p)
  3. δ最小可检测效果差δ是你业务上能接受的「最低有效提升」。δ越小,说明你想捕捉越细微的差异,需要的样本量就越大。
    δ=0.05\delta = 0.05
  4. n样本量把上面的量代入公式,得到每组最少需要的顾客数。它保证实验有足够「力气」分辨出真实差异,而不是被随机噪音淹没。
    n=1.962×0.5×0.50.052≈384n = \frac{1.96^2 \times 0.5 \times 0.5}{0.05^2} \approx 384

评估指标

试饮会进行到第三天,老板娘手里攒了一堆顾客反馈。可她发现一个大问题:顾客说「挺好喝的」和她理解的「好喝」根本是两回事——有人喜欢甜,有人喜欢茶味浓。老板娘决定设计一张标准评分卡:口味(1-5分)、口感(1-5分)、复购意愿(1-5分),三者的加权总分作为「综合满意度」。这就对应了Prompt评估中的核心问题:怎么定义「效果好」?

评估指标必须与业务目标对齐。如果你的业务目标是提升客服解决率,指标就该是「问题解决率」;如果目标是提升导购转化率,指标就是「下单转化率」。同时要兼顾主观指标与客观指标:主观指标如LLM-as-a-Judge打分、用户满意度问卷,适合衡量语气、友好度这类「感受」;客观指标如回答准确率、任务完成率,数据可自动采集、可复现。此外还得设护栏指标——就像奶茶店要盯着「投诉率别上升」,Prompt实验也要盯「敏感内容命中率」「拒绝率」等红线指标,防止为了追求好评而牺牲安全底线。最后,所有评估数据都要在实验期间自动采集上报,以便后续统计。

有了评分卡,顾客的「挺好喝」变成了可比较的4.3分和3.8分。老板娘恍然大悟:指标不是拍脑袋想出来的,而是把「什么是好」这件事,翻译成了一套可测量、可加权的语言。

S=w1s1+w2s2+w3s3S = w_1 s_1 + w_2 s_2 + w_3 s_3
S是综合得分,s₁、s₂、s₃分别是口味、口感、复购意愿得分,w是各自权重。Prompt评估同理:把「好」拆解成几个可打分的维度,加权汇总成单一指标,才能进统计检验。
  1. 维度得分s每个评估维度(口味/准确性/相关性)由标注者或自动评估模型打出1-5分,分数代表该维度的优劣。
    s1=4.2s_1 = 4.2
  2. 权重w权重表示各维度的重要性。比如复购意愿的权重设为0.5,口味和口感各0.25,合计必须等于1。
    w1+w2+w3=1w_1 + w_2 + w_3 = 1
  3. 汇总得分S加权求和得到综合分,作为该Prompt版本的「效果值」,后续所有AB比较都用这个值说话。
    S=0.25×4.2+0.25×4.0+0.5×4.5=4.3S = 0.25 \times 4.2 + 0.25 \times 4.0 + 0.5 \times 4.5 = 4.3

统计显著性

试饮会跑了一周,数据汇总:草莓奶昔满意率66%,珍珠奶茶55%。研发小哥兴奋地说:「高出一大截,上架吧!」老板娘却摆摆手:「万一只是这周来的顾客恰好爱吃草莓呢?」她翻出统计课笔记——这就要请出统计显著性这个裁判,回答一个关键问题:观察到的11个百分点差距,到底是真实差异,还是随机波动?

统计显著性的核心是p值。p值的严格定义是:在零假设(新配方没用)为真的前提下,观察到当前这么大(或更大)差异的概率。p值越小,说明「假如新配方没用,我们却看到这么大差距」这件事越离谱——离谱到我们宁可相信新配方确实有用。行业惯例把显著性水平α设为0.05:p < 0.05,就说差异显著,可以拥抱H1。但要注意,p值有两个常见误读:它不是「新配方有效的概率」,也不是「效果量的大小」——它只是对「巧合」概率的度量。实际计算时,我们通常先算z分数(两比例之差相对标准误的倍数),再从正态分布反查p值。

老板娘盯着z分数和p值,喃喃自语:原来「看起来更好」和「真的更好」之间,隔着一道统计显著性的门槛。11个百分点的差距看似诱人,但若样本只有几十杯,那不过是随机波动的噪音而已。

z=pB−pApˉ(1−pˉ)(1nA+1nB)z = \frac{p_B - p_A}{\sqrt{\bar{p}(1-\bar{p})\left(\dfrac{1}{n_A}+\dfrac{1}{n_B}\right)}}
p_A、p_B是两组满意率,n_A、n_B是两组人数,p̄是合并满意率。z衡量「差异」相对于「随机波动」放大了多少倍:z越大,差异越不可能是巧合。
  1. 比例之差分子是两组满意率的差,这是实验想捕捉的「信号」。差越大,越可能显著。
    pB−pA=0.66−0.55=0.11p_B - p_A = 0.66 - 0.55 = 0.11
  2. 合并比例p̄把两组合并计算整体满意率,用来估计共同的基准成功率。
    pˉ=ahit+bhitnA+nB\bar{p} = \frac{a_{hit} + b_{hit}}{n_A + n_B}
  3. 标准误SE根号项表示「信号」在随机波动下的标准差。样本量越大,SE越小,对差异的估计越精确。
    SE=pˉ(1−pˉ)(1nA+1nB)\text{SE} = \sqrt{\bar{p}(1-\bar{p})\left(\frac{1}{n_A}+\frac{1}{n_B}\right)}
  4. z分数信号除以噪音,得到标准正态分布下的得分。|z| > 1.96时,对应p < 0.05。
    z=0.11SEz = \frac{0.11}{\text{SE}}
  5. p值查表由z查标准正态分布表得到p值。z越大,p越小;p < 0.05则拒绝H0,判定差异显著。
    p=2×(1−Φ(∣z∣))p = 2 \times (1 - \Phi(|z|))

结果解读

统计显著性给出了「是否显著」的判决,但老板娘还有两个问题:草莓奶昔比珍珠奶茶好多少?这个结论对所有人都成立吗?她打开数据看板,发现两个有趣的细节:第一,虽然整体满意率提高了11个百分点,但置信区间显示真实提升可能在3%到19%之间波动——如果真实值落在3%,还值得大费周章换配方吗?第二,把数据按新老顾客分层后,她发现草莓奶昔的提升几乎全部来自新客群,老主顾们依然更爱珍珠奶茶——B版本的「胜利」是有条件的。

这就是结果解读的三个要点。第一,看效应量(effect size)而不是只看p值:效应量是差异的实际大小,提升19%和提升3%都是「显著」,但业务价值天差地别。第二,做分层分析:把数据按用户类型、请求场景、模型版本等维度切开看,避免「辛普森悖论」——整体看有效,细分看无效甚至有害。第三,结合业务价值判断:统计显著只是入场券,是否上线还要算清楚这份提升值不值得付出迁移成本、监控成本和风险。最终决策通常有三种:全量上线、面向特定人群上线、继续迭代。

老板娘在配方本上写下最终结论:草莓奶昔整体可上线,但优先推荐给新客群,老客群保留珍珠奶茶选项。实验的终点不只是一个「是/否」的判断题,而是一份「对谁、在什么场景、提升多少」的说明书。

CI=(pB−pA)±Zα/2pA(1−pA)nA+pB(1−pB)nBCI = (p_B - p_A) \pm Z_{\alpha/2} \sqrt{\frac{p_A(1-p_A)}{n_A} + \frac{p_B(1-p_B)}{n_B}}
置信区间给出了真实差异的合理范围。区间下限小于0则「可能无差异」;下限大于0则「几乎确定有提升」,但下限的绝对值才是决策时要盯住的最坏情况。
  1. 点估计p_B - p_A是差异的最佳猜测值,来自实验数据。
    d^=pB−pA=0.11\hat{d} = p_B - p_A = 0.11
  2. 标准误根号项合并了两组比例的抽样误差,反映点估计的精度。
    SEd=0.55×0.45400+0.66×0.34400\text{SE}_d = \sqrt{\frac{0.55 \times 0.45}{400} + \frac{0.66 \times 0.34}{400}}
  3. 临界值Z_{α/2}取1.96(95%置信度),把点估计向两边扩展一个「误差半径」。
    Z0.025=1.96Z_{0.025} = 1.96
  4. 置信区间给出真实差异的95%可能范围。若下限仍大于0,则「提升」这个结论靠得住;若下限接近0,就要谨慎决策。
    CI=[0.03, 0.19]CI = [0.03,\ 0.19]

版本管理

老板娘翻开那本厚厚的配方本,每一页都是一次尝试的记录:第一页是开业时的珍珠奶茶原方;中间几页是加了焦糖、换过奶源、调整过茶底的小改动;最新一页是草莓奶昔的完整配方、试饮数据、实验结果和最终决策。这份配方本,就是Prompt版本管理系统。

Prompt版本管理的第一步是语义化版本号,格式为「主版本号。次版本号。补丁号」:主版本(MAJOR)是颠覆性改动,比如把客服Prompt从「严谨正式」改成「活泼幽默」,影响面大、不可兼容;次版本(MINOR)是功能增强,比如新增了「多轮对话总结」指令,向后兼容;补丁(PATCH)是小修小补,比如修正一个偶尔出错的口吻用词。每个版本要记录变更内容、变更原因、生效时间和实验评估结果——就像配方本上「换了脱脂奶,因为顾客反馈太腻」。回滚机制同样关键:如果新版本上线后护栏指标爆表,要能一键切回上一个稳定版本。最后,必须保留历史基线(如v1.0.0),它不仅是回滚的退路,也是所有后续实验的「参照系」——每次新配方出来,都要和它比一比。

有了这本配方本,老板娘再也不怕「昨天那个好喝的配方是哪一版来着」的尴尬。她给每个版本贴上标签、写明备注,就像给每杯奶茶盖上了生产日期的印章——改得清楚,才能赢得明白。

v=MAJOR.MINOR.PATCHv = MAJOR.MINOR.PATCH
语义化版本号用三段数字标识Prompt的演进历史:MAJOR代表不兼容的大改版,MINOR代表兼容的功能新增,PATCH代表无感的小修复。版本号本身,就是配方本的目录索引。
  1. 主版本MAJOR重大变更,Prompt风格或任务定义发生根本转变,旧逻辑不兼容。
    2.x.x2.x.x
  2. 次版本MINOR功能增强,在原有Prompt上增加新指令或新能力,向后兼容。
    x.1.xx.1.x
  3. 补丁PATCH小修复,修正措辞、格式或边界情况,不影响功能定义。
    x.x.3x.x.3

工具落地

配方本越来越厚,老板娘有点力不从心:试饮数据、版本记录、评估分数散落在不同小本子里,统计费时还容易出错。她咬咬牙上了一套「智能记账系统」——顾客每点一杯奶茶,系统自动记录配方版本、原料用量、出品时间和顾客评分,月底自动生成对比报表。这套系统,就是LLM应用监控领域的Langfuse和Phoenix。

Langfuse的核心价值是把「一次完整的模型调用」串联成一条trace(追踪链路),自动记录:调用了哪个Prompt版本、传入了什么参数、模型输出了什么、评估模型打了多少分。做AB实验时,Langfuse可以配置实验分组:同一条用户请求进来,系统按分流规则决定调用哪个Prompt版本,并把版本信息一并写入trace。Phoenix则擅长可视化与对比分析:在它的UI里选中两个版本,系统自动画出指标对比图、调用链对比、甚至错误样本聚类。实验看板把核心指标(满意率、延迟、护栏指标)按实验组和对照组分开展示,实验结束后还能自动生成显著性报告。这一套组合拳,让老板娘从「人肉记账」进化到「数据自动进、结论自动出」的闭环。

老板娘坐在吧台后,看着屏幕上的数据流自动跳动。她终于明白:工具化不是把简单的事情搞复杂,而是把「记录、对比、判断」这些重复劳动交给系统,让自己把精力留给真正重要的决策——下一次该调出什么样的新配方。

event={trace_id, version, input, output, score}\text{event} = \{ trace\_id,\ version,\ input,\ output,\ score \}
每一次实验请求被记录为一个标准化事件:trace_id是唯一的追踪ID,version标记调用的Prompt版本,input和output是输入输出,score是自动评估分数。所有下游分析都建立在这个事件模型之上。
  1. trace_id唯一标识一次完整调用链,从用户请求到模型输出再到评估打分,全程可追溯。
    trace_id=uuid4()\text{trace\_id} = \text{uuid4()}
  2. version字段记录本次调用使用的是哪个Prompt版本号,这是AB实验分组的依据。
    version=v1.1.0\text{version} = \text{v1.1.0}
  3. score字段自动评估模块(如LLM-as-a-Judge)对本次输出打出的分数,是效果分析的原材料。
    score=4.3\text{score} = 4.3

AI 应用场景

智能客服Prompt迭代

阶段:Prompt版本管理与在线实验

解决的问题:客服机器人原来的Prompt回复太机械,用户满意度持续下滑。产品经理想改Prompt又不敢改——万一改差了影响更大?用AB实验解决:新Prompt只对50%的用户生效,用Langfuse自动记录两个版本的回答与用户反馈评分。

具体案例:某电商平台客服机器人在「退款流程」场景测试新Prompt。实验组Prompt加入「共情话术+明确时间节点」,对照组保持原样。两周后数据显示:实验组用户满意度提升12%,平均对话轮数下降18%,护栏指标(投诉率)无显著变化。基于置信区间下限仍大于0,团队决定全量上线新版本,并继续在「物流查询」场景复制该方法。

电商导购Prompt对比

阶段:效果评估与结果解读

解决的问题:导购Prompt的新版本在整体指标上「显著提升」,但工程团队发现这种提升推高了算力成本(更长的输出token)。通过分层分析和效应量判断,最终决定只在高价值用户流量上启用新Prompt,实现成本与体验的平衡。

具体案例:某跨境电商的AI导购在「美妆推荐」场景测试新Prompt。整体看转化率提升8%且显著,但按客单价分层后发现:提升集中在客单价>200元的用户群,低客单价用户群无显著差异。团队据此将新Prompt的流量分配调整为「高价值用户70%、普通用户10%」,同步观察成本指标,实验看板持续追踪两周后确认收益。

RAG问答系统Prompt优化

阶段:可观测性与迭代闭环

解决的问题:RAG问答系统的Prompt决定了回答的准确性和引用规范性。过去靠人工抽查评估,效率低且主观。用Phoenix + Langfuse搭建自动评估闭环:每次问答请求自动记录检索上下文、Prompt版本、模型回答,并用LLM-as-a-Judge按「准确性、相关性、引用规范性」三维度打分。

具体案例:某法律科技公司优化「合同条款问答」Prompt,在Phoenix实验看板中对比v2.0.0与v2.1.0两个版本。实验组Prompt新增「引用条款必须附带原文编号」的指令,自动评估显示引用规范性得分从3.1提升到4.6,准确性得分提升6%,且护栏指标(幻觉率)下降。通过置信区间分析确认提升稳定后,团队将该版本推广至全部法律咨询场景。

Python 演示

python90 行
import mathimport random  class PromptVersion:    """Prompt版本,对应配方本上的一条记录"""     def __init__(self, version_id, name, template, params):        self.version_id = version_id        self.name = name        self.template = template        self.params = params     def simulate_call(self, true_quality):        """模拟一次模型调用:按真实质量概率返回是否被用户认可"""        return random.random() < true_quality  def run_ab_experiment(version_a, version_b, quality_a, quality_b,                      rounds=40, users_per_round=30):    """随机分流跑AB实验,返回每轮的打分汇总"""    results = []    for _ in range(rounds):        a_hit = 0        b_hit = 0        a_n = 0        b_n = 0        for _ in range(users_per_round):            if random.random() < 0.5:                a_n += 1                if version_a.simulate_call(quality_a):                    a_hit += 1            else:                b_n += 1                if version_b.simulate_call(quality_b):                    b_hit += 1        results.append({            "a_hit": a_hit, "a_n": a_n,            "b_hit": b_hit, "b_n": b_n,        })    return results  def merge_results(results):    """把每轮结果累加成总量"""    a_hit = sum(r["a_hit"] for r in results)    a_n = sum(r["a_n"] for r in results)    b_hit = sum(r["b_hit"] for r in results)    b_n = sum(r["b_n"] for r in results)    return a_hit, a_n, b_hit, b_n  def normal_cdf(x):    """标准正态分布累积分布函数,用erf近似"""    return 0.5 * (1 + math.erf(x / math.sqrt(2)))  def judge_significance(a_hit, a_n, b_hit, b_n, alpha=0.05):    """计算z分数与p值,判断差异是否统计显著"""    p_a = a_hit / a_n if a_n else 0.0    p_b = b_hit / b_n if b_n else 0.0    p_pool = (a_hit + b_hit) / (a_n + b_n) if (a_n + b_n) else 0.0    se = math.sqrt(p_pool * (1 - p_pool) * (1 / a_n + 1 / b_n))    z = (p_b - p_a) / se if se > 0 else 0.0    p_value = 2 * (1 - normal_cdf(abs(z)))    significant = p_value < alpha    return p_a, p_b, z, p_value, significant  def main():    version_a = PromptVersion(        "v1.0.0", "经典珍珠", "你是一位耐心的客服。", {})    version_b = PromptVersion(        "v1.1.0", "草莓奶昔", "你是一位热情的客服。", {"temperature": 0.8})     results = run_ab_experiment(version_a, version_b,                                quality_a=0.55, quality_b=0.68)    a_hit, a_n, b_hit, b_n = merge_results(results)    p_a, p_b, z, p_value, significant = judge_significance(        a_hit, a_n, b_hit, b_n)     print(f"版本A({version_a.name}) 满意率: {p_a:.1%} 样本量: {a_n}")    print(f"版本B({version_b.name}) 满意率: {p_b:.1%} 样本量: {b_n}")    print(f"z分数: {z:.2f}, p值: {p_value:.4f}")    print("结论:", "差异显著,可以上线新版本" if significant          else "差异不显著,继续积累数据")  if __name__ == "__main__":    main()
目的:模拟奶茶店试饮会——两个Prompt版本各带真实效果概率,随机分流用户,最后用z检验判断B版本是否显著优于A版本,并给出上线建议。
  1. class PromptVersion定义Prompt版本类,version_id就是配方本上的版本号,template是实际Prompt文本。
  2. def run_ab_experiment模拟AB实验:每个用户被随机分到A组或B组(random.random() < 0.5),对应随机号码牌分流。
  3. def simulate_call模拟一次Prompt调用:按真实质量概率返回好评/差评,代表模型输出被用户认可与否。
  4. def merge_results把每轮实验数据累加成总量,相当于老板娘把一周的试饮评分卡汇总。
  5. def normal_cdf标准正态分布的累积分布函数,用于从z分数反查p值。
  6. p_pool = (a_hit + b_hit) / (a_n + b_n)合并两个版本的满意率,作为z检验中的公共基准成功率。
  7. if __name__ == "__main__":可执行入口:跑一轮模拟实验并打印结论,方便直接体验AB实验全流程。

常见误区

误区以为只要看到「满意率B比A高」就能拍板,完全不管样本量够不够。跑了两天、每版只有几十个样本,就说「新版明显更好」。

正解小样本下统计波动极大。就像试饮会只请了10个顾客,5个说草莓好喝——明天换一批顾客结果可能完全反转。样本量要按公式 $n = Z^2 p(1-p)/\delta^2$ 预先估算,宁可多跑几天,也不要拿着噪音当信号。样本量不足时,p值会剧烈跳动,任何「显著」或「不显著」都不可信。

为何常见:人脑天然倾向于从少量数据中找规律,加上业务方催进度,就容易在样本不足时仓促决策。

误区「p=0.02?那就是说B版本有效的概率是98%,稳了!」这种理解是对p值最常见的误读。

正解p值的严格定义是「在零假设(新旧无差异)为真的前提下,观察到当前这么大差异的概率」。它度量的是数据与「无效假设」的相容程度,而不是「备择假设成立」的概率。就好比老板娘发现试饮顾客全是草莓爱好者——「全是草莓爱好者」这件事在「新配方无效」的前提下发生的概率很小,但这并不能直接推断「新配方有效的概率」是多大。想要「有效概率」需要贝叶斯方法,p值给不了这个答案。

为何常见:p值的数学定义比较反直觉,很多教程又用「显著性=有效」的简化说法,导致望文生义。

误区「p<0.05,所以提升很可观,立刻全量上线!」完全不看提升幅度到底有多大。

正解大样本下,0.1%的差异也能「显著」。统计显著只说明「差异不太可能是随机巧合」,不说明「差异有多大」和「值不值得上线」。要用效应量(如提升百分比、Cohen's d)和置信区间来量化效果:置信区间下限落在0.1%和落在10%,决策完全不同。老板娘要做的是看「最少可能提升多少」来决定是否值得换配方。

为何常见:显著性检验是自动计算的,效应量需要额外思考业务意义,人总会偷懒选择一个现成的数字。

误区新版本赢了,旧版本就删掉,「反正以后用不到了」。结果半个月后新版本在某个边缘场景表现崩了,想回退却发现旧版本已经被覆盖。

正解版本管理要留痕——旧版本、中间版本、历史基线都应当保留。语义化版本号让每个版本有唯一标识,变更记录写明每次修改的原因和结果,回滚机制保证随时能一键切换到稳定版本。旧版本不仅是回退的退路,还是未来实验的对照基准。就像配方本上摞着一沓「过时」的配方,哪天流行风向变了,它们就是最现成的灵感来源。

为何常见:开发同学习惯「分支合完就删」,没有意识到Prompt版本是带着业务价值评估结果的历史资产。

误区整体满意率B组高8%,就认定B版本全面胜出,对所有人都更好。

正解整体指标可能掩盖关键细节——这就是辛普森悖论的陷阱:子群结论与整体结论完全相反。正确的做法是做分层分析:按用户类型、请求场景、模型版本、时间段等维度拆开看。草莓奶昔可能对新客是惊喜,对老客是灾难;新Prompt可能对短问题有效,对长文档任务反而更差。分层分析后的决策才是精准的:全量上线、面向特定人群上线、还是继续迭代。

为何常见:整体指标最容易计算和汇报,深挖分层需要额外的工作量和统计功底。

面试题

Q1. AB实验的核心目的是什么?

单选题 · easy

  • A.让所有用户都使用新版本
  • B.控制变量比较两个版本效果← 正确答案
  • C.提升模型推理的速度
  • D.减少模型的调用次数

答案:B。AB实验的本质是「控制变量」:除了Prompt版本不同,其他条件尽量一致,这样观察到的差异才能归因于版本本身。选项A没有对比意义,C和D是性能优化目标,与效果评估无关。就像试饮会,只有让两组顾客的其余条件一致,奶茶口味差异才有说服力。

Q2. 零假设(H0)的正确表述是?

单选题 · easy

  • A.新版本效果显著优于旧版本
  • B.新旧版本效果没有显著差异← 正确答案
  • C.新版本效果必然不如旧版本
  • D.实验样本数据完全可以复现

答案:B。零假设是「保守的默认立场」:新版本没有带来本质提升,任何差异都是随机波动造成的。它是我们试图用数据推翻的对象。A是备择假设的内容,C是另一个方向的零假设,D与统计假设无关。老板娘默认「新配方不比旧配方好」,就是这个道理。

Q3. 样本量公式 n=Z²p(1-p)/δ² 中,δ 指的是什么?

单选题 · mid

  • A.显著性水平的阈值
  • B.最小可检测效果差异← 正确答案
  • C.样本标准差的大小
  • D.实验用户流失的水平

答案:B。δ代表「业务上值得上线的最小提升幅度」——如果新配方只提升1%,你觉得不值得折腾,δ就设为0.01。δ越小,需要的样本量越大。A是α(0.05),C和D与公式无关。它决定了实验能分辨多细微的真实差异。

Q4. 以下哪些做法能保证流量分配的公平性?

多选题 · mid

  • A.按用户ID哈希随机分桶← 正确答案
  • B.同一用户只进入一个实验组← 正确答案
  • C.让用户自选喜欢的Prompt版本
  • D.实验期间保持分流比例稳定← 正确答案

答案:ABD。随机分桶(哈希、随机数)保证两组用户特征同质,同一用户固定进组避免「洗数据」,分流比例稳定保证实验过程不被干扰。C让用户自选会引入「偏好偏差」——爱尝鲜的都选新版本,相当于试饮会顾客自己站队,结果自然失真。

Q5. p值小于0.05说明什么?

单选题 · mid

  • A.新版本效果必然比旧版本好
  • B.随机巧合产生此差异的概率低于5%← 正确答案
  • C.旧版本的效果出现明显下跌
  • D.样本量不足实验需要重跑

答案:B。p值是指在零假设为真的前提下,观察到当前或更极端结果的概率小于5%。它度量「巧合」的可能性,而不是「新版本有效的概率」。A把p值误读为「有效概率」,C和D都与p值无关。p小只是说「差异很难用运气解释」,具体效果大小还要看效应量。

Q6. 关于p值的正确理解有哪些?

多选题 · hard

  • A.p值不是备择假设为真的概率← 正确答案
  • B.p值越小效果量一定越大
  • C.多重比较会增加假阳性风险← 正确答案
  • D.显著结果仍需观察效应量大小← 正确答案

答案:ACD。p值度量「零假设下数据出现的概率」,与「备择假设成立概率」是两个不同的量,A正确。样本量变大时微小差异也会产生小p值,所以p小不等于效果量大,B错误。做多次比较会累积假阳性,C正确。显著不代表有业务价值,必须配合效应量和置信区间,D正确。

Q7. 大样本下p值显著但提升率仅0.1%,你应该怎么做?

单选题 · mid

  • A.立即把新版本全量上线
  • B.结合业务价值判断是否值得上线← 正确答案
  • C.直接宣布本实验失败并回滚
  • D.忽略统计结果重新设计实验

答案:B。统计显著只说明差异「不是巧合」,0.1%的提升在业务上可能完全无感。正确做法是算效应量、看置信区间、评估上线成本,综合判断值不值得。A忽略了成本,C和D把「小提升」误判为「失败」,忽略了统计结论与业务价值的区分。

Q8. Langfuse 在Prompt AB实验中的主要作用是?

单选题 · easy

  • A.自动生成新的Prompt文案
  • B.串联追踪与评估数据← 正确答案
  • C.替代人工编写运行代码
  • D.压缩模型存储所需大小

答案:B。Langfuse是LLM可观测性工具,核心能力是把「请求→Prompt版本→模型输出→评估分数」串成一条可追踪的链路,让AB实验的每组数据都有据可查。A是Prompt生成工具,C是低代码平台,D是模型优化范畴,都不属于Langfuse的核心定位。

Q9. AB实验结束后,哪些结果解读方式是合理的?

多选题 · hard

  • A.只看整体p值不做任何细分
  • B.结合置信区间评估提升范围← 正确答案
  • C.对不同用户群做分层分析← 正确答案
  • D.同时评估护栏指标的变化← 正确答案

答案:BCD。科学的解读要三维度并重:置信区间看提升的「最坏情况」,分层分析避免辛普森悖论,护栏指标防止新版本引入副作用。A只盯整体p值,可能陷入「整体显著但细分有害」的陷阱,也漏掉对不同群体的差异性洞察。

Q10. 语义化版本号 v2.1.0 中的数字 2 表示什么?

单选题 · mid

  • A.PATCH补丁版本的编号
  • B.MAJOR主版本号的编号← 正确答案
  • C.MINOR次版本号的编号
  • D.BUILD构建版本的编号

答案:B。语义化版本号格式为 MAJOR.MINOR.PATCH:MAJOR(2)代表不兼容的重大变更,如Prompt风格彻底改版;MINOR(1)代表向后兼容的功能增强;PATCH(0)代表小修复。版本号的语义化让团队只看数字就能判断改动的严重程度,是Prompt版本管理的基石。