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

這篇幫到你了嗎?

剛解決了一個棘手的報錯?花兩分鐘記錄下來,幫助下一個遇到同樣問題的開發者。

貢獻一條解法