上一篇写了 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 就是选一个。)