STUDY · 技术解剖
一次看懂 · System One
它不回答
它判断
Jev 为什么是第一个「不会聊天」的模型
一份材料 state 「我理解您很着急…」 一段读给人看的文字 noul = 0.93 一个代码能直接分支的数 同一个输入 两种完全不同的产物
9 章 · 8 张表 · 2 个可以动手的演示
一次看懂 · TypeSafe System One

Jev 深度解剖:一个不会聊天的模型

它不是又一个更聪明的 ChatGPT。你给它一段材料、几个问题,它不写字、不解释、不聊天——只还你一堆可以直接让代码分支的概率。这篇把它的原理、能力边界、真实案例、安全风险和配置手段一次讲清。

核实2026-10-16 · 官方文档 + 本机实测
主题System One · 结构化判断 · 置信度路由
阅读约 30 分钟 · 9 章 · 2 个演示
01
认知起点

一个不会聊天的模型

如果你让 ChatGPT 判断一单工单要不要升级,它会怎么回你? 它多半先给你一段话:「根据描述,该客户情绪较为激动,建议优先处理……」 可你的代码要的不是这段话——你要的是一个布尔值,好决定走哪条分支。

Jev 存在的理由只有一个:把「判断」这件事,从「生成文本」里拆出来。

它是 TypeSafe 的第一款 System One 模型。这个命名借自卡尼曼《思考,快与慢》里的系统 1——快速、直觉、不假思索;与之相对的「系统 2」是慢速、深思熟虑的推理。官方文档说得很直白:LLM 的设计目的是产出供人类阅读的文本,拿它做机器要消费的判断,本质上是「把一个文本生成系统强行改造成输出结构化决策」——你得靠提示词约束格式,再写一堆解析代码把文本抠回来,还得处理它偶尔不按格式来的情况。

Jev 把这条链路砍掉了。它的输入是一份材料 + 一组带类型的问题,输出是有类型的值和概率分布。没有文本,没有解析,没有「它今天格式又不对了」。

为什么它能这么快

这里有个容易被忽略的技术事实:Jev 不是自回归模型。官方对此的原话是「it isn't autoregressive and it doesn't generate text」,并且强调它「不顺序产出,而是并行产出」。

「自回归」意味着逐 token 生成——说出第一个词,再根据它说第二个词,如此往复。所有 LLM 都是这样,这也是它们慢的根因:输出越长,耗时线性增长。Jev 不走这条路,它一次就产出全部判断,所以输出长度不影响耗时。

这就解释了那个反直觉的现象:为什么多问几个问题几乎不花额外时间。官方给出的量化收益是——一次调用带 13 个问题,相比拆成 13 次单独调用,便宜 11.5 倍、快 9.6 倍;另一处官方数据是批处理场景便宜 12.2 倍、快 10.0 倍,而答案完全不变。

没公开的部分官方只描述到「一种新架构 + 一个并行采样器 + RLCD 训练法」这一步。没有论文、没有模型卡、没有参数量、没有权重。社区有人探测 API 上万次后推测它大约是 10B 激活参数的稀疏 MoE,但那只是外部黑箱解读,不是官方信息。
官方原话「Jev 针对一份 state 评估有类型的问题,直接返回结构化结果……不做文本生成,不需要解析。输出是有类型的值和概率分布,你的代码可以据此分支、排序、路由。」
你的材料 工单 / 日志 / 评论 LLM 生成文本 Jev 生成判断 「根据描述,该客户 情绪较为激动,建议 优先处理……」 { "升级": 0.93, "诉求": "要货", "风险": 3.8 } ↑ 还得写代码从文本里抠 ↑ 直接 if 分支
图 1 · 同一个输入,两种产物。差别不在聪明程度,在输出契约。

为什么非要拆出来?因为「判断」是软件里最频繁、也最不该昂贵的动作。一封邮件要不要进垃圾箱、一条日志要不要叫人、一笔交易要不要风控拦截——这些动作每天发生百万次,每次只需要一个答案,不需要一段解释。用生成式模型做这件事,你付的是「写一段话」的钱和延迟,拿到的却是「一个数」;而且这段话还得被你用正则抠出来,抠错了就是线上事故。Jev 把这一层做成契约:输入是类型化的,输出也是类型化的,中间的解析环节直接消失。

把生成式模型拿来做判断,是在用一台打印机去当开关。

定位Jev 不是 agent 框架,也不自己决定下一步做什么。官方措辞是:它提供可嵌入软件的 AI 原语,控制权始终在代码手里。你负责问对问题,它负责给出概率。
02
API 全貌

三种问法,就是全部的 API

一个模型的能力边界,能有多窄? Jev 的答案是:三个题型,没了。

这套 API 之所以你花十分钟就能记住,是因为它把「判断」穷举成了三种形状。你所有的问题,最后都归到这三种之一。

