配音

系统评估与迭代

课程简介

构建评估流水线、回归测试、Prompt 迭代优化。

🎬 本课程视频:Building Systems with ChatGPT API — ChatGPT API 系统构建


系统评估与迭代

一、LLM 系统的不确定性

与传统软件不同,LLM 系统的输出具有本质上的不确定性:

  1. 相同输入可能产生不同输出:即使 temperature=0,模型也可能因浮点运算的微小差异而输出不同
  2. 模型更新后行为可能变化:同一个 API 模型版本升级后,对同一个提示词的响应可能不同
  3. 提示词微小改动可能带来连锁反应:改一个词可能导致输出质量的大幅变化
  4. 外部依赖不稳定:检索系统的结果可能随文档库更新而改变

应对这种不确定性的唯一工程方法就是系统化的评估管道和回归测试

二、三层评估体系

2.1 单元评估

单元评估测试系统中单个组件的质量:

class UnitEvaluator:
    '''单元评估——测试单个组件'''

    def evaluate_classifier(self, test_cases):
        '''评估分类器的准确率'''
        results = []
        for case in test_cases:
            predicted = classifier.classify(case.input)
            correct = predicted == case.expected
            results.append({
                "input": case.input,
                "expected": case.expected,
                "predicted": predicted,
                "correct": correct
            })

        accuracy = sum(r["correct"] for r in results) / len(results)
        return {"accuracy": accuracy, "details": results}

    def evaluate_retriever(self, test_cases):
        '''评估检索器的召回率和准确率'''
        results = []
        for case in test_cases:
            retrieved = retriever.retrieve(case.query)
            precision = compute_precision(retrieved, case.relevant_docs)
            recall = compute_recall(retrieved, case.relevant_docs)
            results.append({"precision": precision, "recall": recall})

        avg_precision = sum(r["precision"] for r in results) / len(results)
        avg_recall = sum(r["recall"] for r in results) / len(results)
        return {"avg_precision": avg_precision, "avg_recall": avg_recall}

2.2 集成评估

集成评估测试完整链路的效果:

class IntegrationEvaluator:
    '''集成评估——测试完整链路'''

    def evaluate_end_to_end(self, test_cases):
        '''端到端评估'''
        results = []
        for case in test_cases:
            # 执行完整管道
            response = full_pipeline(case.query)

            # 评估输出
            faithful = check_faithfulness(response, case.context)
            relevant = check_relevance(response, case.query)
            safe = check_safety(response)

            results.append({
                "query": case.query,
                "response": response,
                "faithfulness": faithful,
                "relevance": relevant,
                "safe": safe
            })

        return self._aggregate_results(results)

2.3 用户评估

用户评估收集真实用户在真实场景中的反馈,是最重要的评估方式:

class UserEvaluator:
    '''用户评估——收集真实反馈'''

    def collect_feedback(self, session):
        '''收集用户隐式和显式反馈'''
        feedback = {
            "explicit": {
                "rating": session.rating,           # 用户打分(1-5)
                "feedback_text": session.feedback,  # 用户文字反馈
                "issue_type": session.issue_type    # 问题类型(如有)
            },
            "implicit": {
                "read_time": session.read_time,     # 用户阅读时间
                "scroll_depth": session.scroll_depth, # 滚动深度
                "copy_count": session.copy_count,   # 复制次数
                "regenerate_count": session.regenerate_count, # 重新生成次数
                "session_duration": session.duration # 会话时长
            }
        }
        return feedback

三、回归测试集

3.1 测试集设计

class RegressionTestSuite:
    '''回归测试集'''

    def __init__(self):
        self.test_cases = []

    def add_normal_case(self, query, expected):
        '''添加正常场景'''
        self.test_cases.append({
            "query": query,
            "expected": expected,
            "type": "normal"
        })

    def add_edge_case(self, query, expected):
        '''添加边界场景'''
        self.test_cases.append({
            "query": query,
            "expected": expected,
            "type": "edge"
        })

    def add_regression_case(self, query, expected, bug_id):
        '''添加历史回归案例'''
        self.test_cases.append({
            "query": query,
            "expected": expected,
            "type": "regression",
            "bug_id": bug_id
        })

    def run(self, pipeline):
        '''运行回归测试'''
        results = []
        for case in self.test_cases:
            response = pipeline(case["query"])
            passed = self._check(case, response)
            results.append({
                **case,
                "response": response,
                "passed": passed
            })
        return results

