评测集也会过期:数据漂移、难度漂移与基准版本治理

很多团队把评测集当成一次性建设:上线前整理几百道题,之后每次换模型、改提示词都重跑,只要分数没有下降就认为系统稳定。几个月后,评测仍是九十分,线上投诉却越来越多。原因不一定是评测程序算错了,而可能是它一直在准确测量一个已经不存在的世界。

用户开始用新的业务术语,知识库增加了新产品,移动端带来更短、更口语化的输入,攻击者换了提示注入手法,客服流程又增加了转人工规则。与此同时,研发反复查看固定失败题并针对性优化,旧题从挑战变成熟题。评测分数保持不变,覆盖的真实流量和风险却持续缩小。这就是评测资产的漂移与老化。

解决办法不是每月随机增加几十道题,也不是发现分数太高就故意把题目写得更怪。需要把评测集视为有版本、有适用范围、有健康指标的数据产品:持续比较线上与基准分布,识别漂移发生在哪一层,按来源和风险补充样本,冻结不可变版本,并用桥接样本解释新旧分数差异。

本文以企业知识助手为例,给出一套从监控、诊断、更新到发布的完整方案。示例环境为 Python 3.11,仅使用标准库,方便在任何 CI 中运行。文章中的阈值用于演示计算方法,实际门槛必须依据自己的历史数据、抽样误差和业务成本校准。

1. 什么叫评测集"过期"

过期并不等于所有答案都错了。一份题库可能事实仍正确,但用户分布已经变化;也可能用户没变,业务规则更新后参考答案失效;还可能样本和答案都有效,却因为团队对固定题目过度优化而失去区分度。判断过期应看它是否还能代表当前系统的目标、输入、环境和风险。

评测集有一个隐含有效期,由四个变化速度共同决定:业务政策更新速度、用户输入变化速度、系统能力迭代速度和威胁变化速度。年度政策问答可能按季度审查;互联网搜索助手的时效题可能按天更新;支付权限规则一旦变化就应立即失效。统一规定"每半年更新一次"看似规范,实际会让高变化领域长期暴露,也让稳定领域无意义翻新。

更可靠的做法是事件触发加定期审查。事件包括知识源大版本、工具接口变化、模型或提示重大升级、新用户群上线、线上事故、监管规则变化和异常漂移告警。定期审查负责发现没有明显事件但逐渐积累的变化。

2. 五类漂移必须分开诊断

输入数据漂移是用户表达和属性分布变化,例如长问题变短、英文比例上升、图片输入增多、某类产品咨询变多。输入变化不一定导致性能下降,但旧题库可能不再代表流量。

概念漂移是同样输入对应的正确行为发生变化。例如新制度规定差旅标准按预订日期而非入住日期判断,旧参考答案便失效。它通常无法只看输入统计发现,必须监控规则、标签和结果关系。

难度漂移是问题的求解复杂度变化。用户学会提出多约束问题,知识库文档更长,答案需要跨文档比较;或者模型迭代让旧题全部变得简单,基准失去区分度。难度不是字数,更多取决于所需证据、工具步骤、歧义和干扰因素。

覆盖漂移是业务能力树变化后,评测权重仍停留在旧功能。例如产品上线图表问答,基准仍全是纯文本检索。此时各题本身都有效,但总分已经不能代表产品。