noul 是非题 —— 但要它「是/否」的概率
返回 0~1 一个数
choice 单选题 —— 从一堆选项里选一个
返回选中项 + 各项概率
score 打分题 —— 落在哪个档位
返回档位分数 + 各档概率
一份材料 state noul 要不要升级? choice 诉求是哪一类? score 风险落在第几档? 0.93 一个概率,代码直接比阈值 "要货" · conf 0.95 选中项 + 每个选项的概率 3.83 · 极高档 0.83 分数可落在两档之间 三种问法 在同一个请求里并行执行
图 2 · 三种原语共用一份材料,返回三种不同形状的答案。形状固定,是代码敢直接消费它们的前提。

noul:一个数,不是一段话

noul 这个名字来自「null / not null」那一类判断,它的语义非常窄:返回「为真」的概率。

noul升级

问:这单是否需要立即升级给人工客服主管处理?
答:0.93

注意它不给解释。没有「因为客户提到了消协投诉……」——只有一个 0.93。这不是缺陷,是刻意的设计:解释是给人看的,而读这个数的是 if (score > 0.9)。

易错noul 靠近 0.5 的含义是「是和非五五开」,不是「中等程度」。官方原话:「A Noul near 0.5 means yes and no are about equally likely. It does not mean a medium score.」想表达「严重程度中等」,那是 score 的活,不是 noul 的。

我实测了几个边界样本(问题都是「这条消息是否表达了明确投诉或不满」):

材料noul读出来的意思
东西收到了,谢谢0.01明确不是
请问什么时候能发货0.12基本不是
你们这个效率真的可以0.44真的在两可之间
还行吧,就是有点慢0.47真的在两可之间
第三次了,我很失望0.95基本是
再不发货我就去消协投诉0.97明确是

本机实测,2026-10-16 · 单次调用结果,实际有 ±0.02 波动

0.44 和 0.47 这两行是全表最有价值的。它们不是「0.5 分左右的满意度」,而是模型真的在两种读法之间犹豫:「你们这个效率真的可以」可以是反讽,也可以是真心夸。这种样本你不该用阈值硬切——要么人工兜底,要么把问题问细。

choice:选一个,顺带告诉你它有多纠结

choice 用来做分类。除了告诉你选了哪个,它还给出每个选项的概率和一个置信度。

choice诉求

问:客户此刻最主要的诉求是什么?
选项:要货 · 要钱 · 要说法
答:「要货」 confidence 0.98

要货  ████████████████████  0.99
要钱                          0.00
要说法                        0.01

上限 255 个选项(官方硬规格)。这个数字比大多数人需要的都大得多——意味着你不需要先做一层粗分类再细分。

score:连续量,可以落在两档之间

score 要求你给一个有序列的档位表,它返回一个可落在两档之间的分数。

score流失风险

档位:极低 · 较低 · 中等 · 较高 · 极高
答:3.83(即处在「较高」与「极高」之间,偏后者)

官方规格是至少 2 档、最多 10 档。分数是「各档编号 × 其概率」之和——这也是它为什么能落在 3.83 这种位置。

为什么有用「3.83」比「较高」信息量大得多。0.83 的把握落在「极高」、0.17 落在「较高」,这个分布本身就是决策依据:你可以让 ≥3.8 走人工、3.0–3.8 走自动回复,而不是把连续的严重程度压扁成两个粗格子。

三个问题类型可以混在一次请求里

这是最容易被忽略、但最省事的一点:你可以一次性问很多问题,它们的答案互不影响,而且耗时几乎不变。

我实测的对照(各跑 5 轮,中位数):

请求实测耗时中位
1 个问题560 ms
13 个问题(7 noul + 3 choice + 3 score)590 ms

本机实测,2026-10-16。单问 5 次:540 / 490 / 560 / 620 / 660 ms;13 问 5 次:660 / 560 / 540 / 590 / 780 ms。
注意:单问的 560ms 里绝大部分是网络往返与请求开销,不是模型计算——所以「13 个问题只多 30ms」才是这条曲线的真实形状。

多问十二个问题,中位耗时只多了 30 毫秒。这不是优化出来的,是架构决定的:判断之间互相隔离、并行产出,谁也不等谁。

所以别吝啬提问——该拆的判断就拆开问。官方文档也正是这么建议的:「独立的问题一起问,再在代码里组合它们的答案。拆解不需要更多往返。」

问 1 个问题和问 13 个问题,代价几乎一样。吝啬提问才是浪费。

03
工程细节

一次完整调用长什么样

整条链路只有两个字段:材料 state,和问题集 questions。看一遍你就知道怎么接了。

