☰
PaddleNLP UIE-X 文档信息抽取实战指南:基于 Taskflow 实现零标注的通用文档级信息抽取
2026/9/25 5:54:47 网站建设 项目流程
  • 人工智能
  • 大模型
  • 预训练
  • 微调
  • LoRA
  • RLHF
  • 强化学习
  • 分布式训练

【免费下载链接】PaddleNLP

Easy-to-use and powerful LLM and SLM library with awesome model zoo.

项目地址:https://gitcode.com/gh_mirrors/pa/PaddleNLP
点击查看免费下载

导读

本文围绕 PaddleNLP 提供的 UIE Taskflow 文档信息抽取能力展开,讲解如何在不训练、不标注的前提下,通过自然语言定义抽取目标(schema),对报关单、证件、表格、送货单等图片与 PDF 文档完成实体抽取、关系抽取与多任务抽取。读完本文,你将掌握 UIE-X 文档抽取的完整调用方式、输入格式约定、PP-Structure 版面分析技巧、结果可视化方法,以及schema、ocr_lang、precision等核心参数的取值与底层原理。

1. 功能简介:一条 Taskflow 打通文本与文档的通用信息抽取

PaddleNLP 的paddlenlp.Taskflow提供文本及文档的通用信息抽取、评价观点抽取等能力,可抽取多种类型的信息,包括但不限于:

  • 命名实体识别(NER):人名、地名、机构名等;
  • 关系抽取:如电影的导演、歌曲的发行时间等;
  • 事件抽取:如某路口发生车祸、某地发生地震等;
  • 评价维度、观点词、情感倾向等信息。

其核心特色在于开放域(open-domain)与零训练:用户只需用自然语言自定义抽取目标(schema),即可统一抽取输入文本或文档中的对应信息,实现开箱即用。相关的完整应用总览可参考 信息抽取应用说明,其中涵盖模型选型、性能对比、标注—训练—部署全流程等更多内容。

对于纯文本场景的信息抽取(uie-base等模型的用法),可参考 文本信息抽取 Taskflow 指南;本文聚焦其中的文档抽取分支,即基于 UIE-X 模型的图片、表格与 PDF 信息抽取。

2. 文档信息抽取:实体、关系与多任务场景

文档信息抽取(Document Information Extraction)以图片或 PDF 为输入,底层由 OCR 解析版面文字后交给 UIE-X 模型完成结构化抽取。示例图片(报关单、证件、表格等)可自行准备,代码示例中统一使用./cases/目录下的样例文件。

2.1 实体抽取(Named Entity Recognition, NER)

实体抽取是指识别文本中具有特定意义的实体。在开放域信息抽取中,抽取类别没有限制,用户可以完全自定义 schema。下面以报关单为例,一次性抽取"收发货人、进口口岸、进口日期、运输方式、征免性质、境内目的地、运输工具名称、包装种类、件数、合同协议号"共 10 类实体:

>>> from pprint import pprint >>> from paddlenlp import Taskflow >>> schema = ["收发货人", "进口口岸", "进口日期", "运输方式", "征免性质", "境内目的地", "运输工具名称", "包装种类", "件数", "合同协议号"] >>> ie = Taskflow("information_extraction", schema=schema, model="uie-x-base") >>> pprint(ie({"doc": "./cases/custom.jpeg"})) [{'件数': [{'bbox': [[826, 1062, 926, 1121]], 'end': 312, 'probability': 0.9832498761402597, 'start': 308, 'text': '1142'}], '包装种类': [{'bbox': [[1214, 1066, 1310, 1121]], 'end': 314, 'probability': 0.9995648138860567, 'start': 312, 'text': '纸箱'}], '合同协议号': [{'bbox': [[151, 1077, 258, 1117]], 'end': 319, 'probability': 0.9984179437542124, 'start': 314, 'text': '33035'}], '境内目的地': [{'bbox': [[1966, 872, 2095, 923]], 'end': 275, 'probability': 0.9975541483111243, 'start': 272, 'text': '上海市'}], '征免性质': [{'bbox': [[1583, 770, 1756, 821]], 'end': 242, 'probability': 0.9950633161231508, 'start': 238, 'text': '一般征税'}], '收发货人': [{'bbox': [[321, 533, 841, 580]], 'end': 95, 'probability': 0.4772132061042136, 'start': 82, 'text': '上海新尚实国际贸易有限公司'}, {'bbox': [[306, 584, 516, 624]], 'end': 150, 'probability': 0.33807074572195006, 'start': 140, 'text': '31222609K9'}], '运输工具名称': [{'bbox': [[1306, 672, 1516, 712], [1549, 668, 1645, 712]], 'end': 190, 'probability': 0.6692050414718089, 'start': 174, 'text': 'E. R. TIANAN004E'}], '运输方式': [{'bbox': [[1070, 664, 1240, 715]], 'end': 174, 'probability': 0.9994416347044179, 'start': 170, 'text': '永路运输'}], '进口口岸': [{'bbox': [[1070, 566, 1346, 617]], 'end': 120, 'probability': 0.9945697196994345, 'start': 111, 'text': '洋山港区-2248'}], '进口日期': [{'bbox': [[1726, 569, 1933, 610]], 'end': 130, 'probability': 0.9804819494073627, 'start': 120, 'text': '2017-02-24'}]}]

