news 2026/2/18 1:21:10

用Glyph做了个发票信息提取工具,准确率超预期

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用Glyph做了个发票信息提取工具,准确率超预期

用Glyph做了个发票信息提取工具,准确率超预期

1. 为什么发票识别一直是个“硬骨头”

你有没有试过把一张纸质发票拍下来,想快速提取金额、日期、销售方这些关键信息?结果要么OCR识别错别字,要么表格线一多就乱套,要么手写体直接放弃——最后还是得手动敲进系统。

这不是你操作的问题,而是传统OCR在发票场景里天然有短板:

  • 发票版式千差万别,专票、普票、电子票、手写备注栏,模型见一个懵一个;
  • 文字常和表格线、印章、水印挤在一起,纯文本模型“看不见”结构关系;
  • 关键字段(比如“价税合计”后面那个数字)需要跨区域理解,不是简单按行切分就能搞定。

直到我试了Glyph——智谱开源的视觉推理大模型。它不把发票当“文字流”处理,而是当成一张带语义结构的图像来读。部署完跑了个小测试:32张不同来源的发票(含模糊拍照、带红章、斜拍、部分遮挡),关键字段提取准确率直接拉到96.3%,比之前用的商用OCR高了近12个百分点。

更让我意外的是,它连“备注:本发票为补开”这种嵌在角落的小字、以及“¥ 5,860.00”中逗号和点号的组合都能稳定识别——不是靠规则硬匹配,是真“看懂”了。

下面我就从零开始,带你复现这个轻量级发票提取工具。全程不用写一行训练代码,重点讲清楚:Glyph怎么把一张图变成结构化数据,以及哪些细节决定了它能不能在你的发票上稳稳落地。

2. Glyph不是OCR,是“会看图的AI助手”

2.1 它到底在做什么?

先破除一个误区:Glyph不是升级版OCR。传统OCR的核心是“文字检测→文字识别→后处理”,而Glyph走的是另一条路:

把整张发票渲染成高分辨率图像 → 用视觉语言模型理解图像中的空间关系、语义角色、逻辑结构 → 直接输出结构化JSON

官方文档里那句“通过视觉-文本压缩扩展上下文长度”听起来很学术,拆解成大白话就是:

  • 它把长段文字(比如发票上的商品明细表)画成图,而不是切成token喂给语言模型;
  • 再用VLM(视觉语言模型)像人一样“扫一眼”整张图,定位“这里是一张表格”“左上角是销售方名称”“右下角数字带¥符号大概率是金额”。

这带来两个实际好处:
抗干扰强:印章盖在金额上?表格线断了?Glyph关注的是“这块区域整体像什么”,不是单个字符的像素;
理解逻辑:它能意识到“金额”字段和“税率”字段通常成对出现,即使发票模板没对齐,也能靠位置关系推断。

2.2 和普通多模态模型有什么区别?

你可能用过Qwen-VL、LLaVA这类图文模型,它们也能看图问答。但Glyph针对长文本密集型图像做了特殊优化:

能力维度普通VLM(如Qwen-VL)Glyph
输入处理把图像缩放到固定尺寸(如448×448),再抽特征将原始高分辨率发票保持比例渲染为图像,保留表格线细节
上下文建模依赖文本token序列,长文本易丢失细节把文字“画成图”,用视觉方式建模长距离关系(比如第一行商品名和最后一行金额的关联)
结构感知需要人工提示词强调“找表格”“看右下角”内置对票据类图像的先验知识,对“发票抬头”“税号位置”“金额区域”有更强敏感度

简单说:Qwen-VL是“带图的聊天机器人”,Glyph是“专攻票据的视觉专家”。

3. 三步搭建发票提取工具(实测可用)

整个过程在一台4090D单卡服务器上完成,无需GPU集群。所有操作都在终端执行,没有复杂配置。

3.1 环境准备:5分钟部署镜像

Glyph镜像已预装所有依赖,只需三步:

# 1. 启动镜像(假设已通过Docker或星图平台拉取) docker run -it --gpus all -p 7860:7860 -v /path/to/invoices:/root/invoices glyph-visual-reasoning:latest # 2. 进入容器后,运行启动脚本 cd /root && bash 界面推理.sh # 3. 浏览器打开 http://你的服务器IP:7860 # 在算力列表中点击'网页推理',进入交互界面

实测提示:如果遇到显存不足,可在界面推理.sh中将--max_new_tokens 2048改为1024,对发票提取完全够用。

3.2 核心提示词设计:让Glyph“精准答题”

Glyph的强项在于理解,但输出格式需要明确指令。我在测试中发现,以下提示词结构最稳定:

你是一个专业的财务票据识别助手。请严格按以下要求处理上传的发票图片: 1. 提取所有关键字段,包括:发票代码、发票号码、开票日期、销售方名称、销售方税号、购买方名称、购买方税号、金额、税率、税额、价税合计、收款人、复核、开票人; 2. 输出必须为标准JSON格式,键名使用英文小写(如"invoice_code"、"amount"),值为字符串; 3. 如果某字段在图中不可见,对应值填"NULL"; 4. 不要添加任何解释性文字,只返回纯JSON。 现在开始处理这张发票:

关键细节:

  • 必须强调“严格按要求”:Glyph对指令服从度高,模糊表述(如“尽量提取”)会导致它自由发挥;
  • 键名统一用英文小写:避免中文键名在后续程序解析时报错;
  • 明确“不可见填NULL”:否则它可能编造内容或留空字段。

3.3 批量处理脚本:从单张到百张发票

网页界面适合调试,但实际工作中要处理几十张发票。我写了个Python脚本调用Glyph的API(基于Gradio默认接口):

import requests import json import os from pathlib import Path def extract_invoice(image_path): """调用Glyph API提取发票信息""" url = "http://localhost:7860/api/predict/" # 构造请求数据 with open(image_path, "rb") as f: files = {"file": f} data = { "data": [ "你是一个专业的财务票据识别助手。请严格按以下要求处理上传的发票图片:\n1. 提取所有关键字段...(此处省略完整提示词,同3.2节)", None, None ] } response = requests.post(url, files=files, data={"data": json.dumps(data)}) try: result = response.json() # 解析Glyph返回的JSON字符串(注意:它返回的是包含JSON的字符串) json_str = result["data"][0].strip() return json.loads(json_str) except Exception as e: print(f"解析失败 {image_path}: {e}") return {"error": "JSON解析失败"} # 批量处理 invoice_dir = Path("/root/invoices") results = [] for img_file in invoice_dir.glob("*.jpg"): print(f"正在处理 {img_file.name}...") result = extract_invoice(img_file) result["filename"] = img_file.name results.append(result) # 保存结果 with open("/root/invoice_results.json", "w", encoding="utf-8") as f: json.dump(results, f, ensure_ascii=False, indent=2) print("全部处理完成!结果已保存至 /root/invoice_results.json")

实测效果:32张发票平均处理时间2.4秒/张(4090D),识别结果可直接导入Excel或财务系统。

4. 准确率为什么能超预期?三个实战细节

96.3%的准确率不是玄学,而是Glyph在三个关键环节的扎实表现。我把测试中的典型case整理出来,告诉你哪些地方最容易翻车,以及Glyph怎么化解:

4.1 模糊+倾斜发票:靠“全局构图”而非局部像素

问题发票:手机随手拍的发票,有运动模糊,且画面倾斜约15度。
传统OCR表现:文字检测框歪斜,金额数字被切到框外,识别出“58600”(漏掉小数点)。
Glyph表现

  • 先对整图做几何校正(内部自动完成),还原表格结构;
  • 定位“价税合计”文字块后,向右扫描同一水平线上的数字区域,结合¥符号、千分位逗号、小数点位置综合判断;
  • 输出"total_amount": "5,860.00"(完整保留格式)。

关键洞察:Glyph不依赖单个字符的清晰度,而是用空间关系锚定关键字段。只要“价税合计”四个字能认出,它就知道该往哪找数字。

4.2 印章覆盖关键信息:用“语义补全”替代强行识别

问题发票:红色发票专用章恰好盖在“销售方税号”一栏上,遮挡中间4位数字。
传统OCR表现:识别出“91110000MA000000X”,其中“0000”是猜的,实际应为“1234”。
Glyph表现

  • 检测到印章区域与税号字段重叠;
  • 根据上下文推断:“销售方名称”为“北京某某科技有限公司”,结合常见税号规则(前6位为地区码),返回"seller_tax_id": "91110000MA001234X (印章遮挡,根据公司名称推断)"
  • 同时在JSON中增加"confidence": 0.82字段(Glyph内置置信度评分)。

关键洞察:Glyph会主动告诉你“哪里不确定”,而不是盲目输出。这对财务场景至关重要——宁可标出风险,也不能给错误数据。

4.3 多栏商品明细表:理解“行列逻辑”而非简单分行

问题发票:商品明细占满整页,共5列(序号、名称、规格、单位、金额),32行。
传统OCR表现:按行切分后,金额列文字被拆到下一行,导致“1200.00”变成“1200”和“.00”两行。
Glyph表现

  • 先识别出表格线(即使虚线也有效),构建5×32的逻辑表格;
  • 对每行执行“字段对齐”:确保第4列内容一定是“单位”,第5列一定是“金额”;
  • 输出时按"items": [{"name": "服务器", "unit": "台", "amount": "1200.00"}, ...]结构化组织。

关键洞察:Glyph把发票当“视觉文档”处理,表格、段落、标题都是它的理解单元。这正是它超越纯OCR的核心能力。

5. 它不是万能的:当前局限与应对建议

Glyph很强,但作为新模型,仍有需注意的边界。我在测试中总结出三条铁律:

5.1 别让它“猜”手写字(尤其金额)

  • 现象:手写体“¥捌仟陆佰伍拾元整”识别正确率仅63%,远低于印刷体(98.7%);
  • 原因:Glyph训练数据以印刷体为主,对手写变体泛化不足;
  • 建议:对含手写内容的发票,先用传统OCR(如PaddleOCR)单独处理手写区域,再用Glyph处理印刷体部分,最后合并结果。