评审漂移是评分标准、人工判断或裁判模型发生变化。同一回答在不同时间得到不同分,原因可能是 rubric 改了,也可能是评审模型版本替换。若不把裁判版本纳入记录,团队会把评分器变化误认成系统进步。
#mermaid-svg-rEGbEuV7BN1xXfNd{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-rEGbEuV7BN1xXfNd .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-rEGbEuV7BN1xXfNd .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-rEGbEuV7BN1xXfNd .error-icon{fill:#552222;}#mermaid-svg-rEGbEuV7BN1xXfNd .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-rEGbEuV7BN1xXfNd .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-rEGbEuV7BN1xXfNd .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-rEGbEuV7BN1xXfNd .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-rEGbEuV7BN1xXfNd .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-rEGbEuV7BN1xXfNd .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-rEGbEuV7BN1xXfNd .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-rEGbEuV7BN1xXfNd .marker{fill:#333333;stroke:#333333;}#mermaid-svg-rEGbEuV7BN1xXfNd .marker.cross{stroke:#333333;}#mermaid-svg-rEGbEuV7BN1xXfNd svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-rEGbEuV7BN1xXfNd p{margin:0;}#mermaid-svg-rEGbEuV7BN1xXfNd .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-rEGbEuV7BN1xXfNd .cluster-label text{fill:#333;}#mermaid-svg-rEGbEuV7BN1xXfNd .cluster-label span{color:#333;}#mermaid-svg-rEGbEuV7BN1xXfNd .cluster-label span p{background-color:transparent;}#mermaid-svg-rEGbEuV7BN1xXfNd .label text,#mermaid-svg-rEGbEuV7BN1xXfNd span{fill:#333;color:#333;}#mermaid-svg-rEGbEuV7BN1xXfNd .node rect,#mermaid-svg-rEGbEuV7BN1xXfNd .node circle,#mermaid-svg-rEGbEuV7BN1xXfNd .node ellipse,#mermaid-svg-rEGbEuV7BN1xXfNd .node polygon,#mermaid-svg-rEGbEuV7BN1xXfNd .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-rEGbEuV7BN1xXfNd .rough-node .label text,#mermaid-svg-rEGbEuV7BN1xXfNd .node .label text,#mermaid-svg-rEGbEuV7BN1xXfNd .image-shape .label,#mermaid-svg-rEGbEuV7BN1xXfNd .icon-shape .label{text-anchor:middle;}#mermaid-svg-rEGbEuV7BN1xXfNd .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-rEGbEuV7BN1xXfNd .rough-node .label,#mermaid-svg-rEGbEuV7BN1xXfNd .node .label,#mermaid-svg-rEGbEuV7BN1xXfNd .image-shape .label,#mermaid-svg-rEGbEuV7BN1xXfNd .icon-shape .label{text-align:center;}#mermaid-svg-rEGbEuV7BN1xXfNd .node.clickable{cursor:pointer;}#mermaid-svg-rEGbEuV7BN1xXfNd .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-rEGbEuV7BN1xXfNd .arrowheadPath{fill:#333333;}#mermaid-svg-rEGbEuV7BN1xXfNd .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-rEGbEuV7BN1xXfNd .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-rEGbEuV7BN1xXfNd .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-rEGbEuV7BN1xXfNd .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-rEGbEuV7BN1xXfNd .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-rEGbEuV7BN1xXfNd .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-rEGbEuV7BN1xXfNd .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-rEGbEuV7BN1xXfNd .cluster text{fill:#333;}#mermaid-svg-rEGbEuV7BN1xXfNd .cluster span{color:#333;}#mermaid-svg-rEGbEuV7BN1xXfNd div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-rEGbEuV7BN1xXfNd .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-rEGbEuV7BN1xXfNd rect.text{fill:none;stroke-width:0;}#mermaid-svg-rEGbEuV7BN1xXfNd .icon-shape,#mermaid-svg-rEGbEuV7BN1xXfNd .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-rEGbEuV7BN1xXfNd .icon-shape p,#mermaid-svg-rEGbEuV7BN1xXfNd .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-rEGbEuV7BN1xXfNd .icon-shape rect,#mermaid-svg-rEGbEuV7BN1xXfNd .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-rEGbEuV7BN1xXfNd .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-rEGbEuV7BN1xXfNd .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-rEGbEuV7BN1xXfNd :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 线上与评测差异
输入数据漂移
概念与规则漂移
难度漂移
能力覆盖漂移
评审与裁判漂移
重采样输入与权重
更新证据和参考答案
增加组合与边界样本
修订能力树
重校准Rubric与裁判

把所有变化统称为 data drift 会产生错误修复。输入比例变化可能只需重加权;概念变化必须修改答案;难度老化需要新题;裁判漂移则应冻结或重新校准评分器。先分类,才能知道该改数据、系统还是度量。

3. 评测基准与线上观测必须使用同一特征语言

