大家好,我是小木头。上一期我们体验了 Jev 那个只做选择题不说话、帮助用户做决策的模型。视频发出去之后,我自己问自己最多的三个问题是:他到底准不准?他给的概率能不能信?如果换一个便宜的语言模型,是不是也差不多呢?对于这三个问题,我决定执行一些真实的任务,选择一些有标准答案的数据,看它的决策正确率究竟如何。这期我就来分享一下我做了什么、结果如何,希望对大家在决定是否要用 Jev 的时候呢有所帮助。
在 Kaggle 上有许多高质量的数据集,我决定从中寻找一些符合我需求的。我从 Kaggle 上找了两个有“人工标注答案”的数据集,跑了 662 次 Jev 的调用。同样的数据、同样的问题,我再交给 Claude Haiku 4.5 跑一遍来做对比。全部的脚本和原生响应呢都会开源,如果大家觉得方法有效,可以用自己手头的数据也测一遍,看看究竟结果如何。先说说数据集是怎么挑选的吧?
这一步或许比跑分本身呢更花时间,不过目前有 AI 的加持,这一步也能够自动化、智能化。Jev 只做一件事:基于一段状态(也就是 state)提问,每个问题返回一个概率。所以数据集必须能够改写成一条“输入”加一个有标准答案的选项,分类可以是是与非也可以打分也是可以的。要生成文字的不行,要长篇推理的也不行。其次标签必须要有人工标注,这一条把 Kaggle 上一大半客服工单数据集呢给筛掉了。
比如这个 Customer Support Ticket Dataset,字段看起来还是蛮全的,我下载下来看了一下,它缺的或许正是我所需要的两样东西。一个是真实的文本:他有 8,469 条工单,那描述呢都是模板生成,“product_purchased”还留在了里面,似乎并不是真人或基于真实数据编写的。第二个呢是真实的标签:在优先级上四档各 2,000 多条,和工单类型交叉起来完全的均匀分布。
是随机填的!恐怕文本不是真的,标签呢也不是真的,测试结果恐怕对于我们来讲呢就没有什么意义了。那简单说一下我的其他一些数据选择的标准:要有可对照的公开测评的成绩,也就是别人在这个数据集上发表过的测评结果(论文里的数字、Kaggle 的榜单都算)。有了它呢,Jev 的评估结果比如 80% 才有一个参照,否则也无法衡量 Jev 的表现。
后面我所选择的两个数据集基本上呢都符合这些原则。“垃圾短信”那个数据集,经典模型能做到 97% 以上;“Banking77”数据集原论文里面微调过的 BERT-Large 得到的是 93.7%。那么对于 Jev,输入要短:推文、短信、一句话的提问这些呢都是可以的。那如果想要塞进整篇的文章,那就不行了。
最后呢是数据的许可:要允许公开使用样例和结果,这样呢才能够放进到咱们的视频分享和文章里。按这两条筛选下来,这一期的视频分享中我就用到了两个数据集:第一个呢是 SMS Spam Collection。一共有 5,574 条英文短信,人工标记好了是否是垃圾短信。它在 Kaggle 上是 UCI 官方上传的,目前呢我看有 1,900 多个赞。
原始出处是 UCI 的机器学习仓库,这个数据集很老很简单,经典模型呢都能做到 97% 以上。我拿它呢做个冒烟测试(smoke test),如果 Jev 连这个都不能够处理,或者达不到这个水准呢,恐怕后面呢就不用再看了。第二个是 Banking77:这个是 PolyAI 在 2020 年发布的数据集,13,000 条真人写的银行应用的提问。
人工标记成了 77 个意图,比如比如说卡没收到 PIN、被锁、转账没收到、汇率不对这一类的。Kaggle 上只有社区的镜像,原始出处在 PolyAI 的 GitHub 和 Hugging Face,许可是 CC-BY。我用的呢是原始版本。选它的原因呢在于 77 选一嘛,这正好测试一下 Jev 的能力边界。
在上一期我们的测试中只有用到了 4 个选项,那么 77 个选项一次放进去它能不能搞定呢?准确率又如何呢?公开测评的成绩也很清楚:微调过的 BERT 在这个数据集上大概是 93%,社区报告的 GPT-4 零样本的情况下呢是 80-85 个百分点。那么要丢给 Jev 的问题怎么写呢?来直接看条数据吧!
状态(也就是 state)就是用户提出那句话或描述的状态;提出的问题是“这条消息属于哪个意图”(choice 类型)给它 77 个选项,每个选项一句说明;返回的是选中的意图、77 个选项各自的概率。还包含了一个 confidence,这个数据值短信那边那就更简单了:一个 noul(这条短信是不是垃圾),是垃圾短信呢返回对应的值。
那么返回的呢就是 0 和一之间的一个数,这个呢我们在上一期的 Jev 的介绍中也提到了:noul 类型、choice 类型和 score 类型,这是 Jev 支持的几种典型的类型。好了我们来看看抽样吧!抽样是分层的:Banking77 这个测试集每个意图呢我们取 6 条,462 条;短信场景那边呢按比例来取 200 条(其中 27 条垃圾,也就垃圾短信)。
随机种子固定,谁跑呢都是这么 662 条。跑测试的时候我用的是 OpenRouter 所提供的 Jev 模型,462 次调用呢一共 36 秒跑完,并没有存在限流的情况。我呢是通过 6 个线程并发来做的测试。对照组用到了 Claude Haiku 4.5 模型,同样的 662 条数据、同样的提问。
让它按照 JSON schema 输出答案和一个自己返回的一个 confidence,我们模拟一个 confidence 的响应。temperature 设为 0。那么结果怎么样呢?我们先看准确率:在短信场景中 Jev 200 条对上了 193 条,96.5% 的得分(AUC 0.993)。27 条短信或者 27 条垃圾短信命中了 24 条,误报了 4 条。
Haiku 93.5% 的得分,命中了 25 条,误报了 11 条。Banking77 场景中(77 选一):那么 Jev 462 条命中了 377 条,81.6% 的得分;而 Haiku 呢是 80.1%,对应的是 370 条。两个都明显低于微调模型所得到的 93% 的得分,和社区报的 GPT-4 零样本呢处在同一个档位。
所以第一个问题的答案是:Jev 大致和一个便宜的通用模型的表现呢持平,或许呢略高一些。离专门微调过的模型还是有十几个点的差距。它并不是更聪明,而是更快、更便宜!这两点呢我们后后面还会再看到。
再来看看他错在哪里:85 个错误里面最高频混淆的是这么几对,像实体卡怎么拿和改 PIN 发生了 6 次;订一张实体卡和卡什么时候到;为什么要验证身份和怎么验证身份。全都是相邻的意图,标签本身呢也非常相似!这里呢有一个我觉得蛮有意思的数字:Haiku 错了 92 条,其中有 72 条和 Jev 错在的是同一条上。
看起来难点其实在于数据上,而不是在于模型的能力!这里还有几条值得关注的:Jev 给了 1.0 的概率但是算错了,比如“能帮我转账到一个账户吗”,标注的是收款人不被允许,Jev 选了转入账户。如果看看这条文本我觉得可疑的呢可能是标注!这类例子提醒了咱们一个事情:错误率里有一部分是数据集自己的噪音,任何模型都消除不了。
这也提示了我自己:如何正确标注数据集至关重要!那么第二个问题,概率究竟能不能信?我是这么理解的:把他说我有 80% 把握那些样本放在一起,看看实际上对了多少。那对得上的就是校准得好,对不上呢就是瞎报!Banking77 的结果是这样的:说 55% 的那组实际呢就是 55%;说有 66% 把握的那组实际上呢有 52%。
说 75% 把握的,实际上 65%;另外说 85% 的实际上 74%。报 50% 到 85% 这一段大致呢对得上,整体上可以偏乐观一点。另外呢就是在一些高概率值的数据上存在的不一致:有 330 条他给的最高概率在 0.9 以上,平均报了到了 0.99,实际准确率呢是 0.91。
有 45% 的样本它直接给到了 1.00,这部分实际呢是 97.6%。也就是说它说 100% 的时候,大约每 40 条实际上是会错一条的。这个呢是从概率层面来解读,这是过度自信不是灾难!但你的代码有的时候呢是不能把 1.00 当成真的 1.00 的。不知道大家对于概率层面的解读有没有自己理解呢?
我们再来看看对照组模型 Haiku 自报的 confidence:每一档都比 Jev 更加乐观。说 75% 的实际上呢只有 57%,Haiku 说 85% 的实际呢是对应到了 67%。让语言模型自己报信心值,本来看起来呢就不太靠谱!这个结果可能和大家的经验还是一致的吧。
在短信场景里面 Jev 的概率分布呢非常的干净:一半以上的消息他给的垃圾概率低于了 0.05,这些里面一条垃圾短信都没有。那么给到 0.9 以上的 17 条全都是垃圾,中间地带呢只有 9%,基本上呢可以说是对半开。它漏掉的 3 条垃圾短信对应的概率呢是 0.24、0.44 和 0.46,没有一条被明确的放了过去。
第三件事情是关于 confidence:官方推荐的用法或者推荐的呢是“confidence 阈值”这么一个概念。confidence 高的可以自动的处理,低的转人工!这个概念意思就是说:在 confidence 值特别高的时候呢我们是可以信任 AI 给到我们的决策;那如果 confidence 相对较低,表示 AI(或者 Jev)并没有那么自信。
那么咱们转到人工来处理?这到底能不能用呢?数据或许能够直接回答!我们把 462 条按照 confidence 值从高到低进行排列。如果只采用 confidence 最高的那一半答案,其余转人工,那这一半的准确率呢是 97%。如果我们采用前 3/4,准确率呢是 90.8%,那全部采用那就是刚才我们前面提到的 81.6%。
我们换成阈值概念来说:只让 Jev 自动处理 confidence 大于或等于 0.95 的请求,能够覆盖 63% 的请求。这部分的准确率呢高达 95.5%!把阈值放宽到 0.8,能够覆盖到 79% 的请求,那准确率就会降到 89.9%。反过来看:confidence 低于 0.5 的那 17 条只对了 3 条。
低 confidence 确实对应了高出错率或高错误率!因此这个阈值概念是能用的,而且是蛮重要的。甚至呢比单看概率呢更好用!因为 confidence 反映的是整个分布的集中程度,从意义上来讲也反映出了 Jev 模型的信心程度。
准确率持平的前提下我们来看看另外两个维度:一个是延迟(海外网络端到端)。Jev 的中位数是 432 毫秒,95 分位 658 毫秒,最快的一次 306 毫秒;Haiku 的中位数呢是 1.4 秒,95 分位呢 2.1 秒。差 3 倍多呢!另一个是费用:Banking77 每次请求大约 1,900 个输入 token(因为 77 个选项写进去)。
Jev 跑完 462 次花了不到 4 美分,折合每千次 8 美分;Haiku 1.14 美元,每千次呢 2.47 美元。差距还是蛮大的!有将近 30 倍。短信那种短输入的场景 Jev 每千次成本是 1.3 美分。我还顺便测了一致性:50 条各跑三次,49 条每次选的呢一样。概率最大偏差 0.09!看起来它不是完全的确定性但还是蛮稳的,有兴趣的朋友呢也可以来测试一下这个场景。
最后咱们回到开头的三个问题:关于准不准,和便宜的通用模型呢实际上我感觉呢是处于一个档次。比微调模型差了那么十几个点!这个呢都是针对我具体的数据集、具体测试场景得到的数据。那大家可以根据自己的应用场景来进行评估!所以它不会让你的分类更准,但它确实让你的分类更快、更便宜。
那概率能不能信呢?它报 50% 到 85% 的时候实际上差不多就是那个数字了可以信。那报 90% 以上特别是报 100% 的时候,要打个折按照 97% 来算!这是我这一次最想拿出来分享的一张图表。因为官方呢其实也没有这么一个数据的分享或呈现的。
那阈值或者说 confidence 的有的媒体会用到“门控”这个概念:它能不能用呢?能!而且是蛮重要的。设为 0.95 的阈值,6 成多的请求呢自动处理,准确率呢在 95% 以上。剩下转人工或者转大模型这都是最合理的选择!所以合适的场景还是上一期介绍那几个:路由、过滤、打分。
尤其是那种每秒要做好几次每次就一两句话的决策!不适合的场景也同样的需要它比微调模型更准的恐怕它是做不到的。这期的脚本、抽样的样本、原始的响应这些呢我都放在描述区的仓库里了,感兴趣的朋友呢可以自行获取。如果大家也做过类似的测评或者对 Jev 的使用有自己的经验,欢迎在评论区分享吧!
我是小木头,我们下期见。