AI PLAY玩法更新持续收录
← 回到更新流

2026-10-15 · 原文发布日

自建OCR接口提取发票字段的n8n表单流程

一个n8n免费模板:通过n8n表单上传发票图片,转成base64后发给DGX Spark上自托管的LiteLLM兼容接口,先用OCR模型转出文字,再用Qwen3.6模型把供应商、发票号、日期、总额、币种提取成JSON,最后在表单完成页展示结果。适合已有DGX Spark或兼容推理服务、想自托管发票识别的人。

原文要点

原模板发布在n8n模板库(编号21011),免费导入。流程为:n8n表单上传单页发票图片(PNG/JPG)→转base64→POST到DGX Spark上自托管LiteLLM的/v1/chat/completions端点,先用名为ocr的模型把图片转成文字,再用名为qwen3.6的模型从文字提取供应商、发票号、日期、总额、币种为JSON,最后在表单完成页展示。配置要点是建一个指向LiteLLM(形如http://主机:4000)的OpenAI兼容凭据,替换两处请求URL中的主机占位,并确认服务端暴露ocr与qwen3.6这两个模型名,名称不同需自行调整。

这次做成什么

按该免费模板在本站练习环境中跑通'表单传发票→两段式模型调用→表单页显示提取JSON'的完整链路,并学会把模型名、端点地址替换为自己推理服务的实际值。本站不提供模板文件,需在原页面导入。

准备什么

  • 一个n8n实例,且其表单Trigger可以生成可访问的表单URL
  • 一台已运行LiteLLM代理的服务(原作者用DGX Spark),/v1/chat/completions可从n8n所在网络访问
  • LiteLLM中已注册一个视觉OCR模型(模板内名为ocr)和一个文本提取模型(模板内名为qwen3.6)
  • 几张不含真实个人信息的练习发票图片(PNG或JPG,单页)

具体怎么做

  1. 导入模板并观察节点结构

    在n8n.io/workflows/21011点Use workflow导入。流程依次是:n8n Form Trigger(含文件上传字段)→把上传文件转base64的节点→第一个HTTP Request(调ocr模型做图片转文字)→第二个HTTP Request(调qwen3.6做字段提取)→解析JSON→Form Ending在完成页展示结果。先不改任何东西,通读每个节点的参数。

  2. 创建指向LiteLLM的OpenAI兼容凭据

    在n8n凭据中新建OpenAI类型凭据:Base URL填你的LiteLLM地址(如http://192.168.1.50:4000,仅示例,换成你的主机),API Key填LiteLLM的master key或虚拟key。回到两个HTTP Request节点,分别把这个凭据选上。

  3. 替换请求URL与模型名

    在两个HTTP Request节点中,把URL里的主机占位改成你的LiteLLM主机/IP,保持路径为/v1/chat/completions;把请求体里model字段的ocr和qwen3.6改成你LiteLLM config里实际注册的model_name。若你的服务恰好用同名模型则无需改。

  4. 激活并获取表单URL

    保存后激活工作流(或点Execute workflow进入监听),打开Form Trigger节点显示的表单URL。确认页面只有一个文件上传控件,接受PNG/JPG。

  5. 上传练习发票并核对两段输出

    上传一张练习发票。第一段应返回整段发票文字,第二段应返回含supplier、invoice_number、invoice_date、total、currency的JSON,完成页逐项展示这五个字段。若第一段就失败,先查LiteLLM日志确认ocr模型能否处理图片输入;若第二段JSON解析失败,检查qwen3.6是否输出了多余解释文字。

  6. 记录字段映射到完成页

    对照解析节点的表达式,确认完成页每行展示的字段名与JSON键一一对应(supplier→供应商、invoice_number→发票号、invoice_date→日期、total→总额、currency→币种),方便日后改成中文标签。

可直接复制的材料

字段提取提示词(本站独立编写)

本站按模板五字段独立撰写的中文提示词,放入第二个HTTP Request的消息体;{{ $json.ocr_text }}需替换为引用上一节点OCR文字的实际表达式。

你是一名发票字段提取器。根据下面的发票OCR文字,只输出一个JSON对象,不要输出任何其他文字、解释或代码块标记。字段如下:
- supplier:开票方/供应商名称(字符串,识别不出填null)
- invoice_number:发票号码(字符串,识别不出填null)
- invoice_date:开票日期,格式YYYY-MM-DD(识别不出填null)
- total:价税合计总金额(数字,不含货币符号,识别不出填null)
- currency:币种三字母代码,如CNY、USD、EUR(识别不出填null)
发票OCR文字如下:
{{ $json.ocr_text }}

调用LiteLLM提取阶段的请求体示例

本站独立编写的练习请求体,model名需换成你LiteLLM实际注册的名称;仅示意第二个HTTP Request的body结构,非原模板原文件。

{
  "model": "qwen3.6",
  "messages": [
    {
      "role": "system",
      "content": "你只输出JSON对象,不输出其他文字。"
    },
    {
      "role": "user",
      "content": "从以下发票文字提取supplier、invoice_number、invoice_date、total、currency五个字段为JSON:\n蓝天办公用品有限公司\n发票号码:INV-2026-0457\n开票日期:2026年10月8日\n价税合计:¥1,280.00(人民币)"
    }
  ],
  "temperature": 0
}

练习用发票文字样例

本站虚构的OCR输出文字,用于在没有真实发票时直接喂给第二段提取模型做单元练习。

蓝天办公用品有限公司
发票号码:INV-2026-0457
开票日期:2026年10月8日
项目:A4复印纸10箱 单价110.00 金额1100.00
税额:180.00
价税合计:¥1,280.00(人民币)
收款方式:对公转账

输入与输出示例

本站虚构演示输入与预期输出,未实际运行工作流,数字为本站设定。

输入

表单上传一张虚构练习发票图片(蓝天办公用品有限公司,发票号INV-2026-0457,2026-10-08开票,价税合计1280.00元人民币)

对应输出

第一段ocr模型返回发票全文文字;第二段qwen3.6返回{"supplier":"蓝天办公用品有限公司","invoice_number":"INV-2026-0457","invoice_date":"2026-10-08","total":1280.00,"currency":"CNY"};表单完成页逐行显示:供应商=蓝天办公用品有限公司、发票号=INV-2026-0457、日期=2026-10-08、总额=1280.00、币种=CNY。

做完检查这些

  • 表单URL能打开且只允许上传单个PNG/JPG文件
  • 第一个HTTP Request返回200且响应中含非空发票文字
  • 第二个HTTP Request返回的内容能被解析节点解析为含五个键的JSON对象
  • 完成页展示的五个字段与上传发票内容一致,无缺字段或undefined
  • 把练习图片换成内容不同的发票后,输出字段随之变化而非固定值

容易卡住的地方

  • OpenAI兼容凭据的Base URL必须填到LiteLLM根地址,路径/v1/chat/completions由请求节点拼接,两处都填会404
  • 模板中的ocr和qwen3.6只是LiteLLM里的model_name标识,你的部署若用别的名字必须同步改请求体model字段
  • 自托管视觉模型对图片大小有限制,超大图片可能导致OCR段超时或OOM,练习图建议控制在几MB内
  • 表单Trigger在生产模式与测试模式的URL不同,对外分享前确认用的是生产URL
  • 模型可能输出带代码块标记的JSON,解析节点若报语法错误,需要在提示词中强调纯JSON或加清洗表达式

原文与作者资料 ↗

本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。

原文标题
Extract invoice details from images with DGX Spark OCR and Qwen3.6
原作者
Jamie Madden
原始发布日期
2026-10-15T14:34:22.517Z
来源
https://n8n.io/workflows/21011