← 全部文章← All writing

AI 战略

接一个分类器,工作量不在调用,在措辞

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。

有一件事要先说清楚:它宣传的「零幻觉」只指答案一定落在你给的选项里,不指答对。这两件事差得很远,而下面大半篇都在说这个差距里发生了什么。

它适合什么

判据比清单有用。一句话:把一堆东西分进几个你事先定好的格子,而且你需要知道它有多确定。

同时满足这三条,大概率适合:

  1. 输出空间是封闭的,你能事先把选项列全,包括「都不是」;
  2. 这个判断要高频重复,一天几百次到几百万次;
  3. 你需要一个能拿来路由的数字——高置信自动做,中置信反问,低置信交给人。

具体的活大概是这几类。

路由:工单、邮件、告警分到哪个队列;意图识别之后决定走确定性代码、走专门的大模型、还是走人;模型路由,这一轮该用便宜的还是贵的。

检索: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 也一样有用。