请求 · POST api.typesafe.ai/v1/systemoneJSON
{
  "model": "jev-latest",
  "state": "工单 #88231:客户下单 72 小时未发货,已连续三次催单,
            最新一条写着「再不发货我就去消协投诉,还要发小红书」。",
  "questions": {
    "升级": {
      "type": "noul",
      "instructions": "这单是否需要立即升级给人工客服主管处理?"
    },
    "诉求": {
      "type": "choice",
      "instructions": "客户最主要的诉求是什么?",
      "criteria": { "要货": "催促尽快发货", "要钱": "要求退款或赔偿", "要说法": "要解释或道歉" }
    },
    "流失风险": {
      "type": "score",
      "instructions": "评估客户流失风险等级",
      "criteria": ["极低", "较低", "中等", "较高", "极高"]
    }
  }
}
响应 · 真实返回(已省略 usage)JSON
{
  "model": "jev-1.13.0",
  "answers": {
    "升级": { "type": "noul", "noul": 0.85 },
    "诉求": {
      "type": "choice", "choice": "要货", "confidence": 0.95,
      "probabilities": { "要货": 0.97, "要钱": 0, "要说法": 0.03 }
    },
    "流失风险": {
      "type": "score", "score": 3.83, "confidence": 0.86,
      "legend": { "0": "极低", "1": "较低", "2": "中等", "3": "较高", "4": "极高" },
      "probabilities": { "0": 0, "1": 0, "2": 0, "3": 0.17, "4": 0.83 }
    }
  }
}

三个必须先知道的规格细节

第一,是非题的类型名是 noul,不是 boolean。传 boolean 会直接返回 400 Invalid request。这个坑我踩过——因为很多模型的文档里是非题就叫 boolean。

第二,模型名是 jev-latest。如果你从 Vercel AI Gateway 的文档过来,会看到 typesafe-ai/jev 这种写法——那是网关自己的命名空间,直连官方端点时必须用 jev-latest 或具体版本号(jev-1.13.0 / jev-1.14.0)。

第三,criteria 的写法因题型而异。这点最容易写错:

题型criteria 的正确形态说明
noul可选,{ true: …, false: … }分别描述「算数」和「不算数」的情形
choice对象映射 { "标签": 描述 }键是选项名,值是该选项的说明
score有序数组 [ … ]从低到高排列,每档一个条目
实测坑当 score 的每个档位写成对象(带描述)而不是纯字符串时,返回的 legend 会从字符串变成对象——{"0":"极低"} 会变成 {"0":{"label":"极低", …}}。渲染代码必须同时兼容这两种形态,否则档位名会显示成 [object Object]。

关于 criteria 里的字段名:它们不是保留字

官方示例里给选项写描述时用了 what(包含什么)、not_for(不包含什么)、examples(例子)这几个键。但官方文档同时明确说了一件容易被误解的事:

官方澄清「字段名 question、focus、what、not_for、examples 都不属于 API 的一部分,也均非保留字。」

也就是说,这些是自由的 JSON key,你可以叫任何名字。模型读的是这些键下面的文本内容,不是键名本身。我用自定义键名实测过,同样能返回满分置信度。知道这一点,你就能直接把已有的 JSON schema 或分类体系整块塞进 criteria,不必套模板。

04
真实场景

社区在拿它干什么

一个只会判断的模型,能撑起多少种产品? 社区给出的答案是:五十多个开源项目,从客服到无人机。

Jev 发布后的几周内,GitHub 上涌现出一批以它为核心的开源项目。它们共同的结构是:Jev 当廉价的判断层,把决定做什么的事交给代码,把执行交给别的模型或系统。

客服与工单:把「该给谁、急不急」拆成两个问题

输入一条原始工单"再不发货我就去消协投诉"
Jev 判断两个独立问题是否需要升级?诉求是哪一类?
代码路由按概率分流高置信自动派单,低置信转人工

这不是想象。社区项目 mani-bellan/jev-apps 就是拿 Jev 做「客服路由 + 流水线故障分诊」两件事。而官方文档里的入门示例,第一句 state 就是一句真实的客服求助:"Help! My payouts have been failing for 3 days."

内容审核:判断「该不该拦」,而不是写审核意见

传统做法是让 LLM 输出「这段评论违规,因为它包含人身攻击」。但审核系统真正需要的不是理由,是一个决定和一条依据分类——该拦吗?拦的理由属于哪一类?严重程度几档?这三件事正好对应 noul + choice + score。

noul要拦吗

「兄弟你这个店我劝你别去,老板人品有问题,我朋友在里面干过,具体我也不好多说」
答:0.93(成立,送人工复核)

日志告警分诊:在几百行日志里挑出真正要叫人的那条

社区项目 jevlogs 把 Jev 接在 OpenTelemetry 采集器上,给每条日志打一个「诊断价值分」,只有分数高的才触发告警。逻辑很朴素:绝大多数日志是噪音,但用正则写不出「这条有没有诊断价值」。

拦住「嘴上说做完」的 AI Agent

这是我觉得最妙的一类用法。当 coding agent 汇报「任务已完成」,如何验证?社区项目 jev-belay 的做法是:把「任务要求」和「代码现状」一起交给 Jev,直接问——这个任务是否真的已经完成?

