Java 直接本地推理:用类似 Jev 的决策模型做 AI 扫雷游戏

在很多后台业务工程里,我们引入大模型的目的其实非常朴素:判断一条工单该流转给哪个部门、为一次客诉的紧急程度打分,或者确定用户是否在要求退款。为了这些确定性的分类和判断,过去常要调用云端 LLM API,写一长串 Prompt,再小心翼翼地解析返回的 JSON。一旦遇到输出格式漂移、网络波动或超时,整个业务链路就会受到影响。

近期 TypeSafe AI 发布的 Jev 引起了不少关注。它不逐字生成长文本,而是输入非结构化状态,一次性并行返回确定类型的概率决策。不过 Jev 属于云端闭源模型,依然存在网络延迟、Token 计费以及敏感数据出境的限制。

Laya 正是在这个背景下值得关注的开源方案。它同样专注于结构化决策任务,本质是一个双向编码器决策模型,支持分类(Choice)、评分(Score)和真假概率(Noul)。与调用云端服务不同,Laya 可以完全部署在本地,既不需要担心数据外流,也没有远程网络开销,能直接嵌入企业内部业务系统。

laya-java 安装与极简上手

对于 Java 后端团队而言,在生产环境接入 AI 推理最大的障碍往往是技术栈割裂:为了跑模型常常需要额外搭建 Python 运行环境、安装重量级依赖,或是单独维护一套微服务。

laya-java SDK 解决了这一痛点。它基于 ONNX Runtime 构建,允许 Java 应用在 JVM 进程内部直接加载模型并执行前向推理。整个过程既不需要部署 Python,也不需要发起外部 HTTP 调用,大幅降低了工程集成的运维负担。

SDK 目前已正式发布到 Maven Central,运行环境要求 Java 17 或更高版本。在项目中引入以下依赖即可:

1
2
3
4
5
<dependency>
<groupId>io.github.pig-mesh.ai</groupId>
<artifactId>laya-java</artifactId>
<version>0.1.0</version>
</dependency>

在代码中,laya-java 提供了直观的流式 API。你可以针对一段非结构化文本,在单次预测中同时挂载多个不同维度的判断问题。以下是一个处理售后工单的完整示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import com.pig4cloud.laya.LayaEngine;
import com.pig4cloud.laya.Question;
import java.util.LinkedHashMap;
import java.util.List;

public class LayaQuickStart {
public static void main(String[] args) {
// 1. 定义分类选项(Choice)
var departments = new LinkedHashMap<String, String>();
departments.put("财务售后", "invoices, payments, refunds");
departments.put("技术支持", "bugs, outages, system errors");
departments.put("销售咨询", "pricing, purchases");

// 2. 组装待评估问题集
var questions = new LinkedHashMap<String, Question>();
questions.put("department", Question.choice("Which department should handle this message?", departments));
questions.put("urgency", Question.score("How urgent is this request?", List.of("not urgent", "soon", "critical")));
questions.put("refund", Question.noul("Does the customer ask for money back?"));

// 3. 加载本地模型并执行推理
try (var engine = LayaEngine.load("/path/to/laya-java-model")) {
var result = engine.predict("重复扣款了,请退款。", questions);
System.out.println(result.toPrettyString());
}
}
}

在这段代码中,LayaEngine 实现了 AutoCloseable 接口,结合 try-with-resources 能够安全释放底层原生内存。模型在一次前向传播中同时完成了部门归属选择、紧急程度分级以及是否退款的概率计算,输出标准的结构化数据。

在一致性方面,23 组 Java 与 Python 交叉对照样本中,输入张量完全一致,最终输出的分类标签完全一致。需要提醒的是,在进行生产环境容量规划时,除了模型纯权重约 1.2 GiB 外,还需为 ONNX Runtime 的张量计算及 Native 内存预留充足空间,以保证在高吞吐下的平稳运行。

基于 laya-java 的俄罗斯方块预测

ONNX 模型参数与下载

为了在 Java 进程中直接使用 ONNX Runtime 运行,我们将 Laya 导出为了跨平台的 ONNX 格式。

导出的模型网络参数总量约为 3.22 亿(约 0.3B),169 个权重张量全部为 FP32 浮点精度,未做 INT8 或 INT4 低比特量化。由于导出为标准的 FP32 存储,ONNX 文件大小约为 1.2 GB(其中词嵌入矩阵单独占约 750 MiB)。

部署并运行该模型只需三个核心文件:

  1. model.onnx:导出的计算图与模型权重。
  2. tokenizer.json:分词器词表与分词规则。
  3. config.json:模型配置与部署元数据。

完整的模型资产包已发布在 GitHub Release 中,可以通过 pig-mesh/release 仓库的 laya-java-model-v0.1.0 标签直接下载使用。