uie_pytorch
uie_pytorch 是将百度 PaddleNLP 中的通用信息抽取(UIE)模型迁移至 PyTorch 框架的开源实现。它致力于解决传统信息抽取技术依赖大量标注数据、针对不同任务需单独训练模型以及跨领域泛化能力弱的痛点。通过统一的建模范式,uie_pytorch 能够在一个模型中同时处理实体识别、关系抽取、事件检测、情感分析及观点挖掘等多种任务。
该工具特别适合需要构建灵活文本分析系统的 AI 开发者、算法工程师及科研人员。其核心亮点在于“零样本”与“少样本”学习能力:用户只需用自然语言定义抽取目标(如“时间”、“选手”),无需重新训练即可直接从文本中提取对应信息,极大地降低了数据标注成本和冷启动门槛。此外,项目提供了完整的工具链,支持从数据格式转换、模型微调、效果评估到 ONNX 部署的全流程操作,并针对推理速度进行了优化(支持 FasterTokenizer)。无论是医疗结构化、法律文书分析还是金融文档处理,uie_pytorch 都能帮助开发者快速搭建高效、通用的信息抽取应用。
使用场景
某金融科技公司风控团队需要从每日数千份非结构化的企业新闻舆情中,快速提取“涉事公司”、“风险类型”及“涉及金额”等关键要素,以构建实时预警系统。
没有 uie_pytorch 时
- 标注成本高昂:面对不断涌现的新型风险事件(如“供应链断裂”、“高管失联”),每次新增抽取目标都需要人工标注数百条数据,耗时数周。
- 模型迭代僵化:传统 NER 模型固定了实体类别,一旦业务需求变更(如增加“处罚机构”字段),必须重新训练整个模型,开发周期长。
- 技术栈迁移困难:团队主流架构为 PyTorch,而原版 UIE 基于 PaddlePaddle,跨框架复用模型需要复杂的转换工作或重写代码,阻碍了新技术落地。
- 冷启动效果差:在缺乏历史标注数据的突发舆情场景中,旧模型无法进行零样本抽取,导致预警系统出现盲区。
使用 uie_pytorch 后
- 零样本快速响应:利用 uie_pytorch 的自然语言 Schema 定义能力,仅需输入
['涉事公司', '风险类型', '涉及金额']即可直接抽取,无需任何标注数据,新任务上线从周级缩短至分钟级。 - 灵活定制抽取目标:业务方随时调整关注点(如临时增加“监管文件号”),开发人员只需修改 Schema 列表,uie_pytorch 即可即时适配,无需重新训练模型。
- 无缝融入现有架构:作为原生 PyTorch 实现,uie_pytorch 可直接通过
pip安装并集成到团队现有的 GPU 推理集群中,消除了跨框架部署的兼容性障碍。 - 小样本微调增效:针对特定金融术语,仅需少量标注数据配合
finetune.py进行微调,即可显著提升抽取准确率,兼顾了通用性与专业性。
uie_pytorch 通过统一框架和零样本能力,将非结构化文本转化为结构化数据的门槛降至最低,实现了风控情报处理的降本增效。
运行环境要求
未说明
未说明

快速开始
通用信息抽取 UIE(Universal Information Extraction) PyTorch版
迁移PaddleNLP中的UIE模型到PyTorch上
- 2022-10-3: 新增对UIE-M系列模型的支持,增加了ErnieM的Tokenizer。ErnieMTokenizer使用C++实现的高性能分词算子FasterTokenizer进行文本预处理加速。需要通过
pip install faster_tokenizer安装FasterTokenizer库后方可使用。
PyTorch版功能介绍
convert.py: 自动下载并转换模型,详见开箱即用。doccano.py: 转换标注数据,详见数据标注。evaluate.py: 评估模型,详见模型评估。export_model.py: 导出ONNX推理模型,详见模型部署。finetune.py: 微调训练,详见模型微调。model.py: 模型定义。uie_predictor.py: 推理类。
目录
1. 模型简介
UIE(Universal Information Extraction):Yaojie Lu等人在ACL-2022中提出了通用信息抽取统一框架UIE。该框架实现了实体抽取、关系抽取、事件抽取、情感分析等任务的统一建模,并使得不同任务间具备良好的迁移和泛化能力。为了方便大家使用UIE的强大能力,PaddleNLP借鉴该论文的方法,基于ERNIE 3.0知识增强预训练模型,训练并开源了首个中文通用信息抽取模型UIE。该模型可以支持不限定行业领域和抽取目标的关键信息抽取,实现零样本快速冷启动,并具备优秀的小样本微调能力,快速适配特定的抽取目标。
UIE的优势
使用简单:用户可以使用自然语言自定义抽取目标,无需训练即可统一抽取输入文本中的对应信息。实现开箱即用,并满足各类信息抽取需求。
降本增效:以往的信息抽取技术需要大量标注数据才能保证信息抽取的效果,为了提高开发过程中的开发效率,减少不必要的重复工作时间,开放域信息抽取可以实现零样本(zero-shot)或者少样本(few-shot)抽取,大幅度降低标注数据依赖,在降低成本的同时,还提升了效果。
效果领先:开放域信息抽取在多种场景,多种任务上,均有不俗的表现。
2. 应用示例
UIE不限定行业领域和抽取目标,以下是一些零样本行业示例:
- 医疗场景-专病结构化

