面单识别八模型横评

GWMS · 退件面单识别 · 模型横评

八个大模型读同一批快递面单

用 GWMS 生产环境完全相同的提示词与调用方式(base64 内联图片、单轮对话、要求返回裸 JSON),把 4 张真实退件面单交给 8 个视觉模型,逐字段比对上传速度、识别速度与识别结果。

首轮 4 张图 × 7 个模型 = 28 次调用(26 次返回可解析结果),后续追加 48 次图片格式对照与 32 次生产模型复核,合计 108 次真实调用。全部串行执行以免带宽争抢污染上传计时。基准(ground truth)由逐张放大原图人工核对得出,而非取模型多数票——多数票在本次测试中至少两处集体偏离真值。

一处重要更正:首轮把 qwen-vl-max 当成了生产模型,实为误标。生产调用的 ModelType.QWEN_VL_MAX 实际下发的是 qwen3.7-plus。下表中标注「GWMS 生产实际下发」的那一行才是线上现状;它与 qwen-vl-max 的数据来自同一时间窗的配对复测,详见「生产到底在用哪个模型」一节。

提示词来源 WmsReturnOrderServiceImpl#recognizeLabelFromImagecustomerCodeSuffix = -RTN(sys_config)测试地点:加拿大

准确率最高96%claude-opus-5
22 项完全正确 / 24 项
端到端最快2.81 sgpt-5.2
平均单张总耗时
生产实际耗时11.78 sqwen3.7-plus
线上真正下发的模型
规则违反1qwen3-vl-plus 在无 -RTN 后缀时
仍填了 customerCode

测试素材

四张图分辨率完全一致(608 × 1080),但两张是倒置 180° 拍摄的——这恰好是 PDA 现场拍照最常见的情形,也是本次拉开模型差距的主要变量。

UPS Ground 退件单 · 正置清晰
118 · 正置608×1080 · PNG · 888 KBUPS Ground 退件单 · 正置清晰
UPS Ground 退件单 · 正置、纸面反光
119 · 正置608×1080 · PNG · 930 KBUPS Ground 退件单 · 正置、纸面反光
FedEx Ground · 倒置、收件人行破损
120 · 倒置 180°608×1080 · PNG · 1174 KBFedEx Ground · 倒置、收件人行破损
UPS Ground 退件单 · 倒置、斜置
121 · 倒置 180°608×1080 · PNG · 932 KBUPS Ground 退件单 · 倒置、斜置
图片像素尺寸真实格式原始文件Base64 后实际请求体方向
118608 × 1080PNG · 扩展名写作 .jpg888.0 KB1184.0 KB1185.5 KB正置
119608 × 1080PNG930.1 KB1240.1 KB1241.7 KB正置
120608 × 1080PNG1174.2 KB1565.6 KB1567.2 KB倒置 180°
121608 × 1080PNG · 扩展名写作 .jpg932.1 KB1242.9 KB1244.4 KB倒置 180°

Base64 把体积放大约 1.33 倍;加上提示词与 JSON 外壳,每次请求实际推上去的字节数在 1.19 – 1.57 MB 之间。四个文件全部是 PNG,其中两个扩展名却写作 .jpg——如果调用方按扩展名拼 data:image/jpeg 前缀,MIME 就与内容不符。本次测试按真实格式发送,各家均未因此报错,但这是一处值得收紧的隐患。

上传与识别速度

计时用 http.client 手工分段,把「传字节」和「等模型」拆开:建连 = DNS + TCP + TLS 握手;上传 = 把整个请求体推入 socket 的耗时;识别 = 上传结束到响应首字节,即模型端排队 + 读图 + 推理 + 生成。下表取 4 次调用的中位数,而不是平均值——见表下说明。

模型建连上传
中位数
上传耗时对比上行速率首次调用
上传
识别
中位数
识别耗时对比读响应
中位数
总计
中位数
输入 tok
gpt-5.2
OpenAI
0.120.32
33.5 Mb/s5.412.41
0.002.811134
qwen-vl-max
阿里云 DashScope
1.521.81
5.9 Mb/s3.803.05
0.006.24987
qwen3-vl-plus
阿里云 DashScope
0.941.92
5.6 Mb/s24.164.34
0.007.19987
claude-opus-5
Anthropic
0.110.24
43.9 Mb/s15.746.96
0.009.501417
gemini-2.5-flash
Google
0.100.22
48.4 Mb/s6.105.83
0.009.56593
qwen3.7-plus 生产
阿里云 DashScope
0.822.01
5.3 Mb/s—8.07
0.0011.78995
deepseek-v4-flash-vision-exp
DeepSeek
0.160.21
50.1 Mb/s2.720.85
14.6317.10771
abab7-chat-preview
MiniMax
1.513.91
2.7 Mb/s6.215.65
0.0019.825154

「读响应」一列解释了 deepseek-v4-flash-vision-exp 为什么「识别」只要 0.85 秒、「总计」却要 17 秒:它把长篇思考过程一起写进响应体,首字节来得很快,但正文迟迟传不完。这也正是它在两张倒置图上整图失败的原因——输出全是思考过程,没有 JSON。

