Jev

Jev 的作者是 Diogo Almeida,他参与过 InstructGPT 与 ChatGPT 的早期开发,是 RLHF 的共同发明人,此前在 OpenAI 任研究员,后来在旧金山创办了 TypeSafe AI。公司刚完成由 DCVC 领投的 4000 万美元种子轮,并于 2026 年 9 月 15 日发布了 Jev。

Jev 上线 Vercel AI Gateway 的 24 小时内,近 13% 的付费团队用过它,是该网关历史上新模型采用最快的一次,同期采用率达到 GPT-5.6 系列的两倍以上、Fable 5.1 的六倍以上。Jev 在开发者社区迅速出圈,现在已经对所有人开放:注册用户会获得 5 美元初始额度,由于其极低的定价策略,这笔额度相当于直接送出约 1.2 亿个 Token。

概述

需要说明的是,Jev 并不是又一个生成式模型。它不会根据用户的问题来生成答案,只做一件事情——选择。

在大多数模型都在比拼生成长度、对话能力和长文本推理的时候,Jev 走了一条完全相反的路。它不写文章,也不做开放式问答,只接收一段上下文与预设的几个选项,然后直接输出各个选项的概率。

第一次进入 Jev 官网注册时,会弹出一道小测验,让我们判断 Jev 是否可以问答。

本文的内容主要分为三部分:

  1. Jev 的模型形态与三种题型:它为什么不做问答题,只做选择题;
  2. 官方 API 演示:请求长什么样,返回什么;
  3. 开源复刻模型:Laya、Kev、SemIf-OpenJev 三条路线,分别把「决策能力」放在了模型的哪个位置。

下面逐一展开。

Jev 模型

从模型形态上看,Jev 不属于逐词预测的自回归生成模型,而是退回到了专门做分类与判断的判别式模型,可以简单理解为 BERT,但具体的模型架构并没有开源。

开发者把待分析的文本作为输入,同时递给它几个固定选项。Jev 在运行后不吐出任何自然语言,而是像扫描一样,直接给每一个选项打出确切的概率。

大家或许会有疑惑:我直接调用大模型就可以了,为什么要用 Jev?

这是因为,调用常见的大语言模型时,哪怕你在提示词里写明了「请只回答是或否,不要输出任何多余内容」,模型的底层逻辑依然是在写作文。它必须走自回归流程,一个 Token 一个 Token 地往外吐字。有时候它老老实实输出「是」,有时候却会多吐出标点符号、解释前缀或者换行符,输出的稳定性无法保证。开发者为了在代码里使用这个结果,还得专门写正则表达式去清洗返回的文本;一旦大模型没按预期格式出牌,后续业务逻辑就会直接报错。

让一个擅长写长文的生成模型来做这种是非判断,不仅慢、计费贵,而且输出格式随时可能失控

因此,Jev 从根本上不做问答题,只做选择题。

这种选择题被抽象成了三种最基础的题型:

  • Choice(单选题),用于多分类标签。模型直接返回各个分类的概率。
  • Score(评分题),用于有序刻度打分。比如在 1 到 5 分之间评估内容的匹配度或风险等级,返回各档位的分布与加权分。
  • Noul(判断题),用于纯粹的二元是非判断。直接评估某个命题是真是假。

三种题型的返回字段并不相同。

Type What it answers Returns
Choice Which of these options? choice, probabilities, confidence
Score Which level? score, legend, probabilities, confidence
Noul Is this true? noul (0 to 1)

Noul 是唯一不带 confidence 字段的题型。官方的解释是它的分布只有两个结果,一个数就能完整描述。

Choice 和 Score 都把概率摊在多个选项或等级上,需要 confidence 概括摊开的程度。

score 不是等级编号,是等级编号按概率加权后的位置。

legend 的作用是把数字编号映射回你写的等级描述,避免回头查代码。

usage 里有两个 token 计数。output_tokens 并不是 0,官方示例里它是 18 到 212 之间的正数,统计的是结构化答案占用的 token,不是模型生成的自然语言。

开发者拿到的是带类型的值和概率分布,代码可以直接分支、排序和路由。