我用一个伪造汇报实测过:agent 声称「已完成分页和搜索功能」,但代码里看不到搜索框、接口也没有对应参数。Jev 的判定是:

真做完了?
不成立(0.03)
最主要缺口在哪?
前后端都没实现
返工量多大?
需重做主干

搜索重排:不用向量库的语义搜索

社区项目 jevsearch 用 Jev 给搜索结果打分重排,完全不用 embedding 和向量数据库。官方 cookbook 里的实测数字:重排把 top-1 准确率从 5% 提到 18%,top-10 从 38% 提到 62%。

还有这些

领域社区项目在做什么
浏览器自动化读无障碍树,判断下一步该点哪个按钮;浏览器 Agent 用它在 Google Flights 上搜航班约 7 秒完成
代码审查从一批改动里预筛出高风险的那几个,决定谁能走快速合并
文档分类SEC 10-K 财报分到 75 个行业组;税务文档分类器
数据标注系统性综述的标题/摘要初筛,海量论文按相关性过滤
PDF 检索对 PDF 抽取出的每一行给一个是非概率,实现「自然语言 Ctrl+F」
实时对抗玩游戏(超级马里奥、宝可梦、星际争霸)、控无人机、社交推理游戏里的怀疑度校准
金融风控高频交易里判断「toxic flow」与市场压力状态
模型路由先判断任务难度,再决定这次该调哪个(更贵的)模型

来源:awesome-jev-hub(58 个项目)、awesome-jev-usecases 等社区汇总,见文末参考资料。效果数字多为项目作者自报。

这些用法有什么共同点?它们都不是「需要生成内容」的任务,而是「需要做一个可解释、可路由、可审计的决定」的任务。共同结构是:判断很频繁、单次价值很低、但判断错了代价不低。这正是生成式模型最不划算、而判断模型最划算的地带。

不只是玩具:已经投产的用法

社区项目之外,有几个真实产品级的落地值得单独说:

Workday 用它做「每次击键都重新选一遍 UI 组件」——不是生成整个界面,而是从一个候选组件集里持续判断「这一刻该显示哪个」,约 300ms 完成。他们的首席 AI 官称这是把决策模型投入生产的早期案例。

Vercel 在 AI 网关上用它替换了原先的安全分类步骤,自报快了 5–18 倍。

Box 拿它做事故报告分诊,把报告分进「升级 / 观察 / 复核」三个桶。Dub 用它筛查恶意链接。工具链侧,LangChain、LangSmith、Arize AX、Pydantic AI、Vercel AI SDK 都已接入。

数字要打折看上面这些效果数字多为项目作者或公司自报,不是独立复核的结果。少数独立实测(Datadog、TinyFish 等)我已在下一章单独列出来。另外流传的「25% 财富 500 强在用 Jev」「日处理 1 万亿 token」这类规模口径,只见于公司或媒体转述,没有独立证实,我不写进结论里。
05
能力边界

到底准不准

「它判断得准吗?」——这是所有人问的第一个问题。 但更该问的是:「我怎么知道它对某一个具体答案有多大把握?」

先说结论:官方没有发布任何标准 benchmark 分数。它能承诺的不是「我准确率 95%」,而是「我给出的这个概率,在成批样本上是可信的」。这两件事完全不同。

准确率:官方给了什么,没给什么

先说清楚一件事:官方没有发布任何标准 benchmark 分数(比如 MMLU 之类),第三方评测平台也尚未收录它。所以「Jev 准确率 95%」这种句子,谁说出来都是编的。

官方唯一公开的评测,是它自己在四个决策工作流上跑的一组对照:

模型准确率单条成本延迟
Jev67.8%$0.00040.4 s
Opus 573.1%$0.176137.8 s
GPT-5.6 Terra68%$0.0310 s

来源:TypeSafe 官方工作流评测(第三方转述)。⚠️ 方法有缺陷,必须知道:参考答案是「另两个模型高思考设定的平均」,不是人工标注的 ground truth;工作流也由 TypeSafe 自建。所以这组数字只能当作量级参考,不能当准确率结论。

这组数字真正说明的是性价比的形态:Jev 落后最强的模型 5 个百分点,但便宜约 440 倍、快约 95 倍。它不打算赢在准确率上。

更有价值的第三方数据来自 CMU 的一篇独立评测(把 Jev 当作「AI 裁判」来测):

测试集Jev对照(GPT-6)
RewardBench(1500 对)92.592.5(打平)
HaluEval(3000)87.388.4(−1.1)
JudgeBench(350 对)78.693.1(−14.6)

来源:CMU《JEV-as-a-Judge》arXiv 2609.26550,2026-09-29。15 个 LLM 裁判中 Jev 排第 8。