从返回结果可以看到,文档抽取的每个实体结果除text(实体文本)、start/end(字符偏移区间)与probability(置信度)外,还额外带有bbox坐标框(形如[x1, y1, x2, y2]的像素坐标),用于定位实体在原始文档图片中的位置。这一字段由后处理阶段根据 OCR 版面信息与实体字符区间计算得出,对应实现见 information_extraction.py 中的_add_bbox_info。需要注意的是,收发货人这类实体在文档中可能出现多个结果(公司名 + 编号),返回结构会自动组织为列表。

证件类文档同样适用,例如对驾照进行英文抽取时,需要同时指定 OCR 语言与 schema 语言为英文:

>>> from pprint import pprint >>> from paddlenlp import Taskflow >>> schema = ["Name", "Date of birth", "Issue date"] >>> ie = Taskflow("information_extraction", schema=schema, model="uie-x-base", ocr_lang="en", schema_lang="en") >>> pprint(ie({"doc": "./cases/license.jpeg"}))

2.2 关系抽取(Relation Extraction, RE)

关系抽取是指从文本中识别实体并抽取实体之间的语义关系,进而获取三元组信息,即<主体,谓语,客体>。在 Taskflow 中,关系抽取通过schema 嵌套结构定义:外层键为"主体"实体类别,其值为该主体需要抽取的"客体/关系"实体类别列表。

下面以表格为例,抽取每个"姓名"对应的"招聘单位"与"报考岗位":

>>> from pprint import pprint >>> from paddlenlp import Taskflow >>> schema = {"姓名": ["招聘单位", "报考岗位"]} >>> ie = Taskflow("information_extraction", schema=schema, model="uie-x-base") >>> pprint(ie({"doc": "./cases/table.png"}))

此时返回结果中,每个"姓名"实体下会附带relations字段,组织为{"招聘单位": [...], "报考岗位": [...]}结构。

2.3 跨任务使用:实体 + 关系多任务抽取

当需要同时对文档进行实体抽取与关系抽取时,可以将 schema 构造为"列表 + 嵌套字典"混合的形式。以下是对送货单同时抽取单据级实体(Total GBP、No.、Date、Customer No.、Subtotal without VAT)以及 Description 下的子实体(Quantity、Amount)的 schema 结构:

schema = [ "Total GBP", "No.", "Date", "Customer No.", "Subtotal without VAT", { "Description": [ "Quantity", "Amount" ] } ]

对应代码:

>>> from pprint import pprint >>> from paddlenlp import Taskflow >>> schema = ["Total GBP", "No.", "Date", "Customer No.", "Subtotal without VAT", {"Description": ["Quantity", "Amount"]}] >>> ie = Taskflow("information_extraction", schema=schema, model="uie-x-base", ocr_lang="en", schema_lang="en") >>> pprint(ie({"doc": "./cases/delivery_note.png"}))

从源码层面看,这种多级 schema 会被递归构造成一棵SchemaTree(见 information_extraction.py 中的_build_tree):字符串元素作为叶子节点,字典元素递归展开为父子关系。预测时_multi_stage_predict会先抽取父级实体,再以"父实体文本 + 的"作为 prompt 前缀逐级抽取子级关系,实现多阶段(multi-stage)级联预测,最终把各级结果通过relations嵌套组织。