三种题型可以混在同一次请求里。官方文档的说法是,每个问题会对同一份 state 并行、隔离地求值,增加问题几乎不改变响应时间,只多花少量 question token。

演示

Jev 官方文档中给出了一个购物场景的请求示例:

{
  "state": "My running shoes arrived in the wrong size. Can I swap them for a size 10?",
  "questions": {
    "department": {
      "type": "choice",
      "instructions": "Which team should handle this?",
      "criteria": {
        "returns": "Exchanges, wrong or damaged items",
        "shipping": "Delivery status, delays, lost packages",
        "billing": "Charges, invoices, payment problems"
      }
    }
  }
}

把请求发送给模型,返回的 response 如下:

{
  "model": "jev-1.13.0",
  "answers": {
    "department": {
      "type": "choice",
      "choice": "returns",
      "confidence": 1.0,
      "probabilities": {
        "shipping": 0.0,
        "returns": 1.0,
        "billing": 0.0
      }
    }
  },
  "usage": {
    "input_tokens": 328,
    "output_tokens": 34
  }
}

开源复刻模型

Jev 的架构未被公开发表。TypeSafe 仅表示,该模型通过一次查询生成所有输出,而非一次只输出一个 Token,返回带有校准概率的答案,并用 RLCD 在合成数据上训练。截至目前,参数数量、基础架构、权重和训练方法均未公开。也正因如此,开源社区在复刻 Jev 能力的过程中产生了大概三种架构。

Laya

第一个流派走双向编码器路线,主打轻量、极速与多语言,代表作是开源项目 Laya。Laya 采用 ModernBERT 与多语言 mmBERT 构建,单张消费级显卡上的延迟仅 32.8 毫秒,甚至比 Jev 的远程接口快数倍。更关键的是,它内置了多字符集检测分流器,支持 100 多个语种,成为目前中文与多语言自建环境的首选。该项目截至 2026 年 9 月 24 日已积累 20.7k 颗 Star。

Laya 的具体做法如下:

例如,在一个智能体的工具选择场景中,输入状态为“当前XX地区的气象怎么查看?”,候选选项为“查询数据库”“查询天气”“查询 GIS”“发送短信”。模型可以将这些信息组织成类似下面的输入结构:

[CLS]
状态:当前XX地区的气象怎么查看?

选项1:[MASK] 查询数据库
选项2:[MASK] 查询天气
选项3:[MASK] 查询 GIS
选项4:[MASK] 发送短信
[SEP]

其中,每个 [MASK] 对应一个候选选项。整个序列一次性输入 ModernBERT,经过双向 Transformer 编码后,模型分别取出 4 个 [MASK] 位置的隐藏状态,并由决策头将它们映射为对应的候选项得分。例如:

[MASK]1 → 0.72   查询数据库
[MASK]2 → 0.08   查询天气
[MASK]3 → 0.16   查询 GIS
[MASK]4 → 0.04   发送短信

随后在这些候选项之间进行 Softmax,得到最终的决策概率,并选择概率最高的“查询数据库”。因此,Laya 并不是把每个候选项单独编码后再计算余弦相似度,而是让状态、问题和所有候选项在同一个双向 Transformer 中共同建模,再利用各自的 [MASK] 表示完成候选项打分。

Kev

第二个流派走因果解码器路线,主打大模型底座与超长上下文,代表作是近期在 Hugging Face 发布的 Kev 模型。Kev 基于 Qwen3.5 Base 构建,目前提供 0.8B、4B 和 9B 三种规模,并采用与 Jev 类似的「决策而非生成」思路:模型并不通过自回归方式逐个生成答案 Token,而是将待判断的状态、问题以及候选选项一次性输入模型,直接计算各候选项的决策概率。

Kev 的输入由 State、Question 和 Options 三部分组成。

例如在智能体工具选择场景中:

  • State 可以是“当前XX地区的气象怎么查看?”
  • Question 则是“应该调用哪个工具?”
  • 候选项包括“查询数据库”“查询天气”“查询 GIS”和“发送短信”。

