TypeSafe 在 9 月 15 日发了 Jev,说它是一类新模型:不是语言模型,不输出文本,输入一段状态加一组类型化的问题,一次并行返回带校准概率的答案。
我花了两天把它接进 VOLO 真正会用它的地方,跑了大约一千五百次调用。结论是它配得上接进来,但这篇值钱的部分不是这个结论,是我连着踩的几个坑——其中四个是同一个形状。
关于数字:标了「我量的」是我自己跑出来的,一次运行、一个模型(jev-latest)、一条通道;标了「官方」的来自 TypeSafe 文档;标了别人名字的是第三方。我和 TypeSafe 没有任何关系,API 是自己付费的。
它是什么
三种问题,一次调用可以问十几个,加问题几乎不增加耗时。
| 类型 | 你给什么 | 它还什么 |
|---|---|---|
noul |
一句是非陈述 | 这句为真的概率,0 到 1 |
choice |
最多 255 个选项,每个带描述 | 选中的那个 + 每项概率 + 置信度 |
score |
2 到 10 级有序量表 | 一个连续分 + 概率分布 + 置信度 |
curl https://api.typesafe.ai/v1/systemone \
-H "Authorization: Bearer $TYPESAFE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "jev-latest",
"state": "部署失败两次,客户看到 500",
"questions": {
"urgent": { "type": "noul", "instructions": "这需要立刻处理吗?" },
"area": { "type": "choice", "instructions": "归哪个组?",
"criteria": { "infra": "基础设施与部署",
"app": "应用代码",
"unknown": "文本没说清楚" } },
"severity": { "type": "score", "instructions": "严重程度",
"criteria": ["只影响内部", "部分用户可见", "全量用户可见"] }
}
}'
我量的:第一次调用 HTTP 200,0.84 秒,436 个输入 token。官方:端到端 70 到 500 毫秒,输入每百万 token 0.042 美元,输出不计费。也可以走 Cloudflare Workers AI、OpenRouter、Vercel AI Gateway。
有一件事要先说清楚:它宣传的「零幻觉」只指答案一定落在你给的选项里,不指答对。这两件事差得很远,而下面大半篇都在说这个差距里发生了什么。
它适合什么
判据比清单有用。一句话:把一堆东西分进几个你事先定好的格子,而且你需要知道它有多确定。
同时满足这三条,大概率适合:
- 输出空间是封闭的,你能事先把选项列全,包括「都不是」;
- 这个判断要高频重复,一天几百次到几百万次;
- 你需要一个能拿来路由的数字——高置信自动做,中置信反问,低置信交给人。
具体的活大概是这几类。
路由:工单、邮件、告警分到哪个队列;意图识别之后决定走确定性代码、走专门的大模型、还是走人;模型路由,这一轮该用便宜的还是贵的。
检索:RAG 里每一段先判一下跟问题相不相关再塞进上下文;embedding 出候选之后逐对重排;核查某句话到底有没有被它引的那份材料支持。
安全与质量:给大模型的输入输出做守门;把团队规范变成一堆是非题放进 CI,用结果给 PR 加批注——注意是加批注,别让它直接改。
数据与运营:结构化抽取之后的校验(抽取交给别的东西,选哪个交给它);线索、供应商、候选人打分,各维度分开打、权重写在你自己代码里;大类目分类分两段,先粗后细。
我自己用的两处:多语言的岗位名解析,以及每天几百条线索的初筛。
场景清单部分参考了社区整理的 awesome-jev 和官方文档的 Patterns 一节,我只实跑了最后两类。
一个不是我测的数:Langfuse 写了怎么把它接进评测链路,并引用 Good Start Labs 的测试——Jev 与 Claude Fable 5.1 的判定一致率 91.5%,成本是每百万条评测 160 美元对 33,000 美元。评测的是「跟另一个模型一致」,不是「跟事实一致」,这点他们自己也写了。
我量出来的
岗位名解析:Jev 45/53,我那套手写规则 35/53。
53 个用例,六门语言,其中十几个是我自己历史上踩过的 bug。这个比分不对称:手写规则是为中英文写的,测试用例又来自它自己的 bug 史,所以它是主场作战还输了。
真正让我决定用它的不是比分,是置信度和对错分得开:中文里它答错的三条(「司机」0.39、「分析师」0.49、「经理」0.62)正是全表置信度最低的三个,答对的那些均值 0.95。这意味着阈值路由可行。
证据分拣:高置信全对,答错的全在低置信。
10 条真实条目,每条都有我此前的人工判决。stage 分类答对的置信度是 0.99、0.96、0.91、0.85、0.84;答错的是 0.35、0.38、0.39。
这就是校准该有的样子。一个模型答错不可怕,可怕的是它答错时和答对时一样自信。
最漂亮的一项是「说不出来」:我在选项里显式放了一个 cannot_tell,两条纯噪音都以 0.85、0.84 选了它。
成本:每条分拣约 1,100 个输入 token,每天 200 条约 0.009 美元。四门语言 1,440 条词表全过一遍,0 次调用失败。
坑
同一个模型、同一批数据,措辞不同是 2/10 和 10/10
这是这两天最贵的一个数。我把「这条线索相关吗」这道闸,三种写法并行问在同一次调用里。
| 措辞 | 答对 |
|---|---|
| v1「是否讲了一件 AI 改变了人的工作的具体事」 | 2/10 |
| v2「是否有一件具体、可核对的事实,与 AI 在工作场所的使用、采用、定价、监管、测量有关」 | 10/10 |
| v3「研究者值不值得打开原件读一遍」 | 3/10 |
v1 把我自己数据库里已经收录的三条记录判成不相关:Figma 的 10-Q 给了 0.14,Eurostat 的用途统计 0.06,韩国 AI 基本法条文 0.09。
我当时已经准备写「它认不出我们这类证据」了。
问题在我。「改变了人的工作」这句话,在那三份原件里一个字都没有——Figma 说的是给 AI 用量计费,Eurostat 说的是企业用途占比,韩国法条说的是人要监督。
它按字面读。这是官方文档里明写的第一条,我读过,然后还是先怀疑了模型。
接一个分类器,工作量不在调用,在措辞;而措辞的对错只能拿一批你已经知道答案的数据去撞。
我问的根本不是我要的那个问题
第二天用它验收一批多语言词表时又来了一次,而且更彻底。
我问的是:「一个母语者会不会把这个词理解成同一个岗位?」387 条挑出 160 条。抽看之后发现挑出来的几乎全是对的别名——日语里「簿記」是领域不是职称,「法務部」是律师待的地方不是律师本身,「マーケティング」是学科名。
别名按定义就不是同义词。它是「干这行的人会打进搜索框的那个词」。
换成我系统自己那道题——打这个词的人该落到哪一页——387 条挑出 1 条。
从 160 到 1,模型没变,数据没变,只换了一句话。
先问清楚你的系统实际在做哪道判断,然后把那道判断原样交给它。不要把它翻译成一个听起来更通用的问题。
已经知道的事不要问它
我在分拣里加了一格「发布方是不是当事方」,用来初判一手还是二手。全表不准:韩国法条 0.39,厚生劳动省报告 0.48,Eurostat 0.71。
原因不在模型——我只给了它正文,没给它发布方是谁。而我的管线里每个来源都写死了发布方和层级,这件事我本来就知道。
每问一格已经知道的事,都是给一个已知事实增加一次出错的机会。
「都不是」必须是一个显式选项
我给它 84 个职业让它选。不加第 85 个选项,它就必须从 84 个里挑一个。
加上「以上都不是」之后,「宇航员」「驯兽师」都以 1.00 的置信度选了它。
这条后来发现官方文档里也写了(It cannot abstain),我是先踩了才回去看见的。对我格外要紧:错配比不匹配更坏——「我们没覆盖这个」会被用户看见并说出来,一个错误的匹配不会。
置信度只能用来路由,不能上页面
这条是产品判断,不是技术判断,但它比技术判断更容易出事。
那个 0 到 1 的数字看起来太像一个分数了。VOLO 有一条铁律是不给任何职业打分——「答完五个问题,得到你的失业风险分」是这个产品存在意义的反面。所以置信度只进路由逻辑,一个字节都不渲染到页面上。
三次运行写同一个文件名
四门语言的验收报告我图省事写成了同一个路径。跑完一看,只有最后一门的结果在。而覆盖是无声的:日志里每一门都打印「检查 352 条」,看起来三份都在。
我这个仓库此前栽过三次「失败与空集不可区分」,其中一次是 timeout 命令在这台 Mac 上不存在,它失败后留下的 37 字节文件被读成了「零爬虫流量」。这次是新的一种:结果与结果不可区分。
任何会被反复运行的脚本,输出文件名里要带上它是哪一次运行的那个变量。
最大的收获来自对照组,不是来自模型
为了给 Jev 造一个对照组,我实跑了手写规则在六门语言下的表现,于是撞出了一个真实的生产缺陷。
我们的别名字段是 string[] 而不是多语言类型,六门语言共用同一张中英别名表,而所有数译文的守卫都诚实地报着「5,758/5,758 全齐」——因为一个没被声明成多语言的字段,遍历器根本看不见它。
实测十个真实岗位名:
| 中 | 英 | 葡 | 西 | 法 | 日 | |
|---|---|---|---|---|---|---|
| 修之前 | 10 | 9 | 9 | 8 | 7 | 6 |
| 修之后 | 10 | 10 | 10 | 10 | 10 | 10 |
日语站那个输入框的占位符写着「例:経理、公認会計士、グラフィックデザイナー」。在那之前,我们自己举的三个例子,我们自己一个都解析不了。
后来 Jev 的验收又顺出了第二个:判断「这句话说的是专业还是职业」的那条正则写死了中英文,于是 estudio marketing、estudo marketing、j'étudie le marketing 全落到职业页——一个学生说自己在读市场营销,我们回他一张「市场营销专员的工作正在怎么变」。
给一个新工具造对照组的成本,经常会被对照组本身还回来。
官方自己承认的
这一点值得单独说:TypeSafe 自己发了一页叫 model jaggedness,写清楚模型在哪里不可靠。在这个行业里,厂商主动公布自家模型的弱点是少见的,而且它写得很具体。
| 弱点 | 意思 |
|---|---|
| 按字面读 | 「回答你写下的那个问题,不是你想问的那个」 |
| 算术 | 「不是一个计算器」;数数不可靠,判断两个数接不接近也不可靠 |
| 数值表示 | 十六进制比英文名字表现更差 |
| 日期时间 | 「把日期当文本读,不当有序量读」 |
| 多跳 | 双重否定、绕弯的指代、需要好几步推理的,准确率掉 |
| 无关内容 | 状态越大越杂,准确率越低 |
| 对抗内容 | 它默认不把输入当敌意的 |
| 指令与选项打架 | instructions 和 criteria 说的不是一件事时,它会乱 |
| 生成 | 硬让它生成「效果不好而且非常慢」 |
其中「对抗内容」那条对做守门用途的人是硬约束:不要把它当作对抗性输入的最后一道防线。
还有两条值得知道的。它不生成文本,所以一个评测打了低分,它给不出任何解释——要解释就得另外接一个模型,这会把成本优势吃掉一部分。以及官方指引写着「English is the primary language; test non-English workloads on representative data」,我六门语言的实测里没看到明显劣化,但那是一次运行,不构成反驳。
什么时候不要用它
要它写东西不行,它不产生文本。算数、比日期、判断两个数接不接近,官方自己说不行。开放式问题不行,选项必须你事先给全。对抗性输入的最后一道防线不要交给它。
最后:它的置信度是「这段文字像不像」,不是「这件事是不是真的」。
我自己的边界写得更硬一点:任何会写进 VOLO 判断层的路径都不给它。它只能提议,人来核实。这不是对它不放心,是因为那个产品的承诺就是每条判断可追溯到具名的人。
最后一件事
这两天我踩的四个坑,形状是同一个:我先想出一个听起来对的判据,然后不去校准就用它。
「这次一定又是措辞问题」「这个别名该被拒」「日志里没有就是没有」——每一条单独看都像洞察,而一条自己总结出来的规律,在被校准之前和偏见没有区别。
四次的解药都一样:去看已有的那一批实际长什么样,再决定。
这句话对用 Jev 有用,对不用 Jev 也一样有用。