本期文章我们在原有的单张发票识别基础上实现多种发票识别的dify基于工作流的智能体。
下面我们首先介绍一下整体功能。
这里面主要功能:用户上传一个发票图片(目前我们这工作流支持6种发票),发票会经过文档提取器。文档提取器提取用户上传的发票传递给llm多模态模型,这个模型的作用是判断这发票是哪个类型的发票,接下来我们会根据条件分支来判断走哪个多模态发票提取的llm大语言模型。其中这6个大语言模型区别就在于他们的系统提示词不一样,主要就是每个发票票面信息不一样。模型会根据不同发票票面信息提示词的不同而有所区别,模型返回的json格式的发票信息在发送给变量聚合器进行出来,处理完成后再发送给用户,整体的功能大概就是这样的。
实现的效果如下:
1 火车票票面识别
2.加油站卷式发票
下面我们重点介绍一下这个工作流是如何实现的。
创建工作流或者chatflow
接着来到Dify中按下图顺序依次点击并点击创建(注:chatflow和工作流配置基本差不多,下面我们就以chatflow讲解)
开始
开始节点点开后我们需要添加一个文件上传输入参数。点击开始节点输入字段,点击右边的“+”
我们选择单个文件,输入变量名称、支持的文件类型我们这里就选择图片。其他都可以默认,输入完成后,点击保存按钮
以上步骤完成开始节点设置。
文档提取器
接下来我们在工作流画布中,选择文档提取器和开始节点连接,去掉llm和开始节点连接
我们在文档提取器,输入变量中选中 sys.files
变量
llm(发票识别判断模型)
接下来我们将文档提取器的连接线和llm大语言模型连接。然后按照以下几个步骤设置
1.模型选择,模型我们在模型下拉列表中选择自定义OpenAI-API-compatible Qwen/Qwen2-VL-72B-Instruct模型;模型最大标记4096
2.上下文,这里设置开始节点file 属性值
3.SYSTEM 提示词 我们输入如下内容
\# 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模型的设置
这个模型的作用是区分判断用户上传的发票是哪个类型,通过多模态模型区分后返回对应的发票种类,我这里设定以下几个类型
0 、增值税专用发票普通发票
1、电子发票(全电发票)
2、增值税普通发票-卷票
3、火车票
4、新版火车票-铁路电子客票 (2024年11月1日 国家全面推广 铁路电子客票作为抵扣报销使用)
5、定额发票
100、无法判断的发票
条件分支
这里我们需要接受上一个llm模型输出的返回值(0、1、2、3、4、5、100),由这个判断条件分支来让流程节点选择下面哪一个发票提取llm多模态大模型
它的设置也比较简单就是 if else , 判断条件这里我们 都选择"包含",详细配置可以看我的这个截图
流程节点图如下
这里稍微提一下,因为最后发票无法识别,所以我们之间给它做一个直接回复的节点,节点里面填写“未识别出正确的发票信息,请重新输入”
发票识别llm多模态模型
上一个条件分支节点连接到这个llm多模态模型中,因为这个需要具体提取发票票面信息的,所以我们这里需要6个多模态模型。每个流程节点配置都是一样的,只是系统提示词有区别,我这里就以一个增值税专用发票普通发票LLM为例给大家介绍
1.模型选择,模型我们在模型下拉列表中选择自定义OpenAI-API-compatible Qwen/Qwen2-VL-72B-Instruct模型;模型最大标记4096
2.上下文,这里设置开始节点file 属性值
3.SYSTEM 提示词 我们输入如下内容
请提取这张照片的内容,其中内容格式‘机器编号’、‘发票代码’、‘发票号码’、‘开票日期’、‘校 验 码’、‘购买方名称’、‘购买方纳税人识别号’、‘购买方地 址、电 话’、‘开户行及账号’、‘货物或应税劳务、服务名称’、‘规格型号’、‘单 位’、‘数 量’、‘单 价’、‘金 额’、‘税率’、‘税 额’、‘价税合计(大写)’、‘价税合计(小写)’、‘销售方名称’、‘销售方纳税人识别号’、‘销售方地 址、电 话’、‘销售方地 址、电 话’、‘开户行及账号’、‘备注’、‘收款人’、‘复核’、‘开票人’ 字段返回信息,返回的结果信息以json格式返回
4.视觉 点击右边按钮开启多模态
5 视觉输入变量 选择节点filefiles
变量
以上完成llm模型的设置
其他的提示词我这里也给大家贴一下
电子发票(全电发票)
请提取这张照片的内容,其中内容格式‘发票号码’、‘开票日期’、‘购买方信息名称’、‘购买方统一社会信用代码/纳税人识别号’、‘销售方信息名称’、‘销售方统一社会信用代码/纳税人识别号’、‘项目名称’、‘规格型号’、‘单 位’、‘数 量’、‘单 价’、‘金 额’、‘税率/征收率’、‘税 额’、‘合计’、‘价税合计(大写)’、‘价税合计(小写)’、‘备 注’ 字段返回信息,返回的结果信息以json格式返回
增值税普通发票-卷票
请提取这张照片的内容,其中内容格式‘发票代码’、'发票号码’、'机打号码’、‘机器编号’、‘销售方名称’、‘纳税人识别号’、‘开票日期’、‘收款员’、‘购买方名称’、‘纳税人识别号’、‘项目’、‘单价’、‘数量’、‘金额’、‘合计金额(小写)’、‘合计金额(大写)’、‘校验码’字段返回信息,返回的结果信息以json格式返回
火车票
请提取这张照片的内容,其中内容格式‘始发站’、‘终点站’、‘车次’、‘出发时间’、‘票价’、‘身份证号’、‘姓名’字段返回信息,返回的结果信息以json格式返回
新版火车票-铁路电子客票
请提取这张照片的内容,其中内容格式‘发票号码’、'开票日期’、'‘出发时间’、‘始发站’、‘终点站’、‘车次’、‘票价’、‘身份证号’、‘姓名’、‘电子客票号’、‘购买方名称’、‘统一社会信用代码’字段返回信息,返回的结果信息以json格式返回
定额发票
请提取这张照片的内容,其中内容格式‘发票代码’、'发票号码’、'金额’字段返回信息,返回的结果信息以json格式返回
如果需要在增加发票识别 可以根据上面操作步骤新增一个多模态识别模型以及编写 新的提示词即可。
变量聚合器
这个变量聚合器是干啥的呢?大家发现没有6个多模态发票识别的输出结构其实是一样的,只是它的内容有所区别。因为后面我们是需要输出给用户的,所以这里我们就用变量聚合器把llm大语言模型提取发票的结果统一输出到一个变量聚合器里面。它的配置也很简单接受上一个流程输出结果即可
如果没有变量聚合器就会变成我之前配置的那个流程了,给大家看一下我之前的那个流程吧。
直接回复
接下来我们将变量聚合器连接到直接回复的输出节点。
这个地方设置比较简单,在回复设置一下llm text文本输出以及 开始节点file 输出,这样设置后。就会将发票提取的票面信息以json格式的文本信息返回,并将上传的发票图片信息一并返回给用户
通过以上方式我们就初步完成了整个chatflow工作流。
完整的dsl也发给大家把
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 直接就可以搞定了。
导入DSL后,是需要修改工作流中的模型就可以了,我这里推荐大家使用硅基流动的提供的Qwen/Qwen2-VL-72B-Instruct模型,这个模型目前在上海人工智能实验室推出的CompassRank评测多模态大模型中排名第一
如果大家没有硅基流动的账号,可以点击https://cloud.siliconflow.cn/i/e0f6GCrN 地址来注册,目前硅基的政策是新户注册送14块钱,14块钱够玩一阵子了。
下面我们就感受一下测试效果
发布
点击工作流左上角发布按钮对外提供发布
我们将分享的地址发送给其他小伙伴
我们点击 start chat 就可以使用了。
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。