[Challenge] 為什麼 LLMs 在網格擷取上會產生幻覺,以及我們如何在 n8n 中解析手寫計分卡

:waving_hand: 嘿 n8n 社群,

文件提取管線能漂亮地處理發票和履歷表。但在一個遊戲之夜,我們給我們的 AI 提供了看起來很簡單的東西,但完全搞崩了它:一張手寫的 Kniffel(Yahtzee)記分卡。

:mouse_trap: 網格陷阱

目標:拍一張照片,找到名字上方有手寫星號(*)的玩家,提取他們的分數,計算 35 點獎勵(如果 top $\ge$ 63),加總,然後推送到 Sheets 和 Telegram。

看一下附加的照片:

r/VibeCodersNest - Challenge Why LLMs hallucinate on grid extraction and how we parsed a handwritten scorecard in n8n|562.5xauto

對人類來說很明顯。但 LLM 幻覺出名字(「Ivan」變成「ban」),合併了欄位,搞砸了數學。

以下是空間資料為何會破壞 AI,以及我們用來修復它的提示架構:

:eyes: 打破「從左到右」的偏見

LLM 像讀書一樣讀取(從左到右,逐列)。記分卡要求相反的方式。為了停止「行洩露」跨越欄位,我們強制了物件陣列輸出([{player_name, sum_top, sum_bottom}])。這強制 AI 在移動到下一列之前完成讀取一個垂直欄。

:abacus: 確定性數學,零 LLM 判斷

我們已經知道我們使用的提取器在分類文件和提取結構化資料方面的可靠性令人難以置信,所以我們決定推進它的極限,測試它是否也能處理計算。大錯誤。LLM 是文本預測引擎,不是計算機。修復方案: 我們指示它只提取原始數字,並在下游使用純 JavaScript Code 節點來處理數學和條件獎勵。

:stop_sign: 明確的空狀態停止幻覺

玩家用破折號(-)表示空框。因為 LLM 無法將字符串破折號放入 Number schema,它就慌張地輸出 -1,破壞了我們的 JavaScript。添加嚴格的約束—「關鍵:如果一個儲存格是破折號或空的,您必須輸出 0」,立即修復了管線。

:anchor: 用標籤錨定眼睛

為了防止 AI 在欄位之間漂移,我們給了它視覺座標。我們指示它查看最左邊的列印標籤(例如「Dreierpasch」),沿著一條隱形的水平線跟踪到帶星號的欄,並只提取該儲存格。

:turtle: 一個誠實的警告

將數學轉移到 JS 保證了完美的邏輯,但手寫識別仍然取決於照片質量。如果您需要從雜亂的筆跡中獲得完美的資料,人工參與驗證仍然是上限。

:wrench: 如何執行它

我使用了 easybits 提取器,因為它本身支援 JSON schema 強制,無需與 HTTP 節點提示搏鬥。雲端和自託管都符合免費層級。

  • n8n 雲端: 在節點面板中搜尋 easybits

  • 自託管: 從社群節點安裝 @easybits/n8n-nodes-extractor

:speech_balloon: 歡迎反饋

我附加了原始影像。我非常好奇:當您透過目前的 OCR 或 LLM 設定執行這個精確影像時會發生什麼?您找到了從密集水平網格中提取垂直欄的更乾淨的方法嗎?

最好的祝福,
Felix

1個讚

數學卸載方法完全正確——將所有算術運算保留在 Code 節點中,而不是依賴 LLM,使得管道無論使用哪個模型都具有確定性。按欄優先的 JSON 架構約束([{player_name, sum_top, sum_bottom}])是對抗列邊界混淆的簡潔做法。

如果在低品質照片上準確度仍有滑落,有一個值得嘗試的方法:在傳遞給視覺模型前,先將每一欄作為單獨的圖像區域進行裁剪。即使在 Code 節點中進行粗略的座標裁剪(使用你從計分卡佈局已知的圖像尺寸),也能透過給模型提供更簡單、單欄的上下文,大幅減少位置幻覺。

1個讚

@nguyenthieutoan,感謝你的回饋!

將每一欄裁切成單獨圖片的想法確實很有意思。我唯一的顧慮是,這樣做需要每次拍照時都保持相當一致的構圖。否則,在裁切過程中可能會冒著切掉重要資訊的風險。

話說回來,這是個很棒的建議,我一定會試試看在實際應用中的可行性如何。感謝你分享這個想法!

框架問題的考量是合理的,但你可以通過在每個裁剪區域添加充足的重疊來解決這個問題 - 比如在每個欄位邊界的兩側各添加 10-15% 的緩衝區,而不是在精確的邊界處裁剪。由於你的 schema + 提示詞將 LLM 限制在一次只處理一個玩家,LLM 仍然會專注於正確的欄位,而且輕微的重疊遠不如切割到數字內造成的破壞大。對於像 Kniffel 這樣的印刷計分卡(欄位標題是固定寬度的),你也可以從一張參考圖像中推導一次裁剪邊界,然後在類似條件下拍攝的所有照片中可靠地重複使用相同的像素偏移(相同的桌子、相同的手機距離)。

1個讚

@nguyenthieutoan,聽起來不錯!我一定會試試這個方法。

有趣的是,看到 AI 一般來說有多強大,但突然出現一個邊界情況的想法,你會意識到它可能會破壞很多解決方案。我其實很喜歡發現這些情況,因為它們通常是最有啟發性的。