ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

如何设计抽取Schema?GLiFormer Large v1推理时指定任务的技巧与示例

如何设计抽取Schema?GLiFormer Large v1推理时指定任务的技巧与示例
  • 人工智能
  • NLP
  • 大模型

【免费下载链接】gliformer-large-v1

项目地址:https://ai.gitcode.com/hf_mirrors/knowledgator/gliformer-large-v1
点击查看免费下载

GLiFormer Large v1 是一个 575.6M 参数的统一文本信息抽取模型:它共享同一个 DeBERTa 编码器,并在推理时通过传入任务标签和**抽取 Schema(schema)**即可完成命名实体识别、文本分类、关系抽取和结构化记录抽取,无需为每个任务单独微调。本文面向新手,讲清楚抽取 Schema 应该怎么设计,以及在推理时如何指定任务。📌

为什么"推理时指定任务"很重要

传统做法是每个 NLP 任务训练一个专用模型,维护成本很高。GLiFormer Large v1 的思路是:一个模型 + 任意任务标签——模型在 README.md 中被描述为"One encoder for PDF layout processing, entity recognition, classification, relation extraction, structured records, and text embeddings"。

任务类型调用方法推理时需要你提供什么
命名实体识别(NER)predict_entities实体类型列表,如["person", "organization"]
文本分类classify类别标签列表,或分组字典
联合关系抽取inference(joint_relations=...)实体类型 + 关系类型一起传入
结构化抽取structure字典或嵌套 Pydantic Schema
文本向量embed_text无需标签,直接输出 1024 维向量

一句话理解:Schema 就是你在推理时告诉模型"要从文本里挖出什么结构"的说明书。说明书写得越清晰,抽取得越准。

快速安装与加载模型

先安装官方推理框架(需要 Python 3.10+):

pip install gliformer -U

然后加载本仓库的模型权重:

import torch from gliformer import GLiFormer model = GLiFormer.from_pretrained( "knowledgator/gliformer-large-v1", load_tokenizer=True, ) model = model.to("cuda" if torch.cuda.is_available() else "cpu").eval()

📌 如果你把模型下载到本地,只需把模型 ID 换成本地 checkpoint 目录路径即可,代码完全不用改。

抽取 Schema 设计的 5 个核心技巧

1️⃣ 实体类型:短小、互斥、小写

NER 任务中,Schema 就是一个实体类型字符串列表。建议每个类型名简短且含义互斥,例如:

entities = model.predict_entities( "Alice works at Acme in London.", ["person", "organization", "location"], threshold=0.5, )

每个结果包含text、label、start、end、score五个字段,偏移量是字符位置,end不含边界。💡技巧:类型名用业务里最常用的英文词(如person而非human_name_full),过长的类型名会稀释注意力。

2️⃣ 分类标签:覆盖全部可能性

分类任务的 Schema 是候选标签列表,建议"能枚举就枚举、尽量互斥":

predictions = model.classify( "The new search feature is fast and easy to use.", ["positive", "negative", "neutral"], threshold=0.5, )

它还支持分组标签,一次判断多个维度,例如:

{"sentiment": ["positive", "negative"], "topic": ["product", "support"]}

3️⃣ 关系抽取:实体和关系必须"成对"传入

联合关系抽取(joint relation extraction)需要把实体类型 + 关系类型放在同一个字典里,模型才能理解"谁和谁之间是什么关系":

results = model.inference( "Alice works at Acme.", joint_relations={ "employment": { "entities": ["person", "organization"], "relations": ["works_at"], } }, threshold=0.5, )

⚠️ 注意:本 checkpoint 没有开放关系(open relation)头,所以请用inference+joint_relations,而不是predict_relations便捷方法。

4️⃣ 结构化 Schema:扁平用字典,多级用 Pydantic

结构化抽取可以直接把文本"灌"进你定义的结构里。最简单的 Schema 是一个字典——外层 key 是记录名,value 是字段列表:

records = model.structure( "Alice works at Acme.", {"employee": ["name", "company"]}, ) # {'employee': [{'name': 'Alice', 'company': 'Acme'}]}

