Dify工作流需实现发票扫描件的OCR识别与数据校验双动作:先用代码节点动态获取百度OCR access_token并转PDF/图片为Base64,再调用OCR接口提取字段,经正则清洗后送入LLM结构化输出并比对ERP数据库。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

你需要让Dify自动从纸质发票扫描件中提取开票方、金额、日期等字段,并与系统内已存数据比对是否一致——不是只识别,而是识别+校验双动作同时完成。
配置百度OCR接入作为工具节点
在Dify工作流画布左侧节点库中,拖拽“工具调用”节点到画布中央。点击该节点,在右侧面板选择“新建HTTP工具”。
填写工具名称为“baidu_ocr_invoice”,请求方法选POST,URL填入百度智能云OCR通用文字识别(高精度版)接口地址:https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic。
在Headers区域添加两行:Key填Content-Type,Value填application/x-www-form-urlencoded;Key填Accept,Value填application/json。注意不要漏掉access_token参数——它必须通过调用百度OAuth2.0接口动态获取,不能写死;因此在Body中填:access_token={{baidu_access_token}}&image={{base64_image}}。
这一步必须做:在工作流开头的“开始”节点后,插入一个“代码节点”,用Python脚本调用百度OAuth接口获取token并赋值给变量baidu_access_token。否则OCR请求会因认证失败直接中断。
上传文件并转为Base64编码
从节点库拖入“开始”节点,添加一个文件类型变量,命名为invoice_scan,允许格式限定为.jpg、.png、.pdf。
PDF需先转图:在“开始”节点后接一个“代码节点”,用fitz(PyMuPDF)将PDF第一页渲染为PNG,再用base64.b64encode转码,输出变量设为base64_image。
若上传的是图片,直接读取二进制内容→base64编码即可。注意:【百度OCR要求图片base64编码后长度不超过10MB】,超限会返回错误码282103;建议在代码节点里加判断,超限时用PIL压缩至宽度1200px且质量85%后再编码。
结构化提取关键字段
OCR原始返回是无序文本块列表,需清洗后送入LLM。在OCR工具节点后接一个“文本处理”节点,执行以下操作:
调用百度PaddleOCR‑VL大模型API,支持PDF、Word、PPT、图片等多格式文档解析,精准识别印刷体、手写体、表格、公式、图表、印章等复杂元素,支持100+语言,可处理不规则布局和跨页长文档。触发词:文档解析、VLM解析、大模型OCR、PaddleOCR、多模态文档、手写识别、公式识别、复杂版面。
① 用正则提取所有含“发票代码”“发票号码”“开票日期”“金额”“校验码”字样的行;
② 将每行冒号后的文本截取出来,去掉空格、换行符、中文括号;
③ 对金额字段强制统一格式:匹配¥?\d{1,3}(,\d{3})*\.?\d{0,2},转为纯数字字符串(如“¥1,234.50”→“1234.50”);
④ 输出整理后的键值对字符串,例如:发票代码:1100224320\n发票号码:67891234\n开票日期:2024-05-20\n金额:12500.00。
调用LLM进行字段映射与比对
方法一:使用DeepSeek-VL模型直接解析
拖入“大语言模型”节点,模型选deepseek-vl,系统提示词写:“你是一个财务审核助手。请严格按JSON格式输出:{‘invoice_code’:‘字符串’,‘invoice_number’:‘字符串’,‘issue_date’:‘YYYY-MM-DD格式’,‘amount’:‘浮点数,保留2位小数’,‘match_result’:‘布尔值,与数据库字段比对后结果’}。输入文本来自OCR识别,请忽略无关字符。”
方法二:分步比对(推荐)
先用LLM节点提取结构化字段并标准化,输出JSON;再接一个“条件分支”节点,判断invoice_number是否存在于企业ERP数据库中(需提前配置数据库连接工具);若存在,调用另一个LLM节点比对amount和issue_date字段是否完全一致,不一致则标记discrepancy_fields数组。
最后用“答案节点”聚合输出,Schema定义为:{"invoice_number":"string","amount":"number","issue_date":"string","match_result":"boolean","discrepancy_fields":["string"]}。

















