文章目录

我测了 Jev 的置信度,发现阈值不能随便设

上一篇写了 Jev 在智驾上的实测,但用的都是别人的数据。

这篇不一样 —— 我自己拿到 key,跑了 80 多次真实调用,测一个问题:

Jev 返回的那个”置信度”,能不能直接拿来当开关用?

先说结论:不能。除非你先知道它会在哪里抖。


先说 Jev 返回的三个东西

你问 Jev 「这句话想干什么」,它不给你一段解释,它给你三个东西:

选中:要求换货          ← 它认为的答案
分布:换货 79%、投诉 21%  ← 各个选项各占多少
置信度:0.72            ← 一个 0 到 1 的数字

前两个很好懂。第三个最容易被误用 —— 因为「0.72 的置信度」听起来像「我有 72% 的把握」。

它其实不是这个意思。

置信度是从分布算出来的,不是模型自报的把握。算法是这样的:

把「每个选项都平均」当作 0 分,看最高的那个选项比平均高出多少。

  • 全都一样多(比如 25%、25%、25%、25%)→ 0 分
  • 某一个独占(比如 100%、0%、0%、0%)→ 1 分

这有个重要后果:选项越多,同样的优势算出来的分数越高。 后面会讲这意味着什么。


一、第一次实验:失败了

我最初想验证一件事:把候选答案从 2 个加到 8 个,置信度会不会变?

结果八个选项全是满分。

因为我的测试题太简单了(”耳机左耳没声音,能换货吗”)—— 它一眼就知道答案,直接给 100%,其余选项全 0。

这本身是个发现:Jev 在语义明确的输入上不”留余地”,它给极端分布。

但我的实验设计失败了,得重来。


二、真正的问题:同一个问题,问 30 遍

换个设计 —— 拿三段把握程度不同的消息,每段重复问 20 遍,看答案稳不稳。

结果是今天最有价值的一张表:

消息的明确程度 置信度范围 波动幅度 答案变了吗
明确(”我要退款”) 满分,纹丝不动 0 没变
中等(”帮我看看什么情况”) 在偏低到中等之间来回 最大 没变
较明确 小幅波动 小 没变

两个结论:

① 答案永远不变 —— 60 次调用,一次都没换过选项

这点很反直觉。这个模型不是靠”这次选 A、下次选 B”来表达不确定的。

它每次都选同一个,但背后的概率分布自己在动。

所以你不能用「多问几次看答案一不一致」来判断它有没有把握 —— 答案永远一致。

② 波动的大小,跟问题有多明确有关

问题越”中等”,抖得越厉害。高把握的问题纹丝不动。


三、这张表带来的麻烦

那个波动最大的例子,置信度在 0.58 到 0.73 之间来回跳。

如果你在代码里写「超过 0.7 就自动执行,否则转人工」,会发生什么?

同一段用户输入,问 20 遍:

  • 有 7 次超过 0.7 → 自动执行
  • 有 13 次没到 → 转人工

用户什么都没改,系统的行为却在两种之间反复横跳。

这不是模型的 bug。是那个 0.7 选得不对。


四、我试了”多问几次取中位”——不行

我的第一反应是:那就问三次,取中间那个。

用 30 个样本做了模拟,结果是:

做法 判定的稳定程度
单次 一般
三次取中位 更差

为什么?因为阈值的 0.7 正好落在波动的正中间。这种情况下,反复采样只是让”偏向”更明显,不会让不确定性消失。

要解决,得改阈值的位置,不是改采样次数。


五、那阈值该设在哪

同一批 30 个样本,我扫了一遍:

阈值 会通过的比例 稳不稳
0.55 100% ✅ 稳
0.58 100% ✅ 稳
0.60 100% ✅ 稳
0.65 80% ⚠️ 不稳
0.70 17% ⚠️ 不稳
0.75 0% ✅ 稳

关键在中间那一段。