- 法律场景-判决书抽取

- 金融场景-收入证明、招股书抽取

- 公安场景-事故报告抽取

- 旅游场景-宣传册、手册抽取

3. 开箱即用
uie_predictor提供通用信息抽取、评价观点抽取等能力,可抽取多种类型的信息,包括但不限于命名实体识别(如人名、地名、机构名等)、关系(如电影的导演、歌曲的发行时间等)、事件(如某路口发生车祸、某地发生地震等)、以及评价维度、观点词、情感倾向等信息。用户可以使用自然语言自定义抽取目标,无需训练即可统一抽取输入文本中的对应信息。实现开箱即用,并满足各类信息抽取需求
uie_predictor现在可以自动下载模型了,无需手动convert,如果想手动转换模型,可以参照以下方法。
下载并转换模型,将下载Paddle版的uie-base模型到当前目录中,并生成PyTorch版模型uie_base_pytorch。
python convert.py
如果没有安装paddlenlp,则使用以下命令。这将不会导入paddlenlp,以及不会验证转换结果正确性。
python convert.py --no_validate_output
可配置参数说明:
input_model: 输入的模型所在的文件夹,例如存在模型./model_path/model_state.pdparams,则传入./model_path。如果传入uie-base或uie-tiny等在模型列表中的模型,且当前目录不存在此文件夹时,将自动下载模型。默认值为uie-base。支持自动下载的模型
uie-baseuie-mediumuie-miniuie-microuie-nanouie-medical-baseuie-tiny(弃用,已改为uie-medium)uie-base-enuie-m-baseuie-m-largeernie-3.0-base-zh*
output_model: 输出的模型的文件夹,默认为uie_base_pytorch。no_validate_output:是否关闭对输出模型的验证,默认打开。
* : 使用ernie-3.0-base-zh时不会验证模型,需要微调后才能用于预测
3.1 实体抽取
命名实体识别(Named Entity Recognition,简称NER),是指识别文本中具有特定意义的实体。在开放域信息抽取中,抽取的类别没有限制,用户可以自己定义。
- 例如抽取的目标实体类型是"时间"、"选手"和"赛事名称", schema构造如下:
['时间', '选手', '赛事名称']
调用示例:
>>> from uie_predictor import UIEPredictor
>>> from pprint import pprint
>>> schema = ['时间', '选手', '赛事名称'] # Define the schema for entity extraction
>>> ie = UIEPredictor(model='uie-base', 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构造如下:
['肿瘤的大小', '肿瘤的个数', '肝癌级别', '脉管内癌栓分级']
在上例中我们已经实例化了一个UIEPredictor对象,这里可以通过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级'}]}]
例如抽取的目标实体类型是"person"和"organization",schema构造如下:
['person', 'organization']英文模型调用示例:
>>> from uie_predictor import UIEPredictor >>> from pprint import pprint >>> schema = ['Person', 'Organization'] >>> ie_en = UIEPredictor(model='uie-base-en', schema=schema) >>> pprint(ie_en('In 1997, Steve was excited to become the CEO of Apple.')) [{'Organization': [{'end': 53, 'probability': 0.9985840259877357, 'start': 48, 'text': 'Apple'}], 'Person': [{'end': 14, 'probability': 0.999631971804547, 'start': 9, 'text': 'Steve'}]}]
3.2 关系抽取
关系抽取(Relation Extraction,简称RE),是指从文本中识别实体并抽取实体之间的语义关系,进而获取三元组信息,即<主体,谓语,客体>。
- 例如以"竞赛名称"作为抽取主体,抽取关系类型为"主办方"、"承办方"和"已举办次数", schema构造如下:
{
'竞赛名称': [
'主办方',
'承办方',
'已举办次数'
]
}
调用示例:
>>> schema = {'竞赛名称': ['主办方', '承办方', '已举办次数']} # 定义关系抽取的模式
>>> ie.set_schema(schema) # 重置模式
>>> pprint(ie('2022语言与智能技术竞赛由中国中文信息学会和中国计算机学会联合主办,百度公司、中国中文信息学会评测工作委员会和中国计算机学会自然语言处理专委会承办,已连续举办4届,成为全球最热门的中文NLP赛事之一。'))
[{'竞赛名称': [{'end': 13,
'probability': 0.7825402622754041,
'relations': {'主办方': [{'end': 22,
'probability': 0.8421710521379353,
'start': 14,
'text': '中国中文信息学会'},
{'end': 30,
'probability': 0.7580801847701935,
'start': 23,
'text': '中国计算机学会'}],
'已举办次数': [{'end': 82,
'probability': 0.4671295049136148,
'start': 80,
'text': '4届'}],
'承办方': [{'end': 39,
'probability': 0.8292706618236352,
'start': 35,
'text': '百度公司'},
{'end': 72,
'probability': 0.6193477885474685,
'start': 56,
'text': '中国计算机学会自然语言处理专委会'},
{'end': 55,
'probability': 0.7000497331473241,
'start': 40,
'text': '中国中文信息学会评测工作委员会'}]},
'start': 0,
'text': '2022语言与智能技术竞赛'}]}]
例如以"person"作为抽取主体,抽取关系类型为"Company"和"Position", schema构造如下:
{ 'Person': [ 'Company', 'Position' ] }英文模型调用示例:
>>> schema = [{'Person': ['Company', 'Position']}] >>> ie_en.set_schema(schema) >>> pprint(ie_en('In 1997, Steve was excited to become the CEO of Apple.')) [{'Person': [{'end': 14, 'probability': 0.999631971804547, 'relations': {'Company': [{'end': 53, 'probability': 0.9960158209451642, 'start': 48, 'text': 'Apple'}], 'Position': [{'end': 44, 'probability': 0.8871063806420736, 'start': 41, 'text': 'CEO'}]}, 'start': 9, 'text': 'Steve'}]}]
3.3 事件抽取
事件抽取 (Event Extraction, 简称EE),是指从自然语言文本中抽取预定义的事件触发词(Trigger)和事件论元(Argument),组合为相应的事件结构化信息。
- 例如抽取的目标是"地震"事件的"地震强度"、"时间"、"震中位置"和"震源深度"这些信息,schema构造如下:
{
'地震触发词': [
'地震强度',
'时间',
'震中位置',
'震源深度'
]
}
触发词的格式统一为`触发词`或``XX触发词`,`XX`表示具体事件类型,上例中的事件类型是`地震`,则对应触发词为`地震触发词`。
调用示例:
>>> schema = {'地震触发词': ['地震强度', '时间', '震中位置', '震源深度']} # 定义事件抽取的模式
>>> ie.set_schema(schema) # 重置模式
>>> ie('中国地震台网正式测定:5月16日06时08分在云南临沧市凤庆县(北纬24.34度,东经99.98度)发生3.5级地震,震源深度10千米。')
[{'地震触发词': [{'text': '地震', 'start': 56, 'end': 58, 'probability': 0.9987181623528585, 'relations': {'地震强度': [{'text': '3.5级', 'start': 52, 'end': 56, 'probability': 0.9962985320905915}], '时间': [{'text': '5月16日06时08分', 'start': 11, 'end': 22, 'probability': 0.9882578028575182}], '震中位置': [{'text': '云南临沧市凤庆县(北纬24.34度,东经99.98度)', 'start': 23, 'end': 50, 'probability': 0.8551415716584501}], '震源深度': [{'text': '10千米', 'start': 63, 'end': 67, 'probability': 0.999158304648045}]}}]}]
- 英文模型暂不支持事件抽取
3.4 评论观点抽取
评论观点抽取,是指抽取文本中包含的评价维度、观点词。
- 例如抽取的目标是文本中包含的评价维度及其对应的观点词和情感倾向,schema构造如下:
{
'评价维度': [
'观点词',
'情感倾向[正向,负向]'
]
}
调用示例:
>>> schema = {'评价维度': ['观点词', '情感倾向[正向,负向]']} # 定义观点抽取的模式
>>> ie.set_schema(schema) # 重置模式
>>> pprint(ie("店面干净,很清静,服务员服务热情,性价比很高,发现收银台有排队")) # 使用pprint更好地展示结果
[{'评价维度': [{'end': 20,
'probability': 0.9817040258681473,
'relations': {'情感倾向[正向,负向]': [{'probability': 0.9966142505350533,
'text': '正向'}],
'观点词': [{'end': 22,
'probability': 0.957396472711558,
'start': 21,
'text': '高'}]},
'start': 17,
'text': '性价比'},
{'end': 2,
'probability': 0.9696849569741168,
'relations': {'情感倾向[正向,负向]': [{'probability': 0.9982153274927796,
'text': '正向'}],
'观点词': [{'end': 4,
'probability': 0.9945318044652538,
'start': 2,
'text': '干净'}]},
'start': 0,
'text': '店面'}]}]
英文模型schema构造如下:
{ 'Aspect': [ 'Opinion', 'Sentiment classification [negative, positive]' ] }调用示例:
>>> schema = [{'Aspect': ['Opinion', 'Sentiment classification [negative, positive]']}] >>> ie_en.set_schema(schema) >>> pprint(ie_en("The teacher is very nice.")) [{'Aspect': [{'end': 11, 'probability': 0.4301476415932193, 'relations': {'Opinion': [{'end': 24, 'probability': 0.9072940447883724, 'start': 15, 'text': 'very nice'}], 'Sentiment classification [negative, positive]': [{'probability': 0.9998571920670685, 'text': 'positive'}]}, 'start': 4, 'text': 'teacher'}]}]
3.5 情感分类
- 句子级情感倾向分类,即判断句子的情感倾向是“正向”还是“负向”,schema构造如下:
'情感倾向[正向,负向]'
调用示例:
>>> schema = '情感倾向[正向,负向]' # 定义句子级情感分类的模式
>>> ie.set_schema(schema) # 重置模式
>>> ie('这个产品用起来真的很流畅,我非常喜欢')
[{'情感倾向[正向,负向]': [{'text': '正向', 'probability': 0.9988661643929895}]}]
英文模型schema构造如下:
```text
'情感倾向[正向,负向]'
```
英文模型调用示例:
>>> schema = '情感分类 [负面, 正面]'
>>> ie_en.set_schema(schema)
>>> ie_en('我很抱歉,但这是我一生中见过的最糟糕的电影。')
[{'情感分类 [负面, 正面]': [{'text': '负面', 'probability': 0.9998415771287057}]}]
```
<a name="跨任务抽取"></a>
#### 3.6 跨任务抽取
- 例如在法律场景同时对文本进行实体抽取和关系抽取,schema可按照如下方式进行构造:
```text
[
"法院",
{
"原告": "委托代理人"
},
{
"被告": "委托代理人"
}
]
调用示例:
>>> schema = ['法院', {'原告': '委托代理人'}, {'被告': '委托代理人'}]
>>> ie.set_schema(schema)
>>> pprint(ie("北京市海淀区人民法院\n民事判决书\n(199x)建初字第xxx号\n原告:张三。\n委托代理人李四,北京市 A律师事务所律师。\n被告:B公司,法定代表人王五,开发公司总经理。\n委托代理人赵六,北京市 C律师事务所律师。")) # Better print results using pprint
[{'原告': [{'end': 37,
'probability': 0.9949814024296764,
'relations': {'委托代理人': [{'end': 46,
'probability': 0.7956844697990384,
'start': 44,
'text': '李四'}]},
'start': 35,
'text': '张三'}],
'法院': [{'end': 10,
'probability': 0.9221074192336651,
'start': 0,
'text': '北京市海淀区人民法院'}],
'被告': [{'end': 67,
'probability': 0.8437349536631089,
'relations': {'委托代理人': [{'end': 92,
'probability': 0.7267121388225029,
'start': 90,
'text': '赵六'}]},
'start': 64,
'text': 'B公司'}]}]
3.7 模型选择
多模型选择,满足精度、速度要求
模型 结构 语言 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-nano调用示例:>>> from uie_predictor import UIEPredictor >>> schema = ['时间', '选手', '赛事名称'] >>> ie = UIEPredictor('uie-nano', schema=schema) >>> ie("2月8日上午北京冬奥会自由式滑雪女子大跳台决赛中中国选手谷爱凌以188.25分获得金牌!") [{'时间': [{'text': '2月8日上午', 'start': 0, 'end': 6, 'probability': 0.6513581678349247}], '选手': [{'text': '谷爱凌', 'start': 28, 'end': 31, 'probability': 0.9819330659468051}], '赛事名称': [{'text': '北京冬奥会自由式滑雪女子大跳台决赛', 'start': 6, 'end': 23, 'probability': 0.4908131110420939}]}]uie-m-base和uie-m-large支持中英文混合抽取,调用示例:>>> from pprint import pprint >>> from uie_predictor import UIEPredictor >>> schema = ['Time', 'Player', 'Competition', 'Score'] >>> ie = UIEPredictor(schema=schema, model="uie-m-base", schema_lang="en") >>> pprint(ie(["2月8日上午北京冬奥会自由式滑雪女子大跳台决赛中中国选手谷爱凌以188.25分获得金牌!", "Rafael Nadal wins French Open Final!"])) [{'Competition': [{'end': 23, 'probability': 0.9373889907291257, 'start': 6, 'text': '北京冬奥会自由式滑雪女子大跳台决赛'}], 'Player': [{'end': 31, 'probability': 0.6981119555336441, 'start': 28, 'text': '谷爱凌'}], 'Score': [{'end': 39, 'probability': 0.9888507878270296, 'start': 32, 'text': '188.25分'}], 'Time': [{'end': 6, 'probability': 0.9784080036931151, 'start': 0, 'text': '2月8日上午'}]}, {'Competition': [{'end': 35, 'probability': 0.9851549932171295, 'start': 18, 'text': 'French Open Final'}], 'Player': [{'end': 12, 'probability': 0.9379371275888104, 'start': 0, 'text': 'Rafael Nadal'}]}]
3.8 更多配置
>>> from uie_predictor import UIEPredictor
>>> ie = UIEPredictor('uie_nano',
schema=schema)
model:选择任务使用的模型,默认为uie-base,可选有uie-base,uie-medium,uie-mini,uie-micro,uie-nano和uie-medical-base,uie-base-en。schema:定义任务抽取目标,可参考开箱即用中不同任务的调用示例进行配置。schema_lang:设置schema的语言,默认为zh, 可选有zh和en。因为中英schema的构造有所不同,因此需要指定schema的语言。该参数只对uie-m-base和uie-m-large模型有效。batch_size:批处理大小,请结合机器情况进行调整,默认为1。task_path:设定自定义的模型。position_prob:模型对于span的起始位置/终止位置的结果概率在0~1之间,返回结果去掉小于这个阈值的结果,默认为0.5,span的最终概率输出为起始位置概率和终止位置概率的乘积。use_fp16:是否使用fp16进行加速,默认关闭。fp16推理速度更快。如果选择fp16,请先确保机器正确安装NVIDIA相关驱动和基础软件,确保CUDA>=11.2,cuDNN>=8.1.1,初次使用需按照提示安装相关依赖。其次,需要确保GPU设备的CUDA计算能力(CUDA Compute Capability)大于7.0,典型的设备包括V100、T4、A10、A100、GTX 20系列和30系列显卡等。更多关于CUDA Compute Capability和精度支持情况请参考NVIDIA文档:GPU硬件与支持精度对照表。
4. 训练定制
对于简单的抽取目标可以直接使用UIEPredictor实现零样本(zero-shot)抽取,对于细分场景我们推荐使用轻定制功能(标注少量数据进行模型微调)以进一步提升效果。下面通过报销工单信息抽取的例子展示如何通过5条训练数据进行UIE模型微调。
4.1 代码结构
.
├── utils.py # 数据处理工具
├── model.py # 模型组网脚本
├── doccano.py # 数据标注脚本
├── doccano.md # 数据标注文档
├── finetune.py # 模型微调脚本
├── evaluate.py # 模型评估脚本
└── README.md
4.2 数据标注
我们推荐使用数据标注平台doccano 进行数据标注,本示例也打通了从标注到训练的通道,即doccano导出数据后可通过doccano.py脚本轻松将数据转换为输入模型时需要的形式,实现无缝衔接。标注方法的详细介绍请参考doccano数据标注指南。
原始数据示例:
深大到双龙28块钱4月24号交通费
抽取的目标(schema)为:
schema = ['出发地', '目的地', '费用', '时间']
标注步骤如下:
- 在doccano平台上,创建一个类型为
序列标注的标注项目。 - 定义实体标签类别,上例中需要定义的实体标签有
出发地、目的地、费用和时间。 - 使用以上定义的标签开始标注数据,下面展示了一个doccano标注示例:
标注完成后,在doccano平台上导出文件,并将其重命名为
doccano_ext.json后,放入./data目录下。这里我们提供预先标注好的文件doccano_ext.json,可直接下载并放入
./data目录。执行以下脚本进行数据转换,执行后会在./data目录下生成训练/验证/测试集文件。
python doccano.py \
--doccano_file ./data/doccano_ext.json \
--task_type ext \
--save_dir ./data \
--splits 0.8 0.2 0
可配置参数说明:
doccano_file: 从doccano导出的数据标注文件。save_dir: 训练数据的保存目录,默认存储在data目录下。negative_ratio: 最大负例比例,该参数只对抽取类型任务有效,适当构造负例可提升模型效果。负例数量和实际的标签数量有关,最大负例数量 = negative_ratio * 正例数量。该参数只对训练集有效,默认为5。为了保证评估指标的准确性,验证集和测试集默认构造全负例。splits: 划分数据集时训练集、验证集所占的比例。默认为[0.8, 0.1, 0.1]表示按照8:1:1的比例将数据划分为训练集、验证集和测试集。task_type: 选择任务类型,可选有抽取和分类两种类型的任务。options: 指定分类任务的类别标签,该参数只对分类类型任务有效。默认为["正向", "负向"]。prompt_prefix: 声明分类任务的prompt前缀信息,该参数只对分类类型任务有效。默认为"情感倾向"。is_shuffle: 是否对数据集进行随机打散,默认为True。seed: 随机种子,默认为1000.separator: 实体类别/评价维度与分类标签的分隔符,该参数只对实体/评价维度级分类任务有效。默认为"##".
备注:
- 默认情况下 doccano.py 脚本会按照比例将数据划分为 train/dev/test 数据集
- 每次执行 doccano.py 脚本,将会覆盖已有的同名数据文件
- 在模型训练阶段我们推荐构造一些负例以提升模型效果,在数据转换阶段我们内置了这一功能。可通过
negative_ratio控制自动构造的负样本比例;负样本数量 = negative_ratio * 正样本数量。 - 对于从doccano导出的文件,默认文件中的每条数据都是经过人工正确标注的。
更多不同类型任务(关系抽取、事件抽取、评价观点抽取等)的标注规则及参数说明,请参考doccano数据标注指南。
此外,也可以通过数据标注平台 Label Studio 进行数据标注。本示例提供了 labelstudio2doccano.py 脚本,将 label studio 导出的 JSON 数据文件格式转换成 doccano 导出的数据文件格式,后续的数据转换与模型微调等操作不变。
python labelstudio2doccano.py --labelstudio_file label-studio.json
可配置参数说明:
labelstudio_file: label studio 的导出文件路径(仅支持 JSON 格式)。doccano_file: doccano 格式的数据文件保存路径,默认为 "doccano_ext.jsonl"。task_type: 任务类型,可选有抽取("ext")和分类("cls")两种类型的任务,默认为 "ext"。
4.3 模型微调
通过运行以下命令进行模型微调:
python finetune.py \
--train_path "./data/train.txt" \
--dev_path "./data/dev.txt" \
--save_dir "./checkpoint" \
--learning_rate 1e-5 \
--batch_size 16 \
--max_seq_len 512 \
--num_epochs 100 \
--model "uie_base_pytorch" \
--seed 1000 \
--logging_steps 10 \
--valid_steps 100 \
--device "gpu"
可配置参数说明:
train_path: 训练集文件路径。dev_path: 验证集文件路径。save_dir: 模型存储路径,默认为./checkpoint。learning_rate: 学习率,默认为1e-5。batch_size: 批处理大小,请结合机器情况进行调整,默认为16。max_seq_len: 文本最大切分长度,输入超过最大长度时会对输入文本进行自动切分,默认为512。num_epochs: 训练轮数,默认为100。model: 选择模型,程序会基于选择的模型进行模型微调,默认为uie_base_pytorch。seed: 随机种子,默认为1000.logging_steps: 日志打印的间隔steps数,默认10。valid_steps: evaluate的间隔steps数,默认100。device: 选用什么设备进行训练,可选cpu或gpu。max_model_num: 保存的模型的个数,不包含model_best和early_stopping保存的模型,默认为5。early_stopping: 是否采用提前停止(Early Stopping),默认 nicht verwendet.
4.4 模型评估
通过运行以下命令进行模型评估:
python evaluate.py \
--model_path ./checkpoint/model_best \
--test_path ./data/dev.txt \
--batch_size 16 \
--max_seq_len 512
评估方式说明:采用单阶段评价的方式,即关系抽取、事件抽取等需要分阶段预测的任务对每一阶段的预测结果进行分别评价。验证/测试集默认会利用同一层级的所有标签来构造出全部负例。
可开启debug模式对每个正例类别分别进行评估,该模式仅用于模型调试:
python evaluate.py \
--model_path ./checkpoint/model_best \
--test_path ./data/dev.txt \
--debug
输出打印示例:
[2022-09-14 03:13:58,877] [ INFO] - -----------------------------
[2022-09-14 03:13:58,877] [ INFO] - Class Name: 疾病
[2022-09-14 03:13:58,877] [ INFO] - Evaluation Precision: 0.89744 | Recall: 0.83333 | F1: 0.86420
[2022-09-14 03:13:59,145] [ INFO] - -----------------------------
[2022-09-14 03:13:59,145] [ INFO] - Class Name: 手术治疗
[2022-09-14 03:13:59,145] [ INFO] - Evaluation Precision: 0.90000 | Recall: 0.85714 | F1: 0.87805
[2022-09-14 03:13:59,439] [ INFO] - -----------------------------
[2022-09-14 03:13:59,440] [ INFO] - Class Name: 检查
[2022-09-14 03:13:59,440] [ INFO] - Evaluation Precision: 0.77778 | Recall: 0.56757 | F1: 0.65625
[2022-09-14 03:13:59,708] [ INFO] - -----------------------------
[2022-09-14 03:13:59,709] [ INFO] - Class Name: X's手术治疗
[2022-09-14 03:13:59,709] [ INFO] - Evaluation Precision: 0.90000 | Recall: 0.85714 | F1: 0.87805
[2022-09-14 03:13:59,893] [ INFO] - -----------------------------
[2022-09-14 03:13:59,894] [ INFO] - Class Name: X的实验室检查
[2022-09-14 03:13:59,894] [ INFO] - Evaluation Precision: 0.71429 | Recall: 0.55556 | F1: 0.62500
[2022-09-14 03:14:00,057] [ INFO] - -----------------------------
[2022-09-14 03:14:00,058] [ INFO] - Class Name: X的影像学检查
[2022-09-14 03:14:00,058] [ INFO] - Evaluation Precision: 0.69231 | Recall: 0.45000 | F1: 0.54545
可配置参数说明:
model_path: 进行评估的模型文件夹路径,路径下需包含模型权重文件pytorch_model.bin及配置文件config.json。test_path: 进行评估的测试集文件。batch_size: 批处理大小,请结合机器情况进行调整,默认为16。max_seq_len: 文本最大切分长度,输入超过最大 length时会对 input text进行 automatic cut, default is 512.device: 选用进行 training 的 equipment, can be cpu or gpu.
4.5 定制模型一键预测
UIEPredictor装载定制模型,通过task_path指定模型权重文件的路径,路径下需要包含训练好的模型权重文件pytorch_model.bin。
>>> from pprint import pprint
>>> from uie_predictor import UIEPredictor
>>> schema = ['出发地', '目的地', '费用', '时间']
# 设置抽取目标和定制化模型权重路径
>>> my_ie = UIEPredictor(model='uie-base',task_path='./checkpoint/model_best', schema=schema)
>>> 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'}]}]
4.6 实验指标
我们在互联网、医疗、金融三大垂类自建测试集上进行了实验:
| 金融 | 医疗 | 互联网 | ||||
|---|---|---|---|---|---|---|
| 0-shot | 5-shot | 0-shot | 5-shot | 0-shot | 5-shot | |
| uie-base (12L768H) | 46.43 | 70.92 | 71.83 | 85.72 | 78.33 | 81.86 |
| uie-medium (6L768H) | 41.11 | 64.53 | 65.40 | 75.72 | 78.32 | 79.68 |
| uie-mini (6L384H) | 37.04 | 64.65 | 60.50 | 78.36 | 72.09 | 76.38 |
| uie-micro (4L384H) | 37.53 | 62.11 | 57.04 | 75.92 | 66.00 | 70.22 |
| uie-nano (4L312H) | 38.94 | 66.83 | 48.29 | 76.74 | 62.86 | 72.35 |
| uie-m-large (24L1024H) | 49.35 | 74.55 | 70.50 | 92.66 | 78.49 | 83.02 |
| uie-m-base (12L768H) | 38.46 | 74.31 | 63.37 | 87.32 | 76.27 | 80.13 |
0-shot表示无训练数据直接通过UIEPredictor进行预测,5-shot表示每个类别包含5条标注数据进行模型微调。实验表明UIE在垂类场景可以通过少量数据(few-shot)进一步提升效果。
4.7 模型部署
以下是UIE Python端的部署流程,包括环境准备、模型导出和使用示例。
环境准备 UIE的部署分为CPU和GPU两种情况,请根据你的部署环境安装对应的依赖。
CPU端
CPU端的部署请使用如下命令安装所需依赖
pip install onnx onnxruntimeGPU端
为了在GPU上获得最佳的推理性能和稳定性,请先确保机器已正确安装NVIDIA相关驱动和基础软件,确保CUDA >= 11.2,cuDNN >= 8.1.1,并使用以下命令安装所需依赖
pip install onnx onnxconverter_common onnxruntime-gpu如需使用半精度(FP16)部署,请确保GPU设备的CUDA计算能力 (CUDA Compute Capability) 大于7.0,典型的设备包括V100、T4、A10、A100、GTX 20系列和30系列显卡等。 更多关于CUDA Compute Capability和精度支持情况请参考NVIDIA文档:GPU硬件与支持精度对照表
模型导出
将训练后的动态图参数导出为静态图参数:
python export_model.py --model_path ./checkpoint/model_best --output_path ./export可配置参数说明:
model_path: 动态图训练保存的参数路径,路径下包含模型参数文件pytorch_model.bin和模型配置文件config.json。output_path: 静态图参数导出路径,默认导出路径为model_path,即保存到输入模型同目录下。
推理
CPU端推理样例
在CPU端,请使用如下命令进行部署
python uie_predictor.py --task_path ./export --engine onnx --device cpu可配置参数说明:
model:选择任务使用的模型,默认为uie-base,可选有uie-base,uie-medium,uie-mini,uie-micro,uie-nano和uie-medical-base,uie-base-en。task_path: 用于推理的ONNX模型文件所在文件夹。例如模型文件路径为./export/inference.onnx,则传入./export。如果不设置,将自动下载model对应的模型。position_prob:模型对于span的起始位置/终止位置的结果概率0~1之间,返回结果去掉小于这个阈值的结果,默认为0.5,span的最终概率输出为起始位置概率和终止位置概率的乘积。max_seq_len: 文本最大切分长度,输入超过最大长度时会对输入文本进行自动切分,默认为512。engine: 可选值为pytorch和onnx。推理使用的推理引擎。
GPU端推理样例
在GPU端,请使用如下命令进行部署
python uie_predictor.py --task_path ./export --engine onnx --device gpu --use_fp16可配置参数说明:
model:选择任务使用的模型,默认为uie-base,可选有uie-base,uie-medium,uie-mini,uie-micro,uie-nano和uie-medical-base,uie-base-en。task_path: 用于推理的ONNX模型文件所在文件夹。例如模型文件路径为./export/inference.onnx,则传入./export/inference。如果不设置,将自动下载model对应的模型。use_fp16: 是否使用FP16进行加速,默认关闭。position_prob:模型对于span的起始位置/终止位置的结果概率0~1之间,返回结果去掉小于这个阈值的结果,默认为0.5,span的最终概率输出为起始位置概率和终止位置概率的乘积。max_seq_len: 文本最大切分长度,输入超过最大长度时会对输入文本进行自动切分,默认为512。engine: 可选值为pytorch和onnx。推理使用的推理引擎。
常见问题
相似工具推荐
stable-diffusion-webui
stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。
everything-claude-code
everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上
ComfyUI
ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。
NextChat
NextChat 是一款轻量且极速的 AI 助手,旨在为用户提供流畅、跨平台的大模型交互体验。它完美解决了用户在多设备间切换时难以保持对话连续性,以及面对众多 AI 模型不知如何统一管理的痛点。无论是日常办公、学习辅助还是创意激发,NextChat 都能让用户随时随地通过网页、iOS、Android、Windows、MacOS 或 Linux 端无缝接入智能服务。 这款工具非常适合普通用户、学生、职场人士以及需要私有化部署的企业团队使用。对于开发者而言,它也提供了便捷的自托管方案,支持一键部署到 Vercel 或 Zeabur 等平台。 NextChat 的核心亮点在于其广泛的模型兼容性,原生支持 Claude、DeepSeek、GPT-4 及 Gemini Pro 等主流大模型,让用户在一个界面即可自由切换不同 AI 能力。此外,它还率先支持 MCP(Model Context Protocol)协议,增强了上下文处理能力。针对企业用户,NextChat 提供专业版解决方案,具备品牌定制、细粒度权限控制、内部知识库整合及安全审计等功能,满足公司对数据隐私和个性化管理的高标准要求。
ML-For-Beginners
ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程,旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周,包含 26 节精炼课程和 52 道配套测验,内容涵盖从基础概念到实际应用的完整流程,有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。 无论是希望转型的开发者、需要补充算法背景的研究人员,还是对人工智能充满好奇的普通爱好者,都能从中受益。课程不仅提供了清晰的理论讲解,还强调动手实践,让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持,通过自动化机制提供了包括简体中文在内的 50 多种语言版本,极大地降低了全球不同背景用户的学习门槛。此外,项目采用开源协作模式,社区活跃且内容持续更新,确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路,ML-For-Beginners 将是理想的起点。
ragflow
RAGFlow 是一款领先的开源检索增强生成(RAG)引擎,旨在为大语言模型构建更精准、可靠的上下文层。它巧妙地将前沿的 RAG 技术与智能体(Agent)能力相结合,不仅支持从各类文档中高效提取知识,还能让模型基于这些知识进行逻辑推理和任务执行。 在大模型应用中,幻觉问题和知识滞后是常见痛点。RAGFlow 通过深度解析复杂文档结构(如表格、图表及混合排版),显著提升了信息检索的准确度,从而有效减少模型“胡编乱造”的现象,确保回答既有据可依又具备时效性。其内置的智能体机制更进一步,使系统不仅能回答问题,还能自主规划步骤解决复杂问题。 这款工具特别适合开发者、企业技术团队以及 AI 研究人员使用。无论是希望快速搭建私有知识库问答系统,还是致力于探索大模型在垂直领域落地的创新者,都能从中受益。RAGFlow 提供了可视化的工作流编排界面和灵活的 API 接口,既降低了非算法背景用户的上手门槛,也满足了专业开发者对系统深度定制的需求。作为基于 Apache 2.0 协议开源的项目,它正成为连接通用大模型与行业专有知识之间的重要桥梁。