2.4 输入说明:图片路径、HTTP 链接、base64 与自定义 OCR

文档抽取(UIE-X)支持多种输入形式:

  • 图片路径:本地文件路径;
  • HTTP 图片链接:直接传入 URL;
  • base64 输入:图片内容的 base64 编码;
  • 文档格式:支持图片(jpg/png 等)与 PDF 两种格式。

在输入字典中,text表示文本输入,doc表示文档输入。可同时传入多条输入组成的列表:

[ {'text': '2月8日上午北京冬奥会自由式滑雪女子大跳台决赛中中国选手谷爱凌以188.25分获得金牌!'}, {'doc': './cases/custom.jpg'}, {'doc': 'https://user-images.githubusercontent.com/40840292/203457719-84a70241-607e-4bb1-ab4c-3d9beee9e254.jpeg'} ]

注意(NOTE):多页 PDF 输入目前只抽取第一页的结果;UIE-X 更适合单证文档(如票据、单据等)的信息提取,目前还不适合过长或多页的文档。这一限制在底层解析器中有明确体现:DocParser.read_pdf只加载第一页,并在日志中给出警告(见 doc_parser.py 的read_pdf)。

使用自定义 OCR / layout 作为输入

如果你有自己的 OCR 引擎,可以不依赖内置 PaddleOCR,而是直接把版面结果以layout字段传入。layout是(bbox, text)二元组列表,bbox为[x1, y1, x2, y2]坐标:

layout = [ ([68.0, 12.0, 167.0, 70.0], '名次'), ([464.0, 13.0, 559.0, 67.0], '球员'), ([833.0, 15.0, 1054.0, 64.0], '总出场时间'), ...... ] ie({"doc": doc_path, 'layout': layout})

传入layout时,底层会跳过内置 OCR 的版面解析(do_ocr=False),仅复用外部提供的坐标与文本完成后续编码与抽取,参见 information_extraction.py 的_check_input_text。同时需要说明,UIE-X 的模型输入还会包含按字符对齐的bbox序列以及整页图片(其输入规格input_spec包含bbox与image两个专有张量,见 information_extraction.py 的_construct_input_spec),因此在自定义 layout 场景下,底层依然需要读取图片本身。

2.5 使用技巧:PP-Structure 版面分析与动态切换 schema

使用 PP-Structure 版面分析功能

OCR 识别出来的文字默认会按照左上到右下进行排序。对于分栏、表格内有多行文本等版面复杂的情况,这种简单排序可能打乱阅读顺序、影响抽取效果。此时推荐开启版面分析功能layout_analysis=True,借助 PP-Structure 的版面分析能力(识别段落、标题、表格等区域类型)来优化文字排序、增强抽取效果:

>>> from pprint import pprint >>> from paddlenlp import Taskflow >>> schema = "中标候选人名称" >>> ie = Taskflow("information_extraction", schema=schema, model="uie-x-base", layout_analysis=True) >>> pprint(ie({"doc": "https://gimg2.baidu.com/image_search/..."}))

开启后,底层不再调用普通PaddleOCR,而是初始化PPStructure(table=True, ocr=True, lang=self.ocr_lang)作为版面分析引擎:非表格区域按区域类型(text、title 等)组织文本,表格区域则会解析出单元格级(bbox, text),从而保持表格的语义结构,详见 doc_parser.py 的ocr与init_ocr_inference。值得强调的是:该示例仅用于说明版面分析功能的使用场景,实际生产环境一般仍需结合具体单据进行标注与微调,才能达到理想效果。

动态切换抽取目标:set_schema

同一文档可能需要抽取不同维度的信息。Taskflow 提供set_schema方法,可以在不重新初始化模型的情况下动态更换抽取目标。例如先抽取"中标候选人名称",再切换到抽取医疗文档中的"抗血小板药物的用药指征":

>>> schema = "抗血小板药物的用药指征" >>> ie.set_schema(schema) >>> pprint(ie({"doc": "./cases/drug.webp"}))

