Laya 决策引擎:单次前向传播的多语言判断

Laya 是 NandhaKishorM 开源的 Python 决策引擎,把 choice、score、noul 三类判断压进一次前向传播,覆盖 100 多种语言,并带一个按请求挑 checkpoint 的路由器。这篇文章讲清它怎么装、最短跑通示例、主要功能与参数,以及用户实际踩过的坑,帮读者判断它能不能替掉自己那套大模型加解析的流程。

客服工单该转给哪个组、这条评论算投诉还是咨询、用户有没有退订意图,这类判断在业务里成百上千次地出现。交给生成式大模型去做,代价是要等它把答案写成文本,再写解析逻辑把文本读回来,还要处理解析失败的情况。Laya 把这些判断当成一次前向传播的推理任务,模型不生成文本,直接给出答案。

Laya 是非自回归的 System 1 决策引擎,Python 实现。输入文本与一组带类型的决策问题,单次前向传播返回选项、分值或 yes/no 概率。

一次调用里的所有问题共享同一段文本编码,官方在 T4 上给出的数字是单问题 33 ms,批量时每问题 7.2 ms,覆盖 100 多种语言,Router 会按请求挑对应的 checkpoint。它常被放进工单分流、意图判断、风险打分这类需要稳定延迟和可解析输出的环节。

Laya 项目封面图,展示多语言 typed decision 引擎的定位

仓库地址是 https://github.com/NandhaKishorM/laya ,许可证为 Apache License 2.0,主要语言 Python,占比 81.5%,其次是 TypeScript 13.6%。采集时 28,876 stars、2,520 forks、117 个开放 Issue,最近一次提交在 2026-09-30。模型主页在 https://huggingface.co/convaiinnovations/laya 。

五分钟先跑通

环境要求是 Python 3.10 或更新版本,安装命令只有一条:

python -m pip install laya

用 uv 的话,在 uv 项目里执行 uv add laya,或者在虚拟环境里执行 uv pip install laya。

可选 extras 按需装:laya[serve] 带 HTTP 服务,laya[mcp] 带 MCP 服务,另有 laya[langchain]、laya[llamaindex]、laya[crewai]、laya[onnx]、laya[fast](TileLang GPU 快路径)。各平台的逐步安装、CPU-only 与 GPU 版 PyTorch 的差别、排错步骤在 README 的 Installation details 一节。

官方 Quickstart 给的最短可用示例是这样:

from laya import Router

router = Router()

state = "Hi, we were billed twice for March. Please refund the duplicate today or we will cancel our plan."
questions = {
    "department": {"type": "choice", "instructions": "Which department should handle this?",
                   "criteria": {"billing": "invoices, payments, refunds",
                                "technical": "bugs, outages, system errors",
                                "other": "everything else"}},
    "urgency": {"type": "score", "instructions": "How urgent is this?",
                "criteria": ["not urgent", "soon", "blocking"]},
    "churn_risk": {"type": "noul", "instructions": "Does the user threaten to cancel or leave?"},
}

result = router.predict(state, questions)
print(result["answers"]["department"]["choice"])
print(result["answers"]["churn_risk"]["noul"])
print(result["routing"]["model"])

Router() 首次使用时会下载 checkpoint,构造时传 Router(preload=True) 可以一次性把三个 checkpoint 都加载好。

不想写代码可以用命令行,laya "My payment failed twice" --preset triage 会用一套预置问题集回答。仓库里还有 Dockerfile 与 compose.yaml、compose.cuda.yaml、compose.http.yaml、compose.spark.yaml 几份编排文件,README 没有把它们收成一条起服务的命令。

跑通之后你会得到什么

返回值是一份字典。result["answers"] 按问题名索引,每个问题下面再按类型取结果:choice 取 ["choice"] 拿到选中的标签,noul 取 ["noul"] 拿到答案偏向 yes 的概率,score 走同样的结构。result["routing"]["model"] 说明这次用了哪个 checkpoint,示例里是 english。

换成印地语和西班牙语文本后,README 给出的两行输出都是 multilingual,标签分别落在 billing 和 technical。也就是说同一段调用代码不需要改,路由由 Router 自己判断。

答案拿到手可以接进不同逻辑:choice 的结果直接当路由键,noul 的概率跟阈值比较做二值判断,score 的档位接进排序。要把准确率往上推,下一步是在自己领域的数据上微调。

