人工智能领域正涌现出一类新型架构:非自回归(Non-Autoregressive)模型。与生成文本的大语言模型不同,这类模型专注于即时、精准的反射式决策。
近期,由 OpenAI ChatGPT 联合发明人 Diogo Almeida 创立的资金充足实验室 TypeSafe AI 推出了名为 Jev 的商业产品。Jev 采用 RLCD(Reinforcement Learning for Calibrated Decisions,用于校准决策的强化学习)技术,在垂直销售对话中输出逐次转换轨迹,每百万输入代币收费 0.042 美元,典型响应时间约为 150 毫秒。然而,Jev 并未公开技术文档、模型权重或训练数据集。

针对这一现状,开发者 Nandha Kishor M 发布了完全开源的系统 Laya。Laya 基于该团队此前在 arXiv (2503.23303, 2510.01237) 发表的研究成果构建,旨在提供一个开放、横向的系统 1 级决策模型家族。由于建立在双向编码器之上,Laya 在单个 GPU 上运行仅需 32.8 毫秒(批量处理时 7.2 毫秒/问题),速度比 Jev 快 6 到 8 倍,并支持 100 多种语言。
核心机制:系统 1 与系统 2 的分野
现代 AI 管道存在显著瓶颈:使用生成式 LLM 处理简单的反射性决策任务。例如,当客户支持工单到达、电子邮件进入收件箱或用户提交 API 提示时,系统需要判断:
- 工单应分配至哪个部门?
- 邮件是钓鱼攻击还是垃圾邮件?
- 提示词是否包含越狱或注入指令?
- 问题的紧迫程度等级(0-3)是多少?
- 查询需要代码执行还是简单的事实答案?
调用 8B、70B 甚至前沿生成式 LLM 来完成此类任务效率低下。用户需等待 500 至 2,000 毫秒以获取流式 Token,承担高昂推理成本,并编写正则表达式从自由文本中提取标签。此外,LLM 常表现出“虚假自信”,其输出的置信度分数缺乏数学校准基础。
Laya 模拟人类大脑的“系统 1”思维模式:在标准硬件上实现 30 至 35 毫秒内的即时反射决策,提供诚实且精准的概率输出。
三种决策原语
Laya 通过单次前向传递评估任何状态(原始文本、电子邮件、工单或 JSON 文档),依赖以下三种基本原语:
- 选择(Choice):从标准词典中选择选项。返回所选键、所有选项的概率分布以及校准后的信任分数。
- 评分(Score):将状态置于有序标尺上(如级别 0, 1, 2...)。返回预期级别、对标题等级的分布及信心值。
- Noul(布尔判定):针对直接的是/否问题,返回校准概率 P(真)(范围 0.0 到 1.0,P(假) = 1 - P(真))。
由于输出空间纯粹由概率和数字组成,模型不生成文本,因此物理上杜绝了幻觉、模式违规或错误 JSON 的产生。
检查点与捆绑架构
单一模型难以覆盖所有任务和语言。Laya 在 Hugging Face 的单个存储中心下合并发布了三个专用检查点:
| 检查点 | 骨干编码器 | 参数量 | 上下文长度 | 主要优势 |
|---|---|---|---|---|
| convaiinnovations/laya (English) | ModernBERT-large | 421M | 512 | 英语文本分类、防护栏、电子邮件分类 |
| convaiinnovations/laya (Multilingual) | mmBERT-base (256k vocab) | 322M | 1024 (最多可达 8k) | 支持 100+ 种语言,速度快 2.2 倍,跨语言 NLI |
| convaiinnovations/laya (Typed-Decisions) | ModernBERT-large | 421M | 1024 | 代理可观察性、客户服务、发票处理、安全警报 (准确率 0.766) |
选择性下载子文件
为避免用户管理多个仓库或下载 2.5GB 的组合权重,主仓库 convaiinnovations/laya 捆绑了所有三个模型。利用 Hugging Face 的 allow_patterns 功能,SDK 仅下载特定的请求子文件:
# Downloads English model (~808 MB)
agent_en = laya.load("convaiinnovations/laya")
# Downloads ONLY the multilingual subfolder (~647 MB), not the entire 2.5 GB bundle
agent_ml = laya.load("convaiinnovations/laya", subfolder="multilingual")
多脚本现实下的路由机制
在 Massive 基准测试(51 种语言,20 个选项,随机基线=0.050)中发现,英语模型在处理非拉丁字母时表现极差。ModernBERT-large 的 50,000 词元英文 BPE 词表在非拉丁文字上失效:
- 高棉语:准确率 0.000,但报告置信度高达 95%。
- 亚美尼亚语:准确率 0.050(等同于随机猜测),置信度 0.885。
- 希伯来语:准确率 0.060,可靠性 0.964。
- 孟加拉语:准确率 0.080,置信度 0.945。
- 印地语:准确率 0.100,可信度 0.941。
关键教训在于:当模型无法读取输入脚本时,其置信度依然很高。在 51 种语言中,英语检查点的平均可靠性从未低于 0.885,无论其准确率是 82% 还是 0%。因此,信任门控无法保护系统,必须在向前传递之前决定使用哪个模型。
微毫秒纯 Python 路由
Laya 内置路由器,通过检查输入文本的 Unicode 脚本(涵盖天城文、CJK 汉字、西里尔、阿拉伯、希伯来、泰米尔、泰文等 22 种字母)并分析拉丁语停用词分布来实现路由:
- 标准英语文本检测开销:0.09 毫秒。
- 天城文/印度文字检测开销:0.54 毫秒。
- 大型 200 行嵌套 JSON 文档检测开销:0.73 毫秒。
相比 33ms 的前向传递,路由开销可忽略不计(<2%)。通过 Router(preload=True),所需模型保留在 VRAM/RAM 中,消除了流量在语言间交替时 7 到 10 秒的冷交换惩罚。
from laya import Router
# Preload checkpoints into memory for instant sub-35ms routing
router = Router(preload=True)
# English -> automatically routed to ModernBERT-large
res_en = router.predict({"body": "I was charged twice, please refund."}, questions)
# Hindi -> automatically routed to mmBERT-base (100+ languages)
res_hi = router.predict({"body": "मुझसे दो बार शुल्क लिया गया, कृपया पैसे वापस करें।"}, questions)
# Explicit override when you already know the domain
res_spec = router.predict(state, questions, model="typed-decisions")
性能对比:Laya vs TypeSafe Jev
基于公开数据集和标准基准,Laya 与 TypeSafe Jev 进行了直接对比。Laya 的数据为实测结果,Jev 的数据源自第三方独立研究(AbdelStark, nibzard)及 TypeSafe AI 官方发布。
| 基准/指标 | TypeSafe Jev 1.13.0 | Laya (Routed) | 优势 / Delta |
|---|---|---|---|
| typed-decisions (2,000 decisions) | 0.727 | 0.766 | +3.9% (超过 0.735 教师上限) |
| AG News (4 labels) | 0.910 | 0.950 | 准确率高出 +4.0% |
| DAIR Emotion (6 labels) | 0.480 (Brier 0.846) | 0.595 | 高出 +11.5% (Jev 有 16% 零概率) |
| 校准误差 (ECE) | 0.246 | 0.081 | 概率校准确良度提升 3 倍 |
| 延迟 P50 (1 Question) | 236 – 276 ms | 32.8 ms | 执行速度快 7.8 倍 |
| 延迟 P50 (10 Questions Batched) | ~1,500 ms (串行) | 72.3 ms (7.2 ms/q) | 批量调用速度快 20 倍 |
| 可用语言数 (> 3x random) | 无公开基准 | 51 种语言中的 45 种 | 全球语言覆盖 |
| 每百万 Token 成本 | $0.042 (计量 API) | $0.00 (自托管) | 100% 免费 Apache 2.0 |
| 模型权重 & 代码 | 封闭专有 API | 开源 safetensors | 支持气隙隔离 & 本地部署 |
真实世界应用工作流
在评估的 9 个企业工作流中,Laya 展示了生产就绪的决策质量:
- 电子邮件垃圾过滤 (Enron):准确率 0.993,F1 0.993,ECE 0.013。
- 钓鱼检测:准确率 0.980,F1 0.979,ECE 0.012。
- LLM 防护栏与越狱检测 (held-out ToxicChat):准确率 0.755 – 0.762。在 50% 选择性覆盖率下,准确率达到 0.931。
- RAG 段落相关性过滤:单次前向传递准确率 0.657。
- 支持工单队列路由 (10-way):准确率 0.522。
局限性说明
Laya 团队明确指出了当前架构的限制:
- 选项过多导致性能下降:在 Banking77(77 个标签)压力测试中,Laya 得分为 0.425,而 Jev 为 0.870。这是因为选项共享 192-256 token 的
head_max_len预算,在 77 个选项下每个候选项仅剩约 3-4 个 token。建议:保持选择模式在 20 个选项以内,或使用两步粗到细的层级结构。 - 零样本 vs 微调:开箱即用的基础模型在 typed-decisions 基准上的得分约为 0.35(接近随机)。0.766 的高分是通过在基准的训练集上进行微调获得的。应将 Laya 视为快速的基础模型进行专业化定制,而非全知的零样本预言机。
- 温度校准:基础权重附带原始温度 logits。在领域分布上为每种问题类型拟合一个标量温度,可将期望校准误差从 0.466 降至 0.081。
快速入门
安装命令:
pip install laya>=0.3.3
以下是运行多模式决策并自动语言路由的完整示例:
import laya
from laya import Router
# Initialize router with preloading (avoids swap delay)
router = Router(preload=True)
# Define complex state
ticket = {
"ticket_id": "TCK-8821",
"customer": "enterprise_user",
"subject": "System downtime and billing dispute",
"body": "Our production API has been failing since 6 AM. We lost critical transactions. We demand an immediate SLA refund."
}
# Define multiple questions of different primitives
questions = {
"queue": {
"type": "choice",
"instructions": "Which engineering queue owns this ticket?",
"criteria": {
"infrastructure": "server outages, network downtime, database failures",
"billing": "refunds, SLA credits, invoice disputes",
"security": "breaches, vulnerability reports",
"support": "general customer inquiries"
}
},
"urgency": {
"type": "score",
"instructions": "How urgent is this ticket?",
"criteria": ["low priority", "medium", "high priority", "critical blocker"]
},
"churn_risk": {
"type": "noul",
"instructions": "Does the customer threaten to cancel or express severe churn intent?"
}
}
# Single forward pass: evaluates all questions simultaneously
res = router.predict(ticket, questions)
print("Routing Decision :", res["routing"]["model"])
# -> english
print("Assigned Queue :", res["answers"]["queue"]["choice"])
# -> infrastructure (confidence: 0.96)
print("Urgency Score :", res["answers"]["urgency"]["score"])
# -> 2.87 / 3.0
print("Churn Risk




