UIE大模型NLP解决方案深度测评与实战指南

2026-06-23阅读 0热度 0
ai 人工智能

概述

自然语言处理(NLP)任务的实现路径已从传统机器学习全面转向大模型。大模型原生适配NLP场景,大幅简化了端到端的流程。

聊聊从大模型来看NLP解决方案之UIE

标准流水线涵盖:数据标注 → 模型训练 → 模型调优/微调 → 模型压缩 → 预测部署。这套链路覆盖NLP绝大多数场景,开发者既可开箱即用,也能按需灵活定制。

PaddleNLP正是这一思路的典型实现。它将业界优质预训练模型打包为“开箱即用”组件,同时配套丰富的产业实践范例,满足灵活定制需求。

预训练基座模型以ERINE系列大模型为主,毕竟是自有生态。

此前我们讨论过PaddleNLP在层次多标签文本分类任务中的实践,那些方案均基于预训练大模型ERINE。

UIE

UIE(Universal Information Extraction)是通用信息抽取统一框架。官方文档:UIE[1]

该框架将实体抽取、关系抽取、事件抽取、情感分析等任务统一建模,支持跨任务迁移与泛化。PaddleNLP借鉴论文[2]方法,基于ERNIE 3.0知识增强预训练模型,训练并开源了首个中文通用信息抽取模型UIE。其核心优势在于:不限行业领域与抽取目标,零样本冷启动,小样本微调能力强,可快速适配特定抽取需求。

开箱即用

paddlenlp.Taskflow直接提供通用信息抽取、评价观点抽取等能力。支持的抽取类型包括:命名实体识别(人名、地名、机构名)、关系(如电影的导演、歌曲的发行时间)、事件(某路口车祸、某地地震)、评价维度、观点词、情感倾向……用户仅需用自然语言自定义抽取目标,无需训练即可直接抽取。真正实现开箱即用,满足多样化的信息抽取需求。

以实体抽取任务为例:

命名实体识别(NER)即识别文本中具有特定意义的实体。在开放域信息抽取中,类别由用户自由定义,无预设限制。

  • 例如抽取目标实体类型为"时间"、"选手"和"赛事名称",schema构造如下:
['时间', '选手', '赛事名称']

调用示例:

>>> from pprint import pprint
>>> from paddlenlp import Taskflow

>>> schema = ['时间', '选手', '赛事名称'] # Define the schema for entity extraction
>>> ie = Taskflow('information_extraction', schema=schema)
>>> pprint(ie("2月8日上午北京冬奥会自由式滑雪女子大跳台决赛中中国选手谷爱凌以188.25分获得金牌!")) # Better print results using pprint
[{'时间': [{'end': 6,
          'probability': 0.9857378532924486,
          'start': 0,
          'text': '2月8日上午'}],
  '赛事名称': [{'end': 23,
            'probability': 0.8503089953268272,
            'start': 6,
            'text': '北京冬奥会自由式滑雪女子大跳台决赛'}],
  '选手': [{'end': 31,
          'probability': 0.8981548639781138,
          'start': 28,
          'text': '谷爱凌'}]}]
  • 又如抽取肿瘤的大小、个数、肝癌级别、脉管内癌栓分级,schema构造如下:
['肿瘤的大小', '肿瘤的个数', '肝癌级别', '脉管内癌栓分级']

前面已实例化Taskflow对象,通过set_schema方法重置抽取目标。调用示例:

>>> schema = ['肿瘤的大小', '肿瘤的个数', '肝癌级别', '脉管内癌栓分级']
>>> ie.set_schema(schema)
>>> pprint(ie("(右肝肿瘤)肝细胞性肝癌(II-III级,梁索型和假腺管型),肿瘤包膜不完整,紧邻肝被膜,侵及周围肝组织,未见脉管内癌栓(MVI分级:M0级)及卫星子灶形成。(肿物1个,大小4.2×4.0×2.8cm)。"))
[{'肝癌级别': [{'end': 20,
            'probability': 0.9243267447402701,
            'start': 13,
            'text': 'II-III级'}],
  '肿瘤的个数': [{'end': 84,
             'probability': 0.7538413804059623,
             'start': 82,
             'text': '1个'}],
  '肿瘤的大小': [{'end': 100,
             'probability': 0.8341128043459491,
             'start': 87,
             'text': '4.2×4.0×2.8cm'}],
  '脉管内癌栓分级': [{'end': 70,
               'probability': 0.9083292325934664,
               'start': 67,
               'text': 'M0级'}]}]

UIE的能力远不止于此。作为统一抽取框架,其他任务可直接参考官方文档。

基座模型

基座模型自然是自有预训练基座,没有意外。

