news 2026/2/3 2:37:43

用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/1 21:16:44

Ollama镜像免配置|translategemma-27b-it支持CSV批量导入与翻译结果导出

Ollama镜像免配置&#xff5c;translategemma-27b-it支持CSV批量导入与翻译结果导出 你是不是也遇到过这些情况&#xff1a; 有一大堆产品说明书、用户反馈或客服对话要翻译&#xff0c;但每次只能粘贴一段文字&#xff0c;反复切换页面、复制粘贴&#xff0c;一上午就过去了…

作者头像 李华
网站建设 2026/2/1 6:30:54

数字孪生系统间数据同步机制:全面讲解与优化

以下是对您提供的博文《数字孪生系统间数据同步机制:全面讲解与优化》的 深度润色与专业重构版本 。本次优化严格遵循您的全部要求: ✅ 彻底去除AI痕迹,语言自然、老练、有“人味”,像一位在产线摸爬滚打十年的架构师在技术分享会上娓娓道来; ✅ 所有模块有机融合,摒…

作者头像 李华
网站建设 2026/2/2 3:54:06

verl版本验证方法:确认安装成功的3种方式

verl版本验证方法&#xff1a;确认安装成功的3种方式 在完成verl框架的安装后&#xff0c;很多开发者会面临一个看似简单却至关重要的问题&#xff1a;我到底装成功了吗&#xff1f; 不是所有报错都会立刻显现&#xff0c;也不是每次pip install -e .执行完就代表万事大吉。尤…

作者头像 李华
网站建设 2026/2/2 14:10:01

首次使用Keil遇中文乱码?超详细版解决方案

以下是对您提供的博文内容进行 深度润色与结构重构后的专业级技术文章 。整体遵循“去AI痕迹、强工程语感、重实操逻辑、自然节奏”的原则,彻底摒弃模板化标题与刻板论述方式,代之以一位资深嵌入式工程师在技术分享会上娓娓道来的口吻——既有底层原理的穿透力,也有踩坑复…

作者头像 李华
网站建设 2026/2/2 3:49:15

同或门与异或门对比解析:新手教程轻松掌握

以下是对您提供的博文《同或门与异或门对比解析:数字逻辑设计的基石性认知》进行 深度润色与专业重构后的版本 。本次优化严格遵循您的全部要求: ✅ 彻底去除AI痕迹,语言自然、老练、有“人味”——像一位在IC公司摸爬滚打十年的数字前端工程师,在茶水间给新人讲干货; …

作者头像 李华