Laya 深度解析:421M 开源决策模型硬刚 Jev,33ms 背后藏了啥

文章来源声明: 原文作者:iDao技术魔方; 来源站点:掘金; 原文链接:https://juejin.cn/post/7689001132435603456; 本文基于上述来源整理/加工,觅优补充点评,仅供技术学习交流。版权归原作者所有。
觅优短评

适合高并发、可枚举的小决策场景,如路由、分诊、护栏,本地部署延迟与成本优势明显。但别当通用 LLM 用,上生产前需评估标注数据,英文版别硬扛多语言流量。

9 月 18 日,Convai Innovations 的 Nandakishor Mukkunnoth 把 [Laya](https://link.juejin.cn?target=https%3A%2F%2Fgithub.com%2FNandhaKishorM%2Flaya "https://github.com/NandhaKishorM/laya") 直接开源了,Apache 2.0,`pip install laya` 就能装。三天前 TypeSafe 刚发布闭源的 [Jev](https://link.juejin.cn?target=https%3A%2F%2Fdocs.typesafe.ai%2Fintroduction "https://docs.typesafe.ai/introduction"),社区立刻给 Laya 贴了个标签:"开源版 Jev"。

我翻了下两边的文档和 HN 讨论,数据确实炸:Laya 英文版 421M 参数,T4 上单问题 p50 只用 32.8ms,官方说比 Jev 快 7.8 倍;GitHub 三天破 6000 star,HN 主帖冲过 1300 分。口号也硬:"decisions, not text"。

本文回答三个问题:Laya 到底是怎么做到不生成文本也能做决策的?它和 Jev 的差距是架构差距还是部署差距?以及 0.766 这个准确率数字能不能信。

先给结论:Laya 快的本质是把 LLM 的"写作文"环节整个砍掉,换成编码器一次前向打分。便宜和可私有部署是真的,零样本能力弱也是真的。它是个等你微调的底座,不是下载即用的神仙。


一、为啥拿 LLM 做选择题这么亏

先讲旧链路,大家都有体感。日常写法是这样的:

resp = llm.chat(<span>"下面这封邮件是钓鱼吗?只回 JSON:{\"phishing\": true/false}"</span>)
data = json.loads(resp.text)  <span># 祈祷格式没炸</span>

慢在四个地方:

  1. 为 1 bit 信息跑一遍大模型:路由、分诊、拦截这种小事也要走 500-2000ms 的自回归生成。
  2. 输出还要二次解析:JSON 炸了就重试,多写一句解释就得加规则清洗。
  3. 选项一多就飘:77 个意图里模型能给你造出第 78 个,类型安全全靠 prompt 约束。
  4. 置信度是演出来的:LLM 嘴上说 "confidence": 0.95,那只是听起来自信的 token,没有任何统计校准。

jev-ultrafast 那篇我拆过,browser-use 团队已经证明瓶颈在工程不在智能。Laya 和 Jev 走得更远:这种可枚举的决策,压根不该经过文本生成。


二、总体架构:一句话讲清

Laya 的定义我翻译一下:给一段 state,加几个类型化问题,一次前向全部答完,只返回数字。

<span>state</span>(邮件/工单/JSON) + <span>questions</span>(choice/score/noul)
        |
<span>[CLS]</span> question <span>[SEP]</span> <span>[MASK]</span>选项<span>1</span> <span>[MASK]</span>选项<span>2</span> ... <span>[SEP]</span> state <span>[SEP]</span>
        |
ModernBERT-large 编码器(<span>395</span>M, <span>28</span>层双向注意力)
        |
决策头(~<span>25</span>M, <span>2</span>层 Transformer)
  |- Option scorer: 每个[MASK]位置 hidden state -> logit -> softmax
  |- Act/Escalate 门: [CLS] + 分布统计 -> 自动执行还是上交人工
        |
choice/score/noul + probabilities + confidence

三个原语覆盖了日常大部分"小决策":

  • choice:多选一,返回每个选项的概率和置信度。工单路由、意图识别、工具选择都用它。
  • score:有序打分,比如 0-3 的紧急度。返回期望分数加各档分布。
  • noul:是或否,直接返回 P(true),0 到 1 之间。钓鱼、越狱、退款意图都走这个。

关键洞察就一句:选项在请求时才定义,权重不用动。换一套 criteria 就换了个任务,不用重新训练。这点和 Jev 的接口几乎一一对应,迁移成本很低。

我试了一下它的快速上手,确实是开箱能跑的形状:

pip install laya

<span>from</span> laya <span>import</span> Router

router = Router(preload=<span>True</span>)
out = router.predict(state, questions)[<span>"answers"</span>]

preload=True 这个参数别省,后面讲 Router 那节会说,不开的话切语言能卡你 7-10 秒。


三、源码级拆解一:编码器加决策头

Laya 没搞新架构,胜在拼得老实。以英文主检查点为例,总共 421M:

  • ModernBERT-large 占 395M:28 层双向注意力,负责把 state 和问题选项一次性读完。非自回归是这里的关键,自回归是一个 token 一个 token 往外挤,它是一眼看完全文再打分。
  • 决策头约 25M:2 层 Transformer,干两件事。Option scorer 把每个选项前那个 [MASK] 的 hidden state 抽出来算 logit,再做 temperature 缩放加 softmax;Act/Escalate 头看 [CLS] 和分布的离散程度,学一个"拿不准就上交"的门控。

同一个 state 的多个问题会拼成一个 batch,一次前向全算完。Jev 那边的 speculative fan-out 是一次请求问完 operation 加 target,Laya 是一次前向答完 N 个问题,思路是同构的。

训练这块是 Laya 最值得抄的。它用的 RLCD(reinforcement learning against strictly proper scoring rules),名字和 Jev 撞了,但 Laya 把实现公开了:logarithmic 加 spherical 加 ranked probability 三种 proper scoring rule 混起来当 reward,用 GRPO 风格的 group-baseline policy gradient 训,全程不用交叉熵。

Nandakishor 有句话说得很狠:"Naive RL maximizes accuracy by destroying calibration"。直译就是只优化准确率会把模型训成"自信的错"。proper scoring rule 只有当上报概率等于真实概率时期望 reward 最高,模型想拿高分就得诚实。这套东西是可验证的设计,不是 slogan。

Act/Escalate 头的 cost 矩阵也写得很实在:做对加 1,做错扣 3,上交扣 0.5。算一下就知道模型只有当正确率超过 62.5% 时才敢自动执行,剩下全上交。这比拍脑袋定阈值聪明。

人话总结:编码器负责读懂,决策头负责认怂,训练负责让认怂有利可图。


四、源码级拆解二:Router 和三检查点

"Laya"其实是一家三口,都在 convaiinnovations/laya 这一个 Hugging Face 仓库下:

检查点底座参数默认上下文用途
`laya`ModernBERT-large421M512英文分诊、 guardrail
`laya-multilingual`mmBERT-base, 256k 词表322M1024100+ 语言,快 2.2 倍
`laya-typed-decisions`ModernBERT-large421M1024四个 workflow 微调版,0.766 就是它考的

Router 是个纯 Python 的小模块,干的事很专:在前向之前花不到 0.5ms 看 Unicode script,22 种字母表,命中非拉丁直接切多语言版。

为啥必须有它?我看到的翻车数据是真吓人:英文版在 51 语言 MASSIVE 评测里,Khmer 准确率 0.000,置信度 0.952,平均置信度全程没掉下过 0.885。阈值 gating 在这种"自信的文盲"面前完全失效,只能靠前置路由躲开。

生产注意两件事:英文版默认 512 tokens,state 只剩 320 左右,一封长邮件刚够,一个工单串就不够了;多语言和 specialist 版是 1024,state 约 768。编码器上限能拉到 8192,但延迟和质量得自己验。还有 Router(preload=True) 常驻内存,不然中英文流量一切换就是一次 7-10 秒的冷加载。

人话总结:别把英文版往多语言流量上硬怼,Router 不是优化是保命。


五、优化对照表:数字都要有出处

下面这张表是 Laya 官方 README 里对 Jev 1.13.0 的比较,我逐项标了口径。Jev 那列作者自己也承认没调过 TypeSafe API,全是第三方公开数据拼的。

维度Laya(路由后)Jev 1.13.0怎么读
单问题 p5032.8ms, T4 本地236-276ms, 第三方实测7.8 倍主要是省了云端往返,不是智商差距
10 问题 batch72.3ms 共计(7.2ms/个)约 1500ms 串行本地 batch 并行打怪物场景优势大
typed-decisions 准确率0.766 微调版,base 只有 0.3620.727Laya 高分是拿 benchmark 训练集训出来的,base 连多数类基线 0.461 都没过
AG News 4 分类0.9500.910窄分类是 Laya 舒适区
Banking77(77 标签)0.4250.870选项超 20 个 Laya 断崖,Jev 支持到 255
校准误差 ECE0.081(temperature 重拟合后),裸奔 0.4660.246不做校准别信它的 confidence
多语言可用51 测 45 可用无公开数据英文之外无脑选 Laya 多语言版
成本自托管 $0$0.042/百万输入 token月 4000 万次决策 Jev 才 1.34 美元,省钱通常不是选 Laya 的理由

社区实测补了两块拼图。Snake 同逻辑对打:本地 421M Laya 平均 86.5 次决策每秒,p50 约 9ms;云端 Jev 只有 3.2 次每秒,往返约 317ms。M5 Pro 上 15.3ms 对 298.1ms,差出近 20 倍。还有个 laya-mlx 移植到 Apple Silicon,M3 Max 跑到每秒 60 次,内存只吃 1GB 上下。

workflow 明细也值得记:邮件 spam 0.993,钓鱼 0.980,jailbreak/guardrail 0.755-0.762(50% 覆盖下 selective 0.931),RAG 相关性 0.657,10 路工单路由 0.522。二值安全任务很顶,越宽越模糊越要靠微调。


六、证据与诚实:0.766 到底含了多少水分

这节必须较真,因为传播时最容易丢的就是限定条件。

先说 Laya 这边怎么测的。延迟是 T4 单卡自测,Jev 那列是第三方公开值,两边没在同一链路跑过,样本量和 prompt 都不一样。0.766 出自 laya-typed-decisions,训过 benchmark 自己的训练集,base 双检查点裸分 0.34-0.36,随机基线 0.318。模型卡自己写得明白:"a fast base to specialise, not a zero-shot decision engine"。HN 最高赞批评一针见血:要微调才好使,那就和 Jev 不是一个品类了。

校准那 0.081 也是拟合出来的,裸 ECE 是 0.466,多语言版出厂根本没带拟合好的 temperature。同一 benchmark 下 specialist 的 ECE 是 0.213,反而比 Jev 的 0.144 差;soft accuracy Jev 0.580 对 Laya 0.471,Jev 的分布更贴参考答案。当然 Jev 也不干净,DAIR Emotion 上 16% 样本给真 label 概率 0,分支逻辑遇到这种直接暴毙。

再说我自己在 CPU VPS 上的体感(引自 Flowtivity 的复现,4 核 7GB 无 GPU):import 26 秒,808MB 检查点下载加加载 675 秒,冷 predict 85.4 秒,热 predict 中位 49.4 秒。官方文档写的健康 CPU 是 193-464ms,我这台属于地板中的地板。结论很直白:没 GPU 的 Laya 是批处理工具,不是请求链路,交互场景至少准备一块 T4。

Jev 那边 marketing 数字也要打折。"193.6 倍快、444.6 倍便宜"出自 TypeSafe 自家四个 workflow,参考答案是 GPT-6 Astra 和 Fable 5.1 取平均,官方自己都说这是上限。第三方 AY Automate 实测是快 2-3.6 倍,便宜 4.7-7.5 倍(对小模型),只有对最贵的前沿模型才到 40-49 倍。

一句话:两边的 headline 数字都是真的,也都是挑过的。Laya 赢速度成本开放,Jev 赢零样本宽选项长上下文,准确率那行得看你有没有标注数据。


七、上手实操:先跑起来,再谈微调

环境要 Python 3.10 以上。英文版约 808MB,别全量拉 2.5GB,SDK 支持只下子目录。

pip install laya

state = {
    <span>"message"</span>: <span>"I was charged twice for order A-104. Please refund the duplicate."</span>,
    <span>"order"</span>: {<span>"charges"</span>: [<span>49</span>, <span>49</span>]},
}

questions = {
    <span>"department"</span>: {
        <span>"type"</span>: <span>"choice"</span>,
        <span>"instructions"</span>: <span>"Which team should handle this request?"</span>,
        <span>"criteria"</span>: {
            <span>"billing"</span>: <span>"Payments, invoices, and refunds"</span>,
            <span>"technical"</span>: <span>"Bugs and integrations"</span>,
            <span>"account"</span>: <span>"Account access and profile issues"</span>,
        },
    },
    <span>"urgency"</span>: {
        <span>"type"</span>: <span>"score"</span>,
        <span>"instructions"</span>: <span>"How urgent is this request?"</span>,
        <span>"criteria"</span>: [<span>"Not urgent"</span>, <span>"Soon"</span>, <span>"Critical or blocking"</span>],
    },
    <span>"refund_requested"</span>: {
        <span>"type"</span>: <span>"noul"</span>,
        <span>"instructions"</span>: <span>"Does the message request a refund?"</span>,
    },
}

<span>from</span> laya <span>import</span> Router
router = Router(preload=<span>True</span>)
answers = router.predict(state, questions)[<span>"answers"</span>]

置信度分三档走,这是决策模型真正的用法:

dept = answers[<span>"department"</span>]
<span>if</span> dept[<span>"confidence"</span>] >= <span>0.9</span>:
    route_to_team(dept[<span>"choice"</span>])
<span>elif</span> dept[<span>"confidence"</span>] >= <span>0.6</span>:
    review_with_llm(state, dept)
<span>else</span>:
    send_to_human(state)

0.9 和 0.6 只是示意,阈值必须拿自己的数据重标。微调走官方 Kaggle notebook,两块免费 T4 约 4-5 小时跑完 3 万 question、4 个 epoch。选项超过 20 个先做向量召回 predict_shortlist 粗筛,或者拆成粗排加细排。长文本先 chunk 或摘要,512/1024 的窗放不下工单串。

Jev 那边对等的调用长这样,方便你做双跑对比。注意 pin 死版本,别用 jev-latest 这种浮动别名,否则阈值会悄悄失效:

<span>import</span> os, requests
resp = requests.post(
    <span>"https://api.typesafe.ai/v1/systemone"</span>,
    headers={<span>"Authorization"</span>: <span>f"Bearer <span>{os.environ[<span>'TYPESAFE_API_KEY'</span>]}</span>"</span>},
    json={<span>"model"</span>: <span>"jev-1.13.0"</span>, <span>"state"</span>: state, <span>"questions"</span>: questions},
    timeout=<span>5</span>,
)
resp.raise_for_status()
answers = resp.json()[<span>"answers"</span>]


八、局限与展望 + 总结

局限先摊开说,都是项目自己承认的:

  • 零样本弱:base 约 0.35,没有标注数据就别上生产。
  • 上下文短:512/1024 默认窗,长线程、合同、agent trace 得先处理。
  • 宽选项崩:77 标签直接掉到 0.425,得加召回或分层。
  • 校准是活不是属性:temperature 必须在自己分布上重拟合。
  • score 最弱:SST-5 五级情感只有 0.372。
  • 争议:Nandakishor 说核心想法来自他 2025 年 3 月 arXiv:2503.23303 和 9 月 arXiv:2510.01237,Jev 没发论文没开权重。这事谁先谁后不影响你选型,权重能下载才是实的。

展望三条线:

  1. 本地专才爆发:CUA-S1 之前已经证明 706k 参数能吃掉表单场景,von 做到 sub-15ms。通用云端加大模型加本地窄专才的混合部署会越来越多。
  2. 分类网关标配:凡是可枚举的决策,用 Choice/Score/Noul 代替一次 LLM 调用,半美分量级的成本,值得每个 agent 都接一个。
  3. 测量诚实度内卷:敢写清样本量、时钟边界、p 值的项目反而稀缺,Laya 模型卡那句"base 待微调"比 0.766 本身更有价值。

总结 5 条能抄的作业:

  • 可枚举决策别走文本生成,一次前向打分又快又便宜。
  • 校准比准确率高一度重要,能进 if 的概率才有生产价值。
  • 不会认怂的模型不如会 escalate 的,62.5% 那条线可以直接抄。
  • 多语言先做 script 路由,别信英文模型的自信。
  • 云端通用和本地专才别二选一,薄接口隔开,Jev 开局沉淀数据,Laya 微调接管高频。

最后一句:瓶颈早就不在模型智不智能,而在你愿不愿意为几千条标注和一次校准花一个下午。


常见问答 FAQ

Q1:Laya 和 Jev 到底是啥关系?

两者是同类竞品,都是 System One 决策模型。Jev 是 TypeSafe 的闭源云 API,开箱即用;Laya 是 Convai 的 Apache 2.0 开源实现,本地可跑可微调,接口几乎兼容。

Q2:Laya 真的比 Jev 快 7.8 倍吗?

只在特定口径下成立。Laya 单问题 T4 本地推理 32.8ms,Jev 云端往返 236-276ms。这个差距主要是本地推理省掉了网络开销,单票据路由这种低频场景体感不大。

Q3:下载下来就能直接用吗?

能跑,但别指望零样本封神。base 检查点在 typed-decisions 上只有 0.362,接近随机猜。想打到 0.766 必须用自己的标注数据微调,再做 temperature 校准。

Q4:77 个选项的大分类能用 Laya 吗?

目前很吃力。Banking77 上 Laya 只有 0.425,Jev 有 0.870。选项超过 20 个就建议加 head_max_len、向量召回先筛一轮,或者拆成粗排加细排两级。

Q5:中文和多语言靠谱吗?

比 Jev 强,但要用对检查点。英文版在 Khmer 这类非拉丁脚本上出现过 0 准确率配 0.952 置信度的翻车,必须开 Router 自动切到 322M 多语言版,45/51 语言可用。


原创技术博客 · 开源项目分享 · AI全栈创作社区 idao.fun