阈值落在 0.60 到 0.75 之间时,通过率会从 100% 一路崩到 0%。把阈值放在这段外面,行为就稳定了(要么全过、要么全不过)。

所以正确做法不是”挑一个好看的数”,而是:先测出你这个场景的波动区间,再把阈值放在区间外面。 哪怕 0.58 看起来不如 0.7 顺眼,它才真可靠。


六、还有个陷阱:删掉「都不匹配」的选项,它反而更自信

我拿一段几乎没信息的输入做对照:

「关于那个,我觉得可能有点问题,你看怎么弄」

情况一:候选里有「信息不足,无法判断」这个选项

它老老实实选了这个选项,置信度 0.92。这是好行为。

情况二:把这个选项删掉,逼它在四个具体诉求里选

它选了「表达不满」,置信度 0.96 —— 比刚才还高。

这个细节值得警惕:

你把”我没法判断”这个出口拿掉,它不会表达为难,而是基于剩下的选项给一个更干脆的答案,并且更自信。

换句话说 —— 置信度高低,部分取决于你给了它哪些选项。 一个糟糕的问题设计,会让它在错误答案上更自信。


七、最后一个反直觉的性质

回到开头那个算法。因为它拿”平均分布”当 0 分,所以:

同样的优势,选项越多,算出来的置信度越高。

我固定最高的那个选项占 90%,只改选项数量:

选项数量 置信度
2 个 0.80
5 个 0.88
50 个 0.90

这意味着你的阈值在不同问题上的严格程度不一样。

如果你设「超过 0.8 才自动执行」:

  • 二选一的问题:最高的那个要到 90% 才算过
  • 十选一的问题:只要 82% 就算过

同一个阈值,对选项多的问题更宽松。


八、所以该怎么用(可以直接抄的清单)

① 别用 0.7、0.8 这种”看起来顺眼”的数。 先拿自己场景的真实数据跑 20–30 遍,看它波动在哪,把阈值放在波动区外面。

② 别用”多问几次”来稳定判定。 答案本来就稳定,抖的是置信度。多问只会放大偏向。

③ 一定要留「都不匹配」的出口。 没出口,它会在坏选项里选一个,而且更自信(实测 0.92 → 0.96)。

④ 别拿不同问题的阈值互相比。 选项越多,同样的优势算出来越高。要比就换算成”最高的那个占比多少”再比。

⑤ 置信度高,不代表可以放心执行。 这是官方文档自己的话:它只说明”分布有多集中”,不代表整个流程正确,也不代表授权执行。

⑥ 高风险动作的门槛,要跟只读操作分开。 官方给的示例就是这个结构 —— 查余额和批准转账用不同的阈值:

if 置信度 < 0.5:
    转人工()              # 模型真的没主意,别猜
elif 动作 == "查余额":
    显示余额()            # 低风险:显示错了能挽回
elif 动作 == "批准转账":
    if 置信度 > 0.9:
        确认后执行()      # 高风险 + 高把握
    else:
        请用户确认()      # 高风险 + 一般把握 → 先核实

最后:连那个”0.5 地板”也要小心

文档建议用 0.5 当”模型真的不确定,别猜”的下限。

但注意 —— 0.5 在不同选项数下,代表的实际把握程度不一样:

选项数 置信度 0.5 对应”最高选项占比”
2 个 75%
5 个 60%
10 个 55%

同一个 0.5,选项越多,要求的把握越低。

如果你同时用不同选项数的问题,又共用一个 0.5 地板 —— 那这个地板对不同问题的严格程度是不一样的。

这不是模型的缺陷,是”用一个数字概括一整个分布”必然要付的代价。 知道代价在哪,就能绕开它。


本文数据来自 2026-09-21 对 TypeSafe API 的真实调用(约 80 次请求,模型 jev-latest)。置信度算法从 TypeSafe 官方文档的交互组件源码中提取,未做改动。

想自己动手看数字怎么变:决策置信度工作台 —— 拖动滑块改概率分布,置信度实时更新。