主要功能

  • 三类带类型的决策:choice 从 criteria 给出的标签里选一个,对应多分类;score 在有序档位里打分,对应有序回归;noul 回答 yes/no 并输出概率。
  • 按请求自动路由:Router 检测文本的语言与书写系统,非英文交给 laya-multilingual,默认英文文本走英文 checkpoint。长且偏英文的文本官方建议手动指定 model="multilingual",否则会被路由到英文模型。
  • 批量与长文档:decide_batch、Router.predict_batch、Router.predict_long 共享同一次前向传播;ONNX 版的 predict_batch 支持 sort_by_length。laya-multilingual 配 max_len=8192 时能读 8192 token。
  • HTTP 服务:装 laya[serve] 后可以起服务,提供 POST /v1/systemone 接口。v0.3.22 的改动之一是允许请求体用 JSON 传该接口的控制项。
  • 低置信度弃答:predict、predict_batch、decide、decide_batch 接受 min_confidence=,低于阈值的答案在 answer_confidence 上被标成 low_confidence: True,decide 对这类样本直接返回 None。
  • ONNX 与量化:ONNXAgent 提供 predict_batch、predict_long、decide_batch;scripts/export_onnx.py --quantize 写出一份 per-channel INT8 版本给 CPU 用;laya-evals run --onnx 用和 torch 路径相同的门槛评估导出结果。
  • 框架集成与 MCP:LangChain 与 LangGraph 侧有 batch()、abatch() 和新的 LayaDecision,LlamaIndex 提供 selectors,CrewAI 提供路由,MCP 侧有 laya_predict_batch、laya_route_batch、laya_decide 等工具。
  • TypeScript 运行时:laya-ts/ 目录下是 Node.js 与浏览器版本,npm 包名 laya-ts,从仓库的 laya-ts-v* release tag 发布。

常用参数与配置

  • model=:指定 checkpoint。处理长文档时写成 model="multilingual",避免被按英文路由。
  • max_len= 与 head_max_len=:单请求 token 预算。laya-multilingual 默认带 1024 token 上限,会截断长文档,要显式传 max_len=8192。命令行对应 --max-len 和 --head-max-len,服务端由环境变量 LAYA_MAX_TOKEN_BUDGET 卡上限。
  • min_confidence=:置信度弃答阈值。
  • compile=True:v0.3.21 起不再为每种请求形状重新编译。
  • LAYA_MAX_LOADED:同时驻留的 checkpoint 数量。历史上 Router 默认 max_loaded=1,脚本来回切换时每次都会重载 checkpoint。
  • LAYA_REVISION 与 per-checkpoint SHA-256 映射:固定模型版本并校验产物完整性,v0.3.22 在 Router 里加了 per-checkpoint 的 SHA-256 校验。
  • 命令行开关:--preset triage 用预置问题集,--batch FILE 批量跑,--questions 传入问题定义。

结果在哪里看

  • Python 调用:看函数返回值,结构见前面那节。
  • 命令行:答案打到标准输出,laya "..." --preset triage 是最短的用法。
  • HTTP 服务:结果在响应体的 JSON 里;/health 报告某个 checkpoint 实际跑在哪个设备上以及 CPU 回退次数;服务忙时返回 503,响应带 Retry-After。
  • 批量任务:输入由 --batch FILE 指定,输出是打到终端还是写成文件,仓库里没有说明。
  • 评估数据:research/scripts/bench_long_context.py 可以复现长文档的准确率与耗时;BENCHMARKS.md 与 benchmarks/ 目录放官方基准。
  • 文档站:https://nandhakishorm.github.io/laya/ ,API 参考和 hooks、structured、docker、langchain 几份指南都在上面。

实际使用中的坑

  • noul 一律返回否定标签:当一个问题给出的 criteria 是 true/false 或 yes/no 这样的标签对时,noul 会与 state 无关地返回否定标签。该 Issue 有 14 条评论,状态为已解决。
  • laya-multilingual 从不选第一个 score 选项:用户先在日语里发现,换英文重跑后确认不是语言差异。报告里写的是 0/290,状态仍是待解决。
  • 短德文被送进英文 checkpoint:语言判断未定时按英文处理,在 MASSIVE de 上带来 20 个准确率点的损失,报告里 64% 的短德文被路由错。另有人报告西班牙语和意大利语也落到英文模型,那条已解决。改模型或调语言判断逻辑时,短文本的多语言路由值得单独测一遍。
  • 置信度不可靠:Issue 里提到 #124 与 MASSIVE 中文运行上出现了 confidence 1.000 的自信错误,请求在核心 API 与 laya-ts 里加基于置信度的弃答。v0.3.21 已经提供 min_confidence=,但该 Issue 状态仍为待解决。
  • 基准数字可能过期:有人指出仓库里那份 51 语言扫描的 ECE 与 confidence 列早于 #42 的温度截断,现在已无法复现。拿 BENCHMARKS.md 的数字做对比时要留个心眼。

