dify案例分享-基于多模态模型的发票识别2-多种发票识别


上期文章我们提到使用dify基于多模态模型实现单张发票识别功能。本期文章我们在原有的单张发票识别基础上实现多发票识别的dify基于工作流的智能体。

下面我们首介绍一下整体功能。

dify案例分享-基于多模态模型的发票识别2-多种发票识别

  这里面主要功能:用户上传一个发票图片(目前我们这工作流支持6种发票),发票会经过文档提取器。文档提取器提取用户上传的发票传递给llm多模态模型,这个模型的作用是判断这发票是哪个类型的发票,接下来我们会根据条件分支来判断走哪个多模态发票提取的llm大语言模型。其中这6个大语言模型区别就在于他们的系统提示词不一样,主要就是每个发票票面信息不一样。模型会根据不同发票票面信息提示词的不同而有所区别,模型返回的json格式的发票信息在发送给变量聚合器进行出来,处理完成后再发送给用户,整体的功能大概就是这样的。

实现的效果如下:

1 火车票票面识别

dify案例分享-基于多模态模型的发票识别2-多种发票识别

2.加油站卷式发票

dify案例分享-基于多模态模型的发票识别2-多种发票识别

下面我们重点介绍一下这个工作流是如何实现的。

创建工作流或者chatflow

接着来到Dify中按下图顺序依次点击并点击创建(注:chatflow和工作流配置基本差不多,下面我们就以chatflow讲解)

 dify案例分享-基于多模态模型的发票识别2-多种发票识别

开始

      开始节点点开后我们需要添加一个文件上传输入参数。点击开始节点输入字段,点击右边的“+”

      dify案例分享-基于多模态模型的发票识别2-多种发票识别

我们选择单个文件,输入变量名称、支持的文件类型我们这里就选择图片。其他都可以默认,输入完成后,点击保存按钮

dify案例分享-基于多模态模型的发票识别2-多种发票识别

以上步骤完成开始节点设置。

dify案例分享-基于多模态模型的发票识别2-多种发票识别

文档提取器

 接下来我们在工作流画布中,选择文档提取器和开始节点连接,去掉llm和开始节点连接

 dify案例分享-基于多模态模型的发票识别2-多种发票识别

  dify案例分享-基于多模态模型的发票识别2-多种发票识别

我们在文档提取器,输入变量中选中 sys.files 变量

dify案例分享-基于多模态模型的发票识别2-多种发票识别

llm(发票识别判断模型)

  接下来我们将文档提取器的连接线和llm大语言模型连接。然后按照以下几个步骤设置

 1.模型选择,模型我们在模型下拉列表中选择自定义OpenAI-API-compatible  Qwen/Qwen2-VL-72B-Instruct模型;模型最大标记4096

 2.上下文,这里设置开始节点file 属性值

 3.SYSTEM 提示词 我们输入如下内容

  1. # Role: 发票识别专家

    ## Profile
    - 专长: 发票类型识别、图像分析、文字识别
    - 经验: 多年处理各类发票和票据的经验
    - 技能: 精准识别不同类型发票的特征

    ## Goals
    - 根据用户上传的发票图像准确识别发票类型
    - 返回对应的发票类型代码

    ## Rules
    - 仔细分析发票上的所有视觉和文字信息
    - 只返回指定的发票类型代码,不做其他解释
    - 如果无法确定发票类型,返回 "无法识别"

    ## Workflows
    1. 接收用户上传的发票图像
    2. 分析图像中的关键信息和特征
    3. 对比不同类型发票的特征
    4. 确定发票类型
    5. 返回对应的类型代码

    ## Output Format
    发票类型代码:
    - 0: 增值税电子发票
    - 1: 电子发票(全电发票)
    - 2: 增值税普通发票-卷票
    - 3: 火车票
    - 4: 新版火车票-铁路电子客票
    - 5: 定额发票

    ## Examples
    用户: [上传增值税电子普通发票图像]
    特征: 电子版式,有"增值税电子普通发票"字样,含二维码,有密码区,有 "税局监制"字样
    AI: 0

    用户: [上传电子发票(普通发票)或电子发票(增值税专用发票)图像]
    特征: 电子版式,有"电子发票"字样,发票号码长度有20
    AI: 1

    用户: [上传增值税普通发票发票联图像]
    特征: 纸质卷式,较窄,有"增值税普通发票"字样,通常为红色或蓝色
    AI: 2

    用户: [上传火车票图像]
    特征: 磁性票,较小,包含乘车日期、车次、座位等信息
    AI: 3

    用户: [上传新版火车票-铁路电子客票图像]
    特征: 电子版式,有"电子发票(铁路电子客票)"标志,包含乘车日期、车次、座位等信息,有发票号码,发票号码长度20
    AI: 4

    用户: [上传定额发票图像]
    特征: 小型纸质票据,预先印制金额,通常用于小额交易
    AI: 5

    用户: [上传模糊不清的图像]
    特征: 图像模糊,无法辨识关键信息
    AI: 无法识别

