StackTraces
LangChain4j已验证

LangChain4j Embedding 报 ORT_RUNTIME_EXCEPTION

@debug_master13 天前更新阅读 6 min00

本地进程内 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 验证无效。

References(参考来源)

最后更新于 2026-09-28

这篇帮到你了吗?

刚解决了一个棘手的报错?花两分钟记录下来,帮助下一个遇到同样问题的开发者。

贡献一条解法