3.2 回归测试的维护

四、自动化评估管道

class EvalPipeline:
    '''自动化评估管道'''

    def run_eval(self, pipeline_version):
        '''运行完整的评估管道'''
        results = {
            "version": pipeline_version,
            "timestamp": datetime.now(),
            "unit_tests": self.run_unit_tests(),
            "integration_tests": self.run_integration_tests(),
            "regression_tests": self.run_regression_tests(),
            "safety_tests": self.run_safety_tests()
        }

        # 生成报告
        report = self.generate_report(results)

        # 检查是否通过质量标准
        passed = self.check_quality_gates(results)

        return {
            "results": results,
            "report": report,
            "passed": passed,
            "blockers": self.get_blockers(results) if not passed else []
        }

五、灰度部署

5.1 金丝雀发布

class CanaryDeploy:
    '''金丝雀发布策略'''

    def deploy(self, new_version):
        stages = [
            {"name": "5% 流量", "traffic": 0.05, "duration": "1h"},
            {"name": "20% 流量", "traffic": 0.20, "duration": "4h"},
            {"name": "50% 流量", "traffic": 0.50, "duration": "12h"},
            {"name": "100% 流量", "traffic": 1.00, "duration": "full"}
        ]

        for stage in stages:
            # 路由指定比例的流量到新版本
            self.route_traffic(new_version, stage["traffic"])

            # 监控关键指标
            metrics = self.monitor_metrics(new_version)

            # 检查是否退化
            if self.has_regression(metrics):
                self.rollback(new_version)
                return {"status": "rolled_back", "stage": stage}

            # 进入下一阶段
            print(f"Stage {stage['name']} passed")

        return {"status": "fully_deployed"}

5.2 回滚策略

def rollback(version):
    '''回滚到上一个稳定版本'''
    print(f"Rolling back {version}...")

    # 1. 切换流量到旧版本
    route_all_traffic_to("stable_version")

    # 2. 记录回滚原因
    record_incident({
        "version": version,
        "reason": "regression_detected",
        "timestamp": datetime.now()
    })

    # 3. 通知团队
    notify_team(f"Version {version} rolled back")

    # 4. 保留新版本的日志用于调试
    preserve_logs(version)

六、持续优化循环

class ContinuousOptimization:
    '''持续优化循环'''

    def run_cycle(self):
        while True:
            # 1. 收集数据
            feedback = collect_user_feedback()
            metrics = collect_system_metrics()

            # 2. 分析问题
            issues = analyze_performance(metrics, feedback)

            # 3. 优先排序
            prioritized = prioritize_issues(issues)

            # 4. 实施改进
            for issue in prioritized[:3]:  # 每次最多处理3个问题
                fix = design_fix(issue)
                if validate_fix(fix):
                    deploy_canary(fix)

            # 5. 等待评估周期
            time.sleep(eval_cycle_duration)

七、总结

系统化的评估管道和回归测试是应对 LLM 系统不确定性的核心工程方法。三层评估体系(单元、集成、用户)从不同粒度覆盖系统质量的方方面面。精心维护的回归测试集捕获已修复的缺陷防止复现。自动化的评估管道在每次变更时运行,确保关键指标不退化。灰度部署策略将每次发布的风险控制在最小范围,快速发现并回滚问题。这套方法论是将 LLM 系统从实验原型升级为可靠产品的必经之路。

五、回归测试

5.1 什么是回归测试

回归测试是指当你修改了系统后(比如改了提示词、换了模型、调整了参数),重新运行之前的所有测试用例,确保修改没有破坏已有的功能。

5.2 回归测试集的建设

class RegressionTestSuite:
    def __init__(self):
        self.test_cases = []

    def add_case(self, name, input_data, expected_output, evaluator):
        self.test_cases.append({
            "name": name,
            "input": input_data,
            "expected": expected_output,
            "evaluator": evaluator
        })

    def run_all(self, system):
        results = []
        for case in self.test_cases:
            actual = system.run(case["input"])
            passed = case["evaluator"](actual, case["expected"])
            results.append({"case": case["name"], "passed": passed})
        return results

