答案是:需本地部署Ollama与Dify,用qwen2.5vl:7b视觉模型解析发票图像,提取类型、税号、日期、金额、税额及服务类别,再按票种分支校验税率合规性并输出结构化结果。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

你需要让AI自动识别发票类型、提取税号与开票日期、判断适用增值税率、校验税率合规性,并输出带计算逻辑的结构化结果——整个流程必须本地运行、不传数据、不调云端API,且能应对专票/普票/数电票等多版式。
准备本地模型与Dify运行环境
在终端执行 ollama run qwen2.5vl:7b 确认视觉模型已加载;若未安装,先运行 curl -fsSL https://ollama.com/install.sh | sh 安装Ollama,再拉取模型。
下载Dify官方Docker Compose包(v1.10.3+),解压后修改 .env 文件中 MODEL_PROVIDER=ollama 和 OLLAMA_BASE_URL=http://host.docker.internal:11434 ——这一步【必须用 host.docker.internal 而非 localhost】,否则容器内无法访问宿主机Ollama服务。
执行 docker compose up -d 启动Dify,等待约90秒,浏览器访问 http://localhost:3000 完成初始化设置。
构建发票图像理解节点
进入Dify工作流编辑器,添加第一个节点:选择「LLM」类型,模型选 qwen2.5vl:7b,关闭流式响应。
在Prompt输入框中粘贴以下指令:
你是一个税务专用OCR解析器。仅输出JSON,字段固定为:invoice_type(值为“专票”“普票”“数电票”之一)、tax_id(15/17/20位纯数字或字母组合)、issue_date(YYYY-MM-DD格式)、amount(含税总额,数字)、tax_amount(税额,数字)。不解释、不补全、不猜测缺失字段,缺失则设为null。对图片中所有文字做逐字识别,重点比对“增值税专用发票”“普通发票”“全面数字化的电子发票”字样及税号位置。
注意:该节点输入变量名必须设为 image_file,否则后续文件上传路径会断连。
设计税率决策分支逻辑
从上一节点拖出连线,添加「条件分支」节点。
配置规则如下:
① 当 invoice_type == "专票" → 进入「专票税率分支」
AI编程系统协调器。触发词:开发、实现、创建、添加、修复、报错、重构、优化、review、评审、继续、为什么、记住、保存经验、复盘、分析、学习、参考、模仿、/evolve
② 当 invoice_type == "数电票" → 进入「数电票税率分支」
③ 其余情况 → 进入「普票默认分支」
这三路必须全部显式定义,不能留“否则”兜底——Dify条件分支不支持隐式 fallback,漏写会导致工作流中断无报错。
编写税率校验与计算代码节点
在「专票税率分支」下游添加「代码」节点,语言选 Python 3.11,输入变量设为 parsed(即前序JSON输出)。
粘贴以下代码:
import json
data = json.loads(inputs["parsed"])
rate_map = {"货物": 0.13, "不动产": 0.09, "生活服务": 0.06, "小规模纳税人": 0.01}
rate = rate_map.get(data.get("service_category", "货物"), 0.13)
if data["tax_amount"] is not None and data["amount"] is not None:
calculated_tax = round(data["amount"] / (1 + rate) * rate, 2)
is_compliant = abs(calculated_tax - data["tax_amount"]) < 0.01
else:
is_compliant = None
outputs["rate"] = rate
outputs["calculated_tax"] = calculated_tax if "calculated_tax" in locals() else None
outputs["is_compliant"] = is_compliant
这段代码【依赖 service_category 字段,但前序视觉节点未提取】,需回到图像理解节点Prompt末尾追加:“额外识别并输出 service_category 字段,依据发票品名栏关键词匹配:含‘不动产’‘建筑’填‘不动产’,含‘餐饮’‘住宿’填‘生活服务’,其余默认‘货物’。”
配置最终输出结构与校验报告
将所有分支汇聚到一个「参数提取」节点,勾选「合并所有上游变量」。
在输出模板中填写:
{
"invoice_id": "{{inputs.image_file.name}}",
"extracted": {{inputs.parsed}},
"compliance_check": {
"applied_rate": {{outputs.rate}},
"calculated_tax": {{outputs.calculated_tax}},
"is_compliant": {{outputs.is_compliant}}
}
}
保存工作流,点击右上角「调试」,上传一张增值税专用发票图片,确认返回JSON中包含 compliance_check.is_compliant 字段且值为 true 或 false。

















