本地進程內 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 驗證無效。