标「生产」的 qwen3.7-plus 是后续补测并入的,每张图取 2 轮中位数,因此没有「首次调用」一列;它与 qwen-vl-max 在同一时间窗内配对测量,两者可直接比较,与其余 6 个模型跨窗比较时请留意网络条件差异。

单位:秒。这里必须取中位数而不是平均值:每个模型的第一次调用(都落在图 118 上)都要新建 TLS 连接、冷启动 TCP 拥塞窗口,上传耗时被系统性抬高——claude-opus-5 首次 15.74 秒、随后三次全在 0.19–0.29 秒;qwen3-vl-plus 首次 24.16 秒、随后 1.32–2.09 秒。拿平均值排名会把这个测量假象当成模型差异。「首次调用」一列单独列出,供对照。

剔除冷启动后,上传耗时的差异来自网络路径而非模型本身:Google、Anthropic、OpenAI、DeepSeek 端点稳定在 0.2–0.3 秒,阿里云 DashScope 在 1.3–2.1 秒,MiniMax 波动最大(1.58 – 28.65 秒)。测试从加拿大发起,对国内端点天然不利,这一列不能直接用来判断模型优劣;但对「PDA 部署在北美仓库」这个真实场景,它就是实打实的用户等待时间。

把图片转成 JPEG、缩小尺寸,到底省了什么

这两件事效果完全不同,必须分开看。压体积只影响传输的字节数;压像素尺寸才会改变模型要处理的图像 token 数。下面用同一批面单跑了三个变体,各 4 张图 × 4 个模型 = 48 次额外调用,仍然串行。

变体像素尺寸请求体模型输入 token识别中位数端到端中位数准确率
PNG 原图608 × 10801310 KBqwen-vl-max9873.056.2492%
gemini-2.5-flash5935.839.5690%
claude-opus-514176.969.5096%
gpt-5.211342.412.8173%
JPEG q85608 × 1080136 KBqwen-vl-max9873.104.26 (-32%)94%
gemini-2.5-flash5935.045.19 (-46%)85%
claude-opus-514175.615.71 (-40%)98%
gpt-5.211342.002.15 (-23%)67%
JPEG q60608 × 1080108 KBqwen-vl-max9873.194.03 (-35%)94%
gemini-2.5-flash5933.713.78 (-60%)88%
claude-opus-514177.717.80 (-18%)98%
gpt-5.211341.761.87 (-34%)73%
JPEG q85 · 尺寸减半304 × 54054 KBqwen-vl-max511 (-48%)3.504.29 (-31%)56%
gemini-2.5-flash5933.884.02 (-58%)83%
claude-opus-5779 (-45%)6.736.79 (-29%)81%
gpt-5.2563 (-50%)2.012.07 (-26%)62%
转 JPEG:省上传,不省识别

请求体从 1310 KB 降到 136 KB(压掉 90%),端到端耗时随之下降 23% – 46%。但同一列的输入 token 数一个都没变——qwen 987、gemini 593、claude 1417、gpt-5.2 1134,PNG 与两档 JPEG 完全相同。视觉模型是按像素切 patch 的,文件压得多小都不改变它要读的 token 数,所以识别环节本身没有任何加速,省下来的全是网络传输时间。

JPEG 压缩没有掉准确率

四个模型合计:PNG 原图 87.5%、JPEG q85 85.9%、JPEG q60 88.0%。差异落在 ±2 个百分点内,而且压得更狠的 q60 反而比 q85 高——如果真是压缩损伤,应该是单调下降的。这说明差异来自模型自身的随机性,不是画质。面单是黑白线条与文字,JPEG 在这个分辨率下几乎无损。

缩小像素尺寸:既没更快,还大幅掉准

尺寸减半后 token 确实降了 45% – 50%(gemini 除外,它对小图有 token 下限,593 纹丝不动),但端到端耗时相比 JPEG q85 没有进一步改善(qwen 4.26s → 4.29s)。原因很直接:1000 量级的 prefill 对这些模型根本不是瓶颈,瓶颈在生成和排队。

代价却很惨重:合计准确率从 87.5% 掉到 70.8%,qwen-vl-max 从 92% 掉到 56%。更糟的是失败模式变险——原图上没出现过的 customerCode 规则违反冒出来两次(误填 A1N650-32897、RS),运单号也开始大面积错乱(1Z0A1Z09059513712)。结论:转 JPEG 可以,缩尺寸不要做。

口径说明:每个变体每个模型 4 次调用,单轮实验,准确率各 24 个记分项。样本量小,±2 个百分点的差异不具统计意义;真正可靠的信号是 token 数完全不变(确定性事实)和尺寸减半后 17 个百分点的大幅下滑。「上传」一列在小请求体下会显示接近 0,那是因为字节一次就塞进了 socket 缓冲区、实际传输被并入了等待响应的时间,所以这里改看端到端总耗时。

识别准确率

