评测与迭代
原则
没有评测,就没有稳定性。
OpenAI 的评测指南和 Cookbook 都强调:模型评分可扩展,但必须用人工评审校准,尤其在高风险任务里。
评测体系设计
- 定义指标
- 正确性
- 完整性
- 事实性
- 格式合规率
- 时延
- 单次请求成本
- 构造数据集
golden set:核心高价值样本edge set:边界与对抗样本regression set:线上事故回放样本
- 设计评分
- 自动评分:结构、规则、程序化校验
- 模型评分:语义质量打分
- 人工评分:关键样本抽检
- 建立发布门禁
- 指标未达阈值禁止上线
- 新版本必须跑全量回归
错误分类法(建议)
- E1 事实错误
- E2 推理跳步
- E3 输出格式错误
- E4 漏答关键约束
- E5 安全/合规问题
当你把错误都归到这 5 类,再做针对性修复,迭代速度会明显提升。
每周迭代节奏
- 周一:回放上周失败样本并入回归集
- 周二:提示词/检索/工具三路并行实验
- 周三:离线评测
- 周四:小流量灰度
- 周五:复盘并更新基线
评测脚本示例
自动评测框架
python
import json
from dataclasses import dataclass
from typing import List, Callable
@dataclass
class TestCase:
id: str
input: str
expected_output: str | dict
metadata: dict = None
@dataclass
class EvalResult:
test_id: str
passed: bool
score: float
error_type: str | None
details: dict
class Evaluator:
def __init__(self, test_cases: List[TestCase]):
self.test_cases = test_cases
self.results = []
def run(self, predict_fn: Callable) -> List[EvalResult]:
"""运行所有测试用例"""
for case in self.test_cases:
actual = predict_fn(case.input)
result = self.evaluate(case, actual)
self.results.append(result)
return self.results
def evaluate(self, case: TestCase, actual: str | dict) -> EvalResult:
"""评估单个用例"""
# 实现具体的评估逻辑
pass
def summary(self) -> dict:
"""生成评测报告"""
total = len(self.results)
passed = sum(1 for r in self.results if r.passed)
error_counts = {}
for r in self.results:
if r.error_type:
error_counts[r.error_type] = error_counts.get(r.error_type, 0) + 1
return {
"total": total,
"passed": passed,
"pass_rate": passed / total if total > 0 else 0,
"error_distribution": error_counts
}结构化输出验证
python
import json
from jsonschema import validate, ValidationError
def validate_json_output(output: str, schema: dict) -> tuple[bool, str | None]:
"""验证 JSON 输出格式"""
try:
data = json.loads(output)
validate(instance=data, schema=schema)
return True, None
except json.JSONDecodeError as e:
return False, f"E3: JSON 格式错误 - {e}"
except ValidationError as e:
return False, f"E3: Schema 不匹配 - {e.message}"
# 使用示例
schema = {
"type": "object",
"required": ["summary", "confidence", "evidence"],
"properties": {
"summary": {"type": "string"},
"confidence": {"type": "number", "minimum": 0, "maximum": 1},
"evidence": {"type": "array", "items": {"type": "string"}}
}
}
valid, error = validate_json_output(model_output, schema)回归测试管理
python
class RegressionSuite:
"""回归测试套件"""
def __init__(self):
self.golden_set = [] # 核心高价值样本
self.edge_set = [] # 边界与对抗样本
self.regression_set = [] # 线上事故回放样本
def add_from_incident(self, incident_id: str, input: str, expected: str):
"""从线上事故添加回归用例"""
case = TestCase(
id=f"reg-{incident_id}",
input=input,
expected_output=expected,
metadata={"source": "incident", "incident_id": incident_id}
)
self.regression_set.append(case)
def run_all(self, predict_fn) -> dict:
"""运行所有回归测试"""
results = {
"golden": Evaluator(self.golden_set).run(predict_fn),
"edge": Evaluator(self.edge_set).run(predict_fn),
"regression": Evaluator(self.regression_set).run(predict_fn)
}
return results角色动作卡
开发者
- 维护自动评测流水线,确保每次变更都能回归。
- 为高频错误类型增加可观测指标和报警阈值。
- 把线上事故样本自动回灌到 regression set。
产品经理
- 决定业务指标阈值,明确“可上线”和“必须回滚”边界。
- 组织关键场景人工抽检,避免只依赖自动评分。
- 将评测结果转化为下一周期迭代优先级。
开发者与产品经理交接件
- 每周评测周报(质量、成本、时延、风险)。
- 灰度放量决策记录。
- 回滚触发条件与责任人。
