UIE:统一信息抽取框架与多任务指令微调

FreeGuideOnline 最新 2026-06-23

[抽取指令]:找到文本中的人物和地点 [文本]:乔布斯在加利福尼亚州创立了苹果公司。

模型生成的输出:

{ "人物": ["乔布斯"], "地点": ["加利福尼亚州"] }

可以看出,UIE 将结构化信息线性化为文本序列,解码器以自回归方式生成整个 JSON 对象,再由程序解析为可用数据。

### Schema 的定义与结构化输出
Schema 是用户定义的抽取需求说明书。它可以非常简单(只定义实体类型),也可以包含约束条件或层级关系。常见的 Schema 表示方式:
- **实体抽取**:列出要抽取的实体类别,如 `["人物", "地点", "组织"]`。
- **关系抽取**:描述实体对的关系类型,如 `{"人物-组织": "任职于"}`。
- **事件抽取**:定义事件类型、论元角色等。
- **组合抽取**:同时给出实体、关系甚至事件,要求模型一步输出所有结构化信息。

模型输出总是符合 Schema 约束的结构化文本,通常是 JSON 格式(有时也使用特殊的括号标记)。这种一致性使得后处理极其简单。

### 多任务指令微调:如何训练一个通用抽取器
UIE 的强大泛化能力源于**多任务指令微调**。训练数据构造方式如下:
1. 收集多种信息抽取标注数据(NER、RE、EE、情感分类等),每一份数据都附有对应的任务描述文本(指令)。
2. 将标注结果转换为符合 Schema 的文本格式(如 JSON 字符串)。
3. 将指令、原始文本拼接为输入,将结构化结果作为输出目标,形成大量 `(输入文本, 输出文本)` 对。
4. 使用预训练的 T5 等生成模型在这些数据上进行多任务微调,模型被迫学习理解不同的抽取指令并输出正确的结构。

指令形式丰富多样,例如:
- “抽取文本中的地名”
- “找出所有人物,并提取他们所属的公司”
- “识别文本中的事件,并列出参与者”

通过这种训练,模型不再记忆特定实体标签,而是学会了**根据指令动态调整抽取行为**,实现真正的“通用抽取”。

## 快速上手:使用 UIE 进行信息抽取

### 环境准备
推荐使用 PaddleNLP 生态的 UIE 实现,它提供了开箱即用的预训练模型和工具。安装命令:
```bash
pip install paddlenlp

或者使用社区在 HuggingFace 上的 UIE 模型(需安装 transformers):

pip install transformers

加载预训练模型

PaddleNLP 提供了 Taskflow API,一行代码即可完成常见信息抽取任务:

from paddlenlp import Taskflow

# 加载通用信息抽取模型
uie = Taskflow("information_extraction", schema=["人物", "地点", "组织"])

schema 参数定义了你要抽取的实体类型。你可以随时修改 schema 无需重新加载模型。

单任务抽取示例(命名实体识别)

text = "李华在2023年加入阿里巴巴,工作地点在杭州。"
result = uie(text)
print(result)

输出示例:

[
  {
    "人物": [{"text": "李华", "start": 0, "end": 2}],
    "组织": [{"text": "阿里巴巴", "start": 8, "end": 12}],
    "地点": [{"text": "杭州", "start": 19, "end": 21}]
  }
]

模型不仅抽出了实体文本,还给出了起止位置,便于高亮或下游处理。

零样本抽取:无需训练的新类型

修改 schema 即可尝试完全未在训练集中出现的实体类型:

uie_zero = Taskflow("information_extraction", schema=["操作系统", "创始人"])
text = "苹果公司创始人史蒂夫·乔布斯于1976年推出了Apple I操作系统。"
print(uie_zero(text))

输出中会包含“操作系统:Apple I”、“创始人:史蒂夫·乔布斯”。这种能力来自模型对自然语言描述的理解,而不仅仅是标签记忆。

深入:指令微调与自定义抽取

构造微调数据

针对领域特定需求,你可以用自己的标注数据对 UIE 进行指令微调。数据格式要求每条样本包含:

  • content:输入文本。
  • result:符合 Schema 的标准抽取结果(JSON 字符串)。
  • prompt:可选的指令提示,例如“查找以下文本中的专利编号和申请日期”。

示例数据(JSON 行文件):

{"content":"本发明专利号CN20231001,申请日期2023年6月5日。","result":{"专利编号":["CN20231001"],"申请日期":["2023年6月5日"]},"prompt":"抽取专利编号和申请日期"}

建议至少准备 200~500 条高质量标注数据,用多任务混合其他通用抽取数据一起微调,防止灾难性遗忘。

多任务混合训练

使用 PaddleNLP 的微调脚本,将你的自定义数据与通用抽取数据混合,设置训练参数:

python -m paddlenlp.tools.trainer ... --train_path your_data.jsonl --model_name_or_path uie-base