GLiNER2多任务Schema实战:一次前向传播同时完成5类抽取任务
【免费下载链接】GLiNER2Unified Schema-Based Information Extraction项目地址: https://gitcode.com/gh_mirrors/gl/GLiNER2
GLiNER2 是一个 Schema 驱动的统一信息抽取框架,能在一次前向传播中同时完成实体抽取、文本分类、结构化记录、关系抽取与片段属性标注 5 类任务。传统做法要为每类任务部署一个模型、跑一遍管线,而 GLiNER2 只需用一个 Schema 声明所有任务,调用一次extract()即可拿到全部结果,推理成本几乎不随任务数增加,且支持纯 CPU 本地运行。
为什么需要"一次前向传播"做多任务?
常见的信息抽取管线通常这样工作:
- 跑一遍 NER 模型抽实体
- 跑一遍分类模型判情感
- 跑一遍 JSON 抽取模型解析字段
- ……再跑一遍关系抽取
每一遍都要把文本重新编码一次,模型越多,延迟越高、维护成本越大。
GLiNER2 的思路是Schema 条件化(schema-conditioned):所有任务共用同一个 DeBERTa-v3 编码器,任务类型(实体、标签、字段、关系)被编码为查询条件注入同一次前向传播。换句话说,5 个任务共享同一次文本编码,这就是"一次前向传播"的含义。
5 类任务一览
| 任务 | Schema 方法 | 典型场景 |
|---|---|---|
| 实体抽取 | .entities() | 人名、公司、产品、日期 |
| 文本分类 | .classification() | 情感、意图、文档类型(支持多标签) |
| 结构化抽取 | .structure() | 发票字段、订单信息、病历条目 |
| 关系抽取 | .relations() | "A 就职于 B"这类头尾实体对 |
| 片段属性 | .entity_attributes() | 给抽出的产品片段单独标注情感 |
上图展示了配合 GLiNER2 使用的微调与部署界面:上传训练数据、选择模型、一键训练后即可在本地或服务端推理。
快速上手:3 步完成多任务抽取
安装带本地推理的完整包(需 Python 3.10+):
pip install gliner2[local]第 1 步:加载模型。AutoExtractor会根据检查点自动选择 span(GLiNER2)或 boundary(GLiNER2.5)架构:
from gliner2 import AutoExtractor, AttributeGroup extractor = AutoExtractor.from_pretrained("fastino/gliner2.5-base-v1")第 2 步:用一个 Schema 声明全部 5 类任务。链式调用即可,详见 tutorial/4-combined.md:
schema = ( extractor.create_schema() # ① 文本分类 .classification("sentiment", ["positive", "negative", "neutral"]) # ② 实体抽取 .entities(["person", "product", "company"]) # ③ 片段属性:只给 product 标注情感 .entity_attributes({ "span_sentiment": AttributeGroup( ["positive", "negative", "neutral"], applies_to=["product"], qualify_labels=True, ) }) # ④ 关系抽取 .relations(["works_for"]) # ⑤ 结构化抽取 .structure("order_info") .field("order_number", dtype="str") .field("amount", dtype="str") .field("status", dtype="str", choices=["pending", "shipped", "delivered"]) )第 3 步:一次调用,全部返回。
text = ("Tim Cook works for Apple. I ordered an iPhone for $999, " "status is shipped. Great camera, disappointing battery.") result = extractor.extract( text, schema, include_confidence=True, # 每个结果带置信度 include_spans=True, # 每个片段带 [start, end) 字符位置 )返回是一个字典,5 类任务的结果并列其中:sentiment给出文档级情感,entities按类型分组,span_sentiment挂在对应 product 片段上,relation_extraction给出 works_for 的头尾对,order_info给出结构化的字段值。
3 个实用技巧
1. 用描述提升抽取精度
实体类型可以写成{类型名: 描述}的形式,描述会被编码进 Schema 查询,显著提升歧义场景的准确率。例如把"medication": "药品或药物名称"作为实体定义,比裸词"medication"更稳。
2. 片段属性 ≠ 文档分类
一篇评测可以整体"中性",但其中 iPhone 摄像头是"正面"、电池是"负面"。文档级情感用.classification(),片段级情感用.entity_attributes(),两者可以共存于同一个 Schema。更多细节见 tutorial/13-span_attributes.md。
3. 长文档与批量处理
文本超过模型窗口时,用extract_long()/batch_extract_long(),它会自动按重叠分块、把片段位置映射回原文并合并重叠区的重复结果。多个文档则用batch_extract(),还可以为每条文档指定不同的 Schema。
进阶:需要全局一致的关系图时用 JointIE
上面第 ④ 类的关系抽取是"独立解码"——关系和实体分别打分,无法保证works_for的头一定是 person、尾一定是 organization,也无法限制"每个人最多一个雇主"。
如果这类约束对业务很重要,升级到JointIE:它在候选分数之上做带约束的图搜索,保证整张关系图全局满足你声明的类型端点、唯一性、无自环、无环等硬约束。完整用法见 tutorial/15-joint_ie.md。
相关文档与源码
- 多任务组合详解(含发票、医疗、法律等完整 Schema 示例):tutorial/4-combined.md
- 片段属性教程:tutorial/13-span_attributes.md
- 联合信息抽取(带约束关系图):tutorial/15-joint_ie.md
- 训练数据格式与微调教程:tutorial/8-train_data.md、tutorial/9-training.md
- Schema 构建器源码:gliner2/inference/schema.py
- 抽取运行时(
extract/extract_long实现):gliner2/inference/runtime.py
小结
| 你的需求 | 推荐做法 |
|---|---|
| 多种抽取任务并行、省延迟 | 一个组合 Schema +extract() |
| 只抽实体/只分类 | 直接用extract_entities()/classify_text()简写 API |
| 关系必须满足类型与数量约束 | JointIE+ 约束 Schema |
| 中文等无空格语言 | 加载时指定word_splitter="char" |
| 隐私敏感场景 | 本地 CPU 推理,零外部依赖 |
GLiNER2 把"多个模型、多次编码"压缩成"一个 Schema、一次前向传播",是构建统一信息抽取管线的高效选择。
【免费下载链接】GLiNER2Unified Schema-Based Information Extraction项目地址: https://gitcode.com/gh_mirrors/gl/GLiNER2
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考