在 Dify 中实现 OCR 发票识别时,一般有两种方式:
一、OCR工具 + 大模型结构化
核心是通过 "工作流(Workflow)" 串联 图像处理、OCR 文本识别、结构化信息提取 三个核心环节,输入图像 → OCR 转文本 → 大模型结构化 → 校验输出
结合 Dify 的 "工具调用" 和 "大模型能力" 完成从 "发票图片" 到 "结构化数据" 的转换。
(一)流程节点
1. 输入节点:接收发票图片
- 功能:获取用户上传的发票图像(支持 JPG、PNG、PDF 等格式)。
- Dify 配置 :
在 Dify 应用中创建 "输入组件",设置 "文件上传" 类型,限制文件格式为图像或 PDF(需后续转换为图像)。
示例:用户通过前端界面上传一张增值税发票图片。
输入节点后面还可以加一个发票图片格式校验节点。
2. 预处理节点:图像优化(可选但推荐)
- 功能:对原始图像进行降噪、倾斜校正、分辨率调整等处理,提升后续 OCR 识别准确率(尤其针对模糊、倾斜的发票)。
- 实现方式 :
- 若使用开源工具:通过 Dify 的 "代码节点" 调用 OpenCV 或 PIL 库进行预处理(如
cv2.imread()加载图像,cv2.GaussianBlur()降噪)。 - 若使用第三方 API:部分 OCR 服务(如阿里云 OCR)内置预处理能力,可跳过此节点。
- 若使用开源工具:通过 Dify 的 "代码节点" 调用 OpenCV 或 PIL 库进行预处理(如
3. OCR 文本识别节点:提取图像中的文本
-
功能:将发票图像中的印刷体 / 手写体文本转换为可编辑的字符串( raw text)。
-
Dify 配置(关键步骤) :
通过 Dify 的 "工具调用" 功能集成 OCR 服务,常用两种方式:
-
方式 1:集成开源 OCR 模型(如百度飞桨的 PaddleOCR):
- 在 Dify 中创建 "自定义工具",封装 PaddleOCR 的调用逻辑(需部署 PaddleOCR 服务,提供 API 接口)。
- 在工作流中添加 "工具调用节点",传入预处理后的图像数据,调用 PaddleOCR 接口,获取识别到的文本(通常包含文本内容和坐标信息)。
-
方式 2:集成第三方 OCR API(如百度智能云 OCR、腾讯云 OCR):
- 在 Dify 中创建 "HTTP 工具",配置第三方 OCR API 的请求地址、headers(含 API 密钥)、请求体格式(通常为
multipart/form-data上传图像)。 - 调用 API 后,解析返回结果(如百度 OCR 会返回
words_result字段,包含识别的文本及位置)。
- 在 Dify 中创建 "HTTP 工具",配置第三方 OCR API 的请求地址、headers(含 API 密钥)、请求体格式(通常为
-
-
输出示例 :
识别到的原始文本可能是无序的字符串片段,如:
"发票号码:00123456 开票日期:2024-05-20 购买方:XX 公司 金额:¥1,000.00 税率:13%..."
4. LLM节点:结构化提取关键信息
- 功能 :从 OCR 识别的原始文本中,提取发票的结构化字段(如发票类型、号码、日期、金额、抬头、税号等),并校验格式(如日期标准化为
YYYY-MM-DD,金额保留两位小数)。 - Dify 配置 :
- 在工作流中添加 "大模型节点"(如选用 GPT-3.5 Turbo、通义千问等)。
- 设计 Prompt 指令,明确要求大模型从 OCR 文本中提取指定字段,例如:
请从以下 OCR 识别结果中,提取发票的关键信息,格式化为 JSON:
- 发票类型(如增值税专用发票、普通发票)
- 发票号码(纯数字)
- 开票日期(格式:YYYY-MM-DD)
- 购买方名称
- 购买方税号
- 总金额(数字,保留两位小数)
- 税率(如 13%、9%)
OCR 识别结果:[此处插入 OCR 节点的输出文本]
-
大模型返回结构化 JSON 结果,例如:
{
"发票类型": "增值税专用发票",
"发票号码": "00123456",
"开票日期": "2024-05-20",
"购买方名称": "XX科技有限公司",
"购买方税号": "91110101XXXXXXXXXX",
"总金额": 1000.00,
"税率": "13%"
}
5. 校验与修正节点:提升结果准确性(可选)
- 功能:对大模型提取的结构化数据进行规则校验(如发票号码长度、税号格式、金额与税额的逻辑关系),若存在异常,可通过人工干预或二次调用大模型修正。
- 实现方式 :
- 在 Dify 中添加 "代码节点",编写校验逻辑(如正则表达式校验税号格式
^[0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}$)。 - 若校验失败,通过 "条件分支节点" 触发提示:"发票号码格式异常,请确认 OCR 识别结果是否正确",并允许用户手动修正。
- 在 Dify 中添加 "代码节点",编写校验逻辑(如正则表达式校验税号格式
6. 输出节点:返回结构化结果
- 功能:将最终的结构化数据以友好格式返回给用户(如 JSON、表格、表单等),或同步至下游系统(如财务报销系统)。
- Dify 配置 :
在工作流末尾添加 "输出节点",设置返回格式(如 API 接口返回 JSON,前端展示为表格),并可配置数据存储(如写入数据库或文件)。
(二)优缺点
1、优势
- 对非标准发票(如手写发票、自定义版式发票、多语言发票)适应性更强。
- 支持自定义字段提取(如特殊行业发票的 "项目编号""备注说明")。
- 对模糊 / 倾斜图像的容错性更好:即使 OCR 识别有漏字、错字,大模型可通过上下文推理补全。
2、劣势
- 依赖 OCR 工具的基础识别质量。
- 多了一次 "文本转结构化" 的环节,可能引入大模型的理解偏差(如对 "价税合计" 和 "总金额" 的混淆,需通过 Prompt 严格定义字段边界)。
二、OCR模型
CRNN(CNN+RNN+CTC)
PaddleOCR
百度智能云OCR
阿里云OCR
通义千问OCR模型(qwen-vl-ocr、qwen-vl-ocr-latest)
腾讯 DocLM v5
微软 Azure Document Intelligence 发票模型
Mistral OCR
(一)优缺点
1、优势
- 对标准版式发票(如增值税专用发票、电子普通发票)的识别准确率极高。效率高。
- 字段提取更 "专业":内置发票领域知识(如 "购买方税号" 的格式规则、"税率" 的常见取值 13%/9%/6%),可自动校验字段合法性,减少明显错误。
2、劣势
- 对非标准发票(如企业内部自定义发票、手写发票、国外发票)适应性差。专用模型依赖固定版式。
- 自定义字段扩展困难,未预设字段无法处理。
三、选用比较
| 场景 | 推荐识别方式 | 核心技术 | 核心适配点 | 局限性 |
|---|---|---|---|---|
| 标准发票(增值税票) | 模板匹配 OCR + 行业规则引擎 + 轻量化 DL | 模板匹配、规则引擎、CRNN | 版式固定、字段标准化 | 无法适配任何非标 / 版式变动的发票 |
| 非标准发票(手写 / 自定义版式) | 自适应版式分析 OCR+LLM 语义理解 + 行业微调 | 版式分析、LLM、小样本微调 | 无固定版式、手写体 | 需少量行业样本微调,算力成本高于标准票 |
| 自定义字段提取(特殊行业) | 可视化配置 + Prompt + 行业词库 RAG | 低代码配置、Prompt 工程、RAG | 行业专属字段、个性化提取 | 极度小众的行业词库需要手动构建 |
| 低质量发票(模糊 / 倾斜 / 遮挡) | 全链路预处理 + 多模型融合 + 置信度校验 | 图像预处理、多模型融合、置信度评估 | 图像质量差、特征缺失 | 预处理耗时,部分严重遮挡需人工全复核 |