在 API 层面,Kev 并不要求用户按照固定的分类标签调用模型,而是可以在请求中动态提供候选项,因此模型面对的并不是一个固定的 N 分类问题,而是“给定当前状态和问题,在当前提供的候选项中进行选择”。官方接口的 Choice 类型最多可以提供 255 个候选项,同时还支持 Yes/No 和 Score 等其他决策形式。

在模型内部,Kev 会把这些内容组织成特殊的文本结构,例如:

<state> 当前XX地区的气象怎么查看?

<q> 应该调用哪个工具?
<opt> 查询数据库 </opt>
<opt> 查询天气 </opt>
<opt> 查询 GIS </opt>
<opt> 发送短信 </opt>
<decide>

在 Qwen3.5 的基础上,Kev 并没有重新设计 Transformer,而是保留 Qwen3.5 作为语言理解的 Backbone,并额外加入 LoRA Adapter 和 Pointer Head

  • LoRA 用于对 Qwen3.5 的内部表示进行轻量化微调;
  • Pointer Head 则负责将模型的 Hidden State 转换成候选项之间的决策分数。

Pointer Head 是 Kev 区别于普通 Qwen3.5 的关键。

Qwen3.5 在得到 Hidden State 后,会通过 LM Head 将其映射到整个词表空间,然后预测下一个 Token;

Kev 则不再需要预测“查询”“天气”等自然语言 Token,而是直接利用候选项所在位置的 Hidden State 进行决策。

具体而言,模型会分别取出每个候选项结束位置 </opt> 的 Hidden State,同时取出问题末尾 <decide> 位置的 Hidden State。由于 <decide> 位于所有候选项之后,它能够结合完整的问题和候选项信息形成当前决策的上下文表示。随后 Pointer Head 将 <decide> 表示与每一个 </opt> 表示进行匹配并计算分数,最后在所有候选项之间进行 Softmax,得到概率分布。

例如,经过 Qwen3.5 编码后,Pointer Head 可能得到:

查询数据库 → 1.86
查询天气   → 3.42
查询 GIS   → 0.71
发送短信   → -0.25

经过 Softmax 后得到:

查询数据库 → 0.16
查询天气   → 0.72
查询 GIS   → 0.08
发送短信   → 0.04

因此模型最终直接选择“查询天气”,而不是生成“应该调用查询天气工具”这样的文本。

为了让模型具备这种决策能力,Kev 还需要进行专门训练。训练数据的形式与实际推理基本一致,即给定一个 State、一个 Question 以及若干候选项,同时标注其中的正确答案。

SemIf-OpenJev

第三个流派主打轻量包装与边缘交互。比如开源项目 SemIf-OpenJev,直接拿开源大模型的原生 logits 来做「语义 if 判断」,重点验证:能不能不生成文本,直接从模型的输出概率中得到决策结果。

与 Kev 不同,SemIf 并没有在 Qwen3.5 上增加 LoRA 和 Pointer Head,而是直接利用基础语言模型原有的 LM Head 完成候选项判断。

其核心思路是:既然因果语言模型本身就能够计算“下一个 Token 是什么”的概率,那么对于一个已经确定的候选集合,也可以直接读取这些候选答案 Token 在答案位置上的 logits,而不必真正执行自回归生成。SemIf 将这种方式称为直接读取 typed option probabilities,即候选项的概率由模型原生输出直接计算得到。

例如,对于一个客服路由任务,可以将输入组织为类似下面的形式:

State:
鞋子晚到了两周,而且尺码错误,同时信用卡被扣了两次。

Question:
哪个团队应该处理这个问题?

Options:
A:returns——退换货、退款、商品错误等
B:shipping——配送状态、延迟、丢件等
C:billing——扣款、发票、支付问题等

Answer:

这里的 ABC 并不是模型需要生成的一段自然语言,而是三个候选答案的标识符。整个文本经过 Tokenizer 后输入 Qwen3.5,模型正常执行一次 Forward。

而在 Answer 后对应的预测位置,可以得到整个词表中每个 Token 作为“下一个 Token”时的 logit。

SemIf 并不要求模型生成完整答案,而是从这个位置的输出中,只取出候选答案 ABC 所对应 Token 的 logits。例如:

