銀行材料掃描件按戶拆分(批量材料→單戶Word)
觸發條件
- 客戶(律所/銀行/催收機構)發來批量材料壓縮包(RAR/ZIP 加密)或大 docx(61MB+,全是掃描件圖片)
- 要求「把身份證和開卡申請書拆出來,分別放到各自的 Word 文件裡」
- 要求「單戶 Word = 該客戶身份證正面 + 對應背面 + 對應銀行申請材料,一個不能漏」
- 用戶強調「從頭檢查一遍」——此類任務質量要求高,識別錯誤=客戶損失
用戶鐵律(2026-08-19 用戶)
- 單戶 Word 必須包含:身份證正面 + 對應背面(國徽頁)+ 對應申請材料(申請書),一張不漏
- 文件名標註清楚:
姓名-身份證+開卡申請書.docx - 待人工核對:識別不出/無法匹配的單獨放「待人工核對」資料夾,不混在正常結果裡
- 用戶要求統計:從識別開始到完成分拆的耗時、調用次數、token、費用——客戶可複制定價依據
完整工作流(5步)
Step1 解包
# 加密RAR用7z(本機 C:\Program Files\7-Zip\7z.exe)
"C:/Program Files/7-Zip/7z.exe" x -p"密碼" input.rar -y
# 客戶給的密碼要問用戶;RAR5格式7z可解
- 常見形態:RAR解壓後是一個超大 docx(如《影像材料2.docx》61MB),裡面沒有文字,全是圖片
Step2 從docx提取圖片
import zipfile
with zipfile.ZipFile('影像材料2.docx') as z:
media = [f for f in z.namelist() if f.startswith('word/media/') and f.endswith('.png')]
for f in media: z.extract(f, out_dir)
- docx本質是zip,圖片在 word/media/ 下,命名 image1.png~imageN.png
- 圖片編號 = 原始掃描順序,後面歸戶會用到
Step3 視覺識別分類(⭐核心:模型選型)
絕不用 GLM-4V-Flash 做關鍵證件識別!(本session實測幻覺:11/18張身份證背面被編造成「正面」+編造姓名)
用豆包 Seed 2.0 Pro(doubao-seed-2-0-pro-260215,VLM,準確):
payload = {
"model": "doubao-seed-2-0-pro-260215",
"messages": [{"role": "user", "content": [
{"type": "text", "text": "這是銀行客戶材料掃描件。判斷類別並提取關鍵信息:\n類別只能是:身份證正面、身份證背面、開卡申請書、信用卡申請書、其他材料\n正面→提取姓名+身份證號;背面→提取簽發機關;申請書→提取申請人姓名\n輸出格式:類別:XXX\n姓名:XXX(無則寫無)\n身份證號:XXX\n簽發機關:XXX"},
{"type": "image_url", "image_url": {"url": f"data:image/png;base64,{b64}"}}
]}],
"max_tokens": 200
}
# base_url: https://ark.cn-beijing.volces.com/api/v3/chat/completions
# KEY: .env 的 ARK_API_KEY
- 每張間隔1s防限流,每15張存進度json(斷點續傳),重試3次(429/超時等5-8s)
- 136張約35-40分鐘(17s/張)——後台跑+notify_on_complete
Step4 按戶歸組(正面定戶→背面匹配→申請書匹配)
- 正面姓名定戶:每張「身份證正面」提取姓名→建戶(每戶有fronts/backs/apps三個列表)
- 背面匹配(按簽發機關地區 ↔ 正面身份證前6位地區碼):
- 維護地區碼→公安局名映射表(450122=武鳴、452128=武鳴、450126=賓陽...廣西為主,客戶是廣西銀行時)
- 匹配成功→歸戶;市級簽發機關(南寧市公安局/柳州市公安局)無法唯一匹配→豆包成對對比(一次傳正面+背面兩張圖問「是否同一人」)或待人工核對
- 申請書匹配(姓名):直接匹配 + 拼音模糊匹配(pypinyin):
lazy_pinyin(name)前2字同音即匹配(黃祉玲→黃令、唐咸梅→唐鳳梅、姚賢明→姚先明)- 手寫體申請書姓名識別偏差大,模糊匹配是救回的關鍵
- ⚠️ 別用「原始順序相鄰」匹配正反面——多人混排時會把別人背面歸錯戶(本session教訓:順序匹配44張>實際34張)
Step5 生成單戶Word(python-docx)
from docx import Document
from docx.shared import Cm
doc = Document()
# 標題(居中加粗):{姓名} - 銀行材料
# 【身份證正面】→ 圖寬8cm,逐張 add_picture + 空行
# 【身份證背面】→ 同上
# 【銀行申請材料】→ 圖寬12cm
doc.save(f"{out_dir}/{name}-身份證+開卡申請書.docx")
- 文件名:
{姓名}-身份證+開卡申請書.docx - 未匹配背面/申請書 → 複製到
待人工核對/子目錄
成本統計(用戶要求,交付時給)
# 從API響應 usage 字段累計:prompt_tokens/completion_tokens
# 估算:高清掃描件每張≈2000 tokens輸入、200 tokens輸出
# 豆包Seed 2.0 Pro視覺:輸入≈0.008元/千tokens → 136張全量約2-5元
# 耗時:從識別開始到Word完成
交付給用戶的統計表:調用次數、輸入/輸出tokens、估算費用、總耗時(本session:136張≈180次調用、45萬tokens、3-5元、35分鐘識別+幾分鐘歸戶)
關鍵坑
- GLM-4V-Flash幻覺(本session最痛教訓):識別不出就「編」——把背面編成正面+編造姓名。關鍵識別必須用豆包
- docx圖片提取:用zipfile直接讀 word/media/,不要用python-docx的inline_shapes(大文件慢且不全)
- PIL圖像增強:RGBA模式要先 convert('RGB') 才能做 Contrast/Sharpness/autocontrast;旋轉90°的身份證 h>w*1.5 時生成 ±90°兩個版本分別識別
- 地區碼映射表:廣西為主時手工維護縣→公安局映射(4501=南寧、4502=柳州...),客戶是外省時按身份證前6位查行政區劃
- 豆包慢:17s/張,批量必須後台跑+斷點續傳,別前台等
- 識別「看不清」的件:先PIL增強再二次識別,仍不行才進待人工核對
相關技能
- 視覺模型矩陣/費用紀律:見 model-cost-discipline(user-owned,僅參考)
- 本地OCR:deepseek-ocr(Ollama)適合整頁文字OCR,不適合證件分類
關於作者
九品錦鋰e | 把踩過的坑封裝成「拿來就能跑」的 skill,不寫教科書。
這個 skill 是我自己在用的版本,裡面每條坑都是真踩過的。用的時候卡住了、想要進階玩法、或者有別的場景想讓我封裝成 skill,直接加我微信說,加時備註「SkillHub」我優先通過:

掃碼添加作者微信 · 備註「SkillHub」優先通過