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 的数据来自同一时间窗的配对复测,详见「生产到底在用哪个模型」一节。
四张图分辨率完全一致(608 × 1080),但两张是倒置 180° 拍摄的——这恰好是 PDA 现场拍照最常见的情形,也是本次拉开模型差距的主要变量。
| 图片 | 像素尺寸 | 真实格式 | 原始文件 | Base64 后 | 实际请求体 | 方向 |
|---|---|---|---|---|---|---|
| 118 | 608 × 1080 | PNG · 扩展名写作 .jpg | 888.0 KB | 1184.0 KB | 1185.5 KB | 正置 |
| 119 | 608 × 1080 | PNG | 930.1 KB | 1240.1 KB | 1241.7 KB | 正置 |
| 120 | 608 × 1080 | PNG | 1174.2 KB | 1565.6 KB | 1567.2 KB | 倒置 180° |
| 121 | 608 × 1080 | PNG · 扩展名写作 .jpg | 932.1 KB | 1242.9 KB | 1244.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.12 | 0.32 | 33.5 Mb/s | 5.41 | 2.41 | 0.00 | 2.81 | 1134 | ||
| qwen-vl-max 阿里云 DashScope | 1.52 | 1.81 | 5.9 Mb/s | 3.80 | 3.05 | 0.00 | 6.24 | 987 | ||
| qwen3-vl-plus 阿里云 DashScope | 0.94 | 1.92 | 5.6 Mb/s | 24.16 | 4.34 | 0.00 | 7.19 | 987 | ||
| claude-opus-5 Anthropic | 0.11 | 0.24 | 43.9 Mb/s | 15.74 | 6.96 | 0.00 | 9.50 | 1417 | ||
| gemini-2.5-flash | 0.10 | 0.22 | 48.4 Mb/s | 6.10 | 5.83 | 0.00 | 9.56 | 593 | ||
| qwen3.7-plus 生产 阿里云 DashScope | 0.82 | 2.01 | 5.3 Mb/s | — | 8.07 | 0.00 | 11.78 | 995 | ||
| deepseek-v4-flash-vision-exp DeepSeek | 0.16 | 0.21 | 50.1 Mb/s | 2.72 | 0.85 | 14.63 | 17.10 | 771 | ||
| abab7-chat-preview MiniMax | 1.51 | 3.91 | 2.7 Mb/s | 6.21 | 5.65 | 0.00 | 19.82 | 5154 |
「读响应」一列解释了 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 部署在北美仓库」这个真实场景,它就是实打实的用户等待时间。
这两件事效果完全不同,必须分开看。压体积只影响传输的字节数;压像素尺寸才会改变模型要处理的图像 token 数。下面用同一批面单跑了三个变体,各 4 张图 × 4 个模型 = 48 次额外调用,仍然串行。
| 变体 | 像素尺寸 | 请求体 | 模型 | 输入 token | 识别中位数 | 端到端中位数 | 准确率 |
|---|---|---|---|---|---|---|---|
| PNG 原图 | 608 × 1080 | 1310 KB | qwen-vl-max | 987 | 3.05 | 6.24 | 92% |
| gemini-2.5-flash | 593 | 5.83 | 9.56 | 90% | |||
| claude-opus-5 | 1417 | 6.96 | 9.50 | 96% | |||
| gpt-5.2 | 1134 | 2.41 | 2.81 | 73% | |||
| JPEG q85 | 608 × 1080 | 136 KB | qwen-vl-max | 987 | 3.10 | 4.26 (-32%) | 94% |
| gemini-2.5-flash | 593 | 5.04 | 5.19 (-46%) | 85% | |||
| claude-opus-5 | 1417 | 5.61 | 5.71 (-40%) | 98% | |||
| gpt-5.2 | 1134 | 2.00 | 2.15 (-23%) | 67% | |||
| JPEG q60 | 608 × 1080 | 108 KB | qwen-vl-max | 987 | 3.19 | 4.03 (-35%) | 94% |
| gemini-2.5-flash | 593 | 3.71 | 3.78 (-60%) | 88% | |||
| claude-opus-5 | 1417 | 7.71 | 7.80 (-18%) | 98% | |||
| gpt-5.2 | 1134 | 1.76 | 1.87 (-34%) | 73% | |||
| JPEG q85 · 尺寸减半 | 304 × 540 | 54 KB | qwen-vl-max | 511 (-48%) | 3.50 | 4.29 (-31%) | 56% |
| gemini-2.5-flash | 593 | 3.88 | 4.02 (-58%) | 83% | |||
| claude-opus-5 | 779 (-45%) | 6.73 | 6.79 (-29%) | 81% | |||
| gpt-5.2 | 563 (-50%) | 2.01 | 2.07 (-26%) | 62% |
请求体从 1310 KB 降到 136 KB(压掉 90%),端到端耗时随之下降 23% – 46%。但同一列的输入 token 数一个都没变——qwen 987、gemini 593、claude 1417、gpt-5.2 1134,PNG 与两档 JPEG 完全相同。视觉模型是按像素切 patch 的,文件压得多小都不改变它要读的 token 数,所以识别环节本身没有任何加速,省下来的全是网络传输时间。
四个模型合计: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。
| 排名 | 模型 | 得分 | 准确率 | ✓ | ~ | ✕ | ○ | 整图失败 |
|---|---|---|---|---|---|---|---|---|
| 1 | claude-opus-5 Anthropic | 23.0 / 24 | 96% | 22 | 2 | 0 | 0 | — |
| 2 | qwen3.7-plus GWMS 生产实际下发 阿里云 DashScope | 22.5 / 24 | 94% | 22 | 1 | 0 | 1 | — |
| 3 | qwen-vl-max 枚举名暗示的模型 阿里云 DashScope | 22.0 / 24 | 92% | 22 | 0 | 2 | 0 | — |
| 4 | qwen3-vl-plus 阿里新一代 VL 阿里云 DashScope | 21.5 / 24 | 90% | 21 | 1 | 2 | 0 | — |
| 5 | gemini-2.5-flash GWMS AI 助手同款 | 21.5 / 24 | 90% | 21 | 1 | 2 | 0 | — |
| 6 | gpt-5.2 OpenAI | 17.5 / 24 | 73% | 17 | 1 | 2 | 4 | — |
| 7 | abab7-chat-preview MiniMax | 15.0 / 24 | 62% | 15 | 0 | 6 | 3 | — |
| 8 | deepseek-v4-flash-vision-exp 实验版视觉模型 DeepSeek | 12.0 / 24 | 50% | 12 | 0 | 0 | 12 | 2 |
| 模型 | customerCode | recipientRaw | carrier | trackingNo | 尺寸 L/W/H | weight |
|---|---|---|---|---|---|---|
| 人工基准 | null | PEREGRINE-A142 6AB TERMINAL WAY AVENEL NJ 07001 | UPS | 1Z0JA1729095951372 | null | 1.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 |
| 模型 | customerCode | recipientRaw | carrier | trackingNo | 尺寸 L/W/H | weight |
|---|---|---|---|---|---|---|
| 人工基准 | null | PEREGRINE-A142 6AB TERMINAL WAY AVENEL NJ 07001 | UPS | 1Z0JA1729065777966 | null | 1.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 |
| 模型 | customerCode | recipientRaw | carrier | trackingNo | 尺寸 L/W/H | weight |
|---|---|---|---|---|---|---|
| 人工基准 | null | AMC 6AB TERMINAL WAY AVENEL NJ 07001 | FEDEX | 872758727527 | 36 × 27 × 10 IN | 100.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 对象 | |||||
| 模型 | customerCode | recipientRaw | carrier | trackingNo | 尺寸 L/W/H | weight |
|---|---|---|---|---|---|---|
| 人工基准 | null | PEREGRINE-YY166 6AB TERMINAL WAY AVENEL NJ 07001 | UPS | 1Z0JA1729046196692 | null | 4.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 现状 | PNG | 1310 KB | 2.01 | 8.07 | 11.78 | 995 | 94% | |
| qwen3.7-plus | JPEG | 136 KB | 0.29 | 8.84 | 10.00 | 995 | 94% | |
| qwen-vl-max | PNG | 1310 KB | 3.92 | 2.88 | 7.55 | 987 | 94% | |
| qwen-vl-max 目标组合 | JPEG | 136 KB | 0.25 | 3.15 | 4.40 | 987 | 92% |
报告首轮把 qwen-vl-max 当成了生产基线,那是贴错标签。生产跑的 qwen3.7-plus 端到端 11.78 秒,其中推理独占 8.07 秒。用户抱怨「识别慢」的程度,比按 qwen-vl-max 估算的严重得多。
推理耗时 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 的某个问题。
同一张图上,把各模型的返回值归一化(去空格、统一大小写)后数有几种不同取值。取值种数越多,说明该字段越不可靠。
| 字段 | 118 | 119 | 120 | 121 | 判断 |
|---|---|---|---|---|---|
| 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 现场拍照恰恰经常是倒的——这个场景必须专门验证,不能只拿摆拍样张评估。
提示词写得很明确:「直接复制面单上收件人 / Ship To 栏的全部文字」。但在 118 与 119 上,abab7-chat-preview 返回的是寄件人 STEPHANIE BARKER / ROBERT AGUANNO;在倒置的 121 上,qwen-vl-max(正是当前生产模型)与 qwen3-vl-plus 同样返回了寄件人 MARIA BROADNAX。而 recipientRaw 的用途是「按别名匹配客户」——取错这一栏,包裹就会被认领到别的客户名下,比返回 null 危险得多,因为它是静默出错。
四张面单没有一张带 -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、缩小尺寸,到底省了什么」。
按「改动小、收益大」排序。前三条不换模型也能立刻做。
recognizeLabelFromImage 返回后,若值不匹配 ^.+-RTN$(或去后缀后的形态)就置空,不要直接落库。replaceAll("\\s", "") 再比对;UPS 的 1Z 单号带校验位,本地算一次就能拦下「0 读成 O」「1Z 读成 12」这类字形错误,不通过则提示重拍而不是入库。ModelType.QWEN_VL_MAX 名为 VL-Max,实际下发 qwen3.7-plus。改成 qwen-vl-max 后推理耗时 8.07 s → 2.88 s(砍 64%),准确率同为 94%——这是提速的最大一笔。注意改动落在 gwms-common-ai 共享库、且同时影响出库面单识别,动手前需确认是笔误还是有意为之。见「生产到底在用哪个模型」一节。response_format 或 JSON Schema 约束,Claude 有 output_config.format,改用它们可以从根上消除解析失败这一类问题。你是一个快递标签信息提取引擎。
你的任务是从给定的快递标签图片中提取关键信息,并返回一个严格格式化的 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 对象,不得输出任何其他内容。| 图片 | 模型 | 返回内容 |
|---|---|---|
| 118 | claude-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"} |
| 118 | qwen3.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"} |
| 118 | qwen-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"} |
| 118 | qwen3-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"} |
| 118 | gemini-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"} |
| 118 | gpt-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"} |
| 118 | abab7-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"} |
| 118 | deepseek-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"} |
| 119 | claude-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"} |
| 119 | qwen3.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"} |
| 119 | qwen-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"} |
| 119 | qwen3-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"} |
| 119 | gemini-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"} |
| 119 | gpt-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"} |
| 119 | abab7-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"} |
| 119 | deepseek-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"} |
| 120 | claude-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"} |
| 120 | qwen3.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} |
| 120 | qwen-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"} |
| 120 | qwen3-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"} |
| 120 | gemini-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"} |
| 120 | gpt-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} |
| 120 | abab7-chat-preview | {"customerCode": null, "recipientRaw": null, "carrier": "FedEx", "trackingNo": "872758727", "length": null, "width": null, "height": null, "dimensionUnit": null, "weight": null, "weightUnit": null} |
| 120 | deepseek-v4-flash-vision-exp | 未找到 JSON 对象 |
| 121 | claude-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"} |
| 121 | qwen3.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"} |
| 121 | qwen-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"} |
| 121 | qwen3-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"} |
| 121 | gemini-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"} |
| 121 | gpt-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} |
| 121 | abab7-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"} |
| 121 | deepseek-v4-flash-vision-exp | 未找到 JSON 对象 |