A → 2.31
B → 0.87
C → 3.15

随后仅在当前提供的候选项之间进行 Softmax:

A → 0.287
B → 0.068
C → 0.645

最终选择概率最高的 C,再根据候选项映射得到 billing

整个过程中模型没有生成“应该由 billing 团队处理”这样的自然语言,也没有进行 JSON 生成和解析,而是直接从一次模型前向计算的结果中得到决策。SemIf 官方实现明确采用这种「one forward pass + native option logits」的方式,并强调不会采样答案 Token。

SemIf 并没有改变语言模型的基本结构,而是改变了模型输出的使用方式。普通 LLM 通常需要继续生成 Token,直到形成完整的答案;SemIf 则在模型刚刚计算出“下一个 Token”的概率后立即停止,只读取预先声明的候选答案对应的概率。

这种设计还有一个重要特点:候选项可以在运行时动态提供,而不是要求模型在训练阶段固定一个分类标签集合

模型始终使用相同的语言模型,只需要根据当前请求提供的候选项计算对应 Token 的 logits。因此,它并不是传统意义上的固定 N 分类模型,而更接近一个运行时动态定义候选集合的语义决策器。SemIf 的输入接口也采用 statequestion 和动态 options 三部分,其中候选项由请求方在运行时提供。

不过,这种方法也存在一个明显限制:直接读取的是语言模型词表中的 Token,因此候选答案需要能够映射到模型可以直接读取的答案 Token。因此 SemIf 使用类型明确的选项标识,而不是直接将任意长度的自然语言选项作为一个分类类别。候选项的语义仍然由前面的描述提供,模型真正进行概率比较的是声明的答案 Token。

SemIf 的另一个重要设计是对 State 复用。在智能体场景中,一个较长的 State 往往需要同时回答多个不同的问题。例如同一份防汛状态可能需要连续判断“是否需要预警”“是否需要通知乡镇”“是否需要发送短信”“是否需要升级响应”等。如果每个问题都重新处理完整 State,就会重复计算大量相同的上下文。SemIf 因此提供 Shared 模式,可以先对相同 State 进行 Prefill,再将其复用于多个不同 Question 的决策,从而减少重复计算。官方测试在 37 个 State、每个 State 对应 21 个判断的工作负载上,对直接计算、前缀复用和并行后缀计算进行了比较。

总结

如果将三种开源实现放在一起,可以看到它们实际上代表了三种不同的思路:

  • Laya 通过双向 Encoder 的 [MASK] 表示和决策头完成候选项打分;
  • Kev 保留 Qwen3.5 的生成式 Backbone,通过 LoRA 和 Pointer Head 将 Hidden State 转换为动态候选项分数;
  • SemIf 则进一步简化结构,完全不增加新的决策头,直接利用基础语言模型已有的 LM Head 读取候选答案 Token 的 logits。

三者虽然都试图实现“给定 State、Question 和 Options,直接返回决策概率”的能力,但对“决策能力究竟应该放在模型的哪个位置”给出了不同答案。

路线 代表项目 决策能力放在哪里 主打特点
双向编码器 Laya 选项位表示 + 决策头 轻量极速、多语言
因果解码器 + 微调 Kev LoRA + Pointer Head 大模型底座、超长上下文
原生 logits 读取 SemIf-OpenJev 基础模型自带的 LM Head 零结构改造、候选可动态定义

其实,Jev 并不是什么全新的概念。回想起 NLP 还处在 BERT 时代的时候,当时的主流任务就是这样的各种分类。不同的是,现在它从单一分类演变成了辅助智能体决策的形式,其中涉及的各种技术也在不断创新。

你说变了,也没变,思路和之前差不多;你说没变,其实也变了。

未来的智能体架构里,生成式大模型负责写长文、做复杂的开放式推理,轻量判别模型站在最前面管流量分流和逻辑分支,各干各最擅长的事。

参考文章

Introducing System One Models & Jev - TypeSafe AI Blog

Jev architecture: parameters, encoder or decoder, and no paper yet

这是一篇把"Jev模型"讲明白的科普级解读!

NandhaKishorM/laya

jaredpalmer/kev