5.2 超小字号(<8pt)字段慎用

  • 现象:部分电子发票的备注栏字体为6pt,Glyph会将其识别为“乱码”或跳过;
  • 原因:渲染时像素不足,视觉特征丢失;
  • 建议:预处理阶段用OpenCV对发票做自适应锐化+2倍超分(仅针对小字区域),再送Glyph。

5.3 多页PDF发票需拆解

  • 现象:直接传PDF,Glyph只处理第一页;
  • 原因:当前镜像仅支持单图输入;
  • 建议:用pdf2image库将PDF转为JPG序列,逐页调用Glyph,再按页码合并JSON。关键字段(如发票代码)通常首尾页都有,可交叉验证。

我的实践结论:Glyph最适合标准化程度高、以印刷体为主的发票(占比超85%)。对极端case,用“Glyph主识别 + 规则引擎兜底”的混合方案,整体准确率仍可稳定在95%+。

6. 总结:发票自动化的新思路

回看这次实践,Glyph带来的不只是更高准确率,更是一种工作流的重构:

  • 过去:OCR识别 → 正则清洗 → 人工核对 → 导入系统(4步,耗时/张≈3分钟);
  • 现在:Glyph一键提取 → JSON直连数据库(2步,耗时/张≈2.4秒)。

它把“识别”这件事,从技术问题变成了产品问题——你不再纠结字符级精度,而是聚焦于:
🔹 如何设计提示词让模型理解业务逻辑;
🔹 如何用结构化输出对接下游系统;
🔹 如何建立置信度阈值,自动触发人工复核。

而这一切,不需要你懂模型训练,不需要标注数据,甚至不需要写复杂代码。就像当年Excel取代算盘一样,Glyph正在让票据处理从“手艺活”变成“配置活”。

如果你也在被发票、合同、报表这些文档淹没,不妨试试Glyph。它未必是终极答案,但绝对是目前最接近“开箱即用智能”的那一个。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/17 9:30:21

RS485测试通信稳定性:四种模式全面讲解

以下是对您提供的博文内容进行 深度润色与专业重构后的技术文章 。整体风格已全面转向 真实工程师口吻 :去AI化、强实践性、重逻辑流、有血有肉,同时严格遵循您提出的全部格式与表达要求(无模块化标题、无总结段、自然收尾、口语化但不失严谨、关键点加粗提示、代码注释…

作者头像 李华
网站建设 2026/2/7 23:23:05

一键部署Qwen-Image-Edit-2511,ComfyUI快速启动指南

一键部署Qwen-Image-Edit-2511&#xff0c;ComfyUI快速启动指南 你是不是也遇到过这样的情况&#xff1a;想用AI修一张产品图&#xff0c;换背景、调光影、改细节&#xff0c;结果打开网页版工具卡在加载页&#xff0c;本地装Stable Diffusion又得配ControlNetInpaintLoRA三套…

作者头像 李华
网站建设 2026/2/7 17:00:30

全面讲解Proteus元件对照表基础结构与命名规则

以下是对您提供的博文《全面解析Proteus元件对照表:基础结构、命名规则与工程应用实践》的 深度润色与重构版本 。本次优化严格遵循您的全部要求: ✅ 彻底去除AI腔调与模板化表达(如“本文将从……几个方面阐述”) ✅ 拒绝机械式章节标题,改用自然递进、逻辑闭环的叙述…

作者头像 李华
网站建设 2026/2/8 18:04:43

Ollama部署本地大模型高性能实践:ChatGLM3-6B-128K vLLM推理引擎集成

Ollama部署本地大模型高性能实践&#xff1a;ChatGLM3-6B-128K vLLM推理引擎集成 1. 为什么选择ChatGLM3-6B-128K作为本地主力模型 当你开始搭建自己的本地大模型服务时&#xff0c;第一个问题往往是&#xff1a;该选哪个模型&#xff1f;不是参数量越大越好&#xff0c;也不…

作者头像 李华
网站建设 2026/2/11 0:12:04

FPGA实现Gardner环定时同步:从理论到Verilog代码与Testbench验证

1. Gardner环定时同步基础原理 在数字通信系统中&#xff0c;定时同步是确保接收端正确采样发送端信号的关键技术。想象一下&#xff0c;你和朋友用对讲机通话&#xff0c;如果两人说话的节奏不同步&#xff0c;就会导致听不清或漏掉重要信息。Gardner环就是一种解决这种"…

作者头像 李华
网站建设 2026/2/7 13:57:28

Hunyuan-MT-7B开源大模型:Apache 2.0协议下中小企业商用指南

Hunyuan-MT-7B开源大模型&#xff1a;Apache 2.0协议下中小企业商用指南 你是不是也遇到过这些翻译难题&#xff1f; 外贸团队每天要处理几十封英文邮件&#xff0c;但人工翻译慢、成本高&#xff1b; 跨境电商上架多语种商品页&#xff0c;机器翻译生硬得客户看不懂&#xff…

作者头像 李华