如何提取手寫票據資訊?

阿里妹導讀
本文主要講述在處理票據資訊結構化提取任務時,如何結合OCR(光學字元識別)技術和多模態大模型Qwen-VL來提高票據資訊提取的準確性和效率。
場景:票據資訊結構化提取
某客戶業務中涉及的票據型別繁多,包括手寫票據、列印小票、文件電子表格等,如下圖所示。客戶希望利用我們的多模態大模型qwen-vl來將這些不同型別的票據資訊提取為結構化資料,以便後續進行自動化處理和分析。最關鍵的需求是確保所提取的票據資訊準確無誤,尤其是關鍵資訊(如編號編碼),不能遺漏也不能出現錯誤。這將使客戶能夠更高效地管理他們大量的票據資料,減少人工處理的工作量,提高工作效率。
難點:VL-LLM
測試方案可以從最簡單的方式開始,即直接呼叫qwen-vl。只需將圖片上傳至OSS,然後編寫一段提示即可讓大模型為我們處理任務透過api呼叫qwen-vl模型_大模型服務平臺百鍊(Model Studio)-阿里雲幫助中心 (aliyun.com)[1]
測試樣例為下圖:
prompt如下:
prompt_with_message="""請結合圖片輸出結構化的JSON資訊。注意要返回完整的資料,不能遺漏,不能省略;對於包含多行的專案用列表表示;只輸出JSON不要輸出任何額外內容;不同行的內容應該分別輸出"""
呼叫最新的vl-max-0809模型:
messages = [    {        "role": "user",        "content": [            {"image": url},            {"text": prompt_with_message}        ]    }]response = dashscope.MultiModalConversation.call(  model='qwen-vl-max-0809',  messages=messages)
響應結果:見評論區
對比圖片內容可以看出,存在以下關鍵資訊的錯誤:
  • “收貨單位:家宴”識別成了“發票單位:某賓館”
  • 貨名“80/30無芯40”與“57/40刷卡紙”識別成了"貨物名稱": ["57/40無芯紙", "80/30無芯紙"]
  • “單價”: [145.00, 530.00],“金額”: [290.00, 2120.00], “金額合計”: 2410.00 也與票據資訊對應不上
  • 出現了簽收日期、簽收人圖中本來不存在的幻覺資訊。
這個例子可以看到,使用VL-LLM在“從影像中提取文字”這個特定場景中的效果有時並不太好,但在其他語義指令上,比如“輸出json格式資料”,是有效的。
那麼如果有其他方式可以更快更好地處理“從影像中提取文字”這個任務呢?受語言大模型中"RAG"思路的啟發,也許我們可以先提取影像中的文字,然後將其作為“知識參考”輸入VL-LLM,結合VL-LLM強大的語義理解能力,或許就能夠準確提取出票據中的資訊,並輸出結構化資料。
那麼給到VL-LLM的prompt template就會是這樣的:
prompt_with_message=f"""供參考的票據文字如下,輸出時結合上下文對有錯誤的予以糾正。{text}請結合圖片輸出結構化的JSON資訊。注意要返回完成的資料,不能遺漏,不能省略;對於包含多行的專案用列表表示;只輸出JSON不要輸出任何額外內容;不同行的內容應該分別輸出"""
目前的任務是要獲取影像中的文字內容,也就是說,我們想知道圖中的文字有哪些,這讓我們很容易聯想到文字識別領域中的“老炮兒”——OCR技術。
比較:OCR與VL-LLM
問:OCR是什麼?
通義千問:OCR是光學字元識別(Optical Character Recognition)的縮寫,是一種技術,用於將印刷文字、手寫文字或文件中的字元轉換為機器編碼的文字。透過掃描或拍照的方式捕捉文字影像,然後利用計算機軟體分析影像中的字元形狀,並將其轉換成可編輯和可搜尋的資料。這種技術在很多領域都有應用,比如文件數字化、資料錄入、書籍掃描、發票處理等,大大提高了資訊處理的效率和準確性。
儘管多模態大模型也具備通用的文字識別能力,但OCR技術在不同的業務場景下可以透過特定的訓練和加強。例如,阿里雲產品文字識別_OCR 文字識別_圖片識別文字_資料智慧-阿里雲 (aliyun.com)[2]覆蓋了通用文字識別、個人證照識別、車輛物流識別、票據憑證識別、企業資質識別和混貼等多個場景。
我們將OCR與VL-LLM做個對比:
合作:OCR + VL-LLM
因此,我們想到在原有方案的基礎上加入OCR作為輔助,讓OCR與VL協同工作:
考慮到手寫票據的情況,我們利用阿里雲OCR產品的通用手寫體識別介面呼叫:
RecognizeHandwriting進行通用手寫體識別_文字識別(OCR)-阿里雲幫助中心 (aliyun.com)[3],逐行識別影像中的中文文字,並將所識別的文字替換prompt中的{text},提供給大模型作為參考。這樣做類似於VL中的“RAG”(Retrieval-Augmented Generation)模式,既結合了OCR高精準文字識別的能力,同時也利用了大模型的指令分析和上下文理解等優勢。
效果對比
以下case中vl模型使用qwen-vl-max-0809,ocr使用阿里雲OCR通用手寫體識別。