这张表把 Jev 的能力边界画得很清楚:在「判断偏好」类任务上它和最强的模型打平,但在「需要推导结论」的任务上落后 14.6 分——差距集中在数学、代码和逻辑推理(逻辑题上它落后 27.6 分)。这与上一章「它不擅长多跳推理」是同一件事,只是换了个角度被量化。

真正让这套东西可用的是置信度:CMU 那篇论文里,用置信度做级联(τ=0.9)后,被接受的那部分判断准确率 94.7%,与 GPT-6 的 94.4% 打平——而成本是 $0.044 / 千次判断 vs GPT-6 的 $12.182,便宜约 277 倍。

Jev 的用法从来不是「用它替代强模型」,而是「用它筛掉绝大多数不需要强模型的判断」。

校准:官方唯一敢承诺的东西

官方对「校准」给了非常清楚的定义,而且这个定义值得逐字读:

官方定义被赋予 0.2 的输出,应该大约 20% 的时候发生;0.8 应该约 80% 发生;1.0 应该 100% 发生。
紧接着一句同样重要:「这些比率描述的是一批预测,不是对任何单个答案的保证。」

最后那句是关键。Jev 说某个工单「0.93 需要升级」,不是在保证这一单一定需要升级,而是在说:在你交给我的所有 0.93 的样本里,大约 93% 真的需要升级。所以正确的用法是把它当分组筛子,不是当单条判据。

它的训练方式叫 RLCD(Reinforcement Learning for Calibrated Decisions,面向校准决策的强化学习)。官方对此的表述是:训练目标是让「更高的概率对应更高的正确答案占比」。官方还顺带批评了 RLHF,说它「可能奖励谄媚和听起来自信的幻觉」,并指出「人类偏好和机器可信赖性是两个不同的优化目标」。

但校准也不是完美的。第三方在 1200 道 MMLU-Pro 上测得它的校准误差(ECE)约 0.0313;另有一个 77 例的小样本实验显示它偏过度自信约 12 个百分点(平均置信度 87.4% vs 实际准确率 75.3%)。⚠️ 后者样本量很小,只能作为方向性参考。

我实测了三条常被提起的「自洽性缺陷」

社区里流传 Jev 有几个自洽性问题:选项位置会影响结果、概率加起来不等于 1、同一问题换个题型问法答案会变。这些说法有第三方出处,值得重视。但我在自己的材料上实测,结论和传闻不完全一致,所以我如实报告:

检验项我的实测结果
互斥命题是否自洽
「只要求退款,不要发货」→ 问「要求退款?」与「要求发货?」
0.99 与 0.02,和为 1.01 ✓ 自洽
同一命题正反两问
问「是否在 9/20 提交」与「是否不是 9/20 提交」
0.98 与 0.02,和为 1.00 ✓ 自洽
换题型问同一件事
noul 问「是否要求退款」vs choice 问同一句
0.99 vs 1.00,差 0.01 ✓ 一致
选项位置敏感
把正确项在首位 / 末位各问一次
两次都选中「要货」,概率 0.99 / 1.00 ✓ 未复现位置偏见

本机实测,2026-10-16。材料均为语义明确的短文本。

但我必须说清楚我没能复现这些缺陷,不等于它们不存在。第三方报告里的位置偏见是在参考卡片这类特定结构上测出来的(正确项放开头/中间约 50%、放末尾约 88%),我的测试材料太简单、没有那一层结构。这里的诚实结论是:在语义明确的短材料上,这些自洽性问题不明显;在更复杂或有对抗性的输入上,第三方确实观测到了它们。你不能因为「我测了没问题」就假设生产环境也没问题。

中文到底行不行

官方文档里有一条对中文使用者必须正视的警告:

官方警告「英语是主要语言,也最准确。其他语言,包括 CJK 文字,可以处理,但表现不如英语。在自己的内容上测试后再依赖 Jev 处理非英语任务。」

注意官方没有给出中文的具体降幅。所以我实测了一遍——同一道题,中英各跑 6 次:

语言最大概率confidence选择结果
中文0.99 ~ 1.000.98 ~ 1.006/6 都是「要货」
English1.001.006/6 都是 "goods"

本机实测,2026-10-16。同一意图的中英文材料,同一道 choice 题各跑 6 次。

noul 类型上,明确样本重复跑 3 次的结果也很稳:「我要退款」是 0.98 / 0.98 / 0.99;「东西收到了,谢谢」是 0.02 / 0.02 / 0.02;「再不发货我就去消协投诉」是 0.98 / 0.98 / 0.98。

但这里有个更重要、也更容易被误读的区别。「判断对不对」和「它对自己的判断有多可信」是两件事。有一篇学术论文专门训练了中文版的决策模型做对照,结果是:中文场景下准确率与 Jev 接近,但 Jev 在中文上的校准误差(ECE)达到 11.45%,明显差于它在英文上的水平。

中文的问题不是「答得对不对」,而是「它报出的置信度够不够可信」。这在用置信度做自动路由时才是真正致命的。

