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

9 月 18 日,Convai Innovations 的 Nandakishor Mukkunnoth 把 Laya 直接开源了,Apache 2.0,pip install laya 就能装。三天前 TypeSafe 刚发布闭源的 Jev,社区立刻给 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 做选择题这么亏

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

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

慢在四个地方:

  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,加几个类型化问题,一次前向全部答完,只返回数字。

scss 复制代码
state(邮件/工单/JSON) + questions(choice/score/noul)
        |
[CLS] question [SEP] [MASK]选项1 [MASK]选项2 ... [SEP] state [SEP]
        |
ModernBERT-large 编码器(395M, 28层双向注意力)
        |
决策头(~25M, 2层 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 的接口几乎一一对应,迁移成本很低。

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

bash 复制代码
pip install laya
python 复制代码
from laya import Router

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

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-large 421M 512 英文分诊、 guardrail
laya-multilingual mmBERT-base, 256k 词表 322M 1024 100+ 语言,快 2.2 倍
laya-typed-decisions ModernBERT-large 421M 1024 四个 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 怎么读
单问题 p50 32.8ms, T4 本地 236-276ms, 第三方实测 7.8 倍主要是省了云端往返,不是智商差距
10 问题 batch 72.3ms 共计(7.2ms/个) 约 1500ms 串行 本地 batch 并行打怪物场景优势大
typed-decisions 准确率 0.766 微调版,base 只有 0.362 0.727 Laya 高分是拿 benchmark 训练集训出来的,base 连多数类基线 0.461 都没过
AG News 4 分类 0.950 0.910 窄分类是 Laya 舒适区
Banking77(77 标签) 0.425 0.870 选项超 20 个 Laya 断崖,Jev 支持到 255
校准误差 ECE 0.081(temperature 重拟合后),裸奔 0.466 0.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 支持只下子目录。

bash 复制代码
pip install laya
python 复制代码
state = {
    "message": "I was charged twice for order A-104. Please refund the duplicate.",
    "order": {"charges": [49, 49]},
}

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

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

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

python 复制代码
dept = answers["department"]
if dept["confidence"] >= 0.9:
    route_to_team(dept["choice"])
elif dept["confidence"] >= 0.6:
    review_with_llm(state, dept)
else:
    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 这种浮动别名,否则阈值会悄悄失效:

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

八、局限与展望 + 总结

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

  • 零样本弱: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

相关推荐
IT_陈寒1 小时前
React组件意外更新的罪魁祸首,我排查了这一整天
前端·人工智能·后端
Csvn1 小时前
React 渲染与 Fiber:从同步递归到可中断的并发渲染
前端
子兮曰1 小时前
1.3亿月活还不够,DeepSeek这次直接把饭碗端走了
前端·后端·aigc
知守观1 小时前
我用 Executors 创建线程池,被阿里规约第一页打了脸——老项目并发踩坑实录
后端
卷无止境1 小时前
前沿部署工程师:当代码写到客户的办公室里
后端·python
lizhongxuan1 小时前
Agent Sandbox:Firecracker 运行路径与安全边界
后端
计算机魔术师1 小时前
澳大利亚将调查OpenAI模型入侵政府医疗网站是否违法
前端
海岳云舟1 小时前
简易规则引擎 easy-rules
后端
福兮说1 小时前
Go 解析邮件的三个坑:GBK 标题、QP 正文,以及 NextPart 偷偷帮你做的事
后端·go