你有没有去过热闹的奶茶店?后厨里一排店员各司其职:A煮茶、B加料、C封口、D打包。如果每一步都靠老师傅口头催,碰上周末高峰期,不是漏了加珍珠,就是封口机前排队堵成一条龙。聪明的店长会把流程固定成“流水线”:订单进来自动拆解、原料自动补充、每一步完成自动触发下一步,店长只需要盯着一块仪表盘看全局。LLM评估Pipeline自动化,做的正是这件事——把“测模型好不好”从人肉跑脚本变成一条标准流水线:数据自动准备、评测自动执行、结果自动汇总、报告自动推送,让模型质量一目了然。
掌握评估Pipeline自动化,你就能从“手工跑评测”进阶到“一键自动化评测”,真正把MLOps评估体系、质量门禁和团队标准化流程握在手中。
可视化演示
展示系统处理流水线、实时性能指标曲线及多方案对比分析,包含数据流转、吞吐延迟监控与方案评估。
本节配有交互动效(进入视口后自动加载,约 3KB)。
系统可视化 处理流程:输入→处理→模型→输出 性能监控:实时指标 P=L×T
评估流程编排
奶茶店后厨有条不成文的规矩:先煮茶,再加料,最后封口。如果你让新店员先封口再煮茶,他做出来的“奶茶”只能倒掉。评估流程也一样——在数据没清洗干净之前就去跑模型推理,得到的指标就像用发霉的茶叶泡出的“奶茶”——看着是杯茶,喝下去全是问题。评估流程编排,就是为评测定义一张严谨的“SOP地图”,确保每一步都在正确的食材上加工。
在技术世界里,这张“SOP地图”是有向无环图(DAG)。每个节点是一个评估步骤(数据加载、推理、打分、聚合),每条边代表依赖关系——只有前置步骤成功完成后,后继步骤才能启动。这样做的好处很直接:数据流转有明确方向,任务可以按依赖切分成可并行的分片,某个步骤挂了也能精准定位、单独重试,而不是把整条流水线推倒重来。
评估流程编排的核心指标是整条流水线的成功率。假设每个步骤的失败率为 \( f_i \),则流水线整体成功概率是各步骤成功率的乘积:
1. 单步成功率:每个步骤的成功率等于 \( 1 \) 减去它的失败率,比如评测步骤失败率 \( f_2 = 0.01 \),则成功率是 0.99。
2. 连乘符号:\( \prod \) 表示对所有步骤的 \( (1 - f_i) \) 逐项相乘,n 个步骤乘 n 次。
3. 整体成功率:如果 5 个步骤成功率都是 0.99,整体成功率约 0.95——这提醒我们,步骤越多,容错设计越重要。
就像奶茶店把后厨每一步都写成操作手册,评估流程编排把每个环节固化成 DAG 节点。新店员照着 SOP 不会做错,新评测照着 DAG 也不会跑偏——这就是编排的价值:让“依赖”不再靠人脑记,而是靠系统管。
CI/CD集成
当奶茶店开了三家分店后,店长发现一个难题:总店研发的新配方,怎样才能快速同步到所有分店?答案是把配方写进“中央配方库”,分店一收到更新通知,自动按新配方备料、制作、试喝。CI/CD 集成干的正是这件事——把评估流程接到代码仓库上,让模型一更新,评测就自动开跑。
具体来说,当开发者在 Git 仓库推送新代码或新模型权重时,触发策略(比如 push 事件、tag 发布、定时任务)会自动拉起一个隔离的评测环境。这个环境用容器技术封装好依赖,和日常开发环境完全隔离——就像每家分店用同一套标准配方库,不会因为某家店的糖浆品牌不同而味道跑偏。评测跑完后,结果会自动回写到 CI 系统,形成“开发-评测-反馈”的闭环。
这个闭环的核心是质量门禁判定:
1. 平均指标 \( \bar{S} \):把 n 个评测用例的得分求平均,得到模型在该批数据上的总体表现。
2. 阈值 \( \theta \):这是团队预先设定的“及格线”,比如准确率不得低于 0.90,相当于奶茶店定的“顾客满意度不低于 4 星”。
3. 门禁判定:平均指标达到阈值,门禁放行(true),新模型可以合入主干;否则拦截(false),触发告警并阻止发布。
回到奶茶店的比喻,CI/CD 集成好比给每家分店装了“自动配方同步器”:总部更新配方,分店自动尝试制作并自动试喝。如果试喝不达标,系统会拦住新品上市并通知研发回炉——这就是反馈闭环:不只让评测自动化,更让质量成为发布流程里的一道硬关卡。
批量评测调度
高峰期的奶茶店,柜台前排了 20 个订单,后厨却只有两台封口机。聪明的店长会按订单类型和等待时间排优先级:先做“少糖去冰”这种简单的,再做复杂的奶盖系列;同时给每台机器设定最大工作量,避免一台机器过热罢工。批量评测调度,就是给这些“订单”(评测任务)安排资源与顺序的大脑。
在真实工程中,评测任务往往有几百个:不同模型版本、不同数据集、不同超参数组合。调度器要解决三件事:并发任务管理(同时跑多少任务不打架)、资源配额控制(每个任务分多少 GPU 显存)、优先级队列(紧急任务插队)。更重要的是断点续跑能力——就像封口机突然断电,重启后能接着封剩下的一半,而不是全部重来。
调度效率可以用资源利用率来衡量:
1. 忙碌时间 \( T_{busy} \):GPU 或 CPU 真正在执行评测任务的时间总和,就像封口机实际封了多少杯的时间。
2. 空闲时间 \( T_{idle} \):资源在等待任务、加载数据或排队时浪费的时间,比如封口机等着下一杯原料送上来。
3. 利用率 \( U \):忙碌时间占总时间的比例,利用率越高说明调度越紧凑。理想目标不是 100%(会排队爆炸),而是稳定在 70%-85%。
调度器就像奶茶店的值班店长,手里握着一张实时订单板:哪台封口机闲了、哪个订单等了太久、哪批原料快要用完,全部一目了然。有了并发控制、配额管理和断点续跑,评测任务再多也能有条不紊地做完——高峰期不再手忙脚乱,系统稳如老店。
结果自动聚合
到了月底,奶茶店长要盘点:哪款奶茶最受欢迎?外卖和堂食的满意度差多少?如果全靠手工翻订单,怕是三天三夜也统计不完。结果自动聚合,就是给评测装一个“自动月报机”:把散落在各个任务的原始指标,自动汇总成一份有意义的总体评价。
聚合的第一步是指标计算汇总:把每次推理的准确率、延迟、拒绝率等原始数据,按任务维度汇总成结构化指标。第二步是多维分组统计:按数据集、模型版本、行业领域等维度交叉分析——就像店长按“口味×季节”拆解销量,能发现“夏天杨枝甘露卖爆、冬天热奶茶走俏”的规律。第三步是模型对比分析:把新版本和基线版本放在同一坐标系下比较。最后是异常波动检测:某个指标突然下跌,系统自动打红旗。
聚合的核心公式是加权指标总分:
1. 单项指标 \( s_i \):第 i 个子维度的得分,比如“数学推理准确率”或“代码生成通过率”。
2. 权重 \( w_i \):每个维度的相对重要程度。求和时所有权重之和应等于 1,就像店长按“口感 40%、出杯速度 30%、颜值 30%”来综合评价新品。
3. 加权求和:把每个指标乘上权重再相加,得到能反映整体水平的综合分 \( S_{total} \)。
一个维度看单调,多个维度看趋势,版本对比看进步,异常检测看风险。结果自动聚合把奶茶店长从“翻订单”的苦海里解放出来——数据自己会说话,模型好不好,分数不会说谎。
报告自动生成
店长每天最头疼的事不是做奶茶,而是写日报。如果系统能自动算好营业额、翻台率、投诉率,再生成一段“今日总结与明日建议”,店长只需要点个“发送”,那该多好。评估报告自动生成,正是把“写日报”这件事交给机器。
一份合格的评估报告包含三层:数据层(结构化指标)、可视层(图表)、结论层(文字总结)。模板化设计让报告风格一致——就像连锁店的日报格式统一,方便横向对比;可视化图表让数字变成趋势线,一眼看出“这周准确率在爬坡”;结论自动生成则根据规则引擎和阈值判定,自动写出“新版本在数学任务上提升 5%,但在代码生成上回退 3%,建议暂缓发布”。
报告中最关键的数字是回归率:
1. 退化用例数 \( N_{worse} \):统计新版本相比基线版本得分下降的用例数量。比如 1000 个测试用例里有 30 个分数变低。
2. 总用例数 \( N_{total} \):参与对比的全部评测用例数量。
3. 回归率 \( R_{reg} \):退化用例占总用例的百分比。回归率越高,说明新版本“开倒车”越严重,报告会给出“禁止发布”的红色结论。
报告自动生成不只是一台打字机,更是一个“分析助手”。当初店长需要花两小时写的日报,现在系统 5 分钟生成、还附带风险预警。报告版本管理把每次评估结果归档成历史快照,下次想看“三个月前的报告长什么样”,一键即达——所有决策都有据可查。
端到端串联
奶茶店开了十家分店后,店长发现单店优化已经不够了——从总部下单、配送原料、门店制作、顾客取餐,一整条链路任何一个环节掉链子,顾客体验都会崩。端到端串联要解决的就是“全链路协同”:把前面讲的编排、CI/CD、调度、聚合、报告全部接成一条完整管线。
Stage 编排设计把整条管线拆成可独立运行的大阶段(Stage),每个 Stage 内跑若干小任务;产物传递管理则定义阶段之间的交接物——前一个 Stage 产出的模型评估结果 JSON,自动成为下一个 Stage 的输入。可观测性追踪贯穿全程,每个 Stage 的耗时、成功率、资源水位都被记录下来,一旦出问题能快速定位“堵点”。如果某个 Stage 失败了,回滚机制会恢复到最近一个成功快照,而不是整个人工重跑。
衡量端到端效率的是全链路耗时:
1. 单 Stage 运行时长 \( t_i^{(stage)} \):第 i 个阶段实际执行时间,比如“批量评测”阶段跑了 32 分钟。
2. 等待时长 \( t_i^{(wait)} \):阶段之间排队、网络传输、资源申请的时间,就像奶茶原料在配送路上耽搁的时间。
3. 总耗时 \( T_{e2e} \):所有阶段执行时间与所有等待时间之和。优化总耗时 = 既压缩执行时间,更减少等待浪费。
从“单店优化”到“全链协同”,端到端串联让评估Pipeline真正变成一条不卡壳的传送带。每一次提交代码、每一个模型版本,都会自动走完这条管线,把“谁在哪个环节慢了、哪一步失败了”告诉负责人——这就是从工具到体系的质变。
工程实践规范
为什么麦当劳在全世界味道都一样?因为总部有一本厚达几百页的《运营手册》:原料供应商、油温、薯条炸制时间、酱料配比,全部标准化。AI 评估要想稳定可靠,同样需要这样一本“工程手册”——否则每个人跑出来的指标口径不同,谁的数据都不能信。
工程实践规范的核心是四件事:接口标准化(每个评测步骤暴露统一的输入输出接口,像奶茶配方卡一样清晰)、指标口径统一(准确率到底是“顶一”还是“前五”,必须全团队一致)、质量门禁设定(不同场景设置不同通过阈值)、持续迭代优化(每次跑完 Pipeline 都复盘,把瓶颈记入下一版改进清单)。当这些规范落地,模型好坏不再取决于某个人拍脑袋,而取决于系统输出的分数。
一个常用的规范化指标是 Z-score,用于衡量某个结果在历史分布中处于什么位置:
1. 原始值 \( x_i \):本次评估的某个指标值,比如新版本的准确率 0.93。
2. 历史均值 \( \mu \):基线版本或历史多个版本在相同任务上的平均准确率。
3. 标准差 \( \sigma \):历史得分的波动程度,衡量"0.93"在历史中算不算异常。
4. Z-score:\( |z_i| > 2 \) 说明本次结果显著偏离历史水平,需要重点排查。
标准化的意义,等同于连锁店的《运营手册》:接口统一让工具可替换,口径统一让数据可比较,门禁统一让质量可管控,迭代统一让系统可持续进化。当一个人说“这个模型指标比之前好”,他能拿出标准化的报告、对比基线和置信区间——这,就是 AI 工程的说服力。
AI 应用场景
场景一:大模型发布前的质量门禁
阶段:模型验证与发布前质检
解决的问题:过去发布新模型靠人工跑 20 个评测集、手工汇总 Excel,耗时两天还容易漏测。现在把评估Pipeline接入 CI/CD,每次新模型推送到仓库自动触发全量评测,质量门禁不通过直接拦截发布。全流程从两天压缩到 40 分钟,且每次评测口径完全一致。
具体案例:某金融科技公司每次更新 Llama 或 Qwen 模型时,Pipeline 自动加载 3000 条脱敏对话数据,跑完推理后聚合准确率、拒答率、幻觉率,对照质量门禁阈值(如幻觉率必须低于 2%)决定是否放行,报告自动推送到飞书群。
场景二:多模型每周横向对比测评
阶段:模型选型与Benchmark管理
解决的问题:团队每季度需要对比 5-8 个开源模型的综合能力,人工跑分耗时费力。通过批量评测调度器,把各模型的评测任务按优先级排入 GPU 队列,并发执行,结果自动聚合到统一对比看板。
具体案例:某 AI 应用公司用 Pipeline 每周自动跑 Llama-3.1-8B、Qwen2.5-7B、Mistral-7B 三个模型在 8 个中文任务集上的表现,聚合出“综合能力 Top3 榜”并自动生成选型建议,直接支撑技术决策。
场景三:评估SOP团队标准化
阶段:团队质量体系建设
解决的问题:团队里每个人自定义评估集和指标口径,导致同一个模型在不同人手里分数差 5 个点。借助工程实践规范,建立统一接口、指标口径和报告模板,所有成员通过同一套 Pipeline 跑评测。
具体案例:某电商团队的 12 名算法工程师统一接入评估Pipeline,每次迭代只需提交模型路径,系统自动产出标准化报告,代码评审时附上报告链接即可,沟通成本下降 60%。
Python 演示
"""评估Pipeline自动化演示:一个轻量级评测流水线引擎"""from dataclasses import dataclassfrom datetime import datetimefrom typing import Callable, Dict, List @dataclassclass EvalReport: run_id: str model_name: str accuracy: float latency_ms: float gate: str created_at: str def load_data(stage: Dict) -> None: """Step1: 准备评测数据(模拟从数据湖读取50条样本)""" stage["dataset"] = [ {"id": i, "prompt": "问题%d" % i, "label": i % 2} for i in range(50) ] stage["data_count"] = len(stage["dataset"]) def run_eval(stage: Dict) -> None: """Step2: 批量执行推理(模拟打分, 每5条错1条)""" dataset = stage["dataset"] correct = 0 for item in dataset: pred = 1 if item["id"] % 5 == 0 else item["label"] if pred == item["label"]: correct += 1 stage["accuracy"] = correct / len(dataset) stage["latency_ms"] = round(120 + len(dataset) * 0.8, 2) def aggregate(stage: Dict) -> None: """Step3: 聚合指标并写入总览""" stage["metrics"] = { "accuracy": round(stage["accuracy"], 4), "latency_ms": stage["latency_ms"], } def quality_gate(stage: Dict) -> None: """Step4: 质量门禁判定(准确率>=0.90才放行)""" stage["gate_passed"] = stage["accuracy"] >= 0.90 def make_report(stage: Dict, report_list: List[EvalReport]) -> None: """Step5: 自动生成报告并落盘""" report = EvalReport( run_id="run-" + datetime.now().strftime("%H%M%S"), model_name=stage["model"], accuracy=stage["metrics"]["accuracy"], latency_ms=stage["metrics"]["latency_ms"], gate="PASS" if stage["gate_passed"] else "FAIL", created_at=str(datetime.now()), ) report_list.append(report) print("[report] %s acc=%.4f gate=%s" % (report.run_id, report.accuracy, report.gate)) class EvalPipeline: """以列表模拟DAG编排: 按注册顺序依次执行Step""" def __init__(self, name: str = "eval-pipeline"): self.name = name self.steps: List[Callable] = [] self.reports: List[EvalReport] = [] def add_step(self, fn: Callable) -> "EvalPipeline": self.steps.append(fn) return self def run(self, model_name: str) -> EvalReport: stage: Dict = {"model": model_name} for i, step in enumerate(self.steps, 1): print("[Step %d] %s..." % (i, step.__name__)) if step.__name__ == "make_report": step(stage, self.reports) else: step(stage) report = self.reports[-1] print("===== %s 结果 =====" % report.run_id) print("accuracy = %.4f" % report.accuracy) print("latency = %.2f ms" % report.latency_ms) print("gate = %s" % report.gate) return report if __name__ == "__main__": pipe = EvalPipeline("llm-eval") pipe.add_step(load_data) pipe.add_step(run_eval) pipe.add_step(aggregate) pipe.add_step(quality_gate) pipe.add_step(make_report) pipe.run("llama-3.1-8b")
class EvalPipeline:定义流水线引擎类,像奶茶店的总控台,负责注册步骤和顺序执行。self.steps: List[Callable] = []用列表保存多个步骤函数,模拟 DAG 的线性执行路径(简化版,无分支依赖)。def add_step(self, fn: Callable) -> "EvalPipeline":链式注册步骤,返回 self 以便pipe.add_step(a).add_step(b)连续调用。stage: Dict = {"model": model_name}stage 是一个上下文字典,像流水线上的托盘,在各步骤之间传递数据。if step.__name__ == "make_report":因为 make_report 需要额外接收报告列表,所以对它特殊调用(简易依赖注入)。stage["accuracy"] = correct / len(dataset)把推理结果写入 stage 上下文,后续聚合步骤从同一托盘取数。stage["gate_passed"] = stage["accuracy"] >= 0.90质量门禁判定,准确率低于 0.90 时报告为 FAIL。pipe.run("llama-3.1-8b")入口函数:传入模型名,自动跑完五个阶段并输出报告。
常见误区
误区我以为只要Pipeline绿色通过、报告生成出来了,这些分数就一定是真实可靠的,可以直接拿给老板看。
正解Pipeline只负责“流程自动化”,就像传送带能把奶茶送到你面前,但不保证茶叶是新鲜的。数据的质量、指标口径是否统一、基线对比是否公平,这些才是可信度的根本。跑通是必要条件,远非充分条件。
为何常见:因为Pipeline输出的报告格式完整、图表精美,容易让人产生“系统说的就是对的”的错觉,而忽略了数据源头和口径问题。
误区我把评测脚本提交到 Git 仓库就算 CI/CD 集成了,push 之后它会自动跑——但每次都要手动去点 Jenkins,很不稳定。
正解真正的 CI/CD 集成需要完整的触发策略、环境隔离和反馈闭环。触发策略(push / tag / 定时)决定何时激活,容器化环境隔离保证评测可复现,结果回写 CI 系统形成拦截或放行的决策。光把脚本放进去,就像把菜谱贴在厨房墙上但没接煤气灶。
为何常见:因为对 CI/CD 的理解停留在“能跑脚本”,忽略了触发、环境、产物、反馈这四个支撑要素。
误区批量评测时我把并发数直接调到 64,以为任务发得越多越快,结果 GPU 显存溢出、任务互相抢占,反而更慢了。
正解并发要受资源配额约束。每个评测任务消耗 GPU 显存、CPU 和带宽,超过资源池上限就会排队甚至 OOM。正确做法是根据资源池容量计算合理并发数,并用队列控制水位,像奶茶店不会让 100 个订单同时挤进 2 台封口机。
为何常见:因为直觉以为“并行=快”,忽略了系统资源的物理上限和调度器的排队成本。
误区我用一个模板把 metrics 字典里的数字填进 Markdown,报告就“自动生成”了,但领导看完说没信息量。
正解报告自动生成的核心价值是结论生成,不是格式化输出。真正要自动完成的是“新版本比基线好了还是坏了、哪些维度退化、是否建议发布”这样的分析结论。模板只是骨架,洞察才是灵魂。
为何常见:因为从工具视角(渲染数据)出发,而非从决策视角(提炼洞察)出发,导致报告有数据无结论。
误区我在聚合阶段加了 30 个指标维度,以为覆盖得越全面结论越可靠,结果报告里全是互相矛盾的信号。
正解维度不是越多越好,而是要少而精、口径统一。维度爆炸会让每个分组只有极少样本,统计上失去意义。应该聚焦与业务目标强相关的 5-8 个核心指标,像奶茶店只关心口感、出杯速度、复购率,不会去统计杯子的重量波动。
为何常见:因为“全面覆盖”听起来更严谨,但忽视了统计功效和指标之间的相关性,导致碎片化结论。
面试题
Q1. 评估Pipeline自动化的核心价值是什么?
- A.减少人工干预← 正确答案
- B.提高模型精度
- C.降低硬件成本
- D.加快模型训练
答案:A。Pipeline自动化解决的是“流程执行”问题,把人工跑脚本变成系统自动执行、自动聚合、自动报告,所以核心价值是减少人工干预。它不会直接改变模型精度、硬件成本或训练速度,这些是其他工程手段的范畴。
Q2. 质量门禁(Quality Gate)的核心作用是?
- A.判断指标是否达标← 正确答案
- B.生成新的测试数据
- C.自动训练神经网络
- D.优化推理代码性能
答案:A。质量门禁就是给评测结果设定“及格线”,指标达到阈值才放行发布,达不到就拦截。它不生成数据、不训练模型、也不做性能优化,只做“关卡裁判”,就像奶茶店试喝不满意就不让新品上架。
Q3. 评估流程用DAG表示的主要原因是?
- A.表达步骤之间的依赖关系← 正确答案
- B.提高数据存储安全性
- C.减少代码仓库体积
- D.加快Python解释速度
答案:A。DAG(有向无环图)的节点表示步骤、边表示依赖,能清晰表达“谁必须先执行、谁可以并行”。存储安全、仓库体积、解释速度都和 DAG 无关。就像后厨 SOP,DAG 管的是“顺序和依赖”。
Q4. 批量评测调度器设置并发上限,主要为了?
- A.评测任务互相干扰← 正确答案
- B.减少模型参数量
- C.提升测试集样本数
- D.简化报告生成逻辑
答案:A。并发上限的核心目的是避免任务互相争抢 GPU/CPU/显存导致 OOM 或性能抖动。调度器把并发控制在资源池可承受范围内。模型参数量、样本数和报告逻辑都不会因为并发上调而改变。
Q5. 加权聚合公式中权重之和应当满足什么条件?
- A.等于 1← 正确答案
- B.大于 1
- C.小于 0
- D.等于 0
答案:A。加权平均要求所有维度权重之和等于 1,这样综合分才能落在与单项指标相同的量纲区间内。如果权重大于1会导致综合分虚高,小于0没有物理意义,等于0则所有分数被归零。
Q6. 断点续跑能力解决的核心问题是?
- A.中途失败不用全部重跑← 正确答案
- B.提升模型推理准确性
- C.降低数据集存储占用
- D.加快代码编译速度
答案:A。断点续跑是记录每个已完成子任务的中间结果,系统失败后从最近检查点恢复,而不是整个 Pipeline 从头再来。就像封口机断电后接着封剩下的一半——和目标推理准确率、存储、编译速度无关。
Q7. 可观测性追踪在端到端Pipeline中的主要价值是?
- A.快速定位瓶颈与失败节点← 正确答案
- B.自动修复全部代码错误
- C.替代人工进行模型调参
- D.自动生成训练数据标注
答案:A。可观测性通过记录每个Stage的耗时、成功率和资源水位,让工程师一眼看清“卡在哪个环节”。它只能发现问题,不能自动修复代码、调参或做标注——就像监控录像告诉你车祸发生在哪,但修车仍需人来做。
Q8. 评估报告自动生成应包含哪些核心内容?
- A.指标结构化汇总← 正确答案
- B.可视化对比图表← 正确答案
- C.自动结论与建议← 正确答案
- D.原始训练日志数据
答案:ABC。一份合格的评估报告 = 结构化指标(数据层)+ 可视化图表(展示层)+ 自动结论(决策层)。原始训练日志不属于报告内容,它体量大且需要专业分析,应留在日志系统而不是报告中。
Q9. 构建CI/CD评估集成时,需要重点设计哪些机制?
- A.触发策略与定时规则← 正确答案
- B.环境隔离与依赖管理← 正确答案
- C.结果反馈与门禁拦截← 正确答案
- D.模型权重随机初始化
答案:ABC。CI/CD集成四要素是触发策略(何时跑)、环境隔离(在哪跑)、自动构建(怎么跑)、反馈闭环(结果怎么用)。权重随机初始化是模型训练阶段的事,和评估CI/CD无关。
Q10. 在多维分组统计中,正确的做法包括?
- A.聚焦与业务目标强相关的维度← 正确答案
- B.保证每个分组有足够样本量← 正确答案
- C.统一不同维度的指标口径← 正确答案
- D.尽可能多地添加统计维度
答案:ABC。多维统计要“少而精”:只选与业务目标相关的维度(A)、确保每组样本量够大(B)、统一指标口径(C)。维度过多会导致样本碎片化、结论互相矛盾(D是错误的),就像分析奶茶销量非要加上杯口直径这个无关维度,只会添乱。