问题出现得很突然,日志倒是留得挺全。在运维截图里用红框圈了三个异常指标,让 gpt-4o 逐个说明,返回只提到最下面那个框,另外两个完全没提;换成分别裁三张小图单独问,三次都答对了。

刚开始盯着「提问用了「这些红框」这类复数指代,没给编号」,折腾了半个多小时,排掉了。

原因不止一个,得分开看。多目标同图时模型注意力被最大的框吸走。另一种情况是红框颜色与告警色接近,模型把它们当成界面元素。

还有一种情况,图片整体分辨率高,小框在缩放后只剩几个像素。

上来先确认红框在原图上的像素尺寸

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

然后按框坐标裁成三张子图并分别提问

python crop_multi.py --src ops.png --boxes boxes.json --outdir crops/

一次请求里带三张图并在文字中标注图序

curl https://api.openai.com/v1/chat/completions -H "Authorization: Bearer $KEY" -d '{"model":"gpt-4o","messages":[{"role":"user","content":[{"type":"text","text":"第一张图说明指标A,第二张图说明指标B"},{"type":"image_url","image_url":{"url":"data:image/png;base64,..."}}]}]}'

要求按编号输出,缺项时返回 not_found

python run_extract.py --prompt prompts/annotate.txt --images crops/*.png

怎么算真的好了,看的是同一批现象。三个异常点都被逐一说明,编号与红框位置对得上,缺失项返回 not_found 而不是静默跳过。

补一句。同图多目标时不要指望模型自己数清楚,先裁图再编号提问,成本略高但结果可核对,也方便把每处结论单独存档。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189