Skip to content

评测与迭代

原则

没有评测,就没有稳定性。

OpenAI 的评测指南和 Cookbook 都强调:模型评分可扩展,但必须用人工评审校准,尤其在高风险任务里。

评测体系设计

  1. 定义指标
  • 正确性
  • 完整性
  • 事实性
  • 格式合规率
  • 时延
  • 单次请求成本
  1. 构造数据集
  • golden set:核心高价值样本
  • edge set:边界与对抗样本
  • regression set:线上事故回放样本
  1. 设计评分
  • 自动评分:结构、规则、程序化校验
  • 模型评分:语义质量打分
  • 人工评分:关键样本抽检
  1. 建立发布门禁
  • 指标未达阈值禁止上线
  • 新版本必须跑全量回归

错误分类法(建议)

  • 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。

产品经理

  • 决定业务指标阈值,明确“可上线”和“必须回滚”边界。
  • 组织关键场景人工抽检,避免只依赖自动评分。
  • 将评测结果转化为下一周期迭代优先级。

开发者与产品经理交接件

  • 每周评测周报(质量、成本、时延、风险)。
  • 灰度放量决策记录。
  • 回滚触发条件与责任人。

参考来源