5.3 自动化集成

将回归测试集成到 CI/CD 流程中:

# .github\/workflows\/eval.yml
name: System Evaluation
on: [push, pull_request]
jobs:
  evaluate:
    runs-on: ubuntu-latest
    steps:
      - uses: actions\/checkout@v3
      - name: Run regression tests
        run: python evaluate.py

六、灰度部署策略

阶段 流量 目的 持续时间
内测 5% 内部团队验证 1-2 天
小范围 25% 发现边缘问题 3-5 天
大范围 50% 大规模验证 5-7 天
全量 100% 完全发布 -

七、总结

关键要点回顾:
- 三层评估体系覆盖组件、链路和用户三个层面
- 回归测试确保变更不会引入退化
- 评估管道自动化开发和反馈流程
- 灰度部署控制发布风险
- 评估不是一次性的,而是持续的过程

五、回归测试

5.1 什么是回归测试

回归测试是指当你修改了系统后(比如改了提示词、换了模型、调整了参数),重新运行之前的所有测试用例,确保修改没有破坏已有的功能。

5.2 回归测试集的建设

class RegressionTestSuite:
    def __init__(self):
        self.test_cases = []

    def add_case(self, name, input_data, expected_output, evaluator):
        self.test_cases.append({
            "name": name,
            "input": input_data,
            "expected": expected_output,
            "evaluator": evaluator
        })

    def run_all(self, system):
        results = []
        for case in self.test_cases:
            actual = system.run(case["input"])
            passed = case["evaluator"](actual, case["expected"])
            results.append({"case": case["name"], "passed": passed})
        return results

5.3 自动化集成

将回归测试集成到 CI/CD 流程中:

# .github\/workflows\/eval.yml
name: System Evaluation
on: [push, pull_request]
jobs:
  evaluate:
    runs-on: ubuntu-latest
    steps:
      - uses: actions\/checkout@v3
      - name: Run regression tests
        run: python evaluate.py

六、灰度部署策略

阶段 流量 目的 持续时间
内测 5% 内部团队验证 1-2 天
小范围 25% 发现边缘问题 3-5 天
大范围 50% 大规模验证 5-7 天
全量 100% 完全发布 -

七、总结

关键要点回顾:
- 三层评估体系覆盖组件、链路和用户三个层面
- 回归测试确保变更不会引入退化
- 评估管道自动化开发和反馈流程
- 灰度部署控制发布风险
- 评估不是一次性的,而是持续的过程

五、回归测试

5.1 什么是回归测试

回归测试是指当你修改了系统后(比如改了提示词、换了模型、调整了参数),重新运行之前的所有测试用例,确保修改没有破坏已有的功能。

5.2 回归测试集的建设

class RegressionTestSuite:
    def __init__(self):
        self.test_cases = []

    def add_case(self, name, input_data, expected_output, evaluator):
        self.test_cases.append({
            "name": name,
            "input": input_data,
            "expected": expected_output,
            "evaluator": evaluator
        })

    def run_all(self, system):
        results = []
        for case in self.test_cases:
            actual = system.run(case["input"])
            passed = case["evaluator"](actual, case["expected"])
            results.append({"case": case["name"], "passed": passed})
        return results

5.3 自动化集成

将回归测试集成到 CI/CD 流程中:

# .github\/workflows\/eval.yml
name: System Evaluation
on: [push, pull_request]
jobs:
  evaluate:
    runs-on: ubuntu-latest
    steps:
      - uses: actions\/checkout@v3
      - name: Run regression tests
        run: python evaluate.py

六、灰度部署策略

阶段 流量 目的 持续时间
内测 5% 内部团队验证 1-2 天
小范围 25% 发现边缘问题 3-5 天
大范围 50% 大规模验证 5-7 天
全量 100% 完全发布 -

七、总结

关键要点回顾:
- 三层评估体系覆盖组件、链路和用户三个层面
- 回归测试确保变更不会引入退化
- 评估管道自动化开发和反馈流程
- 灰度部署控制发布风险
- 评估不是一次性的,而是持续的过程

延伸阅读