按人工核对的基准逐字段打分。✓ 正确 计 1 分,~ 偏差 计 0.5 分,✕ 错误 与 ○ 缺失 计 0 分。每张图 6 个记分项(customerCode、recipientRaw、carrier、trackingNo、尺寸、重量),满分 24。

排名模型得分准确率✓~✕○整图失败
1claude-opus-5
Anthropic
23.0 / 24
96%
22200—
2qwen3.7-plus GWMS 生产实际下发
阿里云 DashScope
22.5 / 24
94%
22101—
3qwen-vl-max 枚举名暗示的模型
阿里云 DashScope
22.0 / 24
92%
22020—
4qwen3-vl-plus 阿里新一代 VL
阿里云 DashScope
21.5 / 24
90%
21120—
5gemini-2.5-flash GWMS AI 助手同款
Google
21.5 / 24
90%
21120—
6gpt-5.2
OpenAI
17.5 / 24
73%
17124—
7abab7-chat-preview
MiniMax
15.0 / 24
62%
15063—
8deepseek-v4-flash-vision-exp 实验版视觉模型
DeepSeek
12.0 / 24
50%
1200122

118 — UPS Ground 退件单 · 正置清晰

模型customerCoderecipientRawcarriertrackingNo尺寸 L/W/Hweight
人工基准nullPEREGRINE-A142 6AB TERMINAL WAY AVENEL NJ 07001UPS1Z0JA1729095951372null1.0 LBS
claude-opus-5
✓null(正确:面单无 -RTN 后缀)
✓含收件人标识与地址
✓UPS
✓逐位一致
✓null(面单未印尺寸)
✓1 LBS
qwen3.7-plus
✓null(正确:面单无 -RTN 后缀)
✓含收件人标识与地址
✓UPS
✓逐位一致
✓null(面单未印尺寸)
✓1 LBS
qwen-vl-max
✓null(正确:面单无 -RTN 后缀)
✓含收件人标识与地址
✓UPS
✓逐位一致
✓null(面单未印尺寸)
✓1 LBS
qwen3-vl-plus
✓null(正确:面单无 -RTN 后缀)
✓含收件人标识与地址
✓UPS
✓逐位一致
✓null(面单未印尺寸)
✓1 LBS
gemini-2.5-flash
✓null(正确:面单无 -RTN 后缀)
✓含收件人标识与地址
✓UPS GROUND
✕与基准差 1 位:'1Z OJA 172 90 9595 1372'
✓null(面单未印尺寸)
✓1 LBS
gpt-5.2
✓null(正确:面单无 -RTN 后缀)
~含收件人标识,地址不全
✓UPS
✓逐位一致
✓null(面单未印尺寸)
✓1 LBS
abab7-chat-preview
✓null(正确:面单无 -RTN 后缀)
✕取成了寄件人
✓UPS GROUND
✕与基准差 2 位:'12 OJA 172 90 9595 1372'
✓null(面单未印尺寸)
✓1 LBS
deepseek-v4-flash-vision-exp
✓null(正确:面单无 -RTN 后缀)
✓含收件人标识与地址
✓UPS
✓逐位一致
✓null(面单未印尺寸)
✓1 LBS

119 — UPS Ground 退件单 · 正置、纸面反光

模型customerCoderecipientRawcarriertrackingNo尺寸 L/W/Hweight
人工基准nullPEREGRINE-A142 6AB TERMINAL WAY AVENEL NJ 07001UPS1Z0JA1729065777966null1.0 LBS
claude-opus-5
✓null(正确:面单无 -RTN 后缀)
✓含收件人标识与地址
✓UPS
✓逐位一致
✓null(面单未印尺寸)
✓1 LBS
qwen3.7-plus
✓null(正确:面单无 -RTN 后缀)
✓含收件人标识与地址
✓UPS
✓逐位一致
✓null(面单未印尺寸)
✓1 LBS
qwen-vl-max
✓null(正确:面单无 -RTN 后缀)
✓含收件人标识与地址
✓UPS
✓逐位一致
✓null(面单未印尺寸)
✓1 LBS
qwen3-vl-plus
✓null(正确:面单无 -RTN 后缀)
✓含收件人标识与地址
✓UPS
✓逐位一致
✓null(面单未印尺寸)
✓1 LBS
gemini-2.5-flash
✓null(正确:面单无 -RTN 后缀)
✓含收件人标识与地址
✓UPS
✕与基准差 1 位:'1Z OJA 172 90 6577 7966'
✓null(面单未印尺寸)
✓1 LBS
gpt-5.2
✓null(正确:面单无 -RTN 后缀)
✓含收件人标识与地址
✓UPS GROUND
✓逐位一致
✓null(面单未印尺寸)
✓1 LBS
abab7-chat-preview
✓null(正确:面单无 -RTN 后缀)
✕取成了寄件人
✓UPS GROUND
✓逐位一致
✓null(面单未印尺寸)
✓1 LBS
deepseek-v4-flash-vision-exp
✓null(正确:面单无 -RTN 后缀)
✓含收件人标识与地址
✓UPS
✓逐位一致
✓null(面单未印尺寸)
✓1 LBS

