问题出现得很突然,日志倒是留得挺全。把一张 3000x2000 的财务报表截图直接传给 gpt-4o,问第三季度毛利率,模型把相邻两列数字读串,回答 41.7% 而实际是 14.7%,换成手动裁小的图后结果正确。

刚开始盯着「截图带缩放,数字之间没有足够留白」,折腾了半个多小时,排掉了。

把日志和配置对完,能解释这个现象的基本就这几处。图片被等比缩到模型内部上限,小字糊成一片。还有一种是detail 用默认值,tile 切分后列边界被切开。

另外,一次塞多张表,模型注意力分散到不同区域。

上来先看图片原始尺寸和 DPI

python -c "from PIL import Image;im=Image.open('report.png');print(im.size, im.info.get('dpi'))"

再往下按表格区域裁切并放大到 1500 像素宽

ffmpeg -i report.png -vf "crop=1500:900:120:340,scale=1500:-1" crop_q3.png

单表单请求并显式要求逐列对齐

curl https://api.openai.com/v1/chat/completions -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" -d '{"model":"gpt-4o","messages":[{"role":"user","content":[{"type":"text","text":"按列读出表格,每行输出名称与数值"},{"type":"image_url","image_url":{"url":"data:image/png;base64,<B64>","detail":"high"}}]}]}'

末了把回答与原始单元格做逐项比对

python diff_cells.py --answer ans.json --sheet q3.xlsx

别只看报错消失,验证要多做一步。裁切后的单表请求读出的 12 个数字与 Excel 完全一致,毛利率回到 14.7%,重复三次结果稳定。

表格识别的瓶颈是像素而不是上下文,一张图塞整页报表必然串行,裁到单表并把 detail 提到 high 才有稳定结果。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189