跳转至

AI 模型评估与基准测试 · 运维手册

适用场景:评估和比较不同 LLM 模型,建立持续的质量监控体系。


1. 评估指标体系

1.1 核心指标

类别 指标 计算方法 目标值
准确性 Accuracy 正确回答数/总数 > 85%
F1 Score 2×Precision×Recall/(Precision+Recall) > 0.8
生成质量 ROUGE-L 最长公共子序列召回率 > 0.6
BLEU n-gram 精确度 > 0.4
BERTScore 语义相似度 > 0.85
效率 P50 Latency 50% 请求延迟 < 1s
P99 Latency 99% 请求延迟 < 3s
Token/sec 生成速度 > 50
成本 Cost/Request 单次请求成本 < $0.01
Cost/1K Tokens 千 Token 成本 最低
稳定性 Error Rate 失败请求比例 < 1%
Availability 服务可用性 > 99.9%

1.2 评估框架

评估流程:
1. 定义评估目标(场景、指标、阈值)
2. 构建测试集(标注数据)
3. 运行模型评估(批量推理)
4. 分析结果(指标对比)
5. 决策(选择/调优/回滚)
6. 持续监控(定期回归测试)

2. 基准测试

2.1 MTEB 基准

MTEB(Massive Text Embedding Benchmark)是 Embedding 模型评估标准:

from mteb import MTEB

# 选择任务
evaluation = MTEB(tasks=[
    "STS14",      # 语义相似度
    "Summarization",  # 摘要
    "Instruction Retrieval"  # 指令检索
])

# 运行评估
results = evaluation.run(model)
print(results)

2.2 SuperCLUE 中文基准

from superclue import SuperCLUE

# 初始化
benchmark = SuperCLUE()

# 运行测试
results = benchmark.evaluate(
    model="Qwen/Qwen2.5-7B-Instruct",
    tasks=["coding", "math", "reasoning", "knowledge"]
)

# 查看排名
benchmark.show_leaderboard()

2.3 自定义运维基准

OPS_BENCHMARK = [
    {
        "category": "network",
        "question": "Nginx 502 错误可能的原因有哪些?",
        "expected_keywords": ["upstream", "connection", "timeout"],
        "difficulty": "medium"
    },
    {
        "category": "kubernetes",
        "question": "Pod 处于 CrashLoopBackOff 状态如何排查?",
        "expected_keywords": ["logs", "restart", "oom"],
        "difficulty": "hard"
    },
    {
        "category": "monitoring",
        "question": "Prometheus 告警如何配置静默规则?",
        "expected_keywords": ["silence", "alertmanager", "match"],
        "difficulty": "medium"
    }
]

3. 测试集构建

3.1 数据来源

来源 优点 缺点 占比建议
历史工单 真实场景 可能过时 40%
知识库文档 覆盖全面 缺乏难度 30%
专家标注 质量高 成本高 20%
合成数据 可批量生成 可能不真实 10%

3.2 分层抽样

import random

def stratified_sample(dataset: list, labels: dict) -> list:
    """分层抽样确保多样性"""
    sampled = []

    for category, count in labels.items():
        # 按难度分层
        easy = [d for d in dataset if d['category'] == category and d['difficulty'] == 'easy']
        medium = [d for d in dataset if d['category'] == category and d['difficulty'] == 'medium']
        hard = [d for d in dataset if d['category'] == category and d['difficulty'] == 'hard']

        # 按比例抽样
        sampled.extend(random.sample(easy, min(5, len(easy))))
        sampled.extend(random.sample(medium, min(10, len(medium))))
        sampled.extend(random.sample(hard, min(5, len(hard))))

    return sampled

3.3 质量检查

def validate_dataset(dataset: list) -> dict:
    """测试集质量检查"""
    checks = {
        "total": len(dataset),
        "categories": len(set(d['category'] for d in dataset)),
        "difficulty_dist": {
            "easy": sum(1 for d in dataset if d['difficulty'] == 'easy'),
            "medium": sum(1 for d in dataset if d['difficulty'] == 'medium'),
            "hard": sum(1 for d in dataset if d['difficulty'] == 'hard')
        },
        "avg_length": sum(len(d['question']) for d in dataset) / len(dataset)
    }

    # 检查重复
    questions = [d['question'] for d in dataset]
    checks["duplicate_rate"] = 1 - len(set(questions)) / len(questions)

    return checks

4. A/B 测试

