这个坑值得记一笔。用 openai 1.40 把 3840x2160 的后台截图发给 gpt-4o 做字段抽取,模型返回的值整体偏移,把金额读成上行的时间戳;同一张图先手工裁成 1280 宽再传就恢复正常,接口没有任何报错提示图像被缩放。
刚开始盯着「detail 用默认的 auto,模型自己选了低分辨率通道」,折腾了半个多小时,排掉了。
真正麻烦的地方在于,几个原因的现象几乎一样。长边超过 2048 像素后服务端会等比缩小,窄笔画被糊掉;图像被切成多个 512 方块,块边界正好压在数字上;PNG 截图带半透明图层,缩放后文字与底色对比度下降。
动手时先用 Pillow 把长边压到 1600 再从原图裁出局部对照
python -c "from PIL import Image;im=Image.open('shot.png');im.thumbnail((1600,1600));im.save('small.png')"
再往下确认每张图的 token 开销是否落在预期区间
python -c "import base64,tiktoken;print(len(base64.b64encode(open('small.png','rb').read())))"
随后关键区域单独裁一块放大后再发一次请求
python crop_region.py --src shot.png --box 1120,540,1600,760 --scale 2
末了把 detail 显式写成 high,观察返回字段是否稳定
curl https://api.openai.com/v1/chat/completions -H "Authorization: Bearer $KEY" -d '{"model":"gpt-4o","messages":[{"role":"user","content":[{"type":"image_url","image_url":{"url":"data:image/png;base64,...","detail":"high"}}]}]}'
怎么算真的好了,看的是同一批现象。同一批 30 张截图抽取,金额与时间字段与人工核对一致,日志里记录的图像长边都在 1600 以内,token 消耗波动不超过一成。
容易忽略的是,缩图是服务端静默做的,接口不会告诉你降了分辨率,遇到小字错读先把原图裁局部放大验证一遍,再决定要不要整体缩。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
