7.3 min_confidence 弃权


7.3 min_confidence 弃权

本节摘要:置信门控的最后一步是把度量变成动作:低于 min_confidence 阈值的不硬答,返回「不确定」走弃权——转人工、进复核队列或触发补充信息再问一次。本节讲三件事:其一,阈值不拍脑袋,用业务代价矩阵算——把「自动答对的收益、自动答错的代价、人工处理的成本」放进一张矩阵,遍历候选阈值选总代价最小的一个(方法参照《Evals 实战:LLM 评测工程》第 07 章《概率系统评测》的代价化阈值);其二,弃权率与准确率的取舍曲线(示意值口径)怎么读、工作点怎么选;其三,弃权的运营面——弃权样本是金矿(微调数据的来源,第 5.1 节回流闭环的入口)、noul 的「不知道」与门控弃权的双层设计。门控参数名以官方文档为准,曲线数值均为示意。

学习目标

  • 用业务代价矩阵推导 min_confidence 阈值,而不是拍一个 0.7。
  • 读懂弃权率与准确率的取舍曲线(示意),为业务选工作点。
  • 说出门控弃权与 noul「不知道」的双层分工。
  • 把弃权样本组织成回流闭环:复核、标注、再微调、再校准。

一、门控的动作面:低于线就不答

接口形态很朴素(写法示意,参数名以官方文档为准):

# gate_call.py —— min_confidence 门控调用(写法示意,接口以官方文档为准) from laya import Router router = Router() result = router.decide( context="工单:用户描述模糊,仅说「东西坏了」。", questions=[{"id": "intent", "type": "choice", "question": "属于哪个类别?", "options": ["账务", "软件缺陷", "售前咨询", "物流"]}], min_confidence=0.62, # 阈值来源见第三节:代价矩阵算出来的(示意值) ) # item = result["results"][0] # item["answer"] —— 高于阈值:正常答案;低于阈值:弃权形态(如 # answer 为「不确定」或带 abstain 标记,以官方文档为准) # item["confidence"] —— 无论弃权与否都带出置信,供下游审计 ​

门控之后必须配套三条路由,缺一条系统就是半成品:自动通道(高置信直接执行)、人工通道(低置信进队列,且把完整分布带上——第 1.2 节的软消费,复核员看的是分布不是孤零零的答案)、重问通道(对「补充信息后可判」的样本触发再问一次——输入太短、缺上下文的样本补齐后常能过线)。三条通道的流量占比是第 10.3 节监控大盘上的核心曲线。

二、阈值:代价矩阵法

「置信多高才能自动执行」本质是业务问题不是技术问题:答对的收益多大、答错的损失多大、人工看一条多贵。三件事写成一张矩阵(数值示意,换成你的业务数字):

代价矩阵(示意数值,币种抽象为「单位成本」) 实际正确 实际错误 ┌──────────────────┬──────────────────┐ 自动执行 │ 收益 +1 │ 损失 -20 │ 错发一份营销邮件没什么, │ (省一次人工) │ (错关一个账户) │ 错关一个账户要赔礼赔钱 ├──────────────────┼──────────────────┤ 弃权转人工 │ 成本 -2 │ 成本 -2 │ 人工复核一条两单位成本 └──────────────────┴──────────────────┘ 期望代价 = P(错|置信段) × (-20) + P(对|置信段) × (+1) + 弃权率 × (-2) ​

遍历候选阈值(比如从 0.50 到 0.95 步进 0.05,示意),对每个阈值用留出集算「该阈值下自动执行的样本的实际对错分布与弃权量」,代入期望代价,取总代价最小的阈值。这就是代价化阈值方法,与《Evals 实战:LLM 评测工程》第 07 章《概率系统评测》的框架一致;《Jev 决策编程》第 09 章《评测与校准》同款思路。两个实践要点:错的代价越不对称(本例 -20 对 +1),最优阈值越高、弃权越多——这是业务在替你定阈值,不是你在定;矩阵里的三个数字要找业务方一起填,这个半小时的会议能替你省掉几周的「阈值玄学调试」。

