AI分类结果旁边出现0.9,常让人顺手理解为“这条有九成把握”。但这个数字可能只是排序分数,也可能是未经校准的概率估计,甚至只是聊天模型按提示词报出的自评分。在不知道分数含义、没有独立结果验证之前,不能把它直接当作准确率。

AI置信分数与校准是什么?用工单分流比较阈值和人工待办方法示意图
分析数据提炼结论 · 原创方法示意图

本篇用八条虚构工单练习三件事:区分单条分数与一批结果的准确程度;理解概率校准在检查什么;比较提高自动转单阈值后,错误与人工工作量如何变化。最后得到一份可复核的分流记录,不需要训练模型或购买接口服务。

概念依据scikit-learn官方概率校准与分类阈值说明。下面分数由人工指定,只用于算术演示,不是实际模型输出,不能据此判断任何产品的能力。本地程序只统计给定数据,没有调用AI或生成真实业务预测。

一、先定义“正类”到底是什么

假设内部工单要分到设备维修队列。标签1表示按本次业务规则确实属于设备维修,标签0表示不属于。分数越高,表示系统越倾向把这条工单看作正类,但是否具有概率含义,还要进一步核对。

人工标签应根据明确的业务规则与原始资料给出,不是把AI的第一次判断复制成标准答案。遇到边界工单,先记录争议并澄清规则;如果连“是否属于维修”都没统一,分数再精确也无法解决标签含义不一致。

这里讨论的是普通内部资料分流,不涉及医疗诊断、信贷或其他高影响决策。真实自动处理权限应由业务方确认,本文不建议把八条样例的阈值直接用于任何生产系统。

二、分数、概率、校准与阈值分别管什么

分数可以用来排序:把更像目标类别的记录排在前面。概率估计则试图表达事件发生的可能性,但有概率输出接口,不代表这些数字天然准确。

校准关注一批预测与实际频率是否相称。对于校准良好的二分类器,如果很多样本都得到接近0.8的正类概率,那么这一批里实际属于正类的比例应接近八成。这是群体层面的检查,不是保证每条分数0.8的记录都能得到确定结论。

阈值是业务动作的分界线。例如正类分数不低于0.8时进入自动转单,其余交给人工。调阈值改变的是谁被自动处理;校准改变的是如何解释或修正概率估计,两者不是同一操作。

聊天模型写出“我有90%的信心”,没有自动满足上述校准条件。至少还需要知道数字怎样产生、对应哪个事件,以及在独立数据上表现如何。不要让模型再解释一遍自己的信心,就把这段解释当作验证证据。

三、准备一份有意包含错误的记录

下面八条记录依次给出编号、分数和人工标签。第二条分数很高但标签为0,第六条标签为1但分数不足0.5,故意用来打破“高分一定对、低分一定错”的直觉。

  • 01:0.95,人工标签1。
  • 02:0.85,人工标签0。
  • 03:0.80,人工标签1。
  • 04:0.70,人工标签1。
  • 05:0.60,人工标签0。
  • 06:0.45,人工标签1。
  • 07:0.30,人工标签0。
  • 08:0.10,人工标签0。

我们只允许“高于阈值的正类候选自动转维修队列”,其余全部待人工判断,不会把低分记录自动判成非维修并关闭。这项约定很重要,否则后面的人工工作量与漏单讨论会变成另一套流程。

四、运行一段可复核的统计程序

准备Python 3,把代码保存为confidence_demo.py。它使用标准库Decimal读取分数,检查范围后再统计。没有需要部署的服务,也不读取真实工单文件。

from decimal import Decimal


ROWS = [
    ("01", "0.95", 1), ("02", "0.85", 0),
    ("03", "0.80", 1), ("04", "0.70", 1),
    ("05", "0.60", 0), ("06", "0.45", 1),
    ("07", "0.30", 0), ("08", "0.10", 0),
]


def selected_stats(rows, threshold):
    cutoff = Decimal(str(threshold))
    if not cutoff.is_finite() or not 0 <= cutoff <= 1:
        raise ValueError("threshold outside [0, 1]")
    selected = []
    ids = set()
    for row_id, raw_score, label in rows:
        score = Decimal(raw_score)
        if row_id in ids:
            raise ValueError("duplicate id")
        ids.add(row_id)
        if not score.is_finite() or not 0 <= score <= 1:
            raise ValueError("score outside [0, 1]")
        if type(label) is not int or label not in (0, 1):
            raise ValueError("label must be 0 or 1")
        if score >= cutoff:
            selected.append((row_id, score, label))
    count = len(selected)
    correct = sum(row[2] for row in selected)
    return {
        "ids": [row[0] for row in selected],
        "selected": count,
        "correct": correct,
        "wrong": count - correct,
        "manual": len(ids) - count,
        "precision": Decimal(correct) / count if count else None,
        "coverage": Decimal(count) / len(ids) if ids else None,
        "mean_score": sum((row[1] for row in selected), Decimal(0)) / count
        if count else None,
    }