case1:

  • OCR,耗時:0.7s,識別結果:
****紙品 送貨單 NO:20240323******* 收貨單位:**家宴洛溪店 送貨日期:2024年3月23日 編號 貨 名 規格 單位 數量 單價 金額 備註 1 80/30無芯40 箱 4 145.00 580.00 2 57/40刷卡紙 箱 2 80.00 160.00 金額合計(大寫):柒佰肆拾元整 6 Y740.00 送貨單位及經手人(簽章):收貨單位及經手人(簽名):恆 稽核員:複核員:三 
可以看到與只有VL-LLM結果相比,融合方案結果中的關鍵資訊收貨單位、貨物名稱、金額、總價等都輸出正確。
VL
OCR+VL
“`json
{
"發票單位": "**某賓館",
"送貨單號": "20240323******",
"送貨日期": "2024年3月23日",
"送貨單位及經手人": "****紙品",
"收貨單位及經手人": "****紙品",
"貨物名稱": ["57/40無芯紙", "80/30無芯紙"],
"規格": ["57/40", "80/30"],
"單位": ["箱", "箱"],
"數量": [2, 4],
"單價": [145.00, 530.00],
"金額": [290.00, 2120.00],
"金額合計": 2410.00,
"金額合計(大寫)": "貳仟肆佰壹拾元整",
"備註": "",
"簽收人": "張三",
"簽收日期": "2024年3月23日"
}
“`
“`json
{
"company_name": "****紙品",
"document_type": "送貨單",
"document_number": "20240323******",
"recipient_unit": "**家宴洛溪店",
"delivery_date": "2024年3月23日",
"items": [
{
"item_number": "1",
"item_name": "80/30無芯40",
"specification": "箱",
"unit": "箱",
"quantity": 4,
"unit_price": 145.00,
"total_amount": 580.00
},
{
"item_number": "2",
"item_name": "57/40刷卡紙",
"specification": "箱",
"unit": "箱",
"quantity": 2,
"unit_price": 80.00,
"total_amount": 160.00
}
],
"total_amount": "柒佰肆拾元整",
"total_amount_numeric": 740.00,
"delivery_unit_and_handler": "",
"recipient_unit_and_handler": "",
"reviewer": "",
"checker": "",
"seal": "****紙品"
}
“`

case2:

  • OCR,耗時:0.75s,識別結果:
骨*購物 收銀員:0012 機號:018 時間:2024.05.06 16:20 品名 數量 t 單價 小計 綠箭無糖花香薄荷糖櫻花白桃味 20202058 2 12.50 25.00 西蘭花(散) 10100335 0.582 13.16 7.66 中購物袋 70700002 0.20 0.20 [惠]水產扁蠶蛹(散) 10400287 0.284 13.80 3.92 原價:19.80 油蟠桃(盒) 10100208 1 19.90 19.90 QQ南瓜(散) 10101272 1.102 5.96 6.57 鱈魚片(散) 10200357 0.172 98.00 16.86 凍幹糖葫蘆(散) 10200406 0.246 98.00 24.11 整單優惠:1.70 抹零:0.02 件數:9 應付:104.20 實收:山東一卡通人民幣 104.20 小票號:NO.2024050****** 會員消費-卡號(600*****) 本次積分(100.30) 最 最新積分(14404. 07) 電子儲零(0) 如需發票,請持此單致客服中心開換 散稱商品重量以稱籤重量為準 熱線電話:xxxxxxxx 地址:xxxxxxxxxx 謝謝惠顧,歡迎下次光臨!
這個案例兩個方案的輸出資訊基本準確無誤,在格式上略有區別。OCR把“昌隆”識別為“骨隆”,大模型並沒有採用。
VL OCR+VL
“`json
{
"store": "昌*購物",
"cashier": "0012",
"machine_number": "018",
"date": "2024.05.06",
"time": "16:20",
"items": [
{
"name": "綠箭無糖花香薄荷糖櫻花白桃味",
"code": "20202058",
"quantity": 2,
"unit_price": 12.50,
"total": 25.00
},
{
"name": "西蘭花(散)",
"code": "10100335",
"quantity": 0.582,
"unit_price": 13.16,
"total": 7.66
},
{
"name": "中購物袋",
"code": "70700002",
"quantity": 1,
"unit_price": 0.20,
"total": 0.20
},
{
"name": "水產扁蠶蛹(散)",
"code": "10400287",
"quantity": 0.284,
"unit_price": 13.80,
"total": 3.92
},
{
"name": "油蟠桃(盒)",
"code": "10100208",
"quantity": 1,
"unit_price": 19.90,
"total": 19.90
},
{
"name": "QQ南瓜(散)",
"code": "10101272",
"quantity": 1.102,
"unit_price": 5.96,
"total": 6.57
},
{
"name": "鱈魚片(散)",
"code": "10200357",
"quantity": 0.172,
"unit_price": 98.00,
"total": 16.86
},
{
"name": "凍幹糖葫蘆(散)",
"code": "10200406",
"quantity": 0.246,
"unit_price": 98.00,
"total": 24.11
}
],
"discount": 1.70,
"rounding": 0.02,
"total_items": 9,
"total_amount": 104.20,
"payment": 104.20,
"payment_method": "**一卡通人民幣",
"receipt_number": "NO.20240********",
"member_number": "600******",
"points_earned": 100.30,
"current_points": 14404.07,
"electronic_wallet": 0,
"note": "如需發票,請持此單致客服中心開換!",
"note2": "散稱商品重量以稱籤重量為準",
"contact_number": "**",
"address": "**",
"greeting": "謝謝惠顧,歡迎下次光臨!"
}
“`
“`json
{
"store": "昌*購物",
"cashier": "0012",
"machine_number": "018",
"date": "2024.05.06",
"time": "16:20",
"items": [
{
"name": "綠箭無糖花香薄荷糖櫻花白桃味",
"code": "20202058",
"quantity": 2,
"unit_price": 12.50,
"total": 25.00
},
{
"name": "西蘭花(散)",
"code": "10100335",
"quantity": 0.582,
"unit_price": 13.16,
"total": 7.66
},
{
"name": "中購物袋",
"code": "70700002",
"quantity": 1,
"unit_price": 0.20,
"total": 0.20
},
{
"name": "[惠]水產扁蠶蛹(散)",
"code": "10400287",
"quantity": 0.284,
"unit_price": 13.80,
"total": 3.92
},
{
"name": "油蟠桃(盒)",
"code": "10100208",
"quantity": 1,
"unit_price": 19.90,
"total": 19.90
},
{
"name": "QQ南瓜(散)",
"code": "10101272",
"quantity": 1.102,
"unit_price": 5.96,
"total": 6.57
},
{
"name": "鱈魚片(散)",
"code": "10200357",
"quantity": 0.172,
"unit_price": 98.00,
"total": 16.86
},
{
"name": "凍幹糖葫蘆(散)",
"code": "10200406",
"quantity": 0.246,
"unit_price": 98.00,
"total": 24.11
}
],
"discount": 1.70,
"rounding": 0.02,
"total_items": 9,
"total_amount": 104.20,
"payment": {
"method": "**一卡通人民幣",
"amount": 104.20
},
"receipt_number": "NO.2024050**********",
"member": {
"card_number": "600*****",
"points": {
"current": 100.30,
"total": 14404.07
}
},
"electronic_storage": 0,
"note": "如需發票,請持此單致客服中心開換",
"note2": "散稱商品重量以稱籤重量為準",
"contact": {
"phone": "**",
"address": "**"
},
"greeting": "謝謝惠顧,歡迎下次光臨!"
}
“`