# threshold_scan.py —— 代价矩阵遍历阈值:把第二部分的算式落成代码(示意) def scan_thresholds(holdout, gain=1, loss=-20, manual_cost=-2): """holdout: [(置信, 是否答对), ...] 留出集记录(示意数据结构) 三个代价参数即代价矩阵的三个数字(示意;带符号净值,越大越好)""" grid = [round(0.50 + 0.05 * i, 2) for i in range(10)] # 0.50~0.95 best = None for th in grid: total, n_auto = 0.0, 0 for conf, hit in holdout: if conf >= th: # 自动执行 total += gain if hit else loss n_auto += 1 else: # 弃权转人工 total += manual_cost if best is None or total > best["期望代价"]: best = {"阈值": th, "期望代价": round(total, 2), "自动率": round(n_auto / len(holdout), 3)} return best # holdout = [(0.91, 1), (0.88, 1), (0.63, 0), (0.55, 1), (0.47, 0)] # 示意 # print(scan_thresholds(holdout)) # 把 loss 从 -20 放宽到 -5 再扫一遍:最优阈值明显下移、自动率上升—— # 阈值是代价矩阵的函数,不是模型的属性(示意结论) ​

代码只是把第二部分的公式翻译成双层循环:外层遍历候选阈值,内层对留出集逐条判走自动通道还是人工通道,矩阵三个数字做成参数。两个工程细节:留出集记录的置信必须是温度拟合(第 7.1 节)之后的刻度,否则扫出的阈值整体错位;扫描结果要和下一部分的取舍曲线对着看——代码给出代价最优点,曲线告诉你这个点离拐点多远、再往上弃权换精度还划不划算。

三、取舍曲线:弃权率换准确率

阈值扫一遍,横轴弃权率、纵轴自动通道准确率,得到单调向上的取舍曲线(示意形态):

自动通道准确率(示意值) 0.98 ┤ ● 阈值0.95(弃权72%) 0.95 ┤ ● 阈值0.85(弃权55%) 0.90 ┤ ● 阈值0.75(弃权38%) 0.85 ┤ ● 阈值0.62(弃权24%) 0.80 ┤ ● 阈值0.50(弃权12%) └──┬────┬────┬────┬────┬────┬──▶ 弃权率 10% 20% 30% 40% 60% 80% ​

读曲线的三个动作。第一,找拐点:曲线前段陡后段缓的位置——拐点之后每多弃权一成换来的准确率微薄,人力却线性上涨(每条弃权样本都是人工成本)。第二,对业务定工作点:曲线不告诉你选哪点,代价矩阵(第二节)告诉你——两件工具配合用,先画曲线再代入代价。第三,跟踪曲线漂移:同一条业务线每月重画一次,曲线整体下移(同样弃权率换不到原来的准确率)是模型漂移的信号,进第 10.3 节的运维清单。注意图中数字均为示意:你的曲线画在留出集与线上抽样上,形状由你的模型质量与业务难度决定,别拿示意的拐点当预期。

定工作点的一份实录(数值均为示意)。矩阵三个数字 +1/-20/-2 代入扫描,代价最优点落在阈值 0.62、自动率 0.76;对照曲线,0.62 恰在拐点附近——再往上每多弃权一成,换来的准确率不到一个点,人力却线性上涨。工作点定 0.62。半年后业务方把「错关账户」的代价从 -20 上调到 -50(大客户场景),重扫一遍:最优点跳到 0.78、自动率掉到六成以下——一个数字改动,阈值跟着搬家,这就是「业务在替你定阈值」的具象版。误判复盘:有团队嫌弃权率 24% 偏高,手动把阈值降到 0.50——准确率应声下滑,因为矩阵没变,阈值却离开了最优解;降弃权率的正确路径是本节第一部分的重问通道(补信息再问)与第五部分的回流(再微调让曲线整体上移),不是拧阈值。