120 — FedEx Ground · 倒置、收件人行破损

模型customerCoderecipientRawcarriertrackingNo尺寸 L/W/Hweight
人工基准nullAMC 6AB TERMINAL WAY AVENEL NJ 07001FEDEX87275872752736 × 27 × 10 IN100.09 LB
claude-opus-5
✓null(正确:面单无 -RTN 后缀)
~地址对,缺收件人标识行
✓FedEx Ground
✓逐位一致
✓36 × 27 × 10
~100.99 vs 基准 100.09
qwen3.7-plus
✓null(正确:面单无 -RTN 后缀)
~地址对,缺收件人标识行
✓FedEx
✓逐位一致
✓36 × 27 × 10
○返回 null
qwen-vl-max
✓null(正确:面单无 -RTN 后缀)
✓含收件人标识与地址
✓FedEx
✓逐位一致
✓36 × 27 × 10
✕160.0 vs 基准 100.09
qwen3-vl-plus
✕误填 'A089-260601-0171' — 违反「当且仅当识别到 -RTN 才填」
~地址对,缺收件人标识行
✓FedEx
✓逐位一致
✓36 × 27 × 10
✓100.09 LB
gemini-2.5-flash
✓null(正确:面单无 -RTN 后缀)
✓含收件人标识与地址
✓FedEx
✓逐位一致
✓36 × 27 × 10
~100.0 vs 基准 100.09
gpt-5.2
✓null(正确:面单无 -RTN 后缀)
○返回 null
✓FedEx Ground
✓逐位一致
○返回 null
○返回 null
abab7-chat-preview
✓null(正确:面单无 -RTN 后缀)
○返回 null
✓FedEx
✕与基准差 3 位:'872758727'
○返回 null
○返回 null
deepseek-v4-flash-vision-exp✕ 整图失败 未找到 JSON 对象

121 — UPS Ground 退件单 · 倒置、斜置

模型customerCoderecipientRawcarriertrackingNo尺寸 L/W/Hweight
人工基准nullPEREGRINE-YY166 6AB TERMINAL WAY AVENEL NJ 07001UPS1Z0JA1729046196692null4.0 LBS
claude-opus-5
✓null(正确:面单无 -RTN 后缀)
✓含收件人标识与地址
✓UPS
✓逐位一致
✓null(面单未印尺寸)
✓4 LBS
qwen3.7-plus
✓null(正确:面单无 -RTN 后缀)
✓含收件人标识与地址
✓UPS
✓逐位一致
✓null(面单未印尺寸)
✓4 LBS
qwen-vl-max
✓null(正确:面单无 -RTN 后缀)
✕取成了寄件人
✓UPS
✓逐位一致
✓null(面单未印尺寸)
✓4 LBS
qwen3-vl-plus
✓null(正确:面单无 -RTN 后缀)
✕取成了寄件人
✓UPS
✓逐位一致
✓null(面单未印尺寸)
✓4 LBS
gemini-2.5-flash
✓null(正确:面单无 -RTN 后缀)
✓含收件人标识与地址
✓UPS
✓逐位一致
✓null(面单未印尺寸)
✓4 LBS
gpt-5.2
✓null(正确:面单无 -RTN 后缀)
✕与收件人栏不符
✓UPS
✕与基准差 1 位:'1Z 04A 172 90 4619 6692'
✓null(面单未印尺寸)
○返回 null
abab7-chat-preview
✓null(正确:面单无 -RTN 后缀)
✕与收件人栏不符
✓UPS
✕与基准差 1 位:'1Z 0J8 172 90 4619 6692'
✓null(面单未印尺寸)
✓4 LBS
deepseek-v4-flash-vision-exp✕ 整图失败 未找到 JSON 对象

生产到底在用哪个模型

横评做完后回查生产代码,发现一处枚举名与实际模型不一致:退件识别调用的 ModelType.QWEN_VL_MAX,枚举名和显示名都是「通义千问VL-Max」,但构造时传入的模型串是 qwen3.7-plus。也就是说,上面表格里的 qwen-vl-max 并不是生产在跑的模型。

String QWEN_VL_MAX          ← 枚举名
String qwen3.7-plus         ← 真正下发给 DashScope 的 model
ModelProvider.QWEN
String 通义千问VL-Max        ← 显示名
String 视觉模型

核实链条:反编译 gwms-common-ai:1.0.20(mvn dependency:tree 确认即项目实际解析版本);application.yml 的 gwms.ai.providers.qwen 只配了 api-key,未覆盖模型;wms_ai_call_config.model 存的是枚举名(ModelType.valueOf),只能在三个枚举间选,无法直接指定模型串,且退件识别直接调 modelFactory.sendVlModel,根本不走那张表。模型串硬编码在共享库里,没有配置侧旁路。

两个模型的同口径复测

PNG / JPEG q85 交替,每张图各 2 轮,共 32 次调用,两个模型在同一时间窗内测量以抵消网络漂移。耗时口径与主表一致:先每张图取中位数,再跨图取中位数(每张图等权)。

