这个坑值得记一笔。用 gpt-4o 读一张 800 宽的发票截图,金额和单位经常串行,同一张图放大到 2000 宽再传就基本正确,接口本身没报错。

刚开始盯着「表格线细,缩放后与文字粘连」,折腾了半个多小时,排掉了。

原因不止一个,得分开看。图片被服务端缩放,小字在缩放后糊成一片;detail 设成 low 时只取低分辨率缩略图;长图被等比压缩,纵向细节损失更严重。

上来先看图片原始尺寸与文字高度

python -c "from PIL import Image;im=Image.open('inv.png');print(im.size)"

随后切成上下两半分别识别再拼接

python -c "from PIL import Image;im=Image.open('inv.png');w,h=im.size;im.crop((0,0,w,h//2)).save('top.png')"

显式把 detail 设为 high

python -c "import json;print(json.dumps({'type':'image_url','image_url':{'url':'data:image/png;base64,AAA','detail':'high'}}))"

剩下的就是用 OCR 结果做交叉校验

python -c "import pytesseract;from PIL import Image;print(pytesseract.image_to_string(Image.open('inv.png'),lang='chi_sim')[:80])"

手上没有现成的复现脚本,就照着线上请求手工拼了一个。

怎么算真的好了,看的是同一批现象。字段与数值不再串行,金额、单位、日期三项都能对上行号,抽取脚本校验通过率明显上升。

提高分辨率不是万能解,长图更该切片,切片既保住细节又避免整体缩放带来的模糊。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189