4.1 实验设计

class ABTest:
    def __init__(self, name: str):
        self.name = name
        self.variants = {}
        self.metrics = {}

    def add_variant(self, variant_id: str, model: str):
        """添加实验组"""
        self.variants[variant_id] = model

    def assign_user(self, user_id: str) -> str:
        """用户分流(Hash 确保一致性)"""
        hash_val = hash(user_id) % 100
        if hash_val < 50:
            return "control"
        else:
            return "treatment"

    def record_result(self, variant: str, result: dict):
        """记录结果"""
        if variant not in self.metrics:
            self.metrics[variant] = {"scores": [], "latencies": []}
        self.metrics[variant]["scores"].append(result["score"])
        self.metrics[variant]["latencies"].append(result["latency"])

4.2 统计分析

from scipy import stats

def analyze_ab_test(control_scores: list, treatment_scores: list) -> dict:
    """A/B 测试结果分析"""
    # T 检验
    t_stat, p_value = stats.ttest_ind(control_scores, treatment_scores)

    # 效应量(Cohen's d)
    pooled_std = np.sqrt((np.var(control_scores) + np.var(treatment_scores)) / 2)
    cohens_d = (np.mean(treatment_scores) - np.mean(control_scores)) / pooled_std

    return {
        "p_value": p_value,
        "significant": p_value < 0.05,
        "effect_size": cohens_d,
        "control_mean": np.mean(control_scores),
        "treatment_mean": np.mean(treatment_scores)
    }

5. 持续监控

5.1 质量 Dashboard

# 每日自动评估
def daily_quality_check():
    """每日质量检查"""
    test_cases = load_test_cases()
    results = []

    for case in test_cases:
        response = call_model(case["question"])
        score = evaluate_response(case, response)
        results.append({
            "case_id": case["id"],
            "score": score,
            "latency": response["latency"],
            "model": response["model"]
        })

    # 记录指标
    save_metrics(results)

    # 检查是否触发告警
    avg_score = np.mean([r["score"] for r in results])
    if avg_score < 0.7:
        send_alert(f"模型质量下降:平均分 {avg_score:.2f}")

5.2 趋势分析

import pandas as pd

def analyze_trend(metrics: pd.DataFrame, window: int = 7) -> dict:
    """趋势分析"""
    # 移动平均
    metrics["moving_avg"] = metrics["score"].rolling(window=window).mean()

    # 检测异常
    threshold = metrics["moving_avg"].mean() - 2 * metrics["moving_avg"].std()
    anomalies = metrics[metrics["score"] < threshold]

    return {
        "trend": "improving" if metrics["moving_avg"].iloc[-1] > metrics["moving_avg"].iloc[0] else "declining",
        "anomalies": len(anomalies),
        "current_score": metrics["score"].iloc[-1]
    }

6. 评估报告模板

# LLM 模型评估报告

## 测试概览
- 测试时间:2026-10-23
- 测试用例:200 条
- 模型版本:Qwen2.5-7B-Instruct-v2

## 核心指标
| 指标 | 当前值 | 目标值 | 状态 |
|---|---|---|---|
| Accuracy | 87% | 85% | ✅ |
| P99 Latency | 2.1s | 3s | ✅ |
| Cost/1K Tokens | $0.001 | $0.002 | ✅ |
| User Satisfaction | 4.2/5 | 4.0 | ✅ |

## 问题清单
1. [P2] 复杂推理题得分偏低(65% vs 目标 80%)
2. [P3] 长文档处理超时率 3%

## 建议
- 下周:针对复杂推理优化 Prompt
- 下月:考虑升级到 70B 模型

7. 延伸阅读


FAQ

如何选择合适的 LLM 评估指标? 核心四指标:① Accuracy(准确率)② ROUGE/BLEU(文本生成质量)③ MTTR(平均修复时间)④ User Satisfaction(用户满意度)。根据场景权重不同。

如何构建自定义测试集? 收集 100-500 条真实运维场景问答,标注标准答案。分层抽样:简单/中等/复杂各占比例。定期更新(每月补充新案例)。

A/B 测试如何设计? 随机分流 50/50,同时运行 1-2 周。对比指标:质量评分、响应时间、用户满意度、成本。统计显著性检验(p < 0.05)。

如何持续监控模型质量? 建立自动化评估 pipeline,每周运行测试集。设置质量阈值告警(准确率下降 > 5% 触发)。趋势分析,及时发现退化。