如何通过识别模糊样本提高 LLM 二分类的精确率?
可以把现有信号作为特征,用带真实标签的数据训练一个评分器,再根据精确率要求选择自动分类阈值。目标是在满足精确率要求的前提下,尽量提高自动处理覆盖率。如果只追求最高精确率,系统可能会把几乎所有样本都送审。
先区分分类错误与误送审
- 分类假阳性:真实为负类,却被自动判为正类,会降低正类 precision。
- 误送审:本来可以可靠自动处理的样本被送去人工审核,会增加成本、降低覆盖率。
如果重点是正类 precision,应统计自动接受的正类预测:
[ \mathrm{Precision}{+}=\frac{TP{\mathrm{auto}}}{TP_{\mathrm{auto}}+FP_{\mathrm{auto}}} ]
同时记录自动处理覆盖率:
[ \mathrm{Coverage}=\frac{N_{\mathrm{auto}}}{N} ]
送审样本应单独统计。把人工处理结果和自动结果混在一起,会掩盖自动分类器的真实表现。
如果正、负两类都需要可靠自动处理,还应约束自动负类预测的正确率,即 negative predictive value(NPV)。正类 precision 很高,并不代表自动负类也可靠。
用有标签数据学习信号的组合方式
不建议直接平均投票一致率、证据评分和 logprobs。这些信号的量纲不同,而且通常存在相关性。多个模型达成一致,也可能只是重复了同一种错误。
可以为每个样本构造以下特征:
- 基础模型的预测类别与标签 logprobs 差值。
- 多次采样的投票比例或投票熵。
- 跨模型分歧程度。
- 证据强度,以及证据与预测是否冲突。
- 检查 agent 是否发现证据不足。
然后选择评分器的预测目标。
一种做法是直接学习正类概率:
[ p(x)=P(Y=1\mid z(x)) ]
其中,(z(x)) 是上述特征。这种做法适合用两个阈值划分自动正类、自动负类和人工审核。
另一种做法是保留基础分类器的标签 (\hat y(x)),只学习它是否预测正确:
[ q(x)=P(Y=\hat y(x)\mid z(x)) ]
此时可将 (1-q(x)) 作为不确定性分数。若目标是正类 precision,仍需按预测类别分别检查和设置阈值,因为总体正确率分数可能掩盖某一类别的错误。
可以先用 logistic regression 建立基线,再根据独立评估结果决定是否需要更复杂的模型。没有真实标签时,也可以设计启发式评分,但不能仅凭模型一致性判断评分是否校准,更不能据此宣称达到某个精确率。
校准分数与经验概率
模型输出“置信度 0.95”时,不能直接认为这类预测的正确率就是 95%。校准需要检查分数相近的样本中,实际正类比例或预测正确率是多少。
数据量允许时,可以按用途划分数据:
- 训练集:学习信号融合评分器。
- 校准集:拟合分数到经验概率的映射。
- 阈值验证集:选择自动接受阈值。
- 独立测试集:评估最终固定策略。
数据较少时可以考虑交叉验证或交叉拟合,但同一条样本的标签不应同时参与评分器训练和它自己的独立效果评估。存在重复文本、同一客户或同一文档的多个片段时,还应按相应实体分组切分,避免泄漏。
校准方法可以从 sigmoid calibration 和 isotonic regression 开始比较。前者限制映射形状,后者更灵活;适用性需要结合校准数据量和验证结果判断。
评估时除了整体校准误差,还要检查最终会被自动接受的高分区域。整体校准表现良好,不代表高置信度尾部已有足够样本支持。
根据精确率与覆盖率选择拒答阈值
若评分器输出的是正类概率 (p(x)),可以采用双阈值策略:
[ \operatorname{decision}(x)= \begin{cases} 0, & p(x)\le t_{\mathrm{neg}}\ \mathrm{review}, & t_{\mathrm{neg}}<p(x)<t_{\mathrm{pos}}\ 1, & p(x)\ge t_{\mathrm{pos}} \end{cases} ]
其中 (t_{\mathrm{neg}}<t_{\mathrm{pos}})。两个阈值不必对称,因为两类错误的业务成本可能不同。
在阈值验证集上,可以选择满足以下约束时覆盖率最高的阈值组合:
- 自动正类的 precision 达到业务要求。
- 如有需要,自动负类的 NPV 也达到业务要求。
- 人工审核量不超过处理能力。
如果没有任何组合满足要求,应明确报告约束不可满足。不能为了控制审核量,就把剩余样本当作可靠预测放行。
还需要考虑样本量。少量自动正类预测全部正确,不足以证明生产 precision 很高。对冻结策略的独立测试结果,可以计算单侧二项比例置信下界,例如 Clopper-Pearson 下界。在独立同分布等假设下,用该下界辅助判断精确率要求是否有足够证据支持。
不要在测试集上反复尝试阈值,再把选中的最好结果当作独立验证。如果需要对阈值搜索过程本身提供统计保证,还需要处理多重选择问题。
一个用于验证双阈值策略的代码示例
以下代码假设 p_positive 是评分器输出的正类概率或分数,y_true 是真实标签。它计算候选策略的经验指标,不负责训练、校准或提供统计保证。
from math import isfinite
def evaluate_policy(y_true, p_positive, *, t_neg, t_pos):
y_true = list(y_true)
p_positive = list(p_positive)
if not y_true or len(y_true) != len(p_positive):
raise ValueError("Inputs must be non-empty and have equal length")
if not 0 <= t_neg < t_pos <= 1:
raise ValueError("Require 0 <= t_neg < t_pos <= 1")
tp = fp = tn = fn = reviewed = 0
for y, p in zip(y_true, p_positive):
if y not in (0, 1):
raise ValueError("Labels must be 0 or 1")
if not isfinite(p) or not 0 <= p <= 1:
raise ValueError("Scores must be finite and within [0, 1]")
if p >= t_pos:
tp += int(y == 1)
fp += int(y == 0)
elif p <= t_neg:
tn += int(y == 0)
fn += int(y == 1)
else:
reviewed += 1
n = len(y_true)
return {
"positive_precision": tp / (tp + fp) if tp + fp else None,
"negative_predictive_value": tn / (tn + fn) if tn + fn else None,
"coverage": (n - reviewed) / n,
"review_rate": reviewed / n,
"accepted_positive_count": tp + fp,
"accepted_negative_count": tn + fn,
}
在验证集上比较候选阈值时,也要查看接受样本数。没有自动正类预测时,precision 是未定义的,不能记为 100%。确定阈值后,应在未参与选择的测试集上评估一次冻结策略。
把高成本检查留给边界样本
生产环境中,可以采用分级处理来控制延迟:
- 所有样本先经过一次基础模型调用,提取预测标签和可获得的低成本特征。
- 只有处于边界区域的样本,再执行额外采样、第二模型或证据检查。
- 额外检查后仍达不到接受条件的样本进入人工审核。
第一阶段和第二阶段应分别验证各自的接受策略,并对完整流程做最终评估。第二阶段面对的是经过筛选的困难样本,不能直接假设它与全量样本有相同的分数分布或校准效果。
对于每个额外信号,可以比较加入前后在相同精确率要求下的覆盖率变化,以及延迟增加多少。若多次采样或检查 agent 没有带来足够收益,就没有必要让所有请求都承担这部分成本。
需要特别留意的边界
标签 logprobs 衡量的是给定 Prompt 下标签文本的生成概率,不天然等于分类正确率。标签包含多个 token 时,不能直接把某个 token 的概率当作完整标签概率;标签长度和表达方式也会影响分数。即使对候选标签概率做归一化,也仍需用真实标签验证。
改变 temperature 会改变采样分布。不同 temperature 的输出可以作为不同特征,但混合后得到的投票比例,不应直接当作某个固定设置下的类别概率。
模糊样本不一定都能靠更多模型调用解决。如果分类定义存在重叠、输入缺少必要信息,或人工标注本身不一致,需要先明确标注规则与审核流程。上线后还应抽检自动接受样本;仅检查送审样本,会漏掉系统自信但错误的情况。
备注:内容仅供参考。
