本地进程内 Embedding 抛
ORT_RUNTIME_EXCEPTION,别急着怀疑自己的代码。这个异常来自 ONNX Runtime 的 native 层(ai.onnxruntime.OrtException),LangChain4j 只是把它包成RuntimeException传上来。它在 0.27.1 还正常,从 0.28.0 开始复现。issue 里试过把 onnxruntime 锁回 1.16.3,问题依旧。截至撰写时该 issue 仍是 open,官方结论未定。
Issue & Env(案发现场与环境)
- 业务场景:用 LangChain4j 的本地进程内 Embedding 模型,对文本做向量化,调用时炸。
- 环境:LangChain4j 0.28.0 及以上;0.27.1 正常。期间 onnxruntime 从 1.16.3 升到 1.17.1。这条版本线来自 langchain4j issue #1003。
StackTrace(堆栈日志)
issue 里贴出的报错片段如下。原文在 Sta 处被截断,这是粘贴时的原始形态,此处照录:
org.opentest4j.AssertionFailedError: Unexpected exception thrown: java.lang.RuntimeException: ai.onnxruntime.OrtException: Error code - ORT_RUNTIME_EXCEPTION - message: Non-zero status code returned while running Add node. Name:'/embeddings/Add_1' Sta
关键信息在最后一句:running Add node ... /embeddings/Add_1。炸的是推理图里一个加法节点。
Reproduce(复现代码)
先把出问题的文本单独抽出来,跑最小复现。这样能确认它和文本相关,而不是环境相关:
EmbeddingModel model = new OnnxEmbeddingModel(...); // 换成你用的本地模型
Embedding e = model.embed("那段会触发报错的文本");
System.out.println(e.vector().length);
只留一个 embed() 调用。如果换掉这段文本就不报,方向就清楚了。
Root Cause(根因分析)
报错来自 native 层
ai.onnxruntime.OrtException 是 ONNX Runtime 自己抛的。LangChain4j 没做二次解析,只是原样包了一层 RuntimeException。所以日志里那串 ORT_RUNTIME_EXCEPTION 才是真正的信息。
定位线索在版本时间线
0.27.1 是最后一个正常版本,0.28.0 开始复现。这期间 onnxruntime 从 1.16.3 升到了 1.17.1,看起来像依赖升级惹的祸。
但 issue 作者试过把依赖锁回 1.16.3,问题依旧。这说明不只是单个依赖版本号的事。模型文件、tokenizer、推理图与运行时之间,存在兼容问题。
只有特定输入才触发
它并非每次都失败,只有特定文本才炸。报的是 running Add node ... /embeddings/Add_1,也就是推理图里某个加法节点。这通常和输入张量的形状或取值有关。
官方结论
截至撰写时,issue #1003 仍处于 open 状态,官方结论未定。上面的成因分析属推断,社区说法,截至撰写时未核实。
The Fix(解决方案)
按代价从低到高排。
1. 先缩小范围
把出问题的文本抽出来单跑,就是上面那段最小复现代码。先确认是文本相关,不是环境相关。这一步不做,后面都是猜。
2. 换模型
换一个 Embedding 模型,或者它的量化版本。量化版通常带 -q 后缀,例如 all-minilm-l6-v2-q。不同模型的推理图不一样,往往能绕开出问题的那类节点。
3. 锁版本
业务上换不了模型的话,把 LangChain4j 锁在 0.27.1。这是已知能绕过的点,代价是停在旧版本。
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-embeddings-all-minilm-l6-v2</artifactId>
<version>0.27.1</version>
</dependency>
4. 换路线
把本地进程内 Embedding 换成远程 Embedding API。代价最直接,但最稳。可参考 LangChain4j 官方文档的 in-process embedding 页 对照可选模型。
5. 别踩的坑
别指望单独把 onnxruntime 降级能修好。issue 里已经验证过锁 1.16.3 无效,这是这条 issue 最有价值的排错信息。
还要区分报错现场。ORT_RUNTIME_EXCEPTION 是推理时崩,就是本文这种。UnsatisfiedLinkError、SIGSEGV 是原生库加载不了。两类问题,别混。
小结
ORT_RUNTIME_EXCEPTION 指向 ONNX Runtime 的 native 层。先做文本级最小复现,再换模型或量化版。不行就锁 0.27.1,或改走远程 API。降 onnxruntime 版本这条,已被 issue 验证无效。