实际含义是这样:如果你只是拿中文判断做初筛(低置信全部转人工),中文完全够用;如果你打算按置信度自动放行某些动作,中文场景的阈值要设得更保守,并且必须用自己的数据校准过。

一个补充观察我在更早的一次测试里,中文曾出现 0.74 这样的低值。事后复盘,那次的问题设计本身有歧义(选项边界重叠),而不是语言的锅。这提醒了一件事:问题设计的质量,对结果的影响远大于语言选择。
06
官方自陈

它不擅长什么

一个模型文档里最该读的部分,是它自己承认搞不定什么。官方那份「jaggedness」(能力参差)清单列了九条,我把它和实测经验合在一起讲。

它做不好的表现正确做法
算术与计数官方原话:「不是计算器」,计数不可靠算术留在代码里,别交给它
日期时间比较把日期当文本读,不当作有序量抽出分量后,用代码比较
多跳推理需要「绕一层」的任务容易出错减少推理跳数,一次只判一步
字面理解倾向照字面读,抓不住言外之意把边界写进 criteria(见下方实测)
冗余上下文state 里塞太多无关细节会拖累判断只给当前问题相关的上下文
对抗性内容默认不把内容当敌意明确写清楚,并部署前测边界样本
选项顺序偏见倾向选靠前的选项打乱顺序重跑,检查一致性
文本生成没为此训练过,强行生成会很慢要写内容就找生成式模型
互相矛盾的指令instructions 与 criteria 打架时结果不稳确保两者说的是一回事

来源:docs.typesafe.ai/model-jaggedness/jev-1.13.md(官方定性描述,原文无准确率数字)

「太字面」这条,我用一个实验量化了它

这是全文我最想让你看的一个对照。材料是一句很微妙的话,问题是「这条消息是否表达了明确投诉或不满」。

第一次,我只给了问题,没给任何判据:

noul不带判据

「还行吧,就是有点慢。」→ 0.46 (几乎五五开,模型在犹豫)

第二次,材料一个字没改,问题一个字没改,只把「什么算、什么不算」写清楚:

noul带判据

算数:明确提出投诉、索赔、曝光、追责,或表达强烈愤怒
不算数:仅描述体验、催促进度、语气平淡,未提出任何诉求
答:0.11

同一条材料,同一个问题,判断从「模棱两可」变成「明确不是」,差值 0.35。

模型之所以犹豫,多数时候不是因为它笨,而是因为你没告诉它边界在哪。

这也解释了为什么官方把「把宽判断拆成窄问题」称为整套方法论里最重要的概念:

官方金句「宽泛的问题会把好几个判断藏在一个答案背后。」
「尽你所能问最明确、最窄、最具体、最原子的问题。」

我同样实测了拆解的效果。问「这个工单是否紧急、重要,需要优先处理并升级」——一个问题里塞了三件事——得到 0.91,但你没法知道它到底在回答哪一件。拆成三个原子问题后:

客户是否明确威胁投诉、曝光或索赔?
0.98
累计消费是否显著高于平均(>5000 元)?
0.93
是否需要人工主管介入处理?
0.89

三个数,三件独立的事,可以在代码里自由组合——比如「威胁投诉 > 0.9 且 高价值 > 0.9 才升级」。那个笼统的 0.91 做不到这一点。而因为问题是并行的,拆成三个的耗时和问一个几乎一样。

「不会幻觉」这句话,别信满

Jev 常被宣传成「不会幻觉」。这句话需要拆开看。

官方说它的输出「在类型上不可证伪」——意思是输出必然落在你预设的选项集合里,不可能吐出一个你没定义过的类别。这是结构性保证,而且官方自己标注了这是「理论上的而非实测的」。

但结构性正确和事实正确是两件事。O'Reilly 的评测对这个说法有一句精准的反驳:

关键反驳「一个合法的答案,不等于一个正确的答案。」一个完全符合 schema、带着漂亮置信度的错误分类,能通过你所有的结构检查,然后安静地把工单派给错误的团队。

所以别把「输出格式永远合法」当成「判断永远正确」。它给你的是免去解析的便利,不是免去验证的许可。

07
必须知道的风险

它会被骗

如果你打算用 Jev 判断「这段内容有没有攻击性」,那攻击者会怎么做? 答案有点反直觉:他会直接在你的材料里,写一段假的判断规则。

这是我在调研里读到的最重要、也最少被提及的一类发现。Jev 的简洁设计——没有层层校验、直接读材料出判断——同时也是它的攻击面。

「伪造策略」攻击:召回率从 82.9% 掉到 3.88%

Datadog 安全实验室做了一项独立研究:把攻击者的文本当作 state 传进去,在文本里塞一段伪造的判断规则(比如伪装成系统策略的句子),看 Jev 会不会被带偏。

结果是灾难性的。在检测基准上:

指标正常情况遭遇伪造策略后
注入检测召回率82.90%3.88%(跌 79 个百分点)
Choice 题召回率85.46%9.69%
工具风险门控均值0.8930.290(跌破 0.5 阻断线)

来源:Datadog Security Labs《Jev as a judge: How counterfeit policy steers Jev》。四个数据集中有两个被完全攻陷。

第三行最值得警惕:那个 0.290 意味着,一个原本会拦截危险工具调用的门控,被攻击者用一段文本说服了「这次没关系」,于是放行。

为什么它比 LLM 更容易被骗

安全厂商 HiddenLayer 的结论更直接:Jev「在某些情况下比 LLM 更容易受攻击」。他们用了一种叫 TokenBreak 的攻击,指出它对更大的 LLM 通常无效,但「对 Jev 开箱即脆弱」。

原因在架构本身。传统 LLM 在输出前有很多层内部处理,等于有很多道偶然的校验;而 Jev 被精简成「读材料 → 直接出判断」,这个设计把那些层层校验一并去掉了。他们的演示里,一段注入的「赞助广告按钮」让浏览器 agent 偏离指令去点了恶意按钮。

必须记住不要把 Jev 当作唯一的安全闸。它可以是安全链路里的一层,但前提是:控制好它的输入从哪来。如果 state 直接来自不可信的用户内容,你就得假设那段内容里可能藏着「说服它」的指令。

官方文档其实也承认了这一点,在 jaggedness 清单里明确写着:state 里的对抗性内容默认不被视为敌意,需要精确提示并部署前测边界样本。

没有解释,也是一种代价

Jev 只给数字,不给理由。这个特性在工程上是优点(不用解析),在合规和问责上是硬伤。

需要可追溯推理链的场景——金融风控的拒贷理由、医疗判断依据、法律文书——直接出局。你拿到的只有一个浮点数,没法向任何人解释「为什么系统做了这个决定」。

Simon Willison 在介绍 Jev 时提了一个值得记住的警告:他希望没有人拿 Jev 给求职者排名。他做了个实验,让 Jev 判断「湾区哪些城市是好城市」,结果它把 Cupertino 排在最高、East Palo Alto 排在最低——一个简短的概率输出,恰好复现了数据里的社会经济偏见,却没有任何解释暴露这个过程。

一个不带解释的概率,会让人误以为它是客观的。

这类风险在传统 LLM 那里至少还留了一条痕迹——你能读到它的推理过程,从而发现「它是不是在按邮编判断人」。Jev 把这条痕迹抹掉了。

08
配置权

你能配什么,不能配什么

「我能自己调权重吗?」 不能。但你会发现,你本来就不需要。

先说最直接的答案:Jev 不支持微调,也没有按账号的权重。官方文档写得毫不含糊。

官方原话「它不会用客户数据做微调或 LoRA 适配」,并且「同一份权重服务所有账号」。

替代路径官方也讲得很明确:定制是通过请求完成的,而不是通过按账号分发的权重。也就是说,你的全部「配置权」都在请求侧:state 给什么、instructions 怎么写、criteria 的边界划在哪、问题怎么拆。

这听起来像是限制,但结合上一章那个 0.46 → 0.11 的实验看,你会发现请求侧的杠杆其实比权重更大——毕竟改权重需要标注数据、训练、部署,而改 criteria 只需要你花五分钟想清楚边界。

那你能配的是:阈值与路由

真正的「配置」发生在你的代码里:按置信度决定怎么处理。官方建议把 confidence 分三档:

高置信度
自动执行
中等置信度
谨慎处理 · 送审或让用户确认
低置信度
不要行动 · 转人工或升级给更强的模型

但这里有个必须记住的原则,官方用一句话概括:

置信度阈值不是一个数字。

也就是说,同一个系统里,不同动作该有不同的门槛。官方给的示例很能说明问题——同一个语音银行助手里:

官方示例:按风险分级设阈值Python
if action.confidence < 0.6:
    route_to_support_agent(account_id)      # 太低,一律转人
elif action.choice == "check_balance":
    show_balance(account_id)                # 只读动作,0.6 就够
elif action.choice == "approve_transfer":
    if action.confidence > 0.85:
        approve_transfer(account_id)        # 高风险 + 高置信,才自动执行
    else:
        ask_user_to_confirm(...)            # 高风险 + 中等置信,先确认

查询余额 0.6 就放行,批准转账要 0.85 还得用户确认。这就是「阈值随风险缩放」——它不该是一个全局常数。

一个判断 分数 + confidence 高置信 自动执行 中等置信 谨慎 · 送审或让用户确认 低置信 不要行动 · 转人工 不用人管 这是省下的那部分成本 多花一步 但比错了便宜 兜底路径 没有它,低置信判断会静默出错 分界线由你的 业务后果决定
图 3 · 置信度路由的三条出口。真正的配置不发生在模型里,发生在这三条线的位置。

置信度到底怎么算的(你可以自己算)

