物流提单智能解析:覆盖海运、空运与海运单的自动化处理方案(附GitHub项目地址)

View Post

物流提单智能解析:覆盖海运、空运与海运单的自动化处理方案(附GitHub项目地址)

​项目介绍:​这是一个面向国际物流与供应链场景的提单智能解析工具。支持上传 PDF、扫描件及拍照件格式的海运提单、海运单、空运单等运输单据,自动识别单据类型,抽取发货人、收货人、通知方、起运港、目的港、货物描述、件数、重量、体积等核心字段,并输出统一结构的 JSON 格式。具备版式还原、字段块定位、多单位标准化及原文坐标溯源能力。适用于 TMS、ERP、关务和供应链系统。

​GitHub 项目地址:​https://github.com/intsig-textin/xparse-sample-projects

机器人1

国际物流业务的复杂性,很大一部分都体现在单证处理上。海运提单、海运单、空运单虽然都属于运输单据,但字段位置、标题写法和版式风格并不统一。发货人、收货人、通知方、起运港、目的港、货物描述、箱号封号,可能分布在不同位置,货描区域还经常跨页或混合表格与自由文本。

这类文档如果完全依赖人工录入,不仅效率低,而且非常依赖经验。真正成熟的物流提单解析方案,价值不在于“看懂一张单据”,而在于建立一套不依赖固定模板、能够适应多种船司和货代版式的结构化处理能力。

一、为什么提单自动化处理始终难做?

提单场景的难点,主要来自三方面。

​第一,单据类型多。​Ocean Bill of Lading、Sea Waybill、Air Waybill 都属于运输单据,但字段侧重点不同。海运更关注船名航次、箱号封号和正本份数,空运则更关注计费重量和处理信息。

​第二,字段表达不稳定。​相同字段在不同模板上可能有不同名称,港口和机场既可能写全称,也可能只写缩写或代码。

​第三,货物区域结构复杂。​货物描述、件数、重量、体积既可能出现在规则表格中,也可能是多段拼接文本。传统模板方法往往在这里失效。

因此,物流提单智能化的关键,不是让系统背下所有版式,而是让它具备跨版式理解和统一映射能力。

二、一条更适合物流单证的技术路线

面向提单场景,更可靠的方案通常包括四层:

[提单文件]↓
[版式感知 OCR]保留字段块、表格、页面位置↓
[单据分类层]判断海运提单 / 海运单 / 空运单↓
[统一字段抽取层]将不同单据类型映射为同一套业务结构↓
[规则归一化与校验]日期、重量、体积、件数标准化↓
[TMS / ERP / 关务 / 供应链系统]

这条路线的核心,在于​先分类,再映射​。

分类层的作用不是输出最终业务结果,而是帮助系统理解这是一张什么单据、货物区域更像表格还是自由文本、后续该优先关注哪些别名和字段块。只有这一层足够稳定,后面的统一抽取才有意义。

统一字段抽取层则负责把海运和空运中真正重要的信息,收敛到一套稳定 schema 中。这样,前端和后续系统消费时就不必为不同单据类型维护多套完全独立的处理逻辑。

三、如果要快速落地,一个提单工具至少需要这几层实现

提单工具的技术结构,建议明确拆成五块:

文件接入层↓
OCR 解析层↓
单据分类层↓
统一字段抽取层↓
标准化与复核层

这五块中,最容易被忽略的不是 OCR,而是分类层和标准化层。前者决定抽取策略,后者决定结果能否真正进入业务系统。

1. OCR 中间层要保留字段块和页面坐标

提单里有大量块状区域,例如发货人、收货人、通知方、港口和货物描述。为了支持后续抽取与复核,OCR 返回结构​建议至少包含一份“文本结构 + 页面定位”中间层​:

{"content_markdown": "...","page_snapshots": [{"page_number": 1,"page_ref": "page_1","page_size": { "width": 1600, "height": 2300 },"blocks": [{ "text": "Shipper", "bbox": [100, 120, 180, 145] }]}]
}

其中:

  • content_markdown:供分类层和抽取层使用的结构化文本
  • page_ref:每一页的唯一引用,用于加载原图和做页级缓存
  • page_size:原始页面尺寸,用来做坐标换算
  • bbox:文本块在页面上的位置框,用于点击字段后高亮原文

2. 分类层要输出“抽取提示”,而不是只输出单据类型

一个可直接落地的分类结果,需要包含:

  • document_type
  • language
  • layout_style
  • cargo_region_type
  • likely_sections
  • strategy_hints

例如:

{"document_type": "air_waybill","cargo_region_type": "table_like","strategy_hints": {"prefer_table_extraction_for_cargo": true,"prefer_block_extraction_for_parties": true,"focus_aliases": ["AWB No.", "Consignee", "Airport of Departure"]}

这一步的意义,是让后续抽取不必在一份完全未知的文档上盲目展开,而是先获得结构理解和策略提示。

3. 统一字段 schema 应覆盖共性字段,差异字段做可选项

一个适合提单场景的结果结构,可以设计成:

{"standard_fields": {"document_no": "123-12345678","shipper": { "name": "ABC Trading", "address": "..." },"consignee": { "name": "XYZ Imports", "address": "..." },"port_of_loading": "Shanghai","port_of_discharge": "Los Angeles","description_of_goods": "Plastic household goods","gross_weight": "12500 KGS","measurement": "86.5 CBM","chargeable_weight": null},"extra_fields": [],"missing_fields": [],"warnings": []
}

海运和空运的差异字段,如 vesselvoyage_nochargeable_weighthandling_info,可以作为可选项存在。这样结果层就能保持稳定,不需要为不同单据重建前端。

4. 标准化层负责日期、重量、体积和件数

提单抽取的结果通常包含大量原始值,例如:

  • 12,500 KGS
  • 27,000 LBS
  • 86.5 CBM
  • 500 CARTONS

这些字段最好在规则层再做一次标准化:

const normalized = {issue_date_iso: normalizeDate(issueDate),gross_weight_kg: parseWeight(grossWeight),measurement_cbm: parseVolume(measurement),package_count_int: parseCount(packageCount)
};

这样既保留原始字段,又能直接给 ERP、TMS 或关务系统提供稳定值。

四、方案真正的价值:摆脱“按船司模板逐个维护”的旧路径

物流单证项目最常见的陷阱,是按模板做。短期看,这种方法上线快;长期看,只要版式一多,维护成本就会迅速上升。

更有价值的方案,是把通用能力建立在文档解析链路上:

  • OCR 负责适应版式变化,而不是人工维护位置模板
  • 分类层负责识别单据语义差异,而不是为每类单据重做一套页面
  • 统一 schema 负责承接业务字段,而不是让下游系统面对一堆不稳定结果
  • 规则层负责完成重量、体积、件数等标准化,减少后续处理成本

这种方案的好处在于,新增船司、货代或新版式出现时,系统大多数情况下只需调整策略和规则,而不需要重新为每种模板投入一轮人工建模。

五、一个可落地的业务工作流

1. 文档进入解析链路

系统接收 PDF、扫描件或图片,先完成 OCR 与结构还原,尽可能保留字段块与表格关系。

2. 单据类型判断

系统先识别该文档更接近海运提单、海运单还是空运单,并初步判断货物区域的结构特点,为后续抽取提供策略依据

3. 输出统一结构化结果

发货人、收货人、通知方、起运地、目的地、货描、件数、重量、体积、运费条款等关键信息,被整理成统一结构,供业务系统使用。

4. 标准化与复核

系统自动生成标准化日期、重量、体积和件数,并提供原文回看能力,让操作员快速确认关键字段。

六、工程实践建议:避免踩坑的五个关键点

1. 先做单据分类,再做字段抽取

海运与空运差异足够大,跳过分类层,后续抽取会明显不稳。

2. 不要把前端结果结构绑死在视觉版式上

用户需要的是业务字段,而不是对原始排版的机械复刻。

3. 货描区域要重点设计

货描是提单里最容易失真的部分,也是最影响业务录入质量的部分,应单独考虑表格与自由文本两种路径。

4. 标准化交给规则层

日期、重量、体积、件数等值既要保留原文,也要提供标准值,最适合放在规则层统一处理。

5. 结果必须可回看原文

没有原文证据的结果,很难真正进入物流审核和单证处理流程。

七、从“单据识别”到“物流数据入口”

物流提单智能解析的意义,不在于把一张单据识别成文字,而在于把国际运输单据变成系统可直接消费的结构化数据。它帮助企业减少手工录入,降低版式变化带来的维护成本,并为后续的 TMS、ERP、关务和供应链系统提供统一的数据入口。

当一套方案能够适应多种单据类型和多样化版式,而不是持续依赖模板维护时,物流单证处理才真正具备了规模化自动化的基础。这正是提单智能解析最核心的技术价值。

直接试用物流提单抽取工具​👉https://www.textin.com/tasks/bill-of-lading-extraction

以上是一种“先分类识别、再映射抽取”的物流提单解析实践方案。核心思路是把版式各异的提单文档先通过版式感知 OCR 统一为保留字段块、表格与坐标信息的中间层,再将单据分类与字段抽取拆成两条链路:分类层输出抽取策略提示,统一抽取层将不同单据类型映射到同一套业务 Schema,最后附加单位标准化与原文溯源能力。方案已发布在 GitHub,欢迎大家在项目中与我们交流。如果你在实际处理物流单证时遇到更复杂的场景,或者有不同的架构思路,欢迎留言或私信探讨。