2026-09-02 · 原文发布日
粘贴发票文本让 OpenAI 提取结构化字段
手动运行的 n8n 免费模板:把发票正文粘贴进文本字段,用严格 JSON 提示词调用 OpenAI Chat Completions 提取发票字段,自动剥离代码围栏、校验有效字段并把明细规范成数组;缺失字段返回 null 而不是猜测,日期统一为 YYYY-MM-DD,解析失败进入独立错误分支,方便接入表格或数据库。
原文要点
该模板为免费 n8n 工作流,手动触发后读取粘贴的发票纯文本,在 Set Extraction Prompt 节点内以纯文本维护提取 schema、规则与模型名,用 HTTP Header Auth 凭据调用 OpenAI Chat Completions;返回内容先剥离代码围栏再解析 JSON,校验是否含有效发票字段,明细规范为数组;缺失字段返回 null,日期统一 YYYY-MM-DD,金额为纯数字;解析失败进入带诊断信息的独立错误分支。要求 n8n 1.0+,作者称单张发票成本仅零点几分之一美分。
这次做成什么
在自己 n8n 里搭一条手动运行的工作流:粘贴发票正文,输出固定结构的 JSON,失败走独立错误分支,可直接写入表格。提示词、schema 与测试数据均为本站独立设计示例,未核对原模板内每个节点的精确界面参数,需以原模板为准。
准备什么
- n8n 1.0 或更高版本,自托管或 Cloud 均可
- 一个 OpenAI API 密钥,并在 n8n 里建为 HTTP Header Auth 类型凭据
- 一段用于测试的真实或虚构发票纯文本
- 不需要 Gmail、数据库或谷歌账号
具体怎么做
建手动触发与文本输入
新建工作流,放 Manual Trigger;其后接 Set 节点命名 Invoice Text,建字符串字段 invoiceText,把测试发票正文整段粘贴进去;上线后可将此字段改为从前置节点动态取值。
配置提取提示词节点
接 Set 节点命名 Set Extraction Prompt,建两个字段:model 填你要用的 OpenAI 模型名,prompt 粘贴下方材料里的完整提取提示词,并在提示词尾部拼接 {{$json.invoiceText}}。schema 要增删字段只改这里,不动后续节点。
配置 OpenAI 请求
加 HTTP Request 节点,POST 到 https://api.openai.com/v1/chat/completions,认证选前面建的 HTTP Header Auth 凭据;Body 用 JSON,model 取 {{$('Set Extraction Prompt').item.json.model}},messages 为单条 user 消息,内容为同节点的 prompt 字段。
解析与规范化
接 Code 节点:读取 choices[0].message.content,去掉行首尾的 ``` 围栏,JSON.parse 失败则返回 {ok:false,error:解析异常原文摘要};成功则检查 invoice_number、total 等关键字段是否至少一个非 null,把 line_items 强制转为数组,日期不正则置 null 并记入 warnings。
接分支与输出
接 IF 节点判断 ok 是否为 true:false 走 Error 分支输出诊断 JSON,true 走 Success 分支输出结构化发票,可继续接 Google Sheets 或数据库节点写入。
可直接复制的材料
发票字段提取提示词全文
本站独立编写的示例提示词,schema 可按需增删;{{$json.invoiceText}} 需与上游字段名一致。
你是发票信息提取器。请从下面的发票正文中提取字段,只输出一个 JSON 对象,不要输出任何解释或代码围栏。规则:1) 字段在文中不存在就填 null,绝不猜测;2) 日期一律输出 YYYY-MM-DD,无法确定填 null;3) 金额输出纯数字,不带货币符号与千分位;4) 明细放入 line_items 数组,每项含 description、quantity、unit_price、amount,没有明细给空数组;5) 顶层字段:invoice_number、invoice_date、vendor_name、buyer_name、currency、subtotal、tax、total、line_items。发票正文:
{{$json.invoiceText}}测试发票文本
本站虚构测试数据,非真实发票,可直接粘贴进 Invoice Text 字段。
ACME 办公用品有限公司
发票编号:INV-2026-0417
开票日期:2026年4月17日
购买方:杭州澄光设计工作室
项目:A4 复印纸 20 箱,单价 95.00,金额 1900.00;订书机 5 个,单价 32.00,金额 160.00
小计:2060.00 元
增值税(13%):267.80 元
合计:2327.80 元(人民币)输入与输出示例
本站虚构演示输出,数字与输入一一对应,未真实调用 OpenAI。
输入
把上方测试发票文本粘贴进 invoiceText 字段并手动运行,模型名设为示例 gpt-4o-mini。对应输出
{"ok":true,"invoice":{"invoice_number":"INV-2026-0417","invoice_date":"2026-04-17","vendor_name":"ACME 办公用品有限公司","buyer_name":"杭州澄光设计工作室","currency":"CNY","subtotal":2060.00,"tax":267.80,"total":2327.80,"line_items":[{"description":"A4 复印纸","quantity":20,"unit_price":95.00,"amount":1900.00},{"description":"订书机","quantity":5,"unit_price":32.00,"amount":160.00}]}}做完检查这些
- Success 分支输出的日期为 YYYY-MM-DD 格式,金额为无符号数字
- 删掉发票里的编号字段后重跑,invoice_number 为 null 而非编造值
- 把提示词节点里的模型字段改成另一模型名,无需改 HTTP 节点即可运行
- 故意把 OpenAI 返回改成非 JSON 文本时,流程进入 Error 分支并含诊断信息
容易卡住的地方
- OpenAI 偶尔会包 ```json 围栏,剥离逻辑必须放在 JSON.parse 之前
- 金额若带千分位或货币符号直接入库会失败,需在 Code 节点再清洗一次
- 发票为扫描图片时本流程不适用,需要先做 OCR 再粘文本
- API 密钥泄露风险:只用 n8n 凭据存储,不要把 key 写进节点参数
本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。
- 原文标题
- Extract structured invoice data from text with OpenAI
- 原作者
- Laurence NIcolaou
- 原始发布日期
- 2026-09-02T07:57:57.874Z
- 来源
- https://n8n.io/workflows/19052