模型格式请求体上传推理推理耗时对比端到端输入 token准确率
qwen3.7-plus 现状PNG1310 KB2.018.07
11.7899594%
qwen3.7-plusJPEG136 KB0.298.84
10.0099594%
qwen-vl-maxPNG1310 KB3.922.88
7.5598794%
qwen-vl-max 目标组合JPEG136 KB0.253.15
4.4098792%
真实基线是 11.78 秒

报告首轮把 qwen-vl-max 当成了生产基线,那是贴错标签。生产跑的 qwen3.7-plus 端到端 11.78 秒,其中推理独占 8.07 秒。用户抱怨「识别慢」的程度,比按 qwen-vl-max 估算的严重得多。

换模型是提速的大头,转 JPEG 是小头

推理耗时 8.07 s → 2.88 s,砍掉 64%——这是唯一能压缩推理时间的杠杆。而转 JPEG 对 qwen3.7-plus 只把端到端从 11.78 s 拉到 10.00 s(快 15%),因为它的瓶颈在推理不在上传;输入 token 数照例纹丝不动(995)。两者叠加:11.78 s → 4.40 s,快 63%。

准确率没有代价——之前的差距是采样噪声

两个模型在 PNG 下同为 94%。首轮单次采样得到的「qwen3.7-plus 96% vs qwen-vl-max 92%」在加倍采样后消失了,这正说明 4 次调用的样本量下 ±4 个百分点不能当结论用。失分点不同但数量相同:qwen3.7-plus 丢图 120 的重量,qwen-vl-max 丢图 121 的 recipientRaw。

唯一的代价出现在目标组合上

qwen-vl-max + JPEG 这一格掉到 92%,多出的失分是一次 customerCode 规则违反:把 REF 号 A089-266601-0171 填进了 customerCode。所以「customerCode 落库前正则复核」不能算后续可选项,必须和这次改动捆在一起做,否则等于拿准确率换速度。

改动落在共享库,且影响两个功能

ModelType.QWEN_VL_MAX 有两个调用点:WmsReturnOrderServiceImpl(退件面单)和 OutOrderLabelAiService(出库面单)。改枚举会同时影响两者,需一并回归。而模型串位于 gwms-common-ai,与 GWMS 主仓分属不同仓库,需单独发版。动手前还应先确认:这个配置是笔误,还是当初有意规避 VL-Max 的某个问题。

各模型结果是否一致

同一张图上,把各模型的返回值归一化(去空格、统一大小写)后数有几种不同取值。取值种数越多,说明该字段越不可靠。

字段118119120121判断
customerCode 1 种 / 8 家 1 种 / 8 家 2 种 / 7 家 1 种 / 7 家 仅一处分歧——但那一处是把 REF 号当成了客户编码,属于规则违反。
recipientRaw 3 种 / 8 家 2 种 / 8 家 5 种 / 7 家 5 种 / 7 家 分歧最大。多个模型把寄件人当成了收件人,直接导致客户匹配错到别家。
carrier 2 种 / 8 家 2 种 / 8 家 2 种 / 7 家 1 种 / 7 家 高度一致,但大小写与后缀(UPS / UPS GROUND / FedEx / FedEx Ground)不统一,入库前必须归一化。
trackingNo 3 种 / 8 家 2 种 / 8 家 2 种 / 7 家 3 种 / 7 家 最危险的字段:数值本身分歧,且分隔符格式各家不同。运单号错一位即查无此单。
尺寸 L/W/H 1 种 / 8 家 1 种 / 8 家 2 种 / 7 家 1 种 / 7 家 有尺寸的那张图上,凡是作答的模型都读对了 36 × 27 × 10。
weight 1 种 / 8 家 1 种 / 8 家 5 种 / 7 家 2 种 / 7 家 有尺寸的那张图上四家给出四个不同的数,只有一家读对 100.09。

关键发现

倒置照片是真正的分水岭

两张正置面单上,七个模型的表现几乎没有差别,运单号全部读对(少数把 0JA 的零看成字母 O)。一旦换成倒置 180° 的两张,差距立刻拉开:deepseek-v4-flash-vision-exp 两张全军覆没,只吐出思考过程、没有 JSON;gpt-5.2 在 FedEx 那张上除承运商和运单号外全部返回 null;abab7-chat-preview 把运单号截断成 872758727。而 PDA 现场拍照恰恰经常是倒的——这个场景必须专门验证,不能只拿摆拍样张评估。

recipientRaw 会把寄件人当成收件人

提示词写得很明确:「直接复制面单上收件人 / Ship To 栏的全部文字」。但在 118 与 119 上,abab7-chat-preview 返回的是寄件人 STEPHANIE BARKER / ROBERT AGUANNO;在倒置的 121 上,qwen-vl-max(正是当前生产模型)与 qwen3-vl-plus 同样返回了寄件人 MARIA BROADNAX。而 recipientRaw 的用途是「按别名匹配客户」——取错这一栏,包裹就会被认领到别的客户名下,比返回 null 危险得多,因为它是静默出错。