模型结构语言
uie-base (默认)12-layers, 768-hidden, 12-heads中文
uie-base-en12-layers, 768-hidden, 12-heads英文
uie-medical-base12-layers, 768-hidden, 12-heads中文
uie-medium6-layers, 768-hidden, 12-heads中文
uie-mini6-layers, 384-hidden, 12-heads中文
uie-micro4-layers, 384-hidden, 12-heads中文
uie-nano4-layers, 312-hidden, 12-heads中文
uie-m-large24-layers, 1024-hidden, 16-heads中、英文
uie-m-base12-layers, 768-hidden, 12-heads中、英文

uie模型基于ERINE基座模型训练而成。

微调—定制化

坦白说,上述能力在许多框架和平台中都能找到。例如ModelScope,遇到NLP或大模型问题时,很多人第一时间去那儿找方案。但ModelScope有一个明显短板:微调能力不足。不少模型和库不提供微调接口,对需要定制化落地的场景帮助有限。毕竟我们在业务中需要的不是现成的玩具,而是能适配实际流程的定制化实现。

这也合理。如果开放微调并支持灵活定制,对开源方而言维护成本会更高。

相比之下,PaddleNLP在微调方面做得相当完善。

数据标注

基于doccano标注平台进行数据标注,具体流程可参考层次多标签分类NLP任务的实践一文。

模型微调

推荐使用Trainer API[3]对模型进行微调。只需输入模型和数据集,Trainer API即可高效完成预训练、微调、模型压缩等任务,一键启动多卡训练、混合精度训练、梯度累积、断点重启、日志显示等功能。它还封装了训练过程中的通用配置,如优化器、学习率调度等。

以下命令以uie-base为预训练模型进行微调,微调后的模型保存至$finetuned_model:

单卡启动:

export finetuned_model=./checkpoint/model_best

python finetune.py  \
    --device gpu \
    --logging_steps 10 \
    --sa ve_steps 100 \
    --eval_steps 100 \
    --seed 42 \
    --model_name_or_path uie-base \
    --output_dir $finetuned_model \
    --train_path data/train.txt \
    --dev_path data/dev.txt  \
    --max_seq_length 512  \
    --per_device_eval_batch_size 16 \
    --per_device_train_batch_size  16 \
    --num_train_epochs 20 \
    --learning_rate 1e-5 \
    --label_names "start_positions" "end_positions" \
    --do_train \
    --do_eval \
    --do_export \
    --export_model_dir $finetuned_model \
    --overwrite_output_dir \
    --disable_tqdm True \
    --metric_for_best_model eval_f1 \
    --load_best_model_at_end  True \
    --sa ve_total_limit 1

模型评估

此步骤可跳过,非核心环节。

模型预测

使用paddlenlp.Taskflow装载定制模型,通过task_path指定模型权重文件路径,该路径下需包含训练好的模型权重文件model_state.pdparams

>>> from pprint import pprint
>>> from paddlenlp import Taskflow

>>> schema = ['出发地', '目的地', '费用', '时间']
# 设定抽取目标和定制化模型权重路径
>>> my_ie = Taskflow("information_extraction", schema=schema, task_path='./checkpoint/model_best')
>>> pprint(my_ie("城市内交通费7月5日金额114广州至佛山"))
[{'出发地': [{'end': 17,
           'probability': 0.9975287467835301,
           'start': 15,
           'text': '广州'}],
  '时间': [{'end': 10,
          'probability': 0.9999476678061399,
          'start': 6,
          'text': '7月5日'}],
  '目的地': [{'end': 20,
           'probability': 0.9998511131226735,
           'start': 18,
           'text': '佛山'}],
  '费用': [{'end': 15,
          'probability': 0.9994474579292856,
          'start': 12,
          'text': '114'}]}]

模型部署

  • 模型导出:训练和压缩阶段已自动完成静态图导出及tokenizer配置文件保存。保存路径${finetuned_model}下应包含.pdimodel.pdiparams模型文件,可用于推理。
  • 模型部署:
# UIE 模型 CPU 推理
python deploy/python/infer.py --model_dir ./checkpoint/model_best --device cpu
# UIE 模型 GPU 推理
python deploy/python/infer.py --model_dir ./checkpoint/model_best --device gpu

总结

PaddleNLP本质上是一个基于预训练大模型的NLP任务解决方案库,其实践流程高度统一:数据标注 → 模型训练 → 模型调优/微调 → 模型压缩 → 预测部署。深入熟悉该库,对掌握NLP与大模型在实际业务中的落地大有裨益。若正在从事相关方向,值得花时间深入了解。

免责声明

本网站新闻资讯均来自公开渠道,力求准确但不保证绝对无误,内容观点仅代表作者本人,与本站无关。若涉及侵权,请联系我们处理。本站保留对声明的修改权,最终解释权归本站所有。

相关阅读

更多
欢迎回来 登录或注册后,可保存提示词和历史记录
登录后可同步收藏、历史记录和常用模板
注册即表示同意服务条款与隐私政策