【prompt实战】AI +OCR技术结合ChatGPT能力项目实践(BOL提单识别提取专家)
本文原创作者:姚瑞南 AI-agent 大模型运营专家,先后任职于美团、猎聘等中大厂AI训练专家和智能运营专家岗;多年人工智能行业智能产品运营及大模型落地经验,拥有AI外呼方向国家专利与PMP项目管理证书。(转载需经授权)
目录
1. 需求背景
2. 目标
3. BOL通用处理逻辑概述
3.1 基础信息 部分
3.2 货物信息部分:
3.3 参考信息部分
BOL的处理结果要求
4. 逻辑梳理
1. BACKGROUND
2. 识别的主要字段
基础信息:
Reference 信息:
3. 格式要求
4. OCR文本清晰度
5. 目标受众
6. 输出示例
7. 特殊要求
8. 数据验证
5. 提示词优化
优化前prompt
优化策略
优化后prompt
中文版
英文版
6. 效果评估
7. 项目收益
1. 需求背景
在公司的运输业务中,BOL(提单)是关键文档,标志着运输的开始,并包含重要的运营信息。目前,不同客户使用不同的BOL模板和处理方式。开发一个单一客户的OCR 信息提取方案通常需要约一周时间,然后才能接入RPA的流程。事实上来说,对于我司而言,BOL中的关键信息具有通用性,可以使用AI的文字理解来解决这个问题。
2. 目标
通过AI +OCR 技术结合, 让AI理解不同客户的BOL,并从中提取UNIS所需的关键信息,实现通用化的BOL解决方案,适配大部分客户的BOL模板。此方法确保数据提取的完整性、准确性和稳定性,并可在未来作为OCR-RPA自动化的直接输入源,直接将ChatGPT提取好的BOL数据对接业务系统录入,人工无需参与手动数据录入。
3. BOL通用处理逻辑概述
3.1 基础信息 部分
以下信息是BOL的核心信息,尽量进行识别:
- 发货人(Shipper)/收货人(Consignee)姓名(可以为空):
- 发货人(Shipper)/收货人(Consignee)地址(不可以为空): 查询TMS位置数据库,与现有Location 进行匹配。如果没有匹配项,选择最接近或标签为“EDI”的地址。
- 提货日期(Pick UP Date)(可以为空): BOL签发日期。
- 特殊说明(Special Instruction)(可以为空): 如交货时间、特殊服务或托盘尺寸等。
3.2 货物信息部分:
包括但不限于Pallet #、Piece #、Weight、NMFC #/Class, 货物描述。通常情况下会有Customer Information 和 Carrier Information 两种描述, 需要都列举识别结果。
3.3 参考信息部分
在客户的BOL中有些参考信息,对于串联业务非常有帮助,需要按如下的逻辑进行和处理,有一定的按优先级要求:
- Load Number (#):非常重要的字段,用于EDI传输。通过识别BOL中的关键词:“Load Number (#)”、“Load ID”、“ME ID”或“SID (#)”来获取。
- Shipper Reference (#):次重要字段,通过识别BOL中的关键词:“Shipper Number (#)”、“Shipping Number (#)”、“Customer Ref (#)”或“Additional Ref (#)”获取。
- Purchase Order (#):通过识别BOL中的关键词:“P.O. Number (#)”、“PO (#)”来获取
- Sales Order (#)”:通过识别BOL中的关键词:“Sales Order”来获取
- DN Number:通过识别BOL中的关键词:“Delivery Note (#)”、“DN #”或“Delivery Number”提取。
- Bill of Lading Number #:通过识别BOL中的关键词:“Sales Order”来获取“BOL Number (#)”来获取参考信息(Reference information)的特殊处理逻辑:
Load Number (#)需要重点识别,如果识别不到,请使用以下逻辑进行替代处理
- 当无法识别Load Number (#)时,但能获取 Shipper REF 信息,应使用 Shipper REF (#) 来替代Load Number (#)
- 当无法识别Load Number (#)和 Shipper REF 时,但能获取Bill of lading Number时,可以用Bill of Lading Number 来替代Load Number (#)
REF/BOL 也需要重点识别, 如果识别不到,请使用以下逻辑进行替代处理(---待定)
- 当无法识别 Bill of lading # 时,但能获取 Customer REF #信息,应使用Customer REF # 来替代REF/BOL 信息
- 当无法识别 Bill of lading # 和 Customer REF #都无法识别到,可以用PO # 来替代
BOL的处理结果要求
AI处理BOL 的识别结果应该分为3个部分
- 基础信息(发件人,收货人,Pickup 时间,Spcial instruction )
- 货物信息(Customer info/Carrier inforamtion)
- 参考信息(LOAD #/Shipper REF/PurchaseOrder /DN number/Bill of Loading #识别结果应保持稳定的格式,对于识别不完整或缺失的信息,系统应给予提示’Not recongnize‘。针对多页BOL,系统需识别并合并信息。
需要提取附件PDF格式的文字对应到不同位置;
4. 逻辑梳理
1. BACKGROUND
你是一个在物流行业的专家,你需要自动识别取提单(BOL,Bill of Lading)上的关键信息,以便用于货物跟踪、清关和物流管理。目的是准确识别和提取BOL上的重要信息字段,并确保数据的完整性和一致性。
2. 识别的主要字段
基础信息:
- 发货人信息(Shipper Information):包括发货人的名称、地址、联系方式等。
- 收货人信息(Consignee Information):包含收货人的名称、地址和联系方式。
- 货物信息(Description of Goods):列出货物的详细信息,包括名称、Pallet数量、Pieces,TYPE,Weigh,NMFC#,Class等信息。通常情况下,有Customer Order Information 和 Carrier Information, 需要分别识别并提取
- PICKUP DATE:提单签发日期及其他重要日期。
- Special Instructions: BOL的特别提示,比如Delivery 时间,特别要求
Reference 信息:
- Load Number (#): 通过识别 BOL 中的关键词,如 Manifest Number (#)、ME ID 或 Shipment Number (#) 获取。
- Shipper REF (#): 通过识别 BOL 中的关键词,如 Shipper Number (#)、Shipping Number (#)、Customer Ref (#) 或 Additional Ref (#) 获取
- Purchase Order (#):通过识别 BOL 中的关键词,如 P.O. Number (#)、PO (#) 或 CustomerOrder (#) 获取。
- DN Number: 通过识别关键词 Delivery Note (#) 获取。
- Bill of Lading Number (#): 通过识别 BOL 中的 BOL number (#) 关键字获取, • 需要更新到 TMS 中的 Manifest.Cust.BOL 字段。
3. 格式要求
- 输出应为结构化数据,如JSON或XML格式,便于数据的进一步处理。
- 若可能,有层次结构以方便嵌套字段(例如发货人和收货人信息中包含子字段,如名称和地址)。货物信息中包
相关文章:

【prompt实战】AI +OCR技术结合ChatGPT能力项目实践(BOL提单识别提取专家)
本文原创作者:姚瑞南 AI-agent 大模型运营专家,先后任职于美团、猎聘等中大厂AI训练专家和智能运营专家岗;多年人工智能行业智能产品运营及大模型落地经验,拥有AI外呼方向国家专利与PMP项目管理证书。(转载需经授权) 目录 1. 需求背景 2. 目标 3. BOL通用处理逻辑…...
【Android】Android开发应用如何开启任务栏消息通知
Android开发应用如何开启任务栏消息通知 1. 获取通知权限2.编写通知工具类3. 进行任务栏消息通知 1. 获取通知权限 在 AndroidManifest.xml 里加上权限配置,如下。 <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android…...
上传文件报错:the request was rejected because no multipart boundary was found
后端使用的springboot的MultipartFile上传文件,接口使用apifox调试过没有问题,但前端调接口报错。前端使用了fetch发送formData数据。 the request was rejected because no multipart boundary was found 前端使用的请求头是 multipart/form-data 没有…...

大模型—Dify本地化部署实战
Dify本地化部署实战 系统要求 安装 Dify 之前, 请确保你的机器已满足最低安装要求: CPU >= 2 CoreRAM >= 4 GiB本地部署 开始前先简单介绍下部署Dify需要用到的组件,稍微有点多,但放心,有Docker你怕啥? 关系数据库:postgres缓存:Redis向量数据库:支持weaviate…...
功能架构元模型
功能架构的元模型是对功能架构进行描述和建模的基础框架,它有助于统一不同团队对系统的理解,并为系统的设计和开发提供一致的标准和规范。虽然具体的元模型可能因不同的应用领域和特定需求而有所差异,但一般来说,功能架构的元模型可以涵盖以下几个方面: 组件/模块元模型:…...
常用工具类——Collections集合框架
常用工具类——Collections集合框架 Collections 是 JDK 提供的一个工具类,提供了一系列静态方法,分类来复习! 1.排序操作 reverse(List list) :反转顺序shuffle(List list) : 洗牌,将顺序打乱sort(List list) &…...

e2studio开发RA2E1(9)----定时器GPT配置输入捕获
e2studio开发RA2E1.9--定时器GPT配置输入捕获 概述视频教学样品申请硬件准备参考程序源码下载选择计时器时钟源UART配置UART属性配置设置e2studio堆栈e2studio的重定向printf设置R_SCI_UART_Open()函数原型回调函数user_uart_callback ()printf输出重定向到串口定时器输入捕获配…...

25/2/7 <机器人基础>雅可比矩阵计算 雅可比伪逆
雅可比矩阵计算 雅可比矩阵的定义 假设我们有一个简单的两个关节的平面机器人臂,其末端执行器的位置可以表示为: 其中: L1 和 L2 是机器人臂的长度。θ1 和 θ2是关节的角度。 计算雅可比矩阵 雅可比矩阵 JJ 的定义是将关节速度与末…...

网络爬虫js逆向之异步栈跟栈案例
【注意!!!】 前言: 1. 本章主要讲解js逆向之异步栈跟栈的知识(通过单步执行调试) 2. 使用关键字搜定位加密入口 3. 本专栏通过多篇文章【文字案例】的形式系统化进行描述 4. 本文章全文进行了脱敏处理 5. 详…...

使用Ollama本地部署deepseek
1、下载安装Ollama 前往下载页面 https://ollama.com/download下载好安装包,如同安装软件一样,直接安装即可 win中默认为C盘,如果需要修改到其他盘,查找具体教程 运行list命令,检查是否安装成功 2、修改模型下载的…...
Rust错误处理:从灭火器到核按钮的生存指南
开篇:错误处理的生存哲学 在Rust的平行宇宙里,错误分为两种人格: panic! → 核按钮💣(不可恢复,全系统警报)Result → 灭火器🧯(可控制,局部处理࿰…...

Golang:Go 1.23 版本新特性介绍
流行的编程语言Go已经发布了1.23版本,带来了许多改进、优化和新特性。在Go 1.22发布六个月后,这次更新增强了工具链、运行时和库,同时保持了向后兼容性。 Go 1.23 的新增特性主要包括语言特性、工具链改进、标准库更新等方面,以下…...

电脑运行黑屏是什么原因?原因及解决方法
电脑运行黑屏是指电脑在正常开机或使用过程中,突然出现屏幕变黑,无法显示任何内容的现象。这种现象可能会给用户带来很多不便,甚至造成数据丢失或硬件损坏。那么,电脑运行黑屏是什么原因呢?下面我们将分析几种可能的原…...

redis之AOF持久化过程
流程图 在redis.conf文件中配置appendonly为yes则开启aof持久化机制 #开启aof持久化,默认关闭为no appendonly no也可以在命令行开启 aof刷盘策略 #每个写操作都会同步刷盘。 appendfsync always #执行命令后先放入aof缓冲区,每秒钟将缓冲区数据刷盘…...

Elasticsearch:向量搜索的快速介绍
作者:来自 Elastic Valentin Crettaz 本文是三篇系列文章中的第一篇,将深入探讨向量搜索(也称为语义搜索)的复杂性,以及它在 Elasticsearch 中的实现方式。 本文是三篇系列文章中的第一篇,将深入探讨向量搜…...
Docker在安装时遇到的问题(第一部分)
一、在用docker-config-manager安装yum源时出现错误 [rootlocalhost ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 已加载插件:fastestmirror, langpacks adding repo from: https://download.docker.com/linux/ce…...
使用 OpenGL ES 在 iOS 上渲染一个四边形:从基础到实现
使用 OpenGL ES 在 iOS 上渲染一个四边形:从基础到实现 在 iOS 开发中,OpenGL ES 是一个强大的工具,用于实现高性能的 2D 和 3D 图形渲染。本文将详细分析一段完整的代码,展示如何使用 OpenGL ES 在 iOS 上渲染一个简单的四边形。我们将从代码的结构、关键模块、着色器的实…...
Spring Boot 2 快速教程:WebFlux处理流程(五)
WebFlux请求处理流程 下面是spring mvc的请求处理流程 具体步骤: 第一步:发起请求到前端控制器(DispatcherServlet) 第二步:前端控制器请求HandlerMapping查找 Handler (可以根据xml配置、注解进行查找) 匹配条件包括…...
Vue 鼠标事件合集,关于鼠标右键的处理方法(改写鼠标右键方法、自定义鼠标右键)
鼠标事件使用 mousedown"canvasDown($event)"按下事件合集 click 点击某个对象时触发 mousedown 鼠标按钮被按下时触发 mouseup 鼠标按钮被松开时触发 mouseleave 当鼠标指针移出元素时触发 dblclick 双击时触发 mousemove 鼠标移动时触发,…...
两种交换排序算法--冒泡,快速
目录 1.冒泡排序原理 2.快速排序原理 3.冒泡代码实现 4.快速排序代码实现 1.冒泡排序原理 冒泡排序(Bubble Sort)是一种简单的排序算法,基本思想是通过反复交换相邻的元素,直到整个序列有序。它的名字来源于较大的元素像气泡…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...