qwen3-vl-plus 违反了 customerCode 的硬规则

四张面单没有一张带 -RTN 后缀,正确答案统一是 null,六个模型都做对了。唯独 qwen3-vl-plus 在 FedEx 那张上把 REF 号 A089-260601-0171 填进了 customerCode。提示词已经用「当且仅当」措辞约束过,仍被绕过——说明靠提示词约束关键字段不够,落库前需要代码侧按后缀正则再校验一次。

运单号的格式与字形分歧

同一个运单号,有的返回 1Z 0JA 172 90 9595 1372,有的返回 1Z0JA1729095951372——下游必须先去空格再比对。更麻烦的是字形混淆:gemini-2.5-flash 把数字 0 读成字母 O,abab7 把 1Z 读成 12、把 0JA 读成 0J8,gpt-5.2 在倒置图上读成 04A。UPS 单号有校验位,入库前跑一次校验位计算就能拦下大部分此类错误。

集体读错也会发生,所以基准不能取多数票

FedEx 那张的实际重量是 ACTWGT: 100.09 LB。四家作答的模型给出 160、100、100.99、100.09 四个不同答案,只有 qwen3-vl-plus 读对。如果按「多数一致即正确」来评判,这个字段根本无法判分。同一张图的尺寸 36 × 27 × 10 IN 则四家全对——连人眼初看都容易把 10 误读成 18,反倒是模型读准了。

上传慢是网络问题,不是模型问题

剔除冷启动后,约 1.3 MB 的请求体在 Google / Anthropic / OpenAI / DeepSeek 端点上传稳定在 0.2–0.3 秒,阿里云 DashScope 是 1.3–2.1 秒,MiniMax 波动最大(1.58 – 28.65 秒)。本次测试从加拿大发起,对国内端点天然不利。但反过来说,如果 PDA 部署在北美仓库,这个差距就是真实存在的用户体验差距,值得考虑就近区域端点或先在客户端压缩图片。

图片没必要传这么大——已实测

四张图都是 608 × 1080、原始 0.9–1.2 MB 的 PNG。面单是黑白线条与文字,PNG 在这里毫无优势。转成质量 85 的 JPEG 后请求体压掉 90%,端到端耗时降 23% – 46%,准确率不变。但要注意:省的全是上传时间,识别环节的 token 数一个都没少。而把像素尺寸也缩掉,则是净亏——不会更快,准确率反而崩 17 个百分点。详见「把图片转成 JPEG、缩小尺寸,到底省了什么」。

对生产实现的建议

按「改动小、收益大」排序。前三条不换模型也能立刻做。

附录

本次使用的提示词(与生产完全一致)
你是一个快递标签信息提取引擎。
你的任务是从给定的快递标签图片中提取关键信息,并返回一个严格格式化的 JSON 对象。

必须遵守以下规则:
1. 响应中不得包含任何解释、注释、文字描述、Markdown、代码块或额外符号。
2. 输出必须直接以 { 开始,以 } 结束,不能使用 json 或任何包裹。
3. 输出的 JSON 对象必须包含以下字段:

{
 "customerCode": string | null,
 "recipientRaw": string | null,
 "carrier": string | null,
 "trackingNo": string | null,
 "length": number | null,
 "width": number | null,
 "height": number | null,
 "dimensionUnit": string | null,
 "weight": number | null,
 "weightUnit": string | null
}

4. 关于字段规则:
 - customerCode 来源于收货人信息中的客户标识,标识后缀为 "-RTN"。
 - 当且仅当明确识别到该后缀时填写 customerCode;否则填写 null。
 - 如果识别出的 customerCode 包含后缀,请去掉后缀后再返回。
 - recipientRaw 用于按别名匹配客户:直接复制面单上"收件人 / 收货公司 / 店铺 / Recipient / Ship To"栏的全部文字,不做任何加工、翻译、清洗。识别不到则填 null。
 - 其他字段如无法从图片中明确识别,必须填入 null。