if __name__ == "__main__":
    for threshold in ("0.5", "0.8"):
        print(threshold, selected_stats(ROWS, threshold))

在文件所在目录运行python confidence_demo.py。输出中的precision只表示自动转单候选里实际属于维修的比例,coverage表示自动处理数量占全部工单的比例。本篇没有把这个coverage定义成正类召回率,也没有计算全系统的最终结单准确率。

五、比较两条阈值线的实际代价

阈值0.5时,01到05被选中,共五条。人工标签为1的有三条,所以候选正确比例是3/5,也就是60%;错误转单两条,待人工三条,自动覆盖率为5/8,即62.5%。

阈值0.8时,只选中01、02、03。候选正确比例是2/3,约66.7%;错误转单一条,待人工五条,自动覆盖率为3/8,即37.5%。这里的等于0.8也会被选中,因为代码采用大于等于。

提高阈值后,本样例错误转单减少了一条,人工待办增加了两条。但02仍然是高分错误,06仍需要人工发现其实际属于维修。阈值提高没有消除错误,只是改变了自动处理范围。

真实业务还应考虑错误转单的返工成本、人工处理能力和延迟要求。不能只挑一个百分比较高的阈值,就宣称流程总体变好。更不能把本来需要人工的五条记录悄悄排除出统计,让系统看起来更准确。

六、再看校准问题,而不是只看排序

分数至少0.8的三条记录,其平均分数为(0.95加0.85加0.80)除以3,约0.8667;实际正类比例为2/3,约0.6667。在这组人工编造的小样例里,平均分数明显高于实际比例。

这可以帮助理解校准图为什么比较“同一分数组中的平均预测”和“实际正类比例”。但三条记录太少,而且没有真实抽样过程,不能用来估计某个线上模型的校准误差或稳定性。

正式检查时可以将独立数据按分数区间分组,记录每组样本数量、平均分数与实际正类比例。分组太细会让样本过少,太粗又可能掩盖局部差异;报告里应保留每组数量,不只画一条看起来平滑的线。

如果需要拟合校准器,应按官方建议使用与模型训练数据独立的资料或适当交叉验证,最后再用保留数据评估。不要在同一小批数据上反复挑阈值、修概率,随后把它当作未经参与调参的测试成绩。

七、把统计表变成实际验收记录

为每次评估记录模型版本、分数来源、标签规则、资料时间范围和阈值。新增渠道的工单、业务规则变化或模型更换,都可能让原有统计不再适用,需要重新抽样核对。

先设人工复核阶段,让系统只提出分流建议,不直接关闭工单。把人工确认结果与原始编号关联起来,再统计哪些类别最容易出错。错误集中在“设备借用”和“设备维修”混淆时,应先修标签定义或输入资料,而不是不断微调小数点。

评估中还要保留未处理、无法判断与资料缺失的记录。把这些情况标成独立状态,比强迫AI给每条记录报一个漂亮分数更容易找到改进方向。若没有足够结果标签,就如实记录暂时无法确认分数可信程度。

八、排查数字不一致时先看定义

  • 候选数不对:检查使用大于还是大于等于,以及是否把0.80误读成80。
  • 百分比对不上:确认分母是自动候选数、全部工单数,还是全部真实正类数。
  • 没有候选:本程序返回precision为None,不能把它写成100%或0%的已验证成绩。
  • 分数出现NaN或超出范围:先拒绝该输入并检查来源,不静默截断成0或1。
  • 相同编号出现两次:先去查资料合并流程,不让重复记录改变统计权重。

这次练习最终应留下两组阈值结果及其业务含义。分数能帮助组织工作,但能否自动处理,仍要由独立证据、业务成本与人工承接能力一起决定。

九、给人工复核留出真正的反馈入口

在分流记录中单独增加“人工确认类别”和“确认依据”,不要把原始模型标签覆盖掉。这样可以区分系统当时建议了什么、人工后来怎样判断,以及错误究竟来自规则变化还是预测本身。需要修改标准答案时保留修改原因,避免评估表在反复编辑后失去可追溯性。

复核样本不能只挑高分记录。若只查看被自动转单的内容,就不知道低分区是否藏着大量真实维修工单,也无法评估人工队列是否承接得住。可以按分数段分别抽取资料,保留抽样方式与每段数量,再结合业务中各段实际占比理解结果。

上线前还要约定暂停自动处理的条件,例如新渠道输入字段缺失、人工反馈出现新的系统性混淆,或者模型版本改变而尚未复核。暂停时仍可保留建议供人参考,不需要为了维持自动处理比例而继续沿用没有证据支撑的阈值。

报告中把本轮能够确认的范围写清楚:哪些资料、哪个版本、哪套标签规则、多少样本,以及还有哪些未知。这样负责人看到的不是一个脱离业务的百分比,而是一份能够决定下一步检查方向的记录。

官方资料