set_schema会重建 schema 树(内部调用_build_tree),因此切换后下一次调用即按新目标抽取,无需重新加载模型权重,适合在同一任务流程中灵活切换抽取维度的场景。

2.6 结果可视化:OCR 结果与抽取结果一键出图

Taskflow 提供两种可视化能力,均通过paddlenlp.utils.doc_parser.DocParser实现(源码见 doc_parser.py),可以将版面框与抽取结果直接绘制到原图上。

OCR 识别结果可视化
>>> from paddlenlp.utils.doc_parser import DocParser >>> doc_parser = DocParser(ocr_lang="en") >>> doc_path = "./cases/business_card.png" >>> parsed_doc = doc_parser.parse({"doc": doc_path}) >>> doc_parser.write_image_with_results( doc_path, layout=parsed_doc['layout'], save_path="ocr_result.png")

doc_parser.parse返回的layout中包含每个文本块的位置框,write_image_with_results会将这些框以半透明色块叠加到原图上并保存为ocr_result.png。

抽取结果可视化
>>> from pprint import pprint >>> from paddlenlp import Taskflow >>> from paddlenlp.utils.doc_parser import DocParser >>> doc_path = "./cases/business_card.png" >>> schema = ["人名", "职位", "号码", "邮箱地址", "网址", "地址", "邮编"] >>> ie = Taskflow("information_extraction", schema=schema, model="uie-x-base", ocr_lang="en") >>> results = ie({"doc": doc_path}) >>> DocParser.write_image_with_results( doc_path, result=results[0], save_path="image_show.png")

将抽取结果(含bbox与嵌套relations)直接绘制到原图:每个实体类别会用不同颜色标注其坐标框,若实体存在子级关系,还会绘制连接线把父实体与其关系实体关联起来,形成直观的抽取全景图。write_image_with_results内部会把多级relations展平后逐框绘制(见 doc_parser.py 的write_image_with_results),并支持return_image=True、max_size等比缩放等扩展用法。

2.7 更多配置:核心参数详解

下面是一次完整的关键字参数配置示例:

>>> from paddlenlp import Taskflow >>> ie = Taskflow('information_extraction', schema="", schema_lang="ch", ocr_lang="ch", batch_size=16, model='uie-x-base', layout_analysis=False, position_prob=0.5, precision='fp32')

各参数含义如下:

参数含义默认值取值与说明
schema定义任务抽取目标空可参考开箱即用中不同任务的调用示例进行配置;为空时运行会提示先通过set_schema()设置
schema_langschema 的语言ch可选ch和en。中英文 schema 的构造方式不同,因此需要显式指定 schema 语言
ocr_langPaddleOCR 的语言chch可在中英混合的图片中使用,en在英文图片上效果更好
batch_size批处理大小16请结合机器显存/内存情况调整
model任务使用的模型uie-base可选uie-base、uie-medium、uie-mini、uie-micro、uie-nano、uie-medical-base、uie-base-en、uie-x-base
layout_analysis是否使用 PP-Structure 对文档进行版面分析False开启后优化布局信息排序,适合分栏、复杂表格场景
position_probspan 起始/终止位置的结果概率阈值0.5概率取值在 0~1 之间,返回结果会去掉低于该阈值的结果;span 的最终概率输出为起始位置概率与终止位置概率的乘积
precision模型精度fp32可选fp16与fp32

model参数补充说明:除文档列出的模型外,从 UIETask 的资源注册表 可以看到,仓库还内置了uie-m-base、uie-m-large(中英双语文本抽取)以及uie-tiny(uie-medium的旧名称,未来将废弃)。文档抽取场景使用uie-x-base;uie-base系列默认用于纯文本场景。

position_prob的底层机制:模型会对每个 token 输出两个概率——作为 span 起始位置的概率与作为终止位置的概率。后处理时先通过get_bool_ids_greater_than(..., limit=self._position_prob)过滤低于阈值的起止位置,再用get_span组合出完整 span,并以起始概率 × 终止概率作为该 span 的最终置信度(见 information_extraction.py 的_single_stage_predict)。因此,当你希望召回更全的结果时,可适当调低该阈值;反之希望结果更精时调高阈值。