你的输出应只包含最终的 JSON 对象,不得输出任何其他内容。
各模型原始返回(逐图)
图片模型返回内容
118claude-opus-5{"customerCode": null, "recipientRaw": "PEREGRINE-A142 6AB TERMINAL WAY AVENEL NJ 07001", "carrier": "UPS", "trackingNo": "1Z0JA1729095951372", "length": null, "width": null, "height": null, "dimensionUnit": null, "weight": 1, "weightUnit": "LBS"}
118qwen3.7-plus{"customerCode": null, "recipientRaw": "PEREGRINE-A142\n6AB TERMINAL WAY\nAVENEL NJ 07001", "carrier": "UPS", "trackingNo": "1Z 0JA 172 90 9595 1372", "length": null, "width": null, "height": null, "dimensionUnit": null, "weight": 1, "weightUnit": "LBS"}
118qwen-vl-max{"customerCode": null, "recipientRaw": "PEREGRINE-A142\n6AB TERMINAL WAY\nAVENEL NJ 07001", "carrier": "UPS", "trackingNo": "1Z 0JA 172 90 9595 1372", "length": null, "width": null, "height": null, "dimensionUnit": null, "weight": 1, "weightUnit": "LBS"}
118qwen3-vl-plus{"customerCode": null, "recipientRaw": "PEREGRINE-A142\n6AB TERMINAL WAY\nAVENEL NJ 07001", "carrier": "UPS", "trackingNo": "1Z 0JA 172 90 9595 1372", "length": null, "width": null, "height": null, "dimensionUnit": null, "weight": 1, "weightUnit": "LBS"}
118gemini-2.5-flash{"customerCode": null, "recipientRaw": "PEREGRINE-A142 6AB TERMINAL WAY AVENEL NJ 07001", "carrier": "UPS GROUND", "trackingNo": "1Z OJA 172 90 9595 1372", "length": null, "width": null, "height": null, "dimensionUnit": null, "weight": 1, "weightUnit": "LBS"}
118gpt-5.2{"customerCode": null, "recipientRaw": "PEREGRINE-A142\n6AB TERMINAL WAY", "carrier": "UPS", "trackingNo": "1Z0JA1729095951372", "length": null, "width": null, "height": null, "dimensionUnit": null, "weight": 1, "weightUnit": "LBS"}
118abab7-chat-preview{"customerCode": null, "recipientRaw": "STEPHANIE BARKER\n2958 3RD AVE\nHUNTINGTON WV 25702-1402", "carrier": "UPS GROUND", "trackingNo": "12 OJA 172 90 9595 1372", "length": null, "width": null, "height": null, "dimensionUnit": null, "weight": 1, "weightUnit": "LBS"}
118deepseek-v4-flash-vision-exp{"customerCode": null, "recipientRaw": "PEREGRINE-A142\n6AB TERMINAL WAY\nAVENEL NJ 07001", "carrier": "UPS", "trackingNo": "1Z0JA1729095951372", "length": null, "width": null, "height": null, "dimensionUnit": null, "weight": 1, "weightUnit": "LBS"}
119claude-opus-5{"customerCode": null, "recipientRaw": "PEREGRINE-A142 6AB TERMINAL WAY AVENEL NJ 07001", "carrier": "UPS", "trackingNo": "1Z0JA1729065777966", "length": null, "width": null, "height": null, "dimensionUnit": null, "weight": 1, "weightUnit": "LBS"}
119qwen3.7-plus{"customerCode": null, "recipientRaw": "PEREGRINE-A142\n6AB TERMINAL WAY\nAVENEL NJ 07001", "carrier": "UPS", "trackingNo": "1Z0JA1729065777966", "length": null, "width": null, "height": null, "dimensionUnit": null, "weight": 1, "weightUnit": "LBS"}
119qwen-vl-max{"customerCode": null, "recipientRaw": "PEREGRINE-A142\n6AB TERMINAL WAY\nAVENEL NJ 07001", "carrier": "UPS", "trackingNo": "1Z 0JA 172 90 6577 7966", "length": null, "width": null, "height": null, "dimensionUnit": null, "weight": 1, "weightUnit": "LBS"}
119qwen3-vl-plus{"customerCode": null, "recipientRaw": "PEREGRINE-A142\n6AB TERMINAL WAY\nAVENEL NJ 07001", "carrier": "UPS", "trackingNo": "1Z 0JA 172 90 6577 7966", "length": null, "width": null, "height": null, "dimensionUnit": null, "weight": 1, "weightUnit": "LBS"}
119gemini-2.5-flash{"customerCode": null, "recipientRaw": "PEREGRINE-A142\n6AB TERMINAL WAY\nAVENEL NJ 07001", "carrier": "UPS", "trackingNo": "1Z OJA 172 90 6577 7966", "length": null, "width": null, "height": null, "dimensionUnit": null, "weight": 1, "weightUnit": "LBS"}
119gpt-5.2{"customerCode": null, "recipientRaw": "PEREGRINE-A142\n6AB TERMINAL WAY\nAVENEL NJ 07001", "carrier": "UPS GROUND", "trackingNo": "1Z0JA1729065777966", "length": null, "width": null, "height": null, "dimensionUnit": null, "weight": 1, "weightUnit": "LBS"}
119abab7-chat-preview{"customerCode": null, "recipientRaw": "ROBERT AGUANNO\n2622 S MOLE ST\nPHILADELPHIA PA 19145-4608", "carrier": "UPS GROUND", "trackingNo": "1Z 0JA 172 90 6577 7966", "length": null, "width": null, "height": null, "dimensionUnit": null, "weight": 1, "weightUnit": "LBS"}
119deepseek-v4-flash-vision-exp{"customerCode": null, "recipientRaw": "PEREGRINE-A142\n6AB TERMINAL WAY\nAVENEL NJ 07001", "carrier": "UPS", "trackingNo": "1Z 0JA 172 90 6577 7966", "length": null, "width": null, "height": null, "dimensionUnit": null, "weight": 1, "weightUnit": "LBS"}
120claude-opus-5{"customerCode": null, "recipientRaw": "6AB TERMINAL WAY AVENEL NJ 07001", "carrier": "FedEx Ground", "trackingNo": "872758727527", "length": 36, "width": 27, "height": 10, "dimensionUnit": "IN", "weight": 100.99, "weightUnit": "LB"}
120qwen3.7-plus{"customerCode": null, "recipientRaw": "Am... 6AB TERMINAL WAY AVENEL NJ 07001", "carrier": "FedEx", "trackingNo": "872758727527", "length": 36, "width": 27, "height": 10, "dimensionUnit": "IN", "weight": null, "weightUnit": null}
120qwen-vl-max{"customerCode": null, "recipientRaw": "AMC 6AB TERMINAL WAY AVENEL NJ 07001", "carrier": "FedEx", "trackingNo": "8727 5872 7527", "length": 36, "width": 27, "height": 10, "dimensionUnit": "IN", "weight": 160, "weightUnit": "LB"}
120qwen3-vl-plus{"customerCode": "A089-260601-0171", "recipientRaw": "AVENEL NJ 07001 6AB TERMINAL WAY", "carrier": "FedEx", "trackingNo": "8727 5872 7527", "length": 36, "width": 27, "height": 10, "dimensionUnit": "IN", "weight": 100.09, "weightUnit": "LB"}
120gemini-2.5-flash{"customerCode": null, "recipientRaw": "AMC 6AB TERMINAL WAY AVENEL NJ 07001", "carrier": "FedEx", "trackingNo": "8727 5872 7527", "length": 36, "width": 27, "height": 10, "dimensionUnit": "IN", "weight": 100, "weightUnit": "LB"}
120gpt-5.2{"customerCode": null, "recipientRaw": null, "carrier": "FedEx Ground", "trackingNo": "8727 5872 7527", "length": null, "width": null, "height": null, "dimensionUnit": null, "weight": null, "weightUnit": null}
120abab7-chat-preview{"customerCode": null, "recipientRaw": null, "carrier": "FedEx", "trackingNo": "872758727", "length": null, "width": null, "height": null, "dimensionUnit": null, "weight": null, "weightUnit": null}
120deepseek-v4-flash-vision-exp未找到 JSON 对象
121claude-opus-5{"customerCode": null, "recipientRaw": "PEREGRINE-YY166 6AB TERMINAL WAY AVENEL NJ 07001", "carrier": "UPS", "trackingNo": "1Z0JA1729046196692", "length": null, "width": null, "height": null, "dimensionUnit": null, "weight": 4, "weightUnit": "LBS"}
121qwen3.7-plus{"customerCode": null, "recipientRaw": "PEREGRINE-YY166\n6AB TERMINAL WAY\nAVENEL NJ 07001", "carrier": "UPS", "trackingNo": "1Z 0JA 172 90 4619 6692", "length": null, "width": null, "height": null, "dimensionUnit": null, "weight": 4, "weightUnit": "LBS"}
121qwen-vl-max{"customerCode": null, "recipientRaw": "MARIA BROADNAX 7903 CYPRESS EDGE DR CYPRESS TX 77433-6670", "carrier": "UPS", "trackingNo": "1Z 0JA 172 90 4619 6692", "length": null, "width": null, "height": null, "dimensionUnit": null, "weight": 4, "weightUnit": "LBS"}
121qwen3-vl-plus{"customerCode": null, "recipientRaw": "MARIA BROADNAX\n7903 CYPRESS EDGE DR\nCYPRESS TX 77433-6670\nPEREGRINE-YY166\n6AB TERMINAL WAY", "carrier": "UPS", "trackingNo": "1Z 0JA 172 90 4619 6692", "length": null, "width": null, "height": null, "dimensionUnit": null, "weight": 4, "weightUnit": "LBS"}
121gemini-2.5-flash{"customerCode": null, "recipientRaw": "PEREGRINE-YY166 6AB TERMINAL WAY AVENEL NJ 07001", "carrier": "UPS", "trackingNo": "1Z0JA1729046196692", "length": null, "width": null, "height": null, "dimensionUnit": null, "weight": 4, "weightUnit": "LBS"}
121gpt-5.2{"customerCode": null, "recipientRaw": "SHIP TO:\nPERCGRINE-YV166\n6BR TERMINAL WAY", "carrier": "UPS", "trackingNo": "1Z 04A 172 90 4619 6692", "length": null, "width": null, "height": null, "dimensionUnit": null, "weight": null, "weightUnit": null}
121abab7-chat-preview{"customerCode": null, "recipientRaw": "SHIP TO: CYPRESS EDGE DR CYPRESS TX 77433-6670", "carrier": "UPS", "trackingNo": "1Z 0J8 172 90 4619 6692", "length": null, "width": null, "height": null, "dimensionUnit": null, "weight": 4, "weightUnit": "LBS"}
121deepseek-v4-flash-vision-exp未找到 JSON 对象