预估时长:1个小时
实践目标:本案例通过条件组件实现了图片视觉以及PDF文本多种类型文件的识别,并且提取票据的识别信息。提升了财务在报销流程中对票务的快速识别及信息记录。具体目标如下:
- 掌握视觉模型节点的OCR应用与配置;
- 掌握IF多条件分支节点的应用;
- 熟悉各类型票据识别提示词的编写;
- 掌握变量聚合器节点的使用。
前置技能:
如果需要了解 Dify的本地部署搭建 以及 系统配置 相关技术的学习者可以参考以下文档:
完整的工作流:
本实验案例需要通过用户上传的票据首先进行票据类型分析(电子发票?火车票?或其他什么票据?),这里会用到LLM节点(视觉大模型)。之后通过条件分支节点根据不同类型的票据编排相对应的视觉模型进行票据信息提取,最终通过变量聚合器将票据提取的信息进行统一处理并回复。
实验运行效果:
实验步骤:
步骤1:创建一个空白的 Chatflow 应用
步骤2:在 开始 节点,添加 输入变量
新添加的输入变量选择 单文件 类型,设置输入变量为 invoiceFile 显示名称为 票据。
步骤3:添加 文档提取器 节点,获取 开始 节点用户上传的票据图片
文档提取器节点 是专门用于获取 开始 节点需用户上传的文件,该节点常与开始节点配对使用。
3-1:点击添加 文档提取器节点
3-2:编辑该节点的 输入变量 为 sys.files
说明:在开始节点中,invoiceFile 变量接收用户上传的票据文件,但开始节点向外输出票据文件的变量则是 sys.files,所以下一个节点要从 sys.files系统全局变量中获取上传票据文件。
步骤4:配置 票据类型识别 大模型节点(LLM)
该节点的作用非常重要,主要完成对各类型的票据进行智能识别。
在这个环节我们两个非常重要的关键点:
- 视觉大模型的应用;
- 各类票据特征的提示词。
4-1:添加 票据类型识别 流程节点
该节点作为 文件提取器 的下一个流程节点,使用 LLM节点 类型创建。
4-2:配置 视觉识别大模型。
在节点添加号好后,我们首先修订节点名称为 票据类型识别。之后要注意的是选择一个视觉大模型,这样才能够完成对用户上传票据图片的识别。
视觉大模型:在这里我们要选择使用一个能够实现视觉识别的大模型,我们选取的是 Qwen2.5-VL-72B-Instruct 模型。
4-3:配置 票据类型识别 节点的 提示词等参数。
首先,我们设置该节点的 上下文 变量值 为 开始 节点中的 invoiceFile。
其次,在SYSTEM中编写 系统提示词,用于配置模型对用户上传票据进行识别的要求和规范。
在本实验中我们设置模型可以识别三种票据:
- 电子发票(全电发票)
- 火车票
- 新版火车票-铁路电子客票
# 角色: 发票识别专家
## 能力
- 专长: 发票类型识别、图像分析、文字识别
- 经验: 多年处理各类发票和票据的经验
- 技能: 精准识别不同类型发票的特征
## 目标
- 根据用户上传的发票图像准确识别发票类型
- 返回对应的发票类型代码
## 规则要求
- 仔细分析发票上的所有视觉和文字信息
- 只返回指定的发票类型代码,不做其他解释
- 如果无法确定发票类型,返回 "无法识别"
## 工作流
1. 接收用户上传的发票图像
2. 分析图像中的关键信息和特征
3. 对比不同类型发票的特征
4. 确定发票类型
5. 返回对应的类型代码
## 输出格式
发票类型代码:
- 0: 电子发票(全电发票)
- 1: 火车票
- 2: 新版火车票-铁路电子客票
## 示例
用户: [上传电子发票(普通发票)或电子发票(增值税专用发票)图像]
特征: 电子版式,有"电子发票"字样,发票号码长度有20位
AI: 0
用户: [上传火车票图像]
特征: 磁性票,较小,包含乘车日期、车次、座位等信息
AI: 1
用户: [上传新版火车票-铁路电子客票图像]
特征: 电子版式,有"电子发票(铁路电子客票)"标志,包含乘车日期、车次、座位等信息,有发票号码,发票号码长度20位
AI: 2
用户: [上传模糊不清的图像]
特征: 图像模糊,无法辨识关键信息
AI: 无法识别
根据识别的结果返回不同的值。 电子发票:0;火车票:1;新版火车票:2;无法识别。
4-3:要开启模型的 视觉 功能,这样才能真正启动大模型的OCR视觉识别功能。
步骤5:添加 条件分支 节点。
根据 票据类型识别 节点的返回值,让业务流程进入到不同的工作流当中,从而实现对不同票据的识别。为了实现这一效果,我们会用到 条件分支 节点。
条件分支节点使用 IF…条件1… ELSIF…条件2…ELSIF…条件N…ELSE…的逻辑结构对多个条件结果进行分流处理。
5-1:添加 IF 条件
首先,在这里条件变量我们必须选择上一个节点 票据类型识别 节点中的 text 输出变量。
其次,要配置 IF 条件判定,这里我们判定 返回变量 text 为 0 。
特别注意:这里一定要选择 包含
5-2:添加 ELIF 条件
因为 票据类型识别 节点会根据OCR视觉甄别出不同的票据类型,从而返回不同的结果。因此,我们还要对其他可能返回的值进行条件判定,这里就要用到 +ELIF 。
如上图所示,我们要把所有可能的返回条件都配置好,最终所有条件添加后的效果:
到此,条件节点 添加完毕!
步骤6:配置不同条件的票据信息识别提取 节点(LLM)
6-1:添加配置 票据信息提取 节点
添加 满足 IF 条件 的 票据信息提取 节点。
该节点其实也会用到Qwen2.5-VL-72B-Instruct视觉识别大模型,编写模型提示词用于对电子发票进行识别操作。
在这里我们的 上下文 变量 为 开始 节点中的 invoiceFile。
对全电子发票处理的模型提示词如下:
请提取这张照片的内容。
其中内容格式‘发票号码’、‘开票日期’、‘购买方信息名称’、‘购买方统一社会信用代码/纳税人识别号’、‘销售方信息名称’、‘销售方统一社会信用代码/纳税人识别号’、‘项目名称’、‘规格型号’、‘单 位’、‘数 量’、‘单 价’、‘金 额’、‘税率/征收率’、‘税 额’、‘合计’、‘价税合计(大写)’、‘价税合计(小写)’、‘备 注’ 字段返回信息。
返回的结果信息以json格式返回
最后,设置开启该模型节点的 视觉OCR识别功能,注意要变量为 开始节点 的 invoiceFile。
6-2:其余类型票据识别模型节点添加
操作完全一致,给出其余模型信息提取节点的 提示词如下:
- 火车票:
请提取这张照片的内容。
其中内容格式‘始发站’、‘终点站’、‘车次’、‘出发时间’、‘票价’、‘身份证号’、‘姓名’字段返回信息。
返回的结果信息以json格式返回
- 新版火车票-铁路电子客票
请提取这张照片的内容。
其中内容格式‘发票号码’、'开票日期’、'‘出发时间’、‘始发站’、‘终点站’、‘车次’、‘票价’、‘身份证号’、‘姓名’、‘电子客票号’、‘购买方名称’、‘统一社会信用代码’字段返回信息。
返回的结果信息以json格式返回
最终添加完后的效果如下图:
6-3:添加 ELSE 条件 的 直接回复 节点。
如果上传的票据文件模糊不清,也就是满足ELSE条件,那我们直接返回客户错误信息即可。
为ELSE条件添加 直接回复 节点。
Tips:如果后续我们希望智能体应用能够识别更多类型的票据,只需要按照这个思路和方法自行添加即可。
OK,到此多条件分支处理的工作流就编排完毕了。
步骤7:添加配置 变量聚合器 节点
什么是 变量聚合器?
本案例中的各种票据识别的输出结构其实基本上是一样的,只是它的内容有所区别。因为后面我们是需要输出给用户的,所以这里我们就用 变量聚合器 把票据信息提取的结果统一输出到一个变量聚合器里面。它的配置也很简单接受上一个流程输出结果即可。
否则,我们要为每一个 票据信息提取 节点 都设置一个 回复节点,会很繁琐。
7-1:添加 变量聚合器 节点
我们点击 全电子发票信息提取 节点上的 + 号,选择 变量聚合器 节点
7-2:配置 节点的变量参数
通过每一个票据信息提取节点 与 变量聚合器 鼠标推拽关联后,设置好每个信息提取节点的输出变量 text,如下入右侧的红框所示。
到此,变量聚合器 节点设置完毕。
步骤8:设置 票据识别后的的信息 直接回复 节点。
作为 变量聚合器 的下一个节点, 直接回复节点需要配置 LLM的输出text以及开始节点的invoiceFile作为输出。
到此,我们的所有工作流编排全部完成了。
最终运行效果:
总结:
通过本实验案例的学习,我们掌握了视觉大模型在智能体开发场景中的应用。此外对多条件分支节点、数据模型OCR的配置以及变量聚合器节点的使用都有了深入的理解和掌握。本案例也是抛砖引玉,希望大家可举一反三,创新出视觉大模型在更多场景的应用。