case3:

  • OCR,耗時:1s,識別結果:
送貨單 *****農牧開發有限公司 第2/3頁 番禺配送中心 日期:2024-03-18 車牌號:502 單據編號:p4-030042-XS-******* 收貨單位 ****(**) 編號 商品全名 規格 單位 數量 單價 金額 備註 家鄉龍口粉絲 包 2 4.5 9 菠菜面 包 2 6 12 南瓜面 包 2 6 12 鮮牛肉 7 斤 3.23 50 150 160 鱸魚骨 斤 5 2. 10 美味源胡椒粉 包 1 6.5 6.5 雀巢美極雞鮮粉 包 40.5 40.5 刀板香 斤 1.21 26 2 31.2 湖南辣椒 斤 6 6.5 39 獨蒜 斤 2 18 36 頁小計 每頁合計:元 Address:******** Tel:152171***** 制單員:** 收貨單位簽章:1月1 七 13
圖中“鮮牛肉”和“刀板香”的數量和金額都有人為的手寫修改,OCR把修改前後都輸出了,而大模型在輸出時結合圖片內容正確輸出了最終的數量與金額,體現了大模型在影像內容分析、上下文理解上的優勢。
VL OCR+VL
“`json
{
"公司名稱": "*****農牧開發有限公司",
"配送中心": "***配送中心",
"日期": "2024-03-18",
"車牌號": "502",
"單據編號": "p4-030042-XS-2*******",
"收貨單位": "***(南沙店)",
"商品資訊": [
{
"編號": "1",
"商品全名": "家鄉龍口粉絲",
"規格": "包",
"單位": "包",
"數量": "2",
"單價": "4.5",
"金額": "9"
},
{
"編號": "2",
"商品全名": "菠菜面",
"規格": "包",
"單位": "包",
"數量": "2",
"單價": "6",
"金額": "12"
},
{
"編號": "3",
"商品全名": "南瓜面",
"規格": "包",
"單位": "包",
"數量": "2",
"單價": "6",
"金額": "12"
},
{
"編號": "4",
"商品全名": "鮮牛肉",
"規格": "斤",
"單位": "斤",
"數量": "3.2",
"單價": "50",
"金額": "160"
},
{
"編號": "5",
"商品全名": "鱸魚骨",
"規格": "斤",
"單位": "斤",
"數量": "5",
"單價": "2",
"金額": "10"
},
{
"編號": "6",
"商品全名": "美味源胡椒粉",
"規格": "包",
"單位": "包",
"數量": "1",
"單價": "6.5",
"金額": "6.5"
},
{
"編號": "7",
"商品全名": "雀巢美極雞鮮粉",
"規格": "包",
"單位": "包",
"數量": "1",
"單價": "40.5",
"金額": "40.5"
},
{
"編號": "8",
"商品全名": "刀板香",
"規格": "斤",
"單位": "斤",
"數量": "1.2",
"單價": "26",
"金額": "31.2"
},
{
"編號": "9",
"商品全名": "湖南辣椒",
"規格": "斤",
"單位": "斤",
"數量": "6",
"單價": "6.5",
"金額": "39"
},
{
"編號": "10",
"商品全名": "獨蒜",
"規格": "斤",
"單位": "斤",
"數量": "2",
"單價": "18",
"金額": "36"
}
],
"頁小計": "343.7",
"地址": "*******",
"制單員": "***",
"聯絡電話": "15217******",
"收貨單位簽章": "****"
}
“`
“`json
{
"送貨單": {
"公司名稱": "****農牧開發有限公司",
"配送中心": "***配送中心",
"日期": "2024-03-18",
"車牌號": "502",
"單據編號": "p4-030042-XS-2*****",
"收貨單位": "****(南沙店)",
"商品列表": [
{
"編號": "",
"商品全名": "家鄉龍口粉絲",
"規格": "",
"單位": "包",
"數量": 2,
"單價": 4.5,
"金額": 9,
"備註": ""
},
{
"編號": "",
"商品全名": "菠菜面",
"規格": "",
"單位": "包",
"數量": 2,
"單價": 6,
"金額": 12,
"備註": ""
},
{
"編號": "",
"商品全名": "南瓜面",
"規格": "",
"單位": "包",
"數量": 2,
"單價": 6,
"金額": 12,
"備註": ""
},
{
"編號": "",
"商品全名": "鮮牛肉",
"規格": "7",
"單位": "斤",
"數量": 3.23,
"單價": 50,
"金額": 160,
"備註": ""
},
{
"編號": "",
"商品全名": "鱸魚骨",
"規格": "",
"單位": "斤",
"數量": 5,
"單價": 2,
"金額": 10,
"備註": ""
},
{
"編號": "",
"商品全名": "美味源胡椒粉",
"規格": "",
"單位": "包",
"數量": 1,
"單價": 6.5,
"金額": 6.5,
"備註": ""
},
{
"編號": "",
"商品全名": "雀巢美極雞鮮粉",
"規格": "",
"單位": "包",
"數量": 1,
"單價": 40.5,
"金額": 40.5,
"備註": ""
},
{
"編號": "",
"商品全名": "刀板香",
"規格": "",
"單位": "斤",
"數量": 1.21,
"單價": 26,
"金額": 31.2,
"備註": ""
},
{
"編號": "",
"商品全名": "湖南辣椒",
"規格": "",
"單位": "斤",
"數量": 6,
"單價": 6.5,
"金額": 39,
"備註": ""
},
{
"編號": "",
"商品全名": "獨蒜",
"規格": "",
"單位": "斤",
"數量": 2,
"單價": 18,
"金額": 36,
"備註": ""
}
],
"頁小計": {
"每頁合計": "312.2",
"單位": "元"
},
"地址": "*******",
"聯絡電話": "152171******",
"制單員": "**",
"收貨單位簽章": "1月1 七 13"
}
}
“`
總結:融合傳統方法的必要
OCR技術在識別靜態文字方面表現出色,但缺乏對影像內容的識別和上下文理解能力。而大模型具有強大的特徵提取和抽象能力,可以有效捕捉資料中的潛在關聯和複雜性。將這兩種技術相融合,能夠有效減少誤識別的機率,實現更高精度的識別結果。兩種技術的優劣勢相互補充,形成一種更具適應性、靈活性和高效性的解決方案。
大模型並非“萬能”的,支援服務的客戶越多,就越能體會到“能不讓大模型做的事情就不讓它做”的實踐經驗對提升效果的重要性。許多傳統方法仍然在特定領域下表現出色,可以為大模型提供前置輸入處理。另外,從計算資源和響應時延的角度來看,傳統技術相對於大模型也具有不少優勢。結合傳統技術可以滿足即時性和高效性的需求,從而增強使用者體驗。
將大模型與傳統技術融合,不僅能彌補各自的不足,還能在多個層面提升資訊處理的能力和效率。這種融合不僅是技術發展的必然趨勢,也是推動各行業智慧化轉型的重要驅動力。
來自團隊:公共雲業務-技術服務部
參考連結:
[1]https://help.aliyun.com/zh/model-studio/developer-reference/qwen-vl-api
[2]https://ai.aliyun.com/ocr
[3]https://help.aliyun.com/zh/ocr/developer-reference/api-ocr-api-2021-07-07-recognizehandwriting
一鍵訓練大模型及部署GPU共享推理服務
透過建立ACK叢集Pro版,使用雲原生AI套件提交模型微調訓練任務與部署GPU共享推理服務。   
點選閱讀原文檢視詳情。

相關文章