附录:实验用的原文

前面讲的都是结论。这里放出实际发给模型的文本,你可以自己拿去复现。

一、一次完整的请求长什么样

这是上面「中等把握」那个用例的完整请求(就是那个波动最大的):

{
  "model": "jev-latest",
  "state": "用户:这个订单我等了半个月还没到,帮我看看什么情况。",
  "questions": {
    "intent": {
      "type": "choice",
      "instructions": "用户最主要的诉求是什么?",
      "criteria": {
        "track_order": "查询物流进度",
        "complain_delay": "表达对延迟的不满",
        "cancel": "要求取消订单",
        "refund": "要求退款"
      }
    }
  }
}

注意几个设计细节(都是官方指引要求的):

  • state 是输入描述,用自然语言写
  • instructions 是问题本身
  • criteria 是候选答案(这里是四个诉求)
  • intent 只是给代码用的 ID,不会发给模型 —— 所以问题必须写完整

二、三个用例的输入原文

明确(”我要退款”)—— 波动为 0:

用户:我要退款,请把钱退到我的支付账户。

中等(波动最大,0.58–0.73 那个):

用户:这个订单我等了半个月还没到,帮我看看什么情况。

较模糊:

用户:我的耳机有点问题,不知道该修还是退,你们看着办吧。

三、删掉「出口选项」的对照实验

信息量极低的输入:

关于那个,我觉得可能有点问题,你看怎么弄

情况一,候选里带一个出口:

- 要求退款
- 要求换货或维修
- 询问政策
- 表达不满
- 信息不足以判断诉求     ← 出口

→ 它选「信息不足以判断」,置信度 0.92

情况二,把出口那一行删掉,其余不变:

→ 它选「表达不满」,置信度 0.96(反而更高)

四、选言命题的三种写法

这个对照是文章第二节里最关键的证据。三段文本只差一个词的表述:

排他(”二者只能取其一”)→ 它的判断是 0.97

前提1:这个球要么是红的,要么是蓝的,二者只能取其一。
前提2:这个球是红的。
结论:这个球不是蓝的。

相容(”也可能都成立”)→ 0.05

前提1:这个球是红的或蓝的,两者至少有一个成立,也可能都成立。
前提2:这个球是红的。
结论:这个球不是蓝的。

模糊(”或者是……或者是……”)→ 0.29

前提1:这个球或者是红的,或者是蓝的。
前提2:这个球是红的。
结论:这个球不是蓝的。

注意第三种的分数是浮动的 —— 写这篇文章时重跑了一次,拿到的是 0.33(原来是 0.29)。这正是本文讲的那个现象:中间地带的判断会抖。

但排他和相容始终稳定在 0.97 和 0.05,从不混淆。这个对比才是重点。

五、逻辑题的原文(节选)

四步推理链(有效,它给 0.95)

如果下雨,地会湿。如果地湿,路会滑。如果路滑,易出事故。现在下雨了。
结论:容易出事故。

肯定后件(无效,它给 0.06)

如果涨价,需求会降。需求降了。
结论:涨价了。

形式化验证器给这道题找到的反例是:「没有涨价,但需求降了」 —— 前提全真,结论却是假的。

中项不周延(无效,它给 0.03)

所有医生都受过训练。所有护士都受过训练。
结论:所有医生都是护士。

反例:在一个只有三个元素的论域里,让「医生=第 3 个、护士=空、受训=第 3 个」,前提全真而结论为假。

六、提问模板

上面所有「是不是必然成立」的判断,用的都是同一个提问:

{
  "valid": {
    "type": "noul",
    "instructions": "假设所有前提都为真,结论是否必然成立?请只判断推理形式是否有效,不要考虑前提在现实中是否成立。"
  }
}

noul 是 Jev 的三种提问类型之一 —— 专门问「是/否」,它返回「是」的概率,而不是”是或否”。

(另两种是 choice 选一个、score 打分。前面用的 choice 就是选一个。)

See Also