四、双层弃权:noul 与门控各守一层

第 1.2 节讲过 noul 的第三值「不知道」——它与 min_confidence 门控是什么关系?分两层:noul 的「不知道」是模型层的弃权,题面本身就允许它说「这个我判断不了」;min_confidence 是系统层的弃权,不管模型说什么,置信不够就拦下。两层互补:

noul「不知道」 min_confidence 门控
层级 题面设计(建模时决定) 系统配置(部署时决定)
触发 语义证据不足 概率数值不足
语义 「看不出来是不是」 「不敢担保我说的是对的」
调整成本 改题面要重微调(第 5 章) 改阈值即时生效

设计建议(示意):是非判断类问题优先用 noul 的三值形态把「不知道」建进题面——它的语义更细;门控作为系统层兜底覆盖所有题型(choice 与 score 没有「不知道」选项,全靠门控拦)。两层弃权的样本进同一个复核队列但打不同标签:模型说不知道的样本补信息可能就能判,门控拦下的样本多半是难例——标签不同,下游处理节奏不同。

五、弃权样本是金矿

弃权不是终点,是数据回流的起点。闭环四步:门控拦下的样本带完整分布进复核队列;人工处理的结果落库(对了、错了、题面本身有歧义三种结论);沉淀成新的偏好样本(第 5.1 节格式——复核结论就是天然的 preferred 与 rejected);攒到一批就再微调、再温度拟合(第 7.1 节铁律)、再重画取舍曲线。这个循环每转一圈,弃权率应该往下走一点、曲线往上抬一点(方向性预期,示意判断)——如果转了两圈没动静,问题多半不在模型在题面,回第 1.2 节修选项定义。由此得到运营视角的最终定位:min_confidence 不是模型的及格线,是业务的人力阀门与数据漏斗——阀门拧在哪由代价矩阵定,漏斗里漏出来的东西决定模型下一轮长什么样。

六、常见问题与排查

症状 先查什么 处置
弃权率某天翻倍 是流量漂移还是阈值被改(配置变更记录) 先查第 10.3 节漂移监控与配置历史,再谈模型
阈值改了没生效 推理侧是否热加载;检查点与温度 T 是否配对错 配对错则刻度错,回第 7.1 节重新对表
重问通道来回触发 补充信息是否真的改变了输入 限重问一次(常用值,示意),仍不过线直接转人工
「不确定」的返回形态字段记不住 以官方文档为准 下游只依赖封装后的弃权布尔位,不碰原始字段
人工通道积压 弃权率与队列容量的乘数关系 弃权率是人力阀门:容量不够,先改矩阵数字再定阈值

本节要点回顾

  • 门控三通道缺一不可:自动执行、人工复核(带分布)、补充信息重问。
  • 阈值用代价矩阵算:错答代价越不对称阈值越高;三个数字找业务方一起填。
  • 取舍曲线找拐点、配矩阵定工作点、按月重画盯漂移;曲线数值以自测为准(文中为示意)。
  • 双层弃权:noul「不知道」是模型层(改题面成本高),门控是系统层(改阈值即时生效)。
  • 弃权样本是金矿:复核、标注、再微调、再校准的回流闭环;转两圈无效就修题面。
  • 阈值扫描是矩阵的翻译、取舍曲线是扫描的地图:改一个代价数字就重扫一遍,别手动拧阈值离开最优解。

至此「调出来」的三章闭环:微调出能力、扩展装下超规格输入、校准与门控把概率变成可信动作。下一章往外看——laya 怎么接进 MCP、LangChain 与 LangGraph 生态,成为现成工具链里的一等公民。


作者与出处
原作者: 灏天文库
整理: 灏天文库整理
本站整理收录,版权归原作者/开源协议所有;欢迎通过原文链接访问源仓库。
发布者: 作者: 灏天文库 转发
评论区 (0)
U