precision='fp16'的硬件要求:fp16推理速度更快,支持 GPU 和 NPU 硬件环境。若选择fp16且运行在 GPU 上:

  • 需确保机器正确安装 NVIDIA 相关驱动和基础软件,CUDA >= 11.2,cuDNN >= 8.1.1,首次使用需按照提示安装相关依赖;
  • 需确保 GPU 设备的 CUDA Compute Capability(计算能力)大于 7.0,典型设备包括 V100、T4、A10、A100、GTX 20 系列和 30 系列显卡等;
  • 关于 CUDA Compute Capability 与精度支持的详细对照关系,可查阅 NVIDIA 官方文档中的 "GPU 硬件与支持精度对照表"。

此外,从 UIETask 的构造函数 可以看到,Taskflow 还支持若干文档未逐一展开的进阶参数,例如max_seq_len(最大序列长度,默认 512)、split_sentence(超长文本切句)、dynamic_max_length(按 batch 内样本动态选择序列长度)、use_fast(快速分词器)以及num_workers(DataLoader 进程数),可按需组合使用。

3. 从源码看 UIE-X 文档抽取的完整链路

结合 information_extraction.py 与 doc_parser.py,一条文档输入在底层大致经过以下阶段:

  1. 文档解析:DocParser.parse根据 MIME 类型区分图片与 PDF,图片经read_image读取(自动做 EXIF 方向校正),PDF 经read_pdf用 PyMuPDF(fitz)渲染首页并放大 10 倍保证清晰度;随后按需将图片扩展为 A4 比例(expand_image_to_a4_size),使尺寸各异的单据保持统一版面;
  2. OCR / 版面分析:未开启layout_analysis时调用PaddleOCR(lang=ocr_lang)识别文本与坐标框;开启后改用PPStructure输出分区域(含表格单元格级)的版面结果;
  3. 模型输入编码:UIE-X 需要把 prompt 与文档字符序列、逐字符 bbox、整页图片共同编码为input_ids / token_type_ids / position_ids / attention_mask / bbox / image六类张量(见_construct_input_spec与doc_reader);
  4. 多阶段级联预测:_multi_stage_predict沿 schema 树逐节点预测,父级实体结果作为子级关系抽取的 prompt 前缀(中文为父实体 + "的",英文为" of " + 父实体,见 information_extraction.py 的_multi_stage_predict);
  5. 坐标回填:_add_bbox_info根据布局把抽取到的字符区间换算成像素坐标框,得到最终含bbox的结果结构。

该能力在仓库中亦有配套测试覆盖,UIE-X 模型本身的构造与推理在 tests/transformers/ernie_layout/test_modeling.py 中有对应验证。

4. 进阶路径

文档抽取能力的"开箱即用"适合快速验证(Research 阶段);当需要把效果推向生产时,仓库还提供了完整的进阶方案:

  • 数据标注:基于 Label Studio 的文档信息抽取标注方案,实现从标注到训练数据的无缝衔接,见 文档标注指南;
  • 微调与部署:文档抽取全流程(含微调脚本finetune.py、评估脚本evaluate.py与 HTTP 部署)见 document 目录说明;
  • 依赖组件方面,文档解析依赖 PaddleOCR 与 PP-Structure 的 OCR / 版面分析能力,PDF 解析依赖 PyMuPDF,均需在环境中预先安装。

参考资料

  • PaddleNLP 信息抽取应用总览(模型选型与性能)
  • 文本信息抽取 Taskflow 使用指南
  • 文档信息抽取全流程示例
  • 信息抽取 Taskflow 核心实现源码
  • DocParser 文档解析器源码
  • UIE-X 模型测试用例
  • PaddleOCR / PP-Structure 版面分析工具
  • 人工智能
  • 大模型
  • 预训练
  • 微调
  • LoRA
  • RLHF
  • 强化学习
  • 分布式训练

【免费下载链接】PaddleNLP

Easy-to-use and powerful LLM and SLM library with awesome model zoo.

项目地址:https://gitcode.com/gh_mirrors/pa/PaddleNLP
点击查看免费下载

相关推荐

上一篇:从入门到精通:linear-merge-openmind 模型架构与核心参数详解
下一篇:Switch Transformers Base-32最佳实践:避免常见错误与性能调优

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询