选型参考

项目适合谁部署方式主要限制什么情况下选它更合适项目地址
NandhaKishorM/laya要在自己的服务里做批量分类、打分、yes/no 判断,并且愿意用 Python 接进现有后端的团队python -m pip install laya;仓库另有 Dockerfile 与四份 compose 文件需要 Python 3.10 以上;长文档必须显式传 max_len=8192,默认 1024 token 会截断;短的非英文文本自动路由有误判记录一次前向传播出多类答案、要覆盖多语言、能接受自己微调模型NandhaKishorM/laya
mizorewww/laya-mlx在 Apple 平台本地跑 Laya 决策模型、在意短决策延迟的开发者按仓库描述是 Laya 模型的 MLX 原生运行时只覆盖 MLX 这一条运行时路径,其余平台与部署形态未逐一核实主要跑 Apple 设备、想用平台原生推理栈而不是 PyTorch 时更合适mizorewww/laya-mlx
allebee/jevk5想用开放权重做带类型的决策与概率输出、不想绑定单一实现的开发者仓库没有说明未逐一核实需要一份与 Laya 不同来源的开放权重决策模型做交叉验证时更合适allebee/jevk5

开箱即用的准确率是 Laya 最需要提前确认的地方。官方在 typed-decisions 基准上给的两个数字是:微调后的 laya-typed-decisions 到 0.766,基础英文 checkpoint 只有 0.362。如果你不能标注自己的数据、跑不了微调,开箱效果可能撑不住生产判断,这时更适合先用 jevk5 这类以开放权重提供带类型决策概率的项目做交叉验证,或者回到通用大模型加解析的老办法。

什么情况下别用它

需要输出文本的场景不要选它。Laya 不生成句子,摘要、回复草稿、多轮对话都不在它的能力范围内,硬套只会让流程更绕。

不能自己标数据、也不打算跑微调的场景不要选它。仓库文档里 0.766 对 0.362 的对比已经说明准确率提升来自领域微调,零样本的基线成绩通常不够用。

单段文本超过 8192 token 的场景不要选它,laya-multilingual 的上限就到这里,再长只能自己切分。

要一个无依赖二进制或 GGUF 单文件的部署场景,现在也不合适。Issue 里有人提到自己在做 ggmlc,想让 Laya 以 GGUF 和无依赖可执行文件的形式发布,那条讨论还是待解决状态,官方没有发布这类产物。

多语言短文本的自动路由必须零误判的场景,建议先跑一遍自己的数据。短德文被送进英文 checkpoint 那条 Issue 记的是 64% 的错路由率和 20 个准确率点的损失,这种误差在分流链路里会直接放大。

焚评:这个项目的量化评分

本项目的选题来自 焚.com(一个按公开公式给 GitHub 项目打分的站)。焚评当前总分 10.0 分(满分 10)。下表是各维度的得分:

评分维度得分
热度动量(权重 25%)10.0 / 10
开发活跃(权重 25%)10.0 / 10
社区响应(权重 15%)10.0 / 10
文档质量(权重 15%)10.0 / 10
发布节奏(权重 10%)10.0 / 10
风险控制(权重 10%)10.0 / 10

评分口径、权重与计算方式见焚.com 的评分方法页;数据随 GitHub 指标刷新,具体数值以焚.com 当前页面为准。本文正文为诀.com 独立撰写,评分数据由焚.com 授权引用。

内容核验说明

想替掉大模型加解析那套流程的团队,可以拿它做第一轮评估:安装命令、最短示例、返回结构、常用参数都落了地,坑也标得具体——开箱准确率依赖领域微调、长文档默认 1024 token 会截断、短非英文文本自动路由有误判记录。局限同样清楚:不生成文本,超过 8192 token 要自己切分。文中的性能与准确率数字来自原作者公开披露,诀.com 未独立验证。

T4 单问题 33 ms、批量 7.2 ms、微调后 0.766 对基础 checkpoint 0.362、短德文 64% 错路由与 20 个准确率点损失,均来自原作者与 Issue 提交者的公开披露,诀.com 未独立验证;stars、forks 等仓库指标为采集时快照,会随时间变化。

项目来源与说明

开源项目:NandhaKishorM(NandhaKishorM)

本文由诀.com 编辑基于该项目的公开信息独立撰写,属原创解读,不是对项目文档的翻译或转载;文中提到的功能与参数以官方仓库为准,代码与文档版权归原作者所有。

查看项目仓库