资讯动态

【AI测试功能5】AI功能测试的“黄金数据集“构建指南:从0到1搭建质量评估体系

发布时间:2026/8/14 17:31:30 来源:尧图企业网站定制
AI功能测试的黄金数据集构建指南从0到1搭建质量评估体系这是AI功能测试系列的第5篇整个系列会更60篇没有黄金数据集的 AI测试就像没有标尺的裁缝——你永远不知道自己的衣服做得合不合身。0. 写在前面测试通过率下降了用户却说更好用了2024 年 6 月我们团队给一个智能写作助手做质量保障。系统基于 GPT-4o帮助用户写文章、邮件、报告。上线前测试团队跑了一遍回归测试——几百条测试用例通过率 92%。上线。一个月后模型从 GPT-4 升级到 GPT-4o。测试团队跑了同样的测试通过率从 92% 降到了 85%。开发团队紧张了是不是升级出问题了但用户反馈群里大家说新版本更好用了、回答更自然了。测试团队懵了。测试通过率下降了但用户满意度上升了。到底哪个是对的后来逐条排查那 7% 的失败用例发现根因测试用例的设计偏向格式合规JSON 格式、字数限制但忽略了内容质量准确性、相关性、有用性。GPT-4o 在格式合规上略逊于 GPT-4因为更灵活但在内容质量上明显更好。测试用例的权重设计错了。那次之后我们彻底重构了测试体系从测试用例集合升级为黄金数据集。每条用例不再只有一个预期输出而是包含多个评判维度、每个维度有独立的阈值。今天这篇文章就是那次重构的完整复盘。1. 概念讲解黄金数据集Golden Set是 AI测试体系的核心基础设施。它是一组经过人工验证的高质量测试用例每个用例包含输入、评判标准和通过阈值。每次模型更新、Prompt 调整、代码修改后你跑一遍黄金数据集就知道这次变更是变强了还是变傻了。很多团队跳过这一步直接开始写测试用例。结果就是测试用例没有基线、回归测试没有标准、质量趋势没有参照。每次模型更新后你只能说好像变好了或好像变差了但说不出具体好在哪、差在哪。黄金数据集不是测试用例的集合而是质量标尺。它定义了什么是好的回答让你的测试有据可依。1.5. 测试用例 vs 黄金数据集8 个维度对比光讲概念不够直观下面这张表格把两者的核心差异列清楚。对比维度传统测试用例黄金数据集核心定位验证功能是否正常工作定义什么是好的回答的质量标尺每条内容输入 唯一预期输出输入 多维度评判标准 阈值通过判定输出与预期一致则通过各维度分别评分全部达标才通过覆盖方式覆盖所有功能点覆盖核心场景 高频意图 高风险场景数量越多越好500-2000 条少而精150-500 条维护频率功能变更时更新每月补充 每季度审查 每年重构自动化程度可 100% 自动化硬性标准 100% 自动化 软性标准 60-80%回归用途发现 Bug衡量质量趋势变强了还是变傻了关键结论黄金数据集不是更好的测试用例而是完全不同的质量基础设施。测试用例回答功能对不对黄金数据集回答回答好不好。1.6. 黄金数据集的合理规模与构成黄金数据集不是越大越好也不是越小越好。下面是不同规模系统的经验值系统规模用例数量标注人员构建周期回归耗时小型系统单一场景如简单问答100-150 条2-3 人1-2 周5-10 分钟中型系统多场景如客服写作150-300 条3-5 人2-3 周10-20 分钟大型系统全场景如综合 AI 助手300-500 条5-8 人3-4 周20-40 分钟黄金数据集的典型构成比例场景类型占比来源说明高频意图40-50%生产日志分析用户最常问的问题覆盖 80% 的日常使用高风险场景20-30%历史投诉/差评出错后果严重的场景金融、医疗、法律边缘场景10-15%测试团队编写低频但重要的场景多轮对话、否定指令竞品对比5-10%竞品分析竞品能做好但你做不好的场景关键结论黄金数据集的构成应该从数据出发不是从想象出发。40-50% 的用例应该来自生产日志因为那才是用户真正在用的场景。2. 核心方法论黄金数据集的构建分五步用例收集。从四个来源收集原始用例生产日志真实用户提问、测试团队编写覆盖边缘场景、用户反馈差评/投诉中的典型案例、竞品分析竞品能做好但你做不好的场景。人工标注。为每个用例定义评判标准。不是写预期输出而是写评判维度 阈值。比如准确性 ≥ 0.85、格式合规 必须通过、相关性 ≥ 0.80。基线测试。用当前稳定版本跑一遍确认用例有效。通过率应在 80-95% 之间。通过率 80% 说明用例可能不合理通过率 95% 说明用例可能太简单。纳入自动化。将黄金数据集集成到 CI/CD 中每次变更自动回归。回归失败自动告警。定期维护。每月补充新场景每季度审查过时用例每年全面重构。用一张图来看五步构建流程五步不是线性的而是闭环循环。定期维护阶段发现的问题会反馈到用例收集阶段持续迭代优化。3. 实战案例场景某智能写作助手的黄金数据集构建前置条件系统是一个基于 GPT-4o 的智能写作助手帮助用户写文章、邮件、报告。团队有 2 名测试工程师。问题团队上线前用了几百条测试用例但没有黄金数据集。上线后模型从 GPT-4 升级到 GPT-4o测试团队跑了同样的测试通过率从 92% 降到 85%。但用户反馈说新版本更好用了。测试团队困惑了——测试通过率下降了但用户满意度上升了到底哪个是对的根因分析测试用例的设计偏向格式合规JSON 格式、字数限制但忽略了内容质量准确性、相关性、有用性。GPT-4o 在格式合规上略逊于 GPT-4因为更灵活但在内容质量上明显更好。测试用例的权重设计错了。解决方案从生产日志中抽取 200 条真实用户提问覆盖写作、翻译、总结、代码四大场景。邀请 3 名内容编辑对每条用例进行人工评分1-5 分评分维度包括准确性、相关性、完整性、清晰度、有用性。计算评分一致性Kappa 系数剔除 Kappa 0.7 的用例评分标准不一致。最终得到 150 条高质量用例每条包含输入、评判维度、阈值、优先级P0/P1/P2。用新黄金数据集重新测试 GPT-4 → GPT-4o 升级结果格式合规从 92% 降到 88%但内容质量从 3.8 升到 4.3综合评分从 85 升到 89。和用户反馈一致。4. 代码示例下面是黄金数据集的结构定义和自动化回归核心代码。需要openai和bert-score依赖import json import numpy as np from typing import List, Dict from openai import OpenAI from bert_score import BERTScorer client OpenAI(api_keyyour-api-key) scorer BERTScorer(langzh, rescale_with_baselineTrue) # span classwx-em-red 黄金数据集结构 /span GOLDEN_CASE_SCHEMA { id: str, # 用例唯一标识 category: str, # 场景分类 difficulty: str, # 难度等级 input: str, # 测试输入 criteria: { # 评判标准 format_valid_json: { # 硬性标准必须通过 type: hard, expected: True }, accuracy: { # 软性标准评分 ≥ 阈值 type: soft, method: llm_judge, threshold: 0.85 }, relevance: { type: soft, method: bert_score, threshold: 0.80 } }, priority: str, # P0核心/ P1重要/ P2一般 tags: list # 标签用于筛选 } # span classwx-em-red 评判函数 /span def verify_hard_criterion(response: str, criterion: Dict) - float: 硬性标准验证格式/类型/结构检查 if criterion.get(expected) is True: try: json.loads(response) return 1.0 # 通过 except json.JSONDecodeError: return 0.0 # 失败 return 1.0 def evaluate_soft_criterion(response: str, method: str, reference: str None) - float: 软性标准评分LLM Judge 或 BERTScore if method span classwx-em-red bert_score and reference: _, _, F1 scorer.score([response], [reference]) return F1.item() elif method /span llm_judge: # 简化版 LLM Judge eval_prompt f请评价以下 AI 回答的质量0-1 分 参考要点{reference} AI 回答{response} 只返回一个数字不要解释。 result client.chat.completions.create( modelgpt-4o, messages[{role: user, content: eval_prompt}], temperature0, ) try: return float(result.choices[0].message.content.strip()) except ValueError: return 0.5 # 解析失败给中间分 # span classwx-em-red 黄金数据集回归测试 /span def run_golden_regression(golden_set: List[Dict]) - Dict: 黄金数据集回归测试 流程 1. 遍历每条用例 2. 调用 AI 系统获得回答 3. 按评判标准评分 4. 统计通过率、各维度得分 results { passed: 0, failed: 0, p0_passed: 0, p0_failed: 0, dimension_scores: {}, details: [] } for case in golden_set: # 调用 AI 系统 response client.chat.completions.create( modelgpt-4o, messages[{role: user, content: case[input]}], temperature0.3, ).choices[0].message.content # 逐维度评分 case_results {} all_pass True for criterion_name, criterion in case[criteria].items(): if criterion[type] span classwx-em-red hard: score verify_hard_criterion(response, criterion) else: score evaluate_soft_criterion( response, criterion[method], case.get(reference) ) case_results[criterion_name] score if score criterion.get(threshold, 0): all_pass False # 记录维度分数 for dim, score in case_results.items(): if dim not in results[dimension_scores]: results[dimension_scores][dim] [] results[dimension_scores][dim].append(score) if all_pass: results[passed] 1 else: results[failed] 1 # P0 用例单独统计 if case.get(priority) /span P0: if all_pass: results[p0_passed] 1 else: results[p0_failed] 1 results[details].append({ case_id: case[id], passed: all_pass, scores: case_results, }) # 计算通过率 results[pass_rate] results[passed] / len(golden_set) if golden_set else 0 # 计算各维度平均分 results[dimension_avg] { dim: np.mean(scores) for dim, scores in results[dimension_scores].items() } return results # span classwx-em-red 使用示例 /span if __name__ __main__: # 示例黄金数据集实际应从 JSON 文件加载 golden_set [ { id: GS001, category: 写作, difficulty: 中等, input: 帮我写一封拒绝邀请的邮件, reference: 礼貌拒绝、表达感谢、说明原因、保持关系, criteria: { format_valid_json: {type: hard, expected: False}, accuracy: {type: soft, method: bert_score, threshold: 0.80}, relevance: {type: soft, method: llm_judge, threshold: 0.85} }, priority: P0, tags: [写作, 邮件], }, ] results run_golden_regression(golden_set) print(f通过率: {results[pass_rate]:.1%}) print(fP0 通过率: {results[p0_passed]}/{results[p0_passed] results[p0_failed]}) print(f各维度平均分: {results[dimension_avg]})代码说明硬性标准格式/类型/结构检查精确验证通过1.0失败0.0软性标准LLM Judge 或 BERTScore 评分0-1 之间与阈值比较P0 用例单独统计P0 失败直接阻断发布返回各维度平均分用于衡量质量趋势5. 注意事项和常见坑黄金数据集不是越大越好。150-500 条是经验值。太少50覆盖不够太多1000维护成本高、回归时间长。关键是质量不是数量。评判标准要具体不能模糊。别写回答要好这种标准。要写准确性 ≥ 0.85、必须包含关键词 XXX、JSON 格式必须合法。模糊的标准 无法自动化。P0 用例必须 100% 通过。P0 是核心功能任何失败都阻断发布。P1 允许 95% 通过P2 允许 90% 通过。但 P0 不行。定期去重。黄金数据集中经常有语义重复的用例比如北京人口多少和北京有多少人口。每季度审查一次合并重复用例保持数据集精简。标注一致性很重要。多人标注时计算 Kappa 系数0.7 才算一致。如果标注标准不一致黄金数据集本身就是错的。别用生产数据直接当黄金数据。生产数据需要人工审核和标注后才能加入黄金数据集。直接拿生产日志当测试标准等于让 AI 自己评判自己。黄金数据集要版本化。每次更新黄金数据集都要打版本标签v1.0、v1.1。模型升级时用最新版本回归历史版本保留用于对比分析。5.5. 常用工具一览工具用途适用场景bert-score语义相似度评分准确性/相关性软性标准评估openaiLLM API 客户端LLM Judge 评分、模型回答生成scikit-learn统计工具计算 Kappa 系数标注一致性pytest测试框架将黄金数据集集成到 pytest 测试套件JSON Schema数据验证硬性标准验证格式/类型/结构MLflow实验追踪记录每次回归结果绘制质量趋势图工具选择原则语义评估用 BERTScore标注一致性用 Kappa趋势追踪用 MLflow。把贵的资源用在刀刃上。6. 总结与思考黄金数据集不是测试用例的集合而是质量标尺。它定义了什么是好的回答让你的测试有据可依、回归有尺可量。【思考题】你的团队有黄金数据集吗如果有大概多少条维护频率是怎样的关键词黄金数据集、AI测试、质量评估、LLM测试、测试框架、BERTScore、LLM Judge、回归测试

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价