需要多级嵌套时,用 Pydantic 模型描述"父-子"层级,并开启validate_output=True做结构校验:

from pydantic import BaseModel class Employee(BaseModel): name: str role: str class Department(BaseModel): name: str employees: list[Employee] records = model.structure(text, {"department": Department}, validate_output=True)

💡技巧:字段名(如name、company)尽量与原文用词贴近,字段越少、越扁平,抽取越稳;深层嵌套会放大误差传递。

5️⃣ 用好threshold和批量参数

  • threshold(默认示例 0.5)控制置信度过滤:结果偏多就调高,偏少就调低;
  • 传入文本列表 +batch_size=8可批量抽取,提升吞吐;
  • 预测结果受Schema 措辞、领域、输入长度、阈值共同影响,同一句话换一组标签,结果可能不同——这属于正常行为,不是 bug。

一次调用跑多个任务:Schema 组合示例

inference方法可以把多种任务 Schema 合并到一次前向里,返回字典按任务分组,每组对应每个输入一条结果:

results = model.inference( "Alice joined Acme as a software engineer.", entities=["person", "organization"], classes=["business", "sports", "technology"], structures={"employee": ["name", "company"]}, ) print(results["ner"][0]) print(results["classification"][0]) print(results["structuring"][0])

仓库文件速览:Schema 与任务的边界在哪里

本仓库是一个标准的 Hugging Face checkpoint 目录,核心文件如下:

文件作用
pytorch_model.bin模型权重,约 2.3 GB(Git LFS 管理)
gliner_config.json模型结构配置:deberta_2d骨干 + 各任务头(NER、分类、联合关系、结构化、embedding)
tokenizer.json / tokenizer_config.json分词器词表与配置
trainer_state.json训练状态:3000 步,loss 从 0.276 降至 0.138
README.md完整用法、评估指标与限制说明

几个值得留意的配置项(来自 gliner_config.json):

  • max_types: 128:单次推理最多可指定 128 个标签类型;
  • max_len: 16384:最大输入长度;
  • max_width: 12、max_count: 20:约束 span 宽度与记录数量,属于官方在 README.md 中提到的"固定记录锚点与 span 宽度限制抽取容量"的边界。

📌 另外,配置文件叫gliner_config.json是历史命名(GLiFormer 框架早期从 GLiNER 演化而来),并不是说这是 GLiNER 模型。

常见问题(FAQ)

Q:为什么我换了一组实体类型,结果差别很大?A:Schema 措辞直接影响预测。模型是按"你给的标签"去找对应 span 的,建议用简洁、领域通用的英文标签,并通过调整threshold校准召回/精度。

Q:关系抽取为什么不能用predict_relations?A:本 checkpoint 没有开放关系头,只有联合关系头,所以要用inference的joint_relations参数(详见 README.md)。

Q:validate_output=True能保证内容正确吗?A:不能。它只校验输出结构是否符合 Pydantic Schema,不校验事实正确性;模型仍可能漏抽、选错 span 或把记录挂到错误的父节点下。

Q:其他语言支持如何?A:已公布的评估结果覆盖的是英文任务;其他语言、文档版面输入和 embedding 基准的效果未被现有结果背书,建议先小样本验证。

小结:Schema 设计清单 ✅

  1. 标签名短、小写、互斥,贴近原文用词;
  2. 分类标签尽量枚举完整,可用分组字典做多维分类;
  3. 关系抽取把实体与关系成对传入joint_relations;
  4. 结构化 Schema先扁平后嵌套,必要时用 Pydantic +validate_output;
  5. 用threshold与batch_size平衡精度、召回与吞吐。

掌握"推理时指定 Schema"这一思路后,同一个 GLiFormer Large v1 模型就能覆盖你业务里大部分轻量级信息抽取需求——先跑通一个任务,再逐步组合多任务,是最上手的路线。

  • 人工智能
  • NLP
  • 大模型

【免费下载链接】gliformer-large-v1

项目地址:https://ai.gitcode.com/hf_mirrors/knowledgator/gliformer-large-v1
点击查看免费下载

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

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进