刚发布的 Jev[2] 模型,过去两周在技术圈里成了现象级的存在。
Jev 干的就是分类,于是很容易被一句"不过是个分类器"打发掉。我这两天对它的判断也变了不少,从"分类器是我写了十年的老本行,我自己搭一个就行"(后面还会聊到),变成"它居然真的比我预想的好用"。
图 1:Jev API 速览,后面细说。
最新的前沿 GPT 和开源权重 LLM 当然也能做 Jev 能做的那些分类,而且它们还能做更通用的决策。Jev 的优势是这类任务跑得更快、花费更低。
反过来,对于范围很窄、定义清楚的问题,Jev 大概不会比专门训练的分类器更准、更快或更便宜。它真正卖的点,是比那些任务专用模型通用得多。
那么 Jev 用的是什么方法(基于合理猜测)、它能做什么、为什么会火,这些我打算放在文章后面。不过我觉得更好的开场方式,是先简单走一遍用于决策的语言模型发展史。回头看这条线,大概能帮大家看清 Jev 到底擅长什么:它确实是个文本分类器,同时它也不只是一个文本分类器。
1 Transformer 出现之前的语言模型与分类
为了把 Jev 放回它该在的位置(这里没有双关的意思),按时间顺序讲会更顺。这一节简单走一遍应用型文本分类:朴素贝叶斯、逻辑回归,以及 Transformer 出现之前那些更经典的(深度)神经网络。
1.1 词袋:朴素贝叶斯、逻辑回归与 XGBoost
15 年前我读研的时候,循环神经网络其实已经存在了(后面还会提到),但文本分类通常还是用词袋表示来做。它足够直接,在中等规模的数据集上就能拿到不错的结果。
简单说,词袋表示是一种让不定长的自由文本能够喂给经典分类器的方法。经典分类器包括朴素贝叶斯、逻辑回归、SVM、随机森林、XGBoost 等等,它们都要求固定长度的输入向量。
现实里的应用从新闻分类到垃圾邮件过滤都有。据称 Gmail 最早期的垃圾邮件过滤器用的也是词袋加朴素贝叶斯。
顺带一提,我在 12 年前写过这个方法的文章[3],那是我最早发到 arXiv 的东西之一。
图 2:我 2014 年的旧教程,讲的是词袋模型下的朴素贝叶斯分类器。
那么词袋表示具体长什么样?它把长度不一的自由文本,比如:
- 训练样本 1:“Zentropa is the most original movie I’ve seen in years. If you like unique thrillers that are influenced by film noir, then this is just the right cure for all of those Hollywood summer blockbusters clogging the theaters these days. Von Trier’s follow-ups like Breaking the Waves have gotten more acclaim, but this is really his best work.”
- 训练样本 2:“This film is just plain horrible. John Ritter doing pratt falls, 75% of the actors delivering their lines as if they were reading them from cue cards, poor editing, horrible sound mixing”
- 训练样本 3:“Zentropa has much in common with The Third Man, another noir-like film set among the rubble of postwar Europe.”
转换成前面那些"经典"分类器可以直接吃的固定长度表示。(上面这几条摘自常用的 IMDb 影评分类数据集[4]。)
图 3:词袋表示示意图。
词袋模型的第一步是建词表,也就是把训练集里所有不重复的词收集起来(也可以顺手去掉 a、the 这类停用词,它们在多数语境里几乎不携带语义信息)。
词袋表示得到固定长度输入的方式,是给词表里的每个词在向量里分配一个位置,然后统计每个词在文档里出现了多少次。假设词表有 50000 个不重复的词,那么不管输入是 10 个词还是 30 万个词,产出的都是长度 50000 的固定向量。注意其中绝大多数位置是 0,因为一篇文档只覆盖词表的一小部分。(除了直接用原始计数,也有 TF-IDF 之类的归一化方案。)
拿到词频向量之后,就可以在带标签的训练集上训一个分类器,比如标成垃圾邮件和非垃圾邮件的邮件。逻辑回归会学到一组特征权重,把某些词(及其计数)和特定标签关联起来:某些词会推高预测为垃圾邮件的概率,另一些会压低它。
这套办法计算开销很低,在特定词能强烈提示标签的任务上效果不错。垃圾邮件分类这种简单任务,靠它往往就能很快拿到一个精度合理的结果。
它最大的短板在于,词袋表示天然丢掉词序。所以"the dog bites the man"和"the man bites the dog"会得到完全相同的向量,尽管它们描述的是两件不同的事。
(有一些变通办法能保留部分局部顺序,比如把词对或者更长的序列,也就是 n-gram,作为特征加进去,代价是词表会变大。)
尽管有这些缺陷,我依然认为词袋在某些低风险场景里有一席之地,因为它实在太便宜了。而且词袋加逻辑回归,仍然是我做每一个文本分类任务时的首选基线,实现起来太方便。
图 4:对想搭一个简单逻辑回归分类器的人,我写过一篇教程。这个模型在平衡数据集上达到 89.9% 的准确率。
1.2 文本分类用的深度神经网络
前面说的词袋模型也能配(简单的)深度神经网络用,比如多层感知机。但短板依然存在:我们还是丢掉了句子结构和词序。
更讲究一些的神经网络架构绕开了词袋这个变通方案:卷积神经网络(CNN)和循环神经网络(RNN),它们可以直接吃词嵌入作为输入。
1.2.1 词嵌入
在把文本喂进模型之前,得先转成合适的表示。一种表示是词袋,另一种是词嵌入向量。两者的区别在于,词袋向量靠统计每个词出现多少次来代表整段文本,而词嵌入把单个词表示成一串学出来的稠密数字。
图 5:词嵌入生成过程示意图。
词嵌入的工作方式和 LLM 里的嵌入层很像,都是把输入 token 转换成稠密向量。嵌入可以发生在模型之外(比如 Word2Vec[5] 和 GloVe[6] 这两个经典且流行的方法),也可以把嵌入层直接放进神经网络架构里,在训练过程中一并学习和调整。
这些经典嵌入在查表时是上下文无关的。举例来说,bank 在"river bank"和"bank account"里拿到的是同一个向量(上下文这件事,通常要靠注意力这类机制来处理)。
想深入了解嵌入,这几个资源可能有用:
Chapter 2: Working with Text Data[7]
(这是 LLM 那本书的章节,但足够让你理解词或 token 嵌入的大意。在 LLM 的 tokenizer 里,词会被切成子词 token;在 Word2Vec 里,通常一个词就是一个 token。)
Understanding the Difference Between Embedding Layers and Linear Layers[8]
(这篇说明了嵌入向量在什么情况下与线性层、矩阵乘法在数学上等价。)
1.2.2 循环神经网络(RNN)
估计很多人对循环神经网络已经很熟悉了,这节我写得短一点。RNN 是自然语言处理里的经典主力架构,主流变体的历史可以追溯到 1980 年代和 90 年代初。2017 年出现的 Transformer(它用的注意力机制最早也是在 RNN 里提出的,简要时间线见我的《Understanding Large Language Models》[9])后来逐渐在很多 NLP 任务上取代了它们。
RNN 一次读一个词。读每一步的时候,它把当前的词嵌入(上一节讲的)和上一步的隐藏状态结合起来。隐藏状态可以理解成一个固定长度的向量,用来概括到目前为止处理过的文本。所以词序在这里是有意义的,把词重新排列会改变状态更新的顺序。
图 6:RNN 分类器示意图。
注意上图用的是 RNN 的展开表示。也就是说,RNN 对每个输入复用同一套层,所以叫"循环"。也正因为是"循环"的,输入文本的长度可以是任意的。下一张图把"折叠"和"展开"两种表示并排放在一起。两者画的是同一个架构,只是可视化方式不同。
图 7:同一个 RNN 的折叠与展开示意。
RNN 出了名地难训,好在后来有一些重要改进,比如 1997 年提出的长短期记忆网络[10](LSTM),以及 2014 年提出的门控循环单元[11](GRU)。它们用学习到的门来控制信息如何保留和更新。(还有更新的 xLSTM:扩展长短期记忆[12],2024 年提出。)
状态空间模型也受"固定长度隐藏状态顺序更新"这个思路启发,相比 Transformer 的注意力要便宜。不过瓶颈还是隐藏状态能存多少信息,而且它仍然必须顺序处理。(一个有趣的冷知识:注意力最早就是为 RNN 开发的,早于 Transformer 架构,这是另一个故事了,我在《Understanding Large Language Models》[9]里写过。)
结论是 RNN 确实可以用来训练文本分类器。回到 IMDb 影评数据集,词袋加逻辑回归的准确率大约是 89.9%(平衡数据集上),而一个 LSTM 的 RNN 只拿到 85.66%。是的,RNN 确实更难训(下面还有个 ULMFiT 方法等着,它能把 RNN 训到高得多的准确率)。
图 8:一个带 LSTM 的简单 RNN 教程。这个模型在平衡数据集上达到 85.66% 的准确率;训练准确率明显更高,说明过拟合相当严重。
注意这个 RNN 是从零开始训的。更好的做法是先在更大的数据集上预训练,再在目标数据集上微调(经典的说法叫"迁移学习")。
在 NLP 领域,提出这个思路最有影响力的论文之一是 2018 年的 ULMFiT[13],它在 IMDb 上拿到了 95.4% 的测试准确率。
图 9:ULMFiT 论文中的标注图。
1.2.3 卷积神经网络(CNN)
卷积神经网络你大概是从计算机视觉那里认识的。不过它也能用在文本上,只是历史上用得没那么普遍。
图 10:用卷积神经网络给图像分类的示意图。
正如上图图像分类的例子,CNN 会把学习到的滤波器作用在图像块(窗口)上。同样的道理,在自然语言里我们可以把学习到的滤波器作用在相邻词嵌入构成的窗口上。
图 11:文本分类 CNN 的逐步拆解。为简单起见只画了 1 个滤波器(通道)。
如上图所示,窗口大小为 3 的卷积滤波器,对每一组相邻的三个词使用同一套权重。然后它在"the movie had surprisingly good acting"上滑动,每次往前挪一个词。这样就得到四个窗口(为简单起见忽略 padding):
- 1:the movie had
- 2:movie had surprisingly
- 3:had surprisingly good
- 4:surprisingly good acting
在接分类头之前的最后一层,我们可以把结果展平(flatten),也可以做全局最大池化(global max pool),然后再接到分类头上。展平虽然保留了全部信息,但会产生长度随输入文本变化的向量(比如"the movie had surprisingly good acting"要是更长,特征图就更长)。所以要让模型与输入长度无关,这里全局最大池化是更好的选择。
简单起见,文本 CNN 可以这样理解。
图 12:带多个滤波器(通道)的文本分类 CNN。
还有一点很讨喜:滤波器在各个位置上的计算是可以并行的,避开了 RNN 那种逐步的依赖关系。
快速对比一下:在前面那个 IMDb 数据集上,我的实验显示这样的 CNN 准确率约为 90.07%(但要注意这高度依赖架构,就像你从计算机视觉那边知道的,准确率的浮动范围可能很大。比如老牌的 AlexNet 在 ImageNet 上的 top-1 准确率约 62.5%,而 ConvNeXt V2-H 能到 88.9%。)
图 13:训练用来分类 IMDb 影评的 CNN,在这个平衡数据集上拿到 90.07% 的准确率。源码可以在这里找到。
2 Transformer
2017 年,最初的 Transformer 架构出现在 Attention Is All You Need[14] 这篇论文里。这个话题已经被讲得太多太透(我和别人都写了不少),所以我这里只聚焦和分类相关的部分。对注意力机制和其他架构细节感兴趣的,请看我另外几篇文章:
关键在于,最初的 Transformer 架构是一个用于语言翻译的 encoder-decoder 结构,但稍加改造就能用在文本分类任务上,下面几节会说明。
图 14:Attention Is All You Need 中的原始 Transformer 架构。
2.1 encoder 风格的语言模型
最初的 Transformer 架构发布之后的头几年,我记得非常清楚。那几年基本被两条路线的竞争所定义:
- BERT 这类 encoder 风格模型,主要由 Google 推动;
- GPT 这类 decoder 风格模型,主要由 OpenAI 推动。
encoder 风格模型天生就是文本分类器,而 GPT 模型能通过零样本和少样本做分类,但那更像是涌现出来的附带能力,它的强项在生成任务上。
不过我们先从 encoder 风格模型讲起,看看怎么微调它们来做文本分类。
用 Transformer(不论 encoder 还是 decoder 风格)有一个共通点:我们用的是在大规模文本语料上预训练好的模型。除了把它们当零样本或少样本分类器直接用,还可以在目标数据集上微调(和前面 RNN 一节提到的 ULMFiT 类似)。
如下图所示,摘自 BERT 论文[15](2018),BERT 这类 encoder 风格模型在第一个位置有一个分类 token,我们可以很方便地针对它做微调。
图 15:BERT 原论文的标注图。
虽然 BERT 模型远不如自回归的 GPT 风格 Transformer 流行,好在住仍有人时不时更新和现代化它们。最近一个我常在分类任务上用的例子是 2024 年的 ModernBERT[16]。
如下图,在 IMDb 影评上,ModernBERT 只花很少的微调功夫就能拿到大约 95% 的准确率。
图 16:不同 LLM 微调后分类 IMDb 影评的结果;源码可以在这里找到。(我几乎没调超参数,而且还有 1% 到 2% 的提升空间;不过这里的重点之一是,用相当小的力气就能拿到很好的结果。)
2.2 decoder 风格的 LLM
GPT 这类 LLM 是 decoder 风格的自回归 Transformer,生成文本和代码的全部注意力都在它们身上(这里没有双关)。
不过,正如我在《Build A Large Language Model (From Scratch)》[17]一书第 6 章里解释的(那是讲微调的一个平缓入门,在讲指令微调之前),我们也可以把它们改造成文本分类器。
当然,也可以直接提示一个大模型,如下图所示。
图 17:提示大模型给一条影评做分类。
不过,如果我们想要结构化输出,又已经明确知道目标领域,这样做既脆弱又低效。
更好的做法是把输出层换成一个更精简的分类头,如下图。
图 18:把 GPT 风格模型的输出层换成更精简的分类头。
微调有几个需要注意的地方。比如因为有自回归的注意力掩码,我们必须小心设计微调方式,确保分类 token 能拿到序列里其他所有 token 的信息。
图 19:BERT 和 GPT 中的注意力掩码。
想了解更多技术细节,可以看我最近那篇端到端的《Building an AI Text Detector From Scratch》[18]:
总的来说,用 GPT 风格 LLM 而不是 BERT 变体的优势在于,市面上有大量现代的开源权重架构可以直接拿来用,从小参数的 Qwen 3 0.6B 到最新的 Kimi、GLM、DeepSeek 都可以。(当然,拿这种超过 10 亿参数的模型做分类,从效率角度看可能有点过剩,但确实可行。)
图 20:在前面那个 IMDb 影评数据集上,一个相对较小的 GPT-2 124M 模型能拿到大约 92% 的准确率;更大更新的 LLM(比如近期的 Qwen3 变体)表现大概率会更好。
2.3 encoder-decoder 风格的架构
最初的 Transformer 架构(一个 encoder-decoder)后来被拆成了两种范式,BERT 这类 encoder 风格模型和 GPT 这类 decoder 风格 LLM,但也有把 encoder-decoder 风格用起来的尝试,最近的一个(有点出人意料地)是 DeepSeek V4.1 Flash[19]。(不过这里是因果 encoder,不是 T5 那种双向的。)
聚焦到分类任务上,encoder-decoder 架构里最值得一提的是 Google 2019 年的 T5(Text-to-Text Transfer Transformer)[20]。
在架构上,T5 和原始 Transformer 的差别包括下面这些改动,训练方式也变了。原始 Transformer 是以监督方式训练来做语言翻译的;T5 用的是无标注文本上的 span corruption 预训练,encoder 收到的是缺了一段 span 的文本,decoder 把这些缺失的 span 生成出来。
图 21:T5 相对原始 Transformer 架构的改动。(架构图取自 Attention Is All You Need。)
现在我们就可以像前面那些 RNN、CNN 和 Transformer 路线一样,给 T5 加一个分类头来用。
另外,我们还可以让(训练)decoder 直接输出类别标签预测(在 IMDb 影评这个场景下就是"positive"或"negative"),这和常规 LLM 一样。我们把这个做法叫文本到文本分类。
GPT 风格 LLM 虽然是在海量文本上训练的,但它们开箱就能很好地做文本到文本分类,前面已经演示过(下面这张图为了方便又放一次)。
图 22:用 GPT 模型做文本到文本分类。
但在 T5 的情况下,通常还会进一步微调 decoder,让它在给定目标领域的这类任务上表现更好。
对 T5 来说,两种方式都管用。总结一下:
图 23:分类头路线与文本到文本路线的对比。
3 Jev 概览
到目前为止,我们已经看过文本分类的很多条路线,从词袋表示加逻辑回归、朴素贝叶斯这样的传统方法,到提示 GPT-6 这类最新前沿 LLM,再到自己给任意开源权重 LLM 接一个分类头(或做文本到文本分类)。
一开始,我(几乎)也把 Jev 当成"不过是个分类器"打发掉了,毕竟我用自然语言输入做分类任务时天天都在搭这种东西(比如最近的《AI Detector》[18]就是一个公开的例子)。
3.1 Jev 和现有的文本到文本分类
不过在继续之前,先简单介绍一下 Jev。Jev 是 TypeSafe AI 发布的新模型[2],几周前才脱离隐身状态,收获了大量关注(刚出来的时候看起来有点怪,因为它看上去就是个分类器)。
Jev 是闭源模型(虽然发布之后涌现出海量快速跟进的开源仿制,不过这个后面再讲)。它用起来相对便宜,官方宣称在决策能力上和 GPT-5.6 Luna 相当,同时快几个数量级、便宜几个数量级:
图 24:来自 TypeSafe AI 博客的基准测试。
这里提到的 GPT-Luna,可以对应到前面讲的文本到文本分类路线。
那它为什么能掀起这么大热度?我认为一部分原因是 API 设计得不错,另一方面是它在各种任务上表现都很好,不需要定制微调。
比如我可以用它给客服工单和邮件分类(我做了个视频版来展示响应速度):
或者用同一个模型实时玩俄罗斯方块(这里用的是 Choice API):
(在进入技术细节之前,也许这样概括最贴切:2022 年的 ChatGPT 之所以让人兴奋,是因为它是一个通用的对话模型,能生成各种文本;技术圈对 Jev 兴奋的原因之一,是它是分类领域的 ChatGPT 时刻,能低成本地对各种文本输入做分类,而不必为每个任务微调一个专门的分类器。)
(截至撰写时,关于它的架构和确切训练算法已知不多,只知道一位创始人说它是通过"Reinforcement Learning for Calibrated Decisions"训练的,后面还会细讲。)
3.2 Jev 的 API
过去几年我们已经习惯了对各种问题抛出更大、更好、更贵的 GPT 风格 LLM。所以对针对性决策或分类任务来说,像 Jev 这样便宜又快的方案,对大多数人来说会显得耳目一新。尤其是一锤子买卖的任务:为了做一件事去收集训练数据、微调一个定制的 ModernBERT 实在麻烦,我们可能干脆扔一个 Luna 级别的模型上去。
除了靠多功能性(也就是开箱就能在不同目标领域上表现好)火起来之外,Jev 还有一套相当顺手的 API,可以用 curl 在终端里调,也可以用它自己的 Python API。
简单说,主要有三种 API 类型,见下图。先从 Choice API 开始,它适合多分类。
图 25:Jev 的 Choice API,用来做多分类。
接下来是 Noul API,更简单,给一个问题打上"是"的概率。
图 26:Jev 的 Noul API,用来做二分类或多标签分类(配多个 Noul 问题)。
最后是 Score API,按一个评分标准给出分数(下面的例子是 0、1、2)。
图 27:Jev 的 Score API,用来做有序分类。
总结一下,各种 API 和它们的适用场景如下。
图 28:Jev API 速查表。
3.3 用 Jev 分类 IMDb
为了让这些 API 更具体,也回答一下 Jev 在前面那个 IMDb 数据集上能做到什么程度,我们可以用 Choice 或者 Noul API 跑一遍。
先看 Choice API。每条影评的调用格式如下:
export TYPESAFE_API_KEY="YOUR_API_KEY"curl -sS https://api.typesafe.ai/v1/systemone \ -H "Authorization: Bearer $TYPESAFE_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "jev-1.13.0", "state": "The acting was excellent and the story kept me engaged throughout. I would happily watch this movie again.", "questions": { "sentiment": { "type": "choice", "instructions": "What is the overall sentiment of this movie review?", "criteria": { "negative": "An overall unfavorable opinion of the movie", "positive": "An overall favorable opinion of the movie" } } } }'如果我们想用显式标签做二分类(这里是二分类)或者多分类问题,Choice API 很方便。
返回结果大概是长这样:
{ "model": "jev-1.13.0", "answers": { "sentiment": { "type": "choice", "choice": "positive", "confidence": 1.0, "probabilities": { "negative": 0.0, "positive": 1.0 } } }, "usage": { "input_tokens": 342, "output_tokens": 32 }}除了"choice": "positive"这个标签,还能拿到这次预测的 confidence,在实际应用里非常有用,以及每个类别的概率。(confidence 衡量的是概率分布有多集中,它和获胜类别自己的概率是两回事。)Jev 的卖点之一,按官方文档的说法,是这些概率经过良好校准(校准后面还会细讲)。
也可以换用 Noul API 来分类这些影评。同样的影评分类场景,格式如下:
curl -sS https://api.typesafe.ai/v1/systemone \ -H "Authorization: Bearer $TYPESAFE_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "jev-1.13.0", "state": "The acting was excellent and the story kept me engaged throughout. I would happily watch this movie again.", "questions": { "is_positive": { "type": "noul", "instructions": "Does this review express an overall positive opinion of the movie?", "criteria": { "true": "An overall favorable opinion of the movie", "false": "An overall unfavorable opinion of the movie" } } } }'Noul API 的返回是:
{ "model": "jev-1.13.0", "answers": { "is_positive": { "type": "noul", "noul": 0.98 } }, "usage": { "input_tokens": 328, "output_tokens": 21 }}(有意思的是,同一段文本,Noul 给正类打的是 0.98,不是 1.0。)
Noul API 也可以用来做多分类,每个类别问一个问题就行,比如:
- 这篇文章是关于财经的吗?
- 这篇是关于政治的吗?
- 这篇是关于技术的吗?
这里每个问题各自独立返回一个概率,这些概率不需要加起来等于 1。所以一段文本可以同时命中多个标签的场景,用 Noul 更合适;只需要一个最终答案的场景,Choice 用起来更省事。
在测试集的 25000 条影评上分别跑 Choice 和 Noul,结果如下:
- Choice:
总耗时:22 分 24 秒
15456663 个输入 token,总成本 $0.6492
准确率 96.47%(24117 条判对)
- Noul:
总耗时:23 分 3 秒
15106663 个输入 token,总成本 $0.6345
准确率 96.20%(24050 条判对)
Choice 和 Noul 在性能和耗时上的这点差距,很可能只是随机波动。和其他 LLM 一样,这里的调用并不完全确定。
举例来说,我在同一个测试集上把 Choice API 又跑了一遍,结果会略有不同:
图 29:Jev 重复运行的结果。
(大规模服务 LLM 和其他模型时出现的不确定性,一般来自批大小相关的 GPU kernel 执行改变了浮点运算顺序,Horace He 去年写过一篇很好的博客文章[21]讲这个。)
总的来说结果相当不错。有个前提要说明:我们并不知道 IMDb 的测试集有没有被算进训练集。
作为参照,一个 ModernBERT 模型:
- 在训练集上微调花了 23 分钟;
- 在测试集上评估花了 7 分钟。
对比之下,最好的 ModernBERT 模型准确率与 Jev 相当,如下图(我觉得再调调超参数还能再高 1% 到 2%)。注意这是在 DGX Spark 上跑的,如果做量化再配更快的硬件,推理还能更快。
图 30:ModernBERT 与 Jev 的对比。
不过比如我们这个 ModernBERT 模型不会玩俄罗斯方块,不给它针对新任务做微调,它也干不了影评分类以外的任何事。而换成 Jev,就可以直接扔一个 GPT-5.6 Luna 或 GPT-6 Luna 上去(慢一些,也贵一些)。
过去有条经验法则:
- 一次性的决策任务,用便宜的 LLM(比如 GPT-6 Luna);
- 这个任务要反复做,就微调一个定制分类器。
现在像 Jev 这样的东西,可以取代上面这套做法:一是比 Luna 降低延迟、省下成本,二是省掉微调定制模型的工作。(当然,如果任务调用量极大,又想在某个非常具体的任务上把速度和精度都拉满,微调仍然是合理的选择。)
4 给 BERT 和 GPT 风格模型套上 Jev API
当然,我们也可以在一个(Modern)BERT 或任意 GPT 风格模型上面加一层 Jev 式的 API。加这样一个 API 相当直接。事实上 Jev 刚发布的时候,我就做了一个 Jev 式的 ModernBERT 模型,来展示自己搭一个 Jev 有多简单。
后来我改了主意,决定不把这个仿制版本放出来。原因是:给 ModernBERT 套一个 Jev 式 API 很容易,在一堆分类任务上微调它也很容易。但要让这个模型在各种不同任务(比如俄罗斯方块)上都表现好,需要大量的训练和调测,这就不容易了。(而且现在已经有足够多的快速 Jev 仿制品在蹭这波热度了,世界不需要再来一个快速仿制品。当然,一个强有力的开源权重版本还是很值得要的。)
不过如果你对这种改造具体怎么做感兴趣,这里给一个快速概览。比如我们可以给任意 BERT、GPT 或 T5 风格的模型加一个小分类头,实现一个 Jev 式的 Choice API,前面已经演示过。但这次不是让这个头的输出节点等于类别数,而是只留 1 个输出节点,如下图这个改造过的 GPT 模型所示。
图 31:把 GPT 模型里映射到整个词表的输出层,换成一个只有一个节点的输出头。
前面我们讨论过把这些模型微调到某个具体任务,比如预定义了"positive"和"negative"两个标签的影评分类。在这个"单输出节点"的设置下,我们可以把它扩展到任意数量、任意定义的类别。
要扩展到任意数量的类别(以三分类为例,把客服工单分到 billing、technical、account 三类),做法如下图。
图 32:在 BERT 或 GPT 风格模型上使用 Jev 式的 choice API。
如上图所示,对每个候选选项,我们把输入文本、任务说明和该候选的描述一起喂给模型。分类(打分)头把输出的表示映射成一个标量分数。然后我们在各候选分数上做 softmax,得到概率分布,返回概率最高的选项。
这里的关键在于,提出的这个头每个类别只有一个输出。每个类别描述生成自己的表示,再由同一个头通过输出层给它打分(这个输出层本质上就是一个逻辑回归模型):
其中
si
是类别标签i的标量分数;
w
是可学习的权重;
b
是可学习的偏置项;
hi
是分类头之前 Transformer 的输出。
对N个候选,这会产出N个分数。softmax 随后返回N个概率。N变化时,学到的参数保持不变。
关于hi:
- BERT 风格的 encoder 模型用
[CLS]token 的最终隐藏状态(也可以先过一个池化层); - GPT 风格的自回归模型通常用最后一个非 padding token 的隐藏状态,前面讲过自回归特性,所以必须这样取(最后一个非 padding token 能看到前面的文本、指令和候选描述)。
然后我们用交叉熵损失对着正确选项,把模型和打分头一起微调。因为所有候选共用同一个打分头,我们可以在不改动架构的前提下改变选项的数量和描述。但再说一次,它在陌生任务上表现如何,取决于训练数据。
顺便问一句,为什么用 BERT 或 GPT 风格的 Transformer 模型,而不是前面说的更简单的 RNN 和 CNN 架构?纯从技术角度看,上面这套做法对两者都成立。但 Transformer 模型的扩展性非常好,意味着它们能在更大的数据集上预训练,收益也比别的模型更大。而且得益于注意力,它们能充分利用上下文里提供的信息。所以如果我们希望模型在没有针对每个任务单独微调的情况下,也能很好地泛化到不同目标任务,在高质量数据集上预训练一个 Transformer 模型,大概率比用 RNN 或 CNN 更接近我们想要的效果。
5 Jev 的架构与训练算法
那 Jev 为什么能在这么多不同的任务上(从影评到下俄罗斯方块这种任意的事)都做得这么好?遗憾的是,架构、算法和训练数据的细节都没有公开。另外也要记住,这背后是一整个团队和一家数百万美元的公司在这一个模型上死磕,我们不能指望用一周时间在公开数据集上训一个 ModernBERT 级别的模型就达到同等水平。
话虽如此,如果要让我猜,架构上我猜他们用的是类似 ModernBERT 的小模型,这也解释了它的低延迟。
训练数据方面,前面提到过,TypeSafe AI 的 CEO 说过[22]:
我们的数据 100% 是合成的(但显然不是那种从大模型里直接吐出来的垃圾)
所以我认为大部分功夫花在了这个数据集的策划上。这件事我给学生和合作者讲了很多年了。举个例子,大概 8 年前我和社科院另一位教授合作,帮她设计一个文本分类问题的实验方案。她的学生花了很多天给词袋基线和 BERT 模型调超参数,抠出了大约 2% 到 5% 的准确率提升。后来我建议我们各自花几天手工多标一些数据(我印象里原始数据集大概 300 条,我们把它翻了一倍),结果准确率提升了 10% 到 20% 以上。是的,为此画学习曲线[23]很重要。
图 33:一条经验法则,通常多要数据比多调超参数更管用。
最后是训练算法。细节同样未知,但 TypeSafe AI 的博客提到[2]他们用了一个叫 Reinforcement Learning for Calibrated Decisions(RLCD)的新算法:
我们构建了一整套完全围绕自动化的技术栈:全新的模型架构、用于极致效率的并行采样器,以及我们称为 Reinforcement Learning for Calibrated Decisions(RLCD)的训练方法。
这个方法没有公开。有一个公开方法在校准目标上很接近,是 2025 年论文 Beyond Binary Rewards: Training LMs to Reason About Their Uncertainty[24] 提出的 RLCR(Reinforcement Learning with Calibration Rewards)。在展开更多细节之前,下一节先简单介绍一下校准本身。
5.1 校准
校准不是一个新话题,而且对任何你想使用和评估类别成员概率的生产模型,我都会建议做这一步。简单说,校准调整模型的概率估计,让它们更贴近实际观察到的类别频率。
再拿 IMDb 影评分类问题举例。模型可能给一条影评打 74% 正向、26% 负向。这些是概率估计,但模型可能过度自信,也可能信心不足。不评估校准的话,我们不能假定这些数值可靠。也就是说,74% 正向和 54% 正向的预测,在 50% 阈值下都会得到"positive"这个类别标签,尽管模型在 74% 那个情况下表达的信心要强。
图 34:校准原理示意图。
校准技术会用一个单独的有标签数据集(比如留出来的验证集)来调整这些概率估计。校准成功之后,在所有被赋予约 74% 正向概率的影评里,大约 74% 应该是真的正向。想了解更多,我推荐去看那篇经久不衰的 scikit-learn 文档[25]。
做法有很多。比如我在AI detector 项目[26]里用过的一种是温度缩放。温度缩放在做 softmax 之前,先把模型的 logits 除以一个温度值T。T(一个正数)通过在校准数据集上最小化交叉熵损失来学习,模型权重保持冻结。温度大于 1 会降低对最高概率类别的信心,温度在 0 到 1 之间则提高它。之后对新预测就用同一个温度。因为这个缩放保留了 logits 的相对顺序,我们选最高概率类别时预测结果不会变。
5.2 带校准奖励的强化学习(RLCR)
Jev 的 RLCD 训练方法仍然是闭源的,不过有一个相关思路可以讨论:带校准奖励的强化学习(RLCR),由 2025 年的 Beyond Binary Rewards: Training LMs to Reason About Their Uncertainty[24] 提出。(注意这两种方法之间没有官方确立的联系,我只是假设它们可能相关。)
可验证奖励强化学习(RLVR)通常给正确答案 1 分,错误答案 0 分。(想要完整的解释和实现,推荐看我的《Build A Reasoning Model (From Scratch)》[27]一书。)
简单说,RLCR 为不准确的信心估计加了一项额外惩罚。
在常规的 RLVR 里,奖励R根据答案对错取 0 或 1(为简单起见,这里忽略可选的格式奖励和长度惩罚)。
在 RLCR 里,模型生成推理和答案,之后给出一段不确定性分析和一个数值置信度q。修改后的奖励是
R = c − (q − c)²
其中 c 在答案正确时为 1,否则为 0。举个例子,一个错误答案却给了 90%(0.9)的信心,奖励是 −0.81,因为
0 − (0.9 − 0)² = −0.81
20% 信心时,奖励是 −0.04。而一个正确答案是 90% 信心,奖励是 0.99。(熟悉评估校准模型的读者可能会注意到,这里的平方误差项就是"答案为正确的概率"这个陈述所对应的 Brier 惩罚。)
图 35:RLCR 概览。
注意不确定性分析和q是由同一个模型(这里是 Qwen2.5-7B)在它的回答里生成的。
不确定性分析是一份关于"它的答案可能在哪儿出错"的书面评估。回答之后,模型会检查缺失的证据、含糊的措辞、可疑的假设,或者可能的推理错误。论文的提示词要求它指出具体的不确定之处,而不是提出修正方案。
系统提示词还会明确要求给出q,一个 0 到 1 之间、用标签包裹的数字。它代表模型对自己答案正确与否的估计概率。所有这些部分由系统在同一段回答里顺序生成。
举个例子,模型的回答可能是这样:
<think>...reasoning about the question...</think><answer>positive</answer><analysis>The passage mentions a positive movie review, but the connection to the second paragraph is unclear.</analysis><confidence>0.6</confidence>
下面是论文里的一张标注图,说明它相比常规 RLVR 加温度缩放如何改善期望校准误差。
在 HotpotQA 上,相比 RLVR,RLCR 把期望校准误差(ECE)从 0.37 降到 0.03,准确率基本持平(62.1% 对 63.0%)。在另外六个数据集上,平均 ECE 从 0.46 降到 0.21,准确率从 53.9% 升到 56.2%。这些是论文表 1(a) 里的结果。
图 36:来自 Beyond Binary Rewards: Training LMs to Reason About Their Uncertainty 论文的 RLCR 结果。
从概念上说,“RLVR + Classifier"里的那个"Classifier”,是一个预测所生成答案是否正确的有监督二分类器。
对 Jev 来说,可以把校准奖励直接用在类型化决策上,不生成推理文本。比如给一个 GPT 风格模型配上 2.2 节那个分类头,然后把 RL 的训练目标改成同时奖励准确的决策和校准过的概率,模型主干和分类头一起训练。这是一个受 RLCR 启发的改造,Jev 的 RLCD 是不是这么干,目前还不清楚。
另一条路是,直接偏好优化(DPO)是基于人类反馈的强化学习(RLHF)的一种交叉熵替代方案,那么我们也可以直接在分类器输出的概率上最小化 CE + Brier 损失。我在 ModernBERT 模型上这么做过,相比常规的温度缩放有 modest 的提升。
图 37:ModernBERT 通过受 RLCR 启发的 Brier 损失优化获得的提升。↑ 表示越高越好,↓ 表示越低越好。
6 Jev 适合谁
Jev 讲得已经足够细了,那么它适合谁?按我的判断,目标人群相当大,交叉在这样两类人之间:一是想省下"为每个决策任务微调一个定制分类器"的时间,二是想省下使用 GPT-6 这类"大杀器"的钱。
还有不少有意思的用法可以想。下面这一节是一个简短的点子清单。
6.1 Jev 的使用场景
用例清单看起来没完没了。当然有些很炫的例子,比如让它下俄罗斯方块(前面那个视频就是用来展示 API 的低延迟)。不过对大多数人来说,给邮件分类更实用。比如可以把 Jev 当成一层额外的垃圾邮件过滤、优先级排序之类的。
但除了这些,它还能当作增强 LLM agent 脚手架的工具。在那里它可以:
- 作为常规 LLM agent 脚手架的前置筛查器,扫描上下文里的提示注入;
- 为一个模型选择推理强度档位;
- 从你注册的技能库里选一个 skill.md;
- 作为评审(judge)用于评估或自我改进;
- 为构建上下文找出相关文件。
这份清单基本没完。有人甚至在 arXiv 上发了一篇调查[28],分析了最近几天冒出来的 2170 个与 Jev 相关的项目。
6.2 关于 Jev 的仿制品和本地版 Jev
Jev 发布以来,几百上千个快速仿制品冒了出来。我看过的大多数,就是拿 ModernBERT 或 Qwen 模型用 SFT 微调一下,再加一个 Jev 式的 API。
据我所知,它们没有一个能在这么广的任务面上达到 Jev 的水平。把这些项目和 Jev 相比,就像把 Alpaca(基于最初的 LLaMA 开源权重模型做的早期指令微调 LLM)和 GPT-6 相比。精神上也许相似,但在真实任务上表现会差很多。
没有冒犯的意思,但它们看起来就是为了蹭热度做的快速项目,我不想在这里推荐具体的哪一个。
这里可能有个例外,是 GLiNER[29] 项目,它已经存在大约 3 年了,虽然底层原理并不相同,但可以做类似的事。不过按一份基准测试[30],Jev 确实更强。
图 38:GLiNER 与 Jev 的对比,数据来自 https://github.com/AbdelStark/jev-benchmarks/blob/main/results/reports/btzsc-pilot-v1.md[30]
总之,对一个好的开源权重 Jev 替代品,需求和意愿都是真实存在的。原因未必是成本(Jev 已经很便宜了),而是隐私。(另外,如果 Jev 在互联网上已经这么快了,想想它在本地高性能硬件上能有多快。)
所以我当然希望 Jev 也有一个 DeepSeek(或者 Kimi、GLM、MiMo)式的时刻。我确信有人在做这件事,但这需要时间。TypeSafe AI 是靠一支专家专职团队做了很多个月的。指望一周之内复制出那套开发和评测工作并不现实。(不过,毕竟这是个比一万亿参数模型更小更高效的模型,按理说不会等太久。)
7 结论
总的来看,Jev 一眼看去似乎没带来什么根本性的新东西。毕竟人们完全可以说它"不过是个分类器"(上面套了层好用的 API 而已)。然而它在极其广泛的任务上表现得出奇地好。从这个意义上说,它是专用分类器的即插即用版本。
专家当然还是会微调专用模型,但为微调一个专用模型做论证的门槛现在高多了,因为随手扔一个 Jev 或 Jev 式模型上去就能拿到够用的结果。
我也不认为 Jev 和它的仿制品会解锁新能力,或者解决以前解决不了的任务。但如果把这类模型放进我们的 agent 脚手架里,让它们在脚手架内部帮 GPT-6 或者 Opus 5.5 这类昂贵模型做决策,那么将来用 agent 脚手架这件事可能会变得又快又便宜。
学AI大模型的正确顺序,千万不要搞错了
🤔2026年AI风口已来!各行各业的AI渗透肉眼可见,超多公司要么转型做AI相关产品,要么高薪挖AI技术人才,机遇直接摆在眼前!
有往AI方向发展,或者本身有后端编程基础的朋友,直接冲AI大模型应用开发转岗超合适!
就算暂时不打算转岗,了解大模型、RAG、Prompt、Agent这些热门概念,能上手做简单项目,也绝对是求职加分王🔋
📝给大家整理了超全最新的AI大模型应用开发学习清单和资料,手把手帮你快速入门!👇👇
学习路线:
✅大模型基础认知—大模型核心原理、发展历程、主流模型(GPT、文心一言等)特点解析
✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑
✅开发基础能力—Python进阶、API接口调用、大模型开发框架(LangChain等)实操
✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用
✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代
✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经
以上6大模块,看似清晰好上手,实则每个部分都有扎实的核心内容需要吃透!
我把大模型的学习全流程已经整理📚好了!抓住AI时代风口,轻松解锁职业新可能,希望大家都能把握机遇,实现薪资/职业跃迁~