官方把公式完整公开了,这意味着你可以自己实现一套更适合业务的度量。我实测验证过这些公式,误差在 0.005 以内。

题型公式实测校验
noul不返回 confidence。想换算成同尺度用 |2p − 1|
choice(p_max − 1/n) / (1 − 1/n)n=3, p_max=0.88 → 实际 0.820,公式 0.820
scoremax(0, 1 − Σpᵢ|i−m| / MAD_unif)n=5, m=4 → 实际 0.970,公式 0.967

来源:docs.typesafe.ai/confidence.md(含官方 Python 参考实现);校验为本机实测,2026-10-16

这个定义有个容易被忽略的后果,官方专门举了例子:choice 的置信度只看最高概率,所以 (0.6, 0.3, 0.1) 和 (0.6, 0.2, 0.2) 得到的置信度完全一样(都是 0.4)。它不区分「有一个强竞争项」和「剩下的均摊」。如果你需要区分这两种情况,官方建议改用 p_max / p_second(领先幅度)。

下面这个演示可以直接动手:拖动概率滑块,看同一个分布在三种读法下算出完全不同的置信度。这正是「置信度不是最大概率」的直观体现。

交互 ① · 为什么 confidence 不等于最大概率
最大概率 p_max
—
最直白的读法
Choice 公式
—
看领先第二名多少
Score 公式
—
还看差几档

试这个把 3 档调成 0.6 / 0.3 / 0.1,记下置信度;再调成 0.6 / 0.2 / 0.2。你会发现两者完全相同——Choice 公式只看最高概率,分不出「有一个强竞争者」和「其余均摊」的区别。
09
动手

亲手跑一次

下面这个演示让你实时看到「材料 → 请求体 → 返回」三者的关系。改材料,看请求怎么变,再看真实返回。

交互 ② · 请求构造器

为什么页面上不能直接调 API

你可能会想:既然有 API Key,为什么不做成网页直接调用?我试过了,这条路被堵死——而且原因值得知道。

官方端点 api.typesafe.ai 不返回任何 CORS 头。我用一个普通网页的 Origin 做预检,直接收到:

预检请求结果HTTP
OPTIONS /v1/systemone
HTTP/2 400
vary: Origin
Disallowed CORS origin
(没有任何 access-control-allow-origin 头)

这不是配置问题,是设计选择:官方端点面向服务端调用。所以任何纯浏览器页面都无法直连它——包括这篇文章所在的站点。想让网页调通,必须有一个本地或服务端的转发层。

安全提醒顺带一句:不要把 API Key 写进网页。上面的 CORS 限制反而帮了你——它阻止了「把 Key 暴露在浏览器里」这种危险做法成为默认选项。服务端持有 Key,浏览器只跟你的服务端说话,这才是正确的架构。

本地跑通只需要两步

如果你想真的在自己机器上调用它,准备一个几十行的代理就够了。先起代理(它同时把页面和 API 放在同一个源上,绕开跨域),然后打开本地地址:

终端Shell
# 1. 把 Key 写进环境变量(不要写进代码)
export TYPESAFE_API_KEY="apikey_你的密钥"

# 2. 起一个最小转发服务(任何语言都行),然后请求它
curl -X POST http://127.0.0.1:8791/api \
  -H "Authorization: Bearer $TYPESAFE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"jev-latest","state":"再不发货我就去消协投诉",
       "questions":{"升级":{"type":"noul","instructions":"是否需要立即升级?"}}}'

官方也提供了 Python 和 JS/TS 的 SDK(pip install typesafe-sdk / @typesafe-ai/sdk),以及一个不用写代码就能试的官方 Playground。

什么时候该用它,什么时候不该

场景适合不适合
判断频率每天百万次的高频判断偶尔一次、值得深想的问题
输出形态代码要 if / 排序 / 路由要给人读的解释、报告、文案
问题性质你想得清楚要问什么你自己也不知道该问什么
任务类型分类、分流、打分、筛重、校验算术、多跳推理、创意生成
成本敏感度极敏感(输出免费,输入 $0.042/M)不在意成本、要最强能力

Jev 最有价值的时刻,是你已经知道要问什么、只是需要一个又快又便宜的答案来触发代码分支的时候。

反过来说,如果你还没想清楚要判断什么——那就先用会聊天的模型把问题聊清楚。这两类模型不竞争,它们分工。

成本输入 $0.042 / 百万 token,输出免费。实测一个工单场景(3 个问题)输入约 529 token,单次成本约 $0.000022——不到十万分之二美元。加上判据描述后约 1218 token,翻一倍,仍然可忽略。
··

参考资料

技术事实与数字核实于 2026-10-16;其中标注「本机实测」的数据来自对官方端点的真实调用。模型仍在快速迭代,规格以官方文档为准。

按 ↑ ↓ 阅读 · 右上角 ◐ 切换深浅色 · STUDY · 技术解剖