比较分布前,需要为两侧提取相同的、隐私安全的特征。知识助手可以记录意图类别、语言、渠道、输入长度桶、是否包含附件、所需知识域、检索命中数、工具步数、是否追问、是否转人工和最终反馈。不要只比较原始文本向量,因为向量距离很难解释,也可能隐藏具体业务类别的消失。

特征字典要有版本和明确计算方式。例如"长问题"是字符数超过某阈值,还是 Token 数超过某阈值;"检索失败"是无召回,还是有召回但证据不足。线上与离线必须复用同一实现,否则监控到的差异来自特征代码而非用户变化。

隐私限制同样重要。漂移监控不需要永久保存完整问题。可以在受控流水线提取类别、长度、哈希和脱敏摘要,再删除或按政策保留原文。小流量类别要做最小计数保护,避免仪表盘间接暴露某个用户的敏感意图。

4. 从分层快照开始,而不是先上复杂算法

最实用的第一步是建立两个时间窗口:基准构建时的参考窗口和近期线上窗口。按能力、渠道、用户角色和风险等级统计比例,观察评测集与线上之间的绝对差值。若线上 30% 是多轮追问,而基准只有 2%,即使复杂统计检验尚未运行,覆盖问题也已经明显。

分层是为了避免总体指标掩盖局部变化。企业整体中文比例稳定,不代表海外租户没有快速增长;平均输入长度稳定,可能是移动端变短与桌面端变长互相抵消。至少按产品入口、租户类型和高风险能力查看,但切分过细会产生大量噪声,因此只保留有业务含义且样本量足够的维度。

快照应保存计数、比例、缺失率和采样范围。只保存百分比会失去置信信息:1/2 与 5000/10000 都是 50%,证据强度完全不同。样本不足时报告"不确定",不要为了仪表盘完整强行输出红绿灯。

5. 用 Jensen-Shannon 散度监控类别分布

类别型特征可以用总变差距离、卡方检验或 Jensen-Shannon 散度。Jensen-Shannon 对称、有界,并能处理分布对比,适合做稳定仪表盘。它只告诉我们分布不同,不告诉变化是否损害模型,因此必须与分层质量指标结合。

下面代码计算平滑后的 Jensen-Shannon 散度,并保留一个最小自检。输入使用类别计数,函数自动对齐缺失类别。平滑避免某一窗口没有出现某类别时对数计算出错。

python 复制代码
from __future__ import annotations

from math import log2
from typing import Mapping


def distribution(counts: Mapping[str, int], keys: list[str], alpha: float) -> list[float]:
    if any(value < 0 for value in counts.values()):
        raise ValueError("counts must be non-negative")
    total = sum(counts.get(key, 0) + alpha for key in keys)
    if total == 0:
        raise ValueError("empty distributions require positive smoothing")
    return [(counts.get(key, 0) + alpha) / total for key in keys]


def kl_divergence(left: list[float], right: list[float]) -> float:
    return sum(p * log2(p / q) for p, q in zip(left, right) if p > 0)


def js_divergence(
    reference: Mapping[str, int],
    current: Mapping[str, int],
    alpha: float = 0.5,
) -> float:
    keys = sorted(set(reference) | set(current))
    if not keys:
        return 0.0
    left = distribution(reference, keys, alpha)
    right = distribution(current, keys, alpha)
    middle = [(p + q) / 2 for p, q in zip(left, right)]
    return (kl_divergence(left, middle) + kl_divergence(right, middle)) / 2


def demo() -> None:
    stable = js_divergence({"qa": 70, "tool": 30}, {"qa": 700, "tool": 300})
    shifted = js_divergence({"qa": 70, "tool": 30}, {"qa": 30, "tool": 70})
    assert stable < shifted
    assert 0.0 <= shifted <= 1.0


if __name__ == "__main__":
    demo()

不要把 0.1 或任何固定值当作行业通用告警线。先用过去多个稳定窗口计算正常波动范围,再结合样本量和业务影响设阈值。低频高风险意图即使总体散度很小,也可能需要立即补题,所以还要设置类别级绝对变化和"新类别出现"告警。

6. 连续特征与嵌入漂移怎么处理

输入长度、检索分数、响应时延等连续特征,可以比较分位数、Kolmogorov-Smirnov 统计量、Wasserstein 距离或分桶后的 PSI。选择方法时要考虑可解释性和样本量。对于业务人员,P50、P90 和超阈值比例往往比单一距离更容易行动。

文本嵌入可以捕捉未预先定义的新表达,但风险也更大。更换嵌入模型会让所有距离失去可比性;均值向量可能掩盖多峰分布;向量变化也可能来自无害措辞。实践中可以固定嵌入模型版本,先聚类得到可解释主题,再监控主题比例和离群簇,同时由人工检查新增簇样本。

Maximum Mean Discrepancy 等方法能比较高维分布,适合研究或成熟平台,但它仍不能回答业务语义。无论算法多复杂,告警之后必须能落到一组代表样本、受影响能力和可能根因,否则只会产生没人处理的漂移分数。

7. 漂移是否有害,要看条件性能

输入分布变化不等于模型退化。用户从长句改成短句,系统可能仍然表现良好。真正关心的是各分层上的成功率、拒答准确率、工具成功率、证据正确率和人工升级率是否变化。应把"分布变了"和"质量变差"作为两个信号,再用影响矩阵排序。

高漂移但质量稳定的类别,可以先重采样和观察;低漂移但质量骤降,可能是代码或依赖回归;高漂移且质量下降,需要优先补充评测并调查系统;低漂移且质量稳定则保持。对于还没有可靠线上标签的场景,使用人工抽样、延迟反馈或弱标签,但要在报告中标注证据等级。

总体分数可能出现辛普森悖论。某个版本在每个能力内都略有提升,但由于流量转向更难能力,总体成功率下降;反过来也可能总体上升而高风险能力下降。报告同时展示固定权重基准分、按当前线上权重重算分和每个关键分层的结果,才能区分系统变化与流量变化。

8. 难度漂移怎样量化

难度至少有三种来源。内在难度包括所需推理步骤、证据数量、歧义和干扰项;经验难度来自一组模型或人工的实际通过率;区分度表示题目能否区分强弱系统。只用"简单、中等、困难"的生成标签不可靠,应结合可计算属性和实测结果校准。

对 RAG 题,可以记录答案所需文档数、证据跨度、是否有冲突版本、正确证据排名和无关文档比例。对 Agent 题,记录工具步数、状态依赖、权限检查、是否需要确认和错误恢复。对开放生成,记录 rubric 维度与硬失败条件。这些结构特征比题面字数更接近真实复杂度。

旧基准的另一种老化是"饱和"。如果多个候选系统在绝大多数题上都通过,题库对新改进失去区分度。不要简单删除所有简单题:它们仍保护基本回归。可以保留一组核心回归题,再新增能区分当前系统的挑战集,并分别报告,避免总分被挑战集难度任意操纵。

9. 用项目分析检查样本健康

经典测量思想可以帮助评测集治理。对每道题统计通过率、不同系统之间的方差、与所属能力总分的相关性、重复运行的不稳定率和人工争议率。长期所有系统都通过的题可能是核心回归,也可能价值降低;所有系统都失败的题可能真正困难,也可能答案错误;对强弱系统结果相反的题值得审查。

下面代码根据多次系统运行计算每题通过率和区分差。示例将系统按整体能力分成高低两组,比较两组在单题上的通过率。它不是严格心理测量模型,但足以发现没有区分度或反向区分的异常样本。

python 复制代码
from __future__ import annotations

from dataclasses import dataclass
from statistics import mean


@dataclass(frozen=True)
class ItemHealth:
    item_id: str
    pass_rate: float
    discrimination: float


def item_health(results: dict[str, dict[str, int]]) -> list[ItemHealth]:
    if len(results) < 4:
        raise ValueError("at least four systems are required")
    item_ids = sorted({item for scores in results.values() for item in scores})
    if any(set(scores) != set(item_ids) for scores in results.values()):
        raise ValueError("all systems must evaluate the same items")

    ranking = sorted(
        results,
        key=lambda system: mean(results[system].values()),
    )
    split = len(ranking) // 2
    low, high = ranking[:split], ranking[-split:]
    health: list[ItemHealth] = []
    for item_id in item_ids:
        values = [results[system][item_id] for system in ranking]
        high_rate = mean(results[system][item_id] for system in high)
        low_rate = mean(results[system][item_id] for system in low)
        health.append(ItemHealth(item_id, mean(values), high_rate - low_rate))
    return health


def demo() -> None:
    runs = {
        "baseline": {"a": 0, "b": 0, "c": 1},
        "old": {"a": 0, "b": 1, "c": 1},
        "current": {"a": 1, "b": 1, "c": 1},
        "candidate": {"a": 1, "b": 1, "c": 1},
    }
    report = {item.item_id: item for item in item_health(runs)}
    assert report["a"].discrimination > 0
    assert report["c"].pass_rate == 1


if __name__ == "__main__":
    demo()

不要根据一次报告自动删除题目。c 全部通过,可能是必须永远守住的基础安全规则;反向区分也可能说明强系统更愿意拒答,而旧 rubric 错把激进回答判为正确。健康指标用于生成审核队列,最终决策回到业务目标和证据。

10. 概念漂移必须从来源变更追踪

知识型评测不应靠定期人工逐题翻查才发现答案过期。每条样本保存来源文档 ID、版本、章节和证据片段摘要;文档发布新版本时,系统找到受影响样本并标为 needs_review。若只记录一个网页 URL,页面原地更新后既无法判断变化,也无法复现旧分数。

来源差异不能直接自动改答案。条款文字变化可能只是格式,也可能改变规则范围。可以用结构化 diff 和模型摘要帮助审核员定位,但需要确定性校验日期、金额、枚举和权限变化。审核通过后创建新的样本版本,并决定旧样本是归档、保留为历史政策题,还是迁移到新答案。

时间型问答尤其要保留"问题发生时间"。用户问旧订单时可能仍应使用旧制度,不能因为当前文档更新就把全部历史答案改成新规则。评测上下文应明确业务时间、知识截点和允许来源,避免把时效问题误判为幻觉。

11. 评审漂移怎样被隔离

LLM-as-Judge 让开放回答评测可扩展,但裁判模型升级、提示变更和供应商服务变化都会改变分数。每次运行记录裁判模型标识、参数、提示模板摘要、rubric 版本和解析代码版本。若其中任一项变化,先在固定锚点集上重跑,与人工金标比较,再决定是否建立新裁判版本。

锚点集应包含明确优秀、明确失败和容易分歧的回答,并覆盖不同能力。监控裁判与人工的一致性、重复评分稳定性、位置偏差和长度偏好。两个候选回答比较时交换顺序;涉及安全硬规则时先用确定性检查,不能让裁判以"整体表达不错"为由原谅数据泄露。

裁判更换后,不要直接把新分数接到旧趋势线上。选取一批桥接运行:旧裁判和新裁判同时评同一批冻结输出,估计系统性偏移,并在仪表盘标明断点。若两者对关键样本结论不同,优先人工仲裁,而不是用一个平均换算公式掩盖语义差异。

12. 新旧基准如何保持可比

评测集更新后,直接比较 v1 的 82 分和 v2 的 78 分没有意义,因为题目和权重变了。需要维护一个桥接集:一部分在两个版本中完全相同且仍有效的锚点题,一部分是同一能力的新旧配对题。候选系统同时跑旧版、新版和桥接集,报告系统变化与基准变化的贡献。

至少展示三种数字:固定旧版上的回归结果、固定新版上的当前结果、按当前线上分布重加权的业务结果。旧版不必永久运行,达到约定迁移周期后可以归档,但历史输出、配置和数据摘要要保留以供审计。

不要为了让趋势线平滑而偷偷调整旧分数。基准升级就是一次测量体系变化,应像财务口径调整一样公开说明。版本说明列出能力树变化、样本数量变化、来源更新、权重调整、裁判变化及已知限制。

13. 评测集的版本模型

每个不可变发布包含数据 Schema 版本、内容版本、rubric 版本、裁判配置、能力树版本和来源清单。可以用语义版本表达兼容性:修正元数据但不改变分数为补丁;新增样本或兼容字段为次版本;改变目标、权重或评分含义为主版本。具体规则由团队定义,关键是历史运行能精确恢复。

数据包生成内容摘要,运行记录引用摘要而非"latest"。CI 中的上线门禁只能使用已批准版本;latest 可以用于探索,不能用于发布判定。删除样本时保留原因和替代项,不从历史包中物理覆盖。

版本也要有状态:draft、review、approved、deprecated、archived。草稿可快速迭代,approved 才能决定上线,deprecated 保留迁移窗口,archived 只读。权限上,生成者不应单独批准自己的高风险样本;至少由领域或安全负责人复核。

14. 更新样本时避免追逐短期噪声

某一周突然出现一个新说法,不一定值得重构题库。使用持续性、规模、质量影响和战略重要性四个维度判断。短期营销活动造成的流量峰值可以建立临时评测切片;持续增长的新产品意图则应进入核心能力树。高风险事件即使低频,也可能立即加入安全回归集。

从线上抽样时避免只收集失败。仅用失败样本更新会把基准变成极难问题集合,失去对真实流量的代表;只按流量抽样又会淹没稀有风险。合理的基准通常包含代表性集、挑战集和安全门禁集,三者分开报告而不是强行揉成一个总分。

新样本进入前要通过证据审核、隐私处理、去重和切分检查。来自同一事故的十个改写应作为来源组管理,不能分散到开发和隐藏测试。开发者可以看到一个代表例用于修复,隐藏集保留不同表达用于验证泛化。

15. 告警与处置闭环

漂移告警必须带行动建议。输入类别变化但质量稳定,负责人可以重加权并观察;新类别出现且无评测覆盖,创建采样任务;质量下降但分布稳定,转给系统回归排查;来源文档变化,自动冻结受影响题的上线门禁资格;裁判锚点不稳定,暂停用该裁判比较版本。

每个告警保存窗口、样本量、特征版本、基准版本和代表样本。处置结果包括无害变化、监控误报、题库缺口、系统缺陷或业务规则变化。长期统计这些原因,可以调整监控而不是不断堆阈值。

SLA 应按风险分级。高风险权限规则变化可能要求当天完成重审;一般语言比例变化可以周度处理。未处理告警到期后,仪表盘应明确标记相关评测"不再代表当前分布",而不是继续显示一个绿色总分。

16. 常见失败模式

第一种是每次漂移就整体重采样。这样历史可比性迅速消失,也可能把短期噪声写入核心基准。应保留锚点,按受影响能力增量更新,并使用桥接运行。

第二种是只监控文本向量。向量报警难解释,嵌入模型升级还会产生假漂移。先建立业务特征和来源追踪,向量用于发现未知簇而非取代语义分类。

第三种是分布不变就认为安全。概念漂移可能在完全相同的问题上改变正确答案,必须监听政策和工具契约变化。

第四种是看到旧题饱和就全部删除。基础回归仍有价值,应把核心集与挑战集分开;挑战集不断演进,核心集保护最低能力。

第五种是更新裁判却不重跑锚点。分数变化可能全来自裁判偏好。任何裁判配置变化都应形成版本断点。

第六种是把统计显著等同业务重要。大样本下很小差异也可能显著,低频安全风险又可能因样本少而不显著。决策必须结合影响成本和风险门槛。

17. 安全、隐私与边界

线上漂移监控会接触真实用户数据。只采集评测所需字段,尽早脱敏,限制访问和保留期限;对于敏感行业,原始文本只在隔离环境短暂处理,仪表盘展示聚合特征。抽样进入题库前重新审查,不能因为它已经存在日志中就默认可用于测试。

攻击者可能主动制造漂移,批量提交特定提示改变分布或诱导团队把恶意样本写进基准。采样要按用户和来源限权,异常流量单独标记,新增安全规则由专家确认。不要让线上输入自动变成隐藏集答案。

评测更新不能成为放松上线标准的手段。若新版更难导致分数下降,应解释变化并重新设定有业务依据的门槛,而不是调权重让数字回到原水平。相反,若线上风险增加,旧门槛可能必须提高。

漂移检测也有能力边界。它能提示分布和关系变化,不能证明因果,更不能自动决定正确业务行为。最终结论需要代表样本、来源证据、系统 trace 和领域判断共同支持。

18. 从零落地的四个阶段

第一阶段不必建设复杂平台。给现有题库补能力、来源、风险和版本字段,冻结一个不可变基线;线上按同一能力标签做周度快照。第二阶段加入类别分布、长度分位数和分层质量指标,建立人工复核流程。第三阶段增加来源变更触发、样本健康分析、裁判锚点和桥接集。第四阶段再考虑嵌入簇、MMD、自动采样和更精细的版本路由。
#mermaid-svg-lA22WudK8KTm3v9v{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-lA22WudK8KTm3v9v .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-lA22WudK8KTm3v9v .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-lA22WudK8KTm3v9v .error-icon{fill:#552222;}#mermaid-svg-lA22WudK8KTm3v9v .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-lA22WudK8KTm3v9v .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-lA22WudK8KTm3v9v .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-lA22WudK8KTm3v9v .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-lA22WudK8KTm3v9v .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-lA22WudK8KTm3v9v .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-lA22WudK8KTm3v9v .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-lA22WudK8KTm3v9v .marker{fill:#333333;stroke:#333333;}#mermaid-svg-lA22WudK8KTm3v9v .marker.cross{stroke:#333333;}#mermaid-svg-lA22WudK8KTm3v9v svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-lA22WudK8KTm3v9v p{margin:0;}#mermaid-svg-lA22WudK8KTm3v9v .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-lA22WudK8KTm3v9v .cluster-label text{fill:#333;}#mermaid-svg-lA22WudK8KTm3v9v .cluster-label span{color:#333;}#mermaid-svg-lA22WudK8KTm3v9v .cluster-label span p{background-color:transparent;}#mermaid-svg-lA22WudK8KTm3v9v .label text,#mermaid-svg-lA22WudK8KTm3v9v span{fill:#333;color:#333;}#mermaid-svg-lA22WudK8KTm3v9v .node rect,#mermaid-svg-lA22WudK8KTm3v9v .node circle,#mermaid-svg-lA22WudK8KTm3v9v .node ellipse,#mermaid-svg-lA22WudK8KTm3v9v .node polygon,#mermaid-svg-lA22WudK8KTm3v9v .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-lA22WudK8KTm3v9v .rough-node .label text,#mermaid-svg-lA22WudK8KTm3v9v .node .label text,#mermaid-svg-lA22WudK8KTm3v9v .image-shape .label,#mermaid-svg-lA22WudK8KTm3v9v .icon-shape .label{text-anchor:middle;}#mermaid-svg-lA22WudK8KTm3v9v .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-lA22WudK8KTm3v9v .rough-node .label,#mermaid-svg-lA22WudK8KTm3v9v .node .label,#mermaid-svg-lA22WudK8KTm3v9v .image-shape .label,#mermaid-svg-lA22WudK8KTm3v9v .icon-shape .label{text-align:center;}#mermaid-svg-lA22WudK8KTm3v9v .node.clickable{cursor:pointer;}#mermaid-svg-lA22WudK8KTm3v9v .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-lA22WudK8KTm3v9v .arrowheadPath{fill:#333333;}#mermaid-svg-lA22WudK8KTm3v9v .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-lA22WudK8KTm3v9v .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-lA22WudK8KTm3v9v .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-lA22WudK8KTm3v9v .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-lA22WudK8KTm3v9v .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-lA22WudK8KTm3v9v .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-lA22WudK8KTm3v9v .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-lA22WudK8KTm3v9v .cluster text{fill:#333;}#mermaid-svg-lA22WudK8KTm3v9v .cluster span{color:#333;}#mermaid-svg-lA22WudK8KTm3v9v div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-lA22WudK8KTm3v9v .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-lA22WudK8KTm3v9v rect.text{fill:none;stroke-width:0;}#mermaid-svg-lA22WudK8KTm3v9v .icon-shape,#mermaid-svg-lA22WudK8KTm3v9v .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-lA22WudK8KTm3v9v .icon-shape p,#mermaid-svg-lA22WudK8KTm3v9v .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-lA22WudK8KTm3v9v .icon-shape rect,#mermaid-svg-lA22WudK8KTm3v9v .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-lA22WudK8KTm3v9v .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-lA22WudK8KTm3v9v .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-lA22WudK8KTm3v9v :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 输入变而质量稳
质量下降
规则变化
覆盖缺口
冻结基准版本
线上特征快照
漂移与分层质量
变化是否有害
重加权与观察
系统根因排查
重审证据与答案
新增来源组样本
桥接运行
批准新版本

每个阶段都应能独立产生价值。不要等到"全自动漂移平台"完成才开始治理;一个带来源版本的题库和一张分层对比表,已经能发现大量问题。自动化只应替代重复计算,不能替代对评测目标的判断。

19. 验收清单

检查评测集是否声明目标用户、业务时间和适用范围;每条样本是否有能力、风险、来源与版本;线上和离线是否复用同一特征实现;漂移指标是否报告样本量;是否同时观察分布和条件质量;难度是否有结构特征和实测证据;裁判是否版本化并用锚点校准;新旧基准是否有桥接集;历史运行是否引用不可变内容摘要;敏感样本是否完成脱敏与权限控制。

最后检查负责人和处置时限。没有 owner 的告警只是装饰,没有重审期限的 needs_review 会永远堆积。高风险题一旦来源失效,应从上线门禁中隔离,而不是继续以旧答案阻止或放行发布。

20. 仪表盘应该呈现什么

一个可行动的仪表盘不以总分大字报结束。顶部先展示基准版本、适用时间、当前线上覆盖率和未处理高风险告警;随后按能力列出线上流量占比、评测样本占比、分布差、线上质量和固定基准结果。任何数字都能下钻到脱敏代表样本、来源版本和最近处置记录。

趋势线上明确标出模型、提示、知识库、裁判和基准版本的变更点。没有这些事件,分数突变无法解释。低样本类别显示计数和不确定状态,不用红绿色制造确定感;超过有效期或来源待审的结果加醒目标记,防止管理者继续把它当成当前证据。

仪表盘之外保留机器可读导出,发布流水线根据批准版本和明确门禁做判断。可视化服务不可用时,CI 仍应使用冻结数据完成验证;反过来,仪表盘变绿也不能绕过样本审查和安全硬门槛。

小结

评测集过期的本质,是测量对象、正确概念、难度、覆盖范围或裁判发生了变化,而测量工具仍停在原地。治理它需要两条并行证据:线上分布告诉我们用户世界怎样变化,分层质量与来源变更告诉我们这些变化是否影响正确行为。

可靠做法不是不断覆盖一份 CSV,而是冻结版本、追踪来源、监控漂移、审核样本健康、维护裁判锚点,并通过桥接集解释新旧口径。保留基础回归集,单独建设挑战和安全门禁集;当基准不再代表当前世界时,明确标记失效而不是继续展示漂亮总分。只有这样,评测才能长期承担发布决策,而不是成为历史成绩单。

参考资料

相关推荐
ClickHouseDB1 小时前
AI 工程闭环的自动化趋势与质量把控边界
大数据·人工智能
miofly1 小时前
EmbeddingGemma 2:740M 参数的多模态嵌入模型,支持本地推理
人工智能
YOLO数据集集合1 小时前
桥梁损伤实例分割数据集 | 桥梁损伤 实例分割 裂缝检测 钢筋外露 混凝土剥落9160期
人工智能·目标检测·计算机视觉·桥梁·桥梁损害·桥梁数据集
DongQiShanRen1 小时前
裁决台账双向互校(下):台账哈希链、三向对账与最小落地
人工智能·深度学习·算法·目标跟踪·自然语言处理·rust·哈希算法
兆。1 小时前
【无标题】
人工智能
LaughingZhu1 小时前
Product Hunt 每日热榜 | 2026-10-02
数据库·人工智能·深度学习·神经网络·搜索引擎
听风吹等浪起1 小时前
第22章:YOLOv5船舶目标检测+注意力模块改进对比,卫星遥感船舶识别实战
人工智能·yolo·目标检测
niaonao1 小时前
C盘爆红别乱删!我用 Codex 查出 AppData 占了 87.81GB
人工智能·openai
lie..1 小时前
30天从零开始学AI应用开发(Day 19):项目二完结:RAG 知识库问答系统,把自己攒的资料变成私人顾问
开发语言·人工智能·python