4.视觉 点击右边按钮开启多模态

5  视觉输入变量  选择节点filefiles 变量

以上完成llm模型的设置

dify案例分享-基于多模态模型的发票识别2-多种发票识别

 这个模型的作用是区分判断用户上传的发票是哪个类型,通过多模态模型区分后返回对应的发票种类,我这里设定以下几个类型

  0 、增值税专用发票普通发票

  1、电子发票(全电发票)

  2、增值税普通发票-卷票

  3、火车票

  4、新版火车票-铁路电子客票 (2024年11月1日 国家全面推广 铁路电子客票作为抵扣报销使用)

  5、定额发票

  100、无法判断的发票

条件分支

 这里我们需要接受上一个llm模型输出的返回值(0、1、2、3、4、5、100),由这个判断条件分支来让流程节点选择下面哪一个发票提取llm多模态大模型

它的设置也比较简单就是 if  else , 判断条件这里我们 都选择"包含",详细配置可以看我的这个截图

 dify案例分享-基于多模态模型的发票识别2-多种发票识别

流程节点图如下

dify案例分享-基于多模态模型的发票识别2-多种发票识别

这里稍微提一下,因为最后发票无法识别,所以我们之间给它做一个直接回复的节点,节点里面填写“未识别出正确的发票信息,请重新输入”

dify案例分享-基于多模态模型的发票识别2-多种发票识别

发票识别llm多模态模型

上一个条件分支节点连接到这个llm多模态模型中,因为这个需要具体提取发票票面信息的,所以我们这里需要6个多模态模型。每个流程节点配置都是一样的,只是系统提示词有区别,我这里就以一个增值税专用发票普通发票LLM为例给大家介绍

1.模型选择,模型我们在模型下拉列表中选择自定义OpenAI-API-compatible  Qwen/Qwen2-VL-72B-Instruct模型;模型最大标记4096

 2.上下文,这里设置开始节点file 属性值

 3.SYSTEM 提示词 我们输入如下内容

  1. 请提取这张照片的内容,其中内容格式‘机器编号’、‘发票代码’、‘发票号码’、‘开票日期’、‘校  码’、‘购买方名称’、‘购买方纳税人识别号’、‘购买方地 址、电 话’、‘开户行及账号’、‘货物或应税劳务、服务名称’、‘规格型号’、‘单 位’、‘数 量’、‘单 价’、‘金 额’、‘税率’、‘税 额’、‘价税合计(大写)’、‘价税合计(小写)’、‘销售方名称’、‘销售方纳税人识别号’、‘销售方地 址、电 话’、‘销售方地 址、电 话’、‘开户行及账号’、‘备注’、‘收款人’、‘复核’、‘开票人’ 字段返回信息,返回的结果信息以json格式返回

4.视觉 点击右边按钮开启多模态

5  视觉输入变量  选择节点filefiles 变量

以上完成llm模型的设置

dify案例分享-基于多模态模型的发票识别2-多种发票识别

其他的提示词我这里也给大家贴一下

电子发票(全电发票)

  1. 请提取这张照片的内容,其中内容格式‘发票号码’、‘开票日期’、‘购买方信息名称’、‘购买方统一社会信用代码/纳税人识别号’、‘销售方信息名称’、‘销售方统一社会信用代码/纳税人识别号’、‘项目名称’、‘规格型号’、‘单 位’、‘数 量’、‘单 价’、‘金 额’、‘税率/征收率’、‘税 额’、‘合计’、‘价税合计(大写)’、‘价税合计(小写)’、‘备 注’ 字段返回信息,返回的结果信息以json格式返回

增值税普通发票-卷票

  1. 请提取这张照片的内容,其中内容格式‘发票代码’、'发票号码’、'机打号码’、‘机器编号’、‘销售方名称’、‘纳税人识别号’、‘开票日期’、‘收款员’、‘购买方名称’、‘纳税人识别号’、‘项目’、‘单价’、‘数量’、‘金额’、‘合计金额(小写)’、‘合计金额(大写)’、‘校验码’字段返回信息,返回的结果信息以json格式返回

火车票

 

  1. 请提取这张照片的内容,其中内容格式‘始发站’、‘终点站’、‘车次’、‘出发时间’、‘票价’、‘身份证号’、‘姓名’字段返回信息,返回的结果信息以json格式返回

新版火车票-铁路电子客票

  1. 请提取这张照片的内容,其中内容格式‘发票号码’、'开票日期’、'‘出发时间’、‘始发站’、‘终点站’、‘车次’、‘票价’、‘身份证号’、‘姓名’、‘电子客票号’、‘购买方名称’、‘统一社会信用代码’字段返回信息,返回的结果信息以json格式返回

定额发票

  1. 请提取这张照片的内容,其中内容格式‘发票代码’、'发票号码’、'金额’字段返回信息,返回的结果信息以json格式返回

如果需要在增加发票识别 可以根据上面操作步骤新增一个多模态识别模型以及编写 新的提示词即可。

变量聚合器

这个变量聚合器是干啥的呢?大家发现没有6个多模态发票识别的输出结构其实是一样的,只是它的内容有所区别。因为后面我们是需要输出给用户的,所以这里我们就用变量聚合器把llm大语言模型提取发票的结果统一输出到一个变量聚合器里面。它的配置也很简单接受上一个流程输出结果即可

dify案例分享-基于多模态模型的发票识别2-多种发票识别

如果没有变量聚合器就会变成我之前配置的那个流程了,给大家看一下我之前的那个流程吧。

dify案例分享-基于多模态模型的发票识别2-多种发票识别

直接回复

接下来我们将变量聚合器连接到直接回复的输出节点。

这个地方设置比较简单,在回复设置一下llm text文本输出以及 开始节点file 输出,这样设置后。就会将发票提取的票面信息以json格式的文本信息返回,并将上传的发票图片信息一并返回给用户

dify案例分享-基于多模态模型的发票识别2-多种发票识别

通过以上方式我们就初步完成了整个chatflow工作流。

完整的dsl也发给大家把

  1. app:
    description: ''
    icon: ?
    icon_background: '#FFEAD5'
    mode: advanced-chat
    name: 发票提取小工具整合版-变量聚合器
    use_icon_as_answer_icon: false
    kind: app
    version: 0.1.2
    workflow:
    conversation_variables: []
    environment_variables: []
    features:
     file_upload:
       allowed_file_extensions:
       - .JPG
       - .JPEG
       - .PNG
       - .GIF
       - .WEBP
       - .SVG
       allowed_file_types:
       - image
       allowed_file_upload_methods:
       - local_file
       - remote_url
       enabled: false
       image:
         enabled: false
         number_limits: 3
         transfer_methods:
         - local_file
         - remote_url
       number_limits: 3
     opening_statement: ''
     retriever_resource:
       enabled: true
     sensitive_word_avoidance:
       enabled: false
     speech_to_text:
       enabled: false
     suggested_questions: []
     suggested_questions_after_answer:
       enabled: false
     text_to_speech:
       enabled: false
       language: ''
       voice: ''
    graph:
     edges:
     - data:
         isInIteration: false
         sourceType: start
         targetType: document-extractor
       id: 1729851066338-source-1729851603790-target
       selected: false
       source: '1729851066338'
       sourceHandle: source
       target: '1729851603790'
       targetHandle: target
       type: custom
       zIndex: 0
     - data:
         isInIteration: false
         sourceType: document-extractor
         targetType: llm
       id: 1729851603790-source-llm-target
       selected: false
       source: '1729851603790'
       sourceHandle: source
       target: llm
       targetHandle: target
       type: custom
       zIndex: 0
     - data:
         isInIteration: false
         sourceType: llm
         targetType: if-else
       id: llm-source-1730191858003-target
       selected: false
       source: llm
       sourceHandle: source
       target: '1730191858003'
       targetHandle: target
       type: custom
       zIndex: 0
     - data:
         isInIteration: false
         sourceType: if-else
         targetType: llm
       id: 1730191858003-true-1730191979948-target
       selected: false
       source: '1730191858003'
       sourceHandle: 'true'
       target: '1730191979948'
       targetHandle: target
       type: custom
       zIndex: 0
     - data:
         isInIteration: false
         sourceType: if-else
         targetType: llm
       id: 1730191858003-98657baa-79e3-4af1-9b19-3daa149c0fab-17301921619230-target
       selected: false
       source: '1730191858003'
       sourceHandle: 98657baa-79e3-4af1-9b19-3daa149c0fab
       target: '17301921619230'
       targetHandle: target
       type: custom
       zIndex: 0
     - data:
         isInIteration: false
         sourceType: if-else
         targetType: llm
       id: 1730191858003-dafa44fc-1c33-4060-a68a-38c5850bda96-17301923168610-target
       selected: false
       source: '1730191858003'
       sourceHandle: dafa44fc-1c33-4060-a68a-38c5850bda96
       target: '17301923168610'
       targetHandle: target
       type: custom
       zIndex: 0
     - data:
         isInIteration: false
         sourceType: if-else
         targetType: llm
       id: 1730191858003-2d44a634-2764-4287-84a7-964fae566d5d-17301924021390-target
       selected: false
       source: '1730191858003'
       sourceHandle: 2d44a634-2764-4287-84a7-964fae566d5d
       target: '17301924021390'
       targetHandle: target
       type: custom
       zIndex: 0
     - data:
         isInIteration: false
         sourceType: if-else
         targetType: llm
       id: 1730191858003-e0a31ca5-21fa-4ec3-8c89-734c40116f8f-17301924991430-target
       selected: false
       source: '1730191858003'
       sourceHandle: e0a31ca5-21fa-4ec3-8c89-734c40116f8f
       target: '17301924991430'
       targetHandle: target
       type: custom
       zIndex: 0
     - data:
         isInIteration: false
         sourceType: if-else
         targetType: llm
       id: 1730191858003-fa4e8d8d-b178-415a-8c86-2d211b380df7-17301925812850-target
       selected: false
       source: '1730191858003'
       sourceHandle: fa4e8d8d-b178-415a-8c86-2d211b380df7
       target: '17301925812850'
       targetHandle: target
       type: custom
       zIndex: 0
     - data:
         isInIteration: false
         sourceType: if-else
         targetType: answer
       id: 1730191858003-false-1730192759530-target
       source: '1730191858003'
       sourceHandle: 'false'
       target: '1730192759530'
       targetHandle: target
       type: custom
       zIndex: 0
     - data:
         isInIteration: false
         sourceType: llm
         targetType: variable-aggregator
       id: 1730191979948-source-1730214844929-target
       source: '1730191979948'
       sourceHandle: source
       target: '1730214844929'
       targetHandle: target
       type: custom
       zIndex: 0
     - data:
         isInIteration: false
         sourceType: llm
         targetType: variable-aggregator
       id: 17301921619230-source-1730214844929-target
       source: '17301921619230'
       sourceHandle: source
       target: '1730214844929'
       targetHandle: target
       type: custom
       zIndex: 0
     - data:
         isInIteration: false
         sourceType: llm
         targetType: variable-aggregator
       id: 17301923168610-source-1730214844929-target
       source: '17301923168610'
       sourceHandle: source
       target: '1730214844929'
       targetHandle: target
       type: custom
       zIndex: 0
     - data:
         isInIteration: false
         sourceType: llm
         targetType: variable-aggregator
       id: 17301924021390-source-1730214844929-target
       source: '17301924021390'
       sourceHandle: source
       target: '1730214844929'
       targetHandle: target
       type: custom
       zIndex: 0
     - data:
         isInIteration: false
         sourceType: llm
         targetType: variable-aggregator
       id: 17301924991430-source-1730214844929-target
       source: '17301924991430'
       sourceHandle: source
       target: '1730214844929'
       targetHandle: target
       type: custom
       zIndex: 0
     - data:
         isInIteration: false
         sourceType: llm
         targetType: variable-aggregator
       id: 17301925812850-source-1730214844929-target
       source: '17301925812850'
       sourceHandle: source
       target: '1730214844929'
       targetHandle: target
       type: custom
       zIndex: 0
     - data:
         isInIteration: false
         sourceType: variable-aggregator
         targetType: answer
       id: 1730214844929-source-1730214939964-target
       source: '1730214844929'
       sourceHandle: source
       target: '1730214939964'
       targetHandle: target
       type: custom
       zIndex: 0
     nodes:
     - data:
         desc: ''
         selected: false
         title: 开始
         type: start
         variables:
         - allowed_file_extensions: []
           allowed_file_types:
           - image
           allowed_file_upload_methods:
           - local_file
           - remote_url
           label: file
           max_length: 48
           options: []
           required: true
           type: file
           variable: file
       height: 90
       id: '1729851066338'
       position:
         x: -126.67275943419781
         y: 283
       positionAbsolute:
         x: -126.67275943419781
         y: 283
       selected: false
       sourcePosition: right
       targetPosition: left
       type: custom
       width: 244
     - data:
         context:
           enabled: true
           variable_selector:
           - '1729851066338'
           - file
         desc: 发票识别判断模型
         memory:
           query_prompt_template: ''
           role_prefix:
             assistant: ''
             user: ''
           window:
             enabled: false
             size: 10
         model:
           completion_params:
             temperature: 0.7
           mode: chat
           name: Qwen/Qwen2-VL-72B-Instruct
           provider: openai_api_compatible
         prompt_template:
         - id: 994d57b8-32bc-45cd-b30a-4a1481553627
           role: system
           text: '# Role: 发票识别专家


               ## Profile

             - 专长: 发票类型识别、图像分析、文字识别

             - 经验: 多年处理各类发票和票据的经验

             - 技能: 精准识别不同类型发票的特征


               ## Goals

             - 根据用户上传的发票图像准确识别发票类型

             - 返回对应的发票类型代码


               ## Rules

             - 仔细分析发票上的所有视觉和文字信息

             - 只返回指定的发票类型代码,不做其他解释

             - 如果无法确定发票类型,返回 "无法识别"


               ## Workflows

             1. 接收用户上传的发票图像

             2. 分析图像中的关键信息和特征

             3. 对比不同类型发票的特征

             4. 确定发票类型

             5. 返回对应的类型代码


               ## Output Format

             发票类型代码:

             - 0: 增值税电子发票

             - 1: 电子发票(全电发票)

             - 2: 增值税普通发票-卷票

             - 3: 火车票

             - 4: 新版火车票-铁路电子客票

             - 5: 定额发票


               ## Examples

             用户: [上传增值税电子普通发票图像]

             特征: 电子版式,有"增值税电子普通发票"字样,含二维码,有密码区,有 "税局监制"字样

             AI: 0


             用户: [上传电子发票(普通发票)或电子发票(增值税专用发票)图像]

             特征: 电子版式,有"电子发票"字样,发票号码长度有20位

             AI: 1


             用户: [上传增值税普通发票发票联图像]

             特征: 纸质卷式,较窄,有"增值税普通发票"字样,通常为红色或蓝色

             AI: 2


             用户: [上传火车票图像]

             特征: 磁性票,较小,包含乘车日期、车次、座位等信息

             AI: 3


             用户: [上传新版火车票-铁路电子客票图像]

             特征: 电子版式,有"电子发票(铁路电子客票)"标志,包含乘车日期、车次、座位等信息,有发票号码,发票号码长度20位

             AI: 4


             用户: [上传定额发票图像]

             特征: 小型纸质票据,预先印制金额,通常用于小额交易

             AI: 5


             用户: [上传模糊不清的图像]

             特征: 图像模糊,无法辨识关键信息

             AI: 无法识别'
         selected: false
         title: LLM
         type: llm
         variables: []
         vision:
           configs:
             detail: high
             variable_selector:
             - '1729851066338'
             - file
           enabled: true
       height: 126
       id: llm
       position:
         x: 553
         y: 292.00000000000006
       positionAbsolute:
         x: 553
         y: 292.00000000000006
       selected: false
       sourcePosition: right
       targetPosition: left
       type: custom
       width: 244
     - data:
         desc: ''
         is_array_file: true
         selected: false
         title: 文档提取器
         type: document-extractor
         variable_selector:
         - sys
         - files
       height: 94
       id: '1729851603790'
       position:
         x: 245
         y: 283
       positionAbsolute:
         x: 245
         y: 283
       selected: false
       sourcePosition: right
       targetPosition: left
       type: custom
       width: 244
     - data:
         cases:
         - case_id: 'true'
           conditions:
           - comparison_operator: contains
             id: aec2b72e-7d06-41ea-b86e-6d3c7e803811
             value: '0'
             varType: string
             variable_selector:
             - llm
             - text
           id: 'true'
           logical_operator: or
         - case_id: 98657baa-79e3-4af1-9b19-3daa149c0fab
           conditions:
           - comparison_operator: contains
             id: 083411ab-178c-4461-b356-55fece233c6f
             value: '1'
             varType: string
             variable_selector:
             - llm
             - text
           id: 98657baa-79e3-4af1-9b19-3daa149c0fab
           logical_operator: and
         - case_id: dafa44fc-1c33-4060-a68a-38c5850bda96
           conditions:
           - comparison_operator: contains
             id: 3ab9cfbc-791b-4d8f-a4ff-c8ebe3fb9d93
             value: '2'
             varType: string
             variable_selector:
             - llm
             - text
           id: dafa44fc-1c33-4060-a68a-38c5850bda96
           logical_operator: and
         - case_id: 2d44a634-2764-4287-84a7-964fae566d5d
           conditions:
           - comparison_operator: contains
             id: 6ec008b1-ca33-489f-bcef-816dca204eb1
             value: '3'
             varType: string
             variable_selector:
             - llm
             - text
           id: 2d44a634-2764-4287-84a7-964fae566d5d
           logical_operator: and
         - case_id: e0a31ca5-21fa-4ec3-8c89-734c40116f8f
           conditions:
           - comparison_operator: contains
             id: 180c7bdf-a872-4835-ba64-d149184e0000
             value: '4'
             varType: string
             variable_selector:
             - llm
             - text
           id: e0a31ca5-21fa-4ec3-8c89-734c40116f8f
           logical_operator: and
         - case_id: fa4e8d8d-b178-415a-8c86-2d211b380df7
           conditions:
           - comparison_operator: contains
             id: 6a8b04c7-a0dc-4c01-8094-66df3eb6b1f7
             value: '5'
             varType: string
             variable_selector:
             - llm
             - text
           id: fa4e8d8d-b178-415a-8c86-2d211b380df7
           logical_operator: and
         - case_id: 837ffce9-f087-4457-b133-ee0886df34a6
           conditions:
           - comparison_operator: contains
             id: fb1e1d2f-2fdd-4ce2-8ce5-0f194281b501
             value: '100'
             varType: string
             variable_selector:
             - llm
             - text
           id: 837ffce9-f087-4457-b133-ee0886df34a6
           logical_operator: and
         desc: ''
         selected: false
         title: 条件分支
         type: if-else
       height: 414
       id: '1730191858003'
       position:
         x: 830
         y: 233
       positionAbsolute:
         x: 830
         y: 233
       selected: false
       sourcePosition: right
       targetPosition: left
       type: custom
       width: 244
     - data:
         context:
           enabled: true
           variable_selector:
           - '1729851066338'
           - file
         desc: 增值税专用发票普通发票提取模型
         model:
           completion_params:
             temperature: 0.7
           mode: chat
           name: Qwen/Qwen2-VL-72B-Instruct
           provider: openai_api_compatible
         prompt_template:
         - id: fef27062-3a9f-4d92-8a59-0902e9c80e87
           role: system
           text: 请提取这张照片的内容,其中内容格式‘机器编号’、‘发票代码’、‘发票号码’、‘开票日期’、‘校 码’、‘购买方名称’、‘购买方纳税人识别号’、‘购买方地
             址、电 话’、‘开户行及账号’、‘货物或应税劳务、服务名称’、‘规格型号’、‘单 位’、‘数 量’、‘单 价’、‘金 额’、‘税率’、‘税
             额’、‘价税合计(大写)’、‘价税合计(小写)’、‘销售方名称’、‘销售方纳税人识别号’、‘销售方地 址、电 话’、‘销售方地 址、电 话’、‘开户行及账号’、‘备注’、‘收款人’、‘复核’、‘开票人’
             字段返回信息,返回的结果信息以json格式返回
         selected: false
         title: 增值税专用发票普通发票
         type: llm
         variables: []
         vision:
           configs:
             detail: high
             variable_selector:
             - '1729851066338'
             - file
           enabled: true
       height: 126
       id: '1730191979948'
       position:
         x: 1221
         y: 153
       positionAbsolute:
         x: 1221
         y: 153
       selected: false
       sourcePosition: right
       targetPosition: left
       type: custom
       width: 244
     - data:
         context:
           enabled: true
           variable_selector:
           - '1729851066338'
           - file
         desc: 电子发票(全电发票)提取模型
         model:
           completion_params:
             temperature: 0.7
           mode: chat
           name: Qwen/Qwen2-VL-72B-Instruct
           provider: openai_api_compatible
         prompt_template:
         - id: fef27062-3a9f-4d92-8a59-0902e9c80e87
           role: system
           text: 请提取这张照片的内容,其中内容格式‘发票号码’、‘开票日期’、‘购买方信息名称’、‘购买方统一社会信用代码/纳税人识别号’、‘销售方信息名称’、‘销售方统一社会信用代码/纳税人识别号’、‘项目名称’、‘规格型号’、‘单
             位’、‘数 量’、‘单 价’、‘金 额’、‘税率/征收率’、‘税 额’、‘合计’、‘价税合计(大写)’、‘价税合计(小写)’、‘备 注’ 字段返回信息,返回的结果信息以json格式返回
         selected: false
         title: 电子发票(全电发票)
         type: llm
         variables: []
         vision:
           configs:
             detail: high
             variable_selector:
             - '1729851066338'
             - file
           enabled: true
       height: 126
       id: '17301921619230'
       position:
         x: 1209.0000000000002
         y: 321.9999999999999
       positionAbsolute:
         x: 1209.0000000000002
         y: 321.9999999999999
       selected: false
       sourcePosition: right
       targetPosition: left
       type: custom
       width: 244
     - data:
         context:
           enabled: true
           variable_selector:
           - '1729851066338'
           - file
         desc: 增值税普通发票-卷票提取模型
         model:
           completion_params:
             temperature: 0.7
           mode: chat
           name: Qwen/Qwen2-VL-72B-Instruct
           provider: openai_api_compatible
         prompt_template:
         - id: fef27062-3a9f-4d92-8a59-0902e9c80e87
           role: system
           text: 请提取这张照片的内容,其中内容格式‘发票代码’、'发票号码’、'机打号码’、‘机器编号’、‘销售方名称’、‘纳税人识别号’、‘开票日期’、‘收款员’、‘购买方名称’、‘纳税人识别号’、‘项目’、‘单价’、‘数量’、‘金额’、‘合计金额(小写)’、‘合计金额(大写)’、‘校验码’字段返回信息,返回的结果信息以json格式返回
         selected: false
         title: 增值税普通发票-卷票
         type: llm
         variables: []
         vision:
           configs:
             detail: high
             variable_selector:
             - '1729851066338'
             - file
           enabled: true
       height: 126
       id: '17301923168610'
       position:
         x: 1209.0000000000002
         y: 479.9999999999999
       positionAbsolute:
         x: 1209.0000000000002
         y: 479.9999999999999
       selected: false
       sourcePosition: right
       targetPosition: left
       type: custom
       width: 244
     - data:
         context:
           enabled: true
           variable_selector:
           - '1729851066338'
           - file
         desc: 火车票提取模型
         model:
           completion_params:
             temperature: 0.7
           mode: chat
           name: Qwen/Qwen2-VL-72B-Instruct
           provider: openai_api_compatible
         prompt_template:
         - id: fef27062-3a9f-4d92-8a59-0902e9c80e87
           role: system
           text: 请提取这张照片的内容,其中内容格式‘始发站’、‘终点站’、‘车次’、‘出发时间’、‘票价’、‘身份证号’、‘姓名’字段返回信息,返回的结果信息以json格式返回
         selected: false
         title: 火车票
         type: llm
         variables: []
         vision:
           configs:
             detail: high
             variable_selector:
             - '1729851066338'
             - file
           enabled: true
       height: 126
       id: '17301924021390'
       position:
         x: 1214.0000000000002
         y: 631.9999999999999
       positionAbsolute:
         x: 1214.0000000000002
         y: 631.9999999999999
       selected: false
       sourcePosition: right
       targetPosition: left
       type: custom
       width: 244
     - data:
         context:
           enabled: true
           variable_selector:
           - '1729851066338'
           - file
         desc: 新版火车票-铁路电子客票提取模型
         model:
           completion_params:
             temperature: 0.7
           mode: chat
           name: Qwen/Qwen2-VL-72B-Instruct
           provider: openai_api_compatible
         prompt_template:
         - id: fef27062-3a9f-4d92-8a59-0902e9c80e87
           role: system
           text: 请提取这张照片的内容,其中内容格式‘发票号码’、'开票日期’、'‘出发时间’、‘始发站’、‘终点站’、‘车次’、‘票价’、‘身份证号’、‘姓名’、‘电子客票号’、‘购买方名称’、‘统一社会信用代码’字段返回信息,返回的结果信息以json格式返回
         selected: false
         title: 新版火车票-铁路电子客票
         type: llm
         variables: []
         vision:
           configs:
             detail: high
             variable_selector:
             - '1729851066338'
             - file
           enabled: true
       height: 126
       id: '17301924991430'
       position:
         x: 1209.0000000000002
         y: 783.9999999999998
       positionAbsolute:
         x: 1209.0000000000002
         y: 783.9999999999998
       selected: false
       sourcePosition: right
       targetPosition: left
       type: custom
       width: 244
     - data:
         context:
           enabled: true
           variable_selector:
           - '1729851066338'
           - file
         desc: 定额发票提取模型
         model:
           completion_params:
             temperature: 0.7
           mode: chat
           name: Qwen/Qwen2-VL-72B-Instruct
           provider: openai_api_compatible
         prompt_template:
         - id: fef27062-3a9f-4d92-8a59-0902e9c80e87
           role: system
           text: 请提取这张照片的内容,其中内容格式‘发票代码’、'发票号码’、'金额’字段返回信息,返回的结果信息以json格式返回
         selected: false
         title: 定额发票
         type: llm
         variables: []
         vision:
           configs:
             detail: high
             variable_selector:
             - '1729851066338'
             - file
           enabled: true
       height: 126
       id: '17301925812850'
       position:
         x: 1214.0000000000002
         y: 938.3364999044305
       positionAbsolute:
         x: 1214.0000000000002
         y: 938.3364999044305
       selected: false
       sourcePosition: right
       targetPosition: left
       type: custom
       width: 244
     - data:
         answer: 未识别出正确的发票信息,请重新输入
         desc: ''
         selected: false
         title: 直接回复 2
         type: answer
         variables: []
       height: 100
       id: '1730192759530'
       position:
         x: 812.5890019963585
         y: 783.9999999999998
       positionAbsolute:
         x: 812.5890019963585
         y: 783.9999999999998
       selected: false
       sourcePosition: right
       targetPosition: left
       type: custom
       width: 244
     - data:
         desc: ''
         output_type: string
         selected: false
         title: 变量聚合器
         type: variable-aggregator
         variables:
         - - '1730191979948'
           - text
         - - '17301921619230'
           - text
         - - '17301923168610'
           - text
         - - '17301924021390'
           - text
         - - '17301924991430'
           - text
         - - '17301925812850'
           - text
       height: 242
       id: '1730214844929'
       position:
         x: 1586.6429784410195
         y: 455.35189817802376
       positionAbsolute:
         x: 1586.6429784410195
         y: 455.35189817802376
       selected: false
       sourcePosition: right
       targetPosition: left
       type: custom
       width: 244
     - data:
         answer: '{{#1730214844929.output#}}

             {{#1729851066338.file#}}'
         desc: ''
         selected: false
         title: 直接回复 2
         type: answer
         variables: []
       height: 122
       id: '1730214939964'
       position:
         x: 1890.6429784410195
         y: 455.35189817802376
       positionAbsolute:
         x: 1890.6429784410195
         y: 455.35189817802376
       selected: true
       sourcePosition: right
       targetPosition: left
       type: custom
       width: 244
     viewport:
       x: -433.2981524469435
       y: -171.82156310876098
       zoom: 0.7578582832552

chatflow调试及发布

完成以上配置后就可以点击调试及发布了,当然如果你比较偷懒,也可以直接导入我的DSL 直接就可以搞定了。

dify案例分享-基于多模态模型的发票识别2-多种发票识别

dify案例分享-基于多模态模型的发票识别2-多种发票识别

 导入DSL后,是需要修改工作流中的模型就可以了,我这里推荐大家使用硅基流动的提供的Qwen/Qwen2-VL-72B-Instruct模型,这个模型目前在上海人工智能实验室推出的CompassRank评测多模态大模型中排名第一

dify案例分享-基于多模态模型的发票识别2-多种发票识别

如果大家没有硅基流动的账号,可以点击https://cloud.siliconflow.cn/i/e0f6GCrN地址来注册,目前硅基的政策是新户注册送14块钱,14块钱够玩一阵子了。

下面我们就感受一下测试效果

dify案例分享-基于多模态模型的发票识别2-多种发票识别

发布

点击工作流左上角发布按钮对外提供发布

dify案例分享-基于多模态模型的发票识别2-多种发票识别

我们将分享的地址发送给其他小伙伴

dify案例分享-基于多模态模型的发票识别2-多种发票识别

我们点击 start chat 就可以使用了。

dify案例分享-基于多模态模型的发票识别2-多种发票识别

总结

目前dify官方最新版本升级到0.10.1版本 开始支持文件上传,图片上传等功能了。另外硅基流动大概在2024年10月18日上线了阿里和书生的多模态模型。

RAG技术前沿技术新闻资讯

基于大模型的业务流程原子化编排技术在RPA中的应用

2025-5-11 20:39:17

前沿技术大模型技术新闻资讯

混合专家 (MoE) 架构:现代大模型的“秘密武器”

2025-5-11 20:59:15

0 条回复 A文章作者 M管理员
欢迎您,新朋友,感谢参与互动!
    暂无讨论,说说你的看法吧
购物车
优惠劵
搜索