- BrainTools - https://www.braintools.ru -

Тихая эволюция zero-shot энкодеров. От UniNER до GLiNER 2

Эта статья является адаптацией моей статьи [1], опубликованной в Towards AI

Intro

Большие языковые модели показывают впечатляющую обобщающую способность, причём не только в задачах генерации текста вроде QA-ассистентов, но и в классификации, распознавании именованных сущностей (Named Entity Recognition) и других NLP-задачах.

С одной стороны, мы на старте эпохи AI агентов, где приложения с тулами управляются
LLM, помогая решать сложные задачи. С другой — слож ные задачи со сложными решениями и прожорливыми LLM требуют железа уровня дата-центра или vendor lock-in-а с зависимостью от внешних API .

Оба варианта дорогие, а есть задачи вроде классификации текста, извлечения информации (тот же NER), где нам не нужен предвзятый и галлюцинирующий алгоритм, а нужна заточенная, детерминированная на выходе модель, обученная под задачу с возможностью zero-shot.

В этой статье мы разберём эволюцию [2], которую вы возможно пропустили, полагаясь на LLM-ки в таких простых задачах. Эта эволюция multitask-энкодеров называется GLiNER. Начав с open-domain zero-shot NER, последняя архитектура умеет решать кучу задач, фокусируясь на извлечении информации и классификации текста. Киллер-фича в том, что бэкбоны у GLiNER в основном на базе энкодеров: bert, deberta, modernbert. Вам не нужно больше решать multitask через медленные LLM-ки и думать про инфраструктуру в контексте трейдоффов пропускной способности и качества, никакого KV-кэша, никакого Time to first token и Token Generation Time. Это просто один forward через модель.

GLiNER даёт простое, но красивое инженерное решение, включая все трейдоффы между скоростью, качеством и генерализацией.

Теперь каждый может просто написать:

from gliner2 import GLiNER2

extractor = GLiNER2.from_pretrained("your-model-name")


schema = (extractor.create_schema()

    .entities({

        "person": "Names of people mentioned",

        "date": "Dates and time references"

    })

    .structure("appointment")

        .field("patient", dtype="str")

        .field("doctor", dtype="str")

        .field("date")

        .field("time")

        .field("type", dtype="str", choices=["checkup", "followup", "consultation"])

)

text = """

Dr. Sarah Johnson confirmed the appointment with John Smith for 

March 15th at 2:30 PM. This will be a follow-up consultation 

regarding his previous visit on February 1st.

"""

results = extractor.extract(text, schema)

и решить 1, 2 или больше задач за один форвард

Так что давайте разберёмся и поймём историю за этим кодом, а я проведу вас через неё.

Universal NER

В 2023, до релиза GLiNER, Zhou et al. [3] показали Universal NER — Open Domain NER, дистиллированный из ChatGPT и построенный поверх обучения [4] других LLM: Vicuna 7B и 13B, превосходящий ChatGPT в большинстве случаев. Я не планирую фокусироваться на этой модели с точки зрения [5] подробностей ее обучения или сбора датасетов, моя цель – собрать основные инсайты.

Основные инсайты

Knowledge Distillation

UniNER использует ChatGPT для разметки текстов следующим промптом:

Позже тот же промпт будет использован в статье GLiNER как отсылка к этой работе и подтверждение эффективности.

UniNER по факту использует hard label distillation, тот же подход использовался относительно недавно (целый год назад!? D) в работе DeepSeek. (Думаю, вы все слышали эту историю)

В итоге UniNER показывает следующие результаты:

Тихая эволюция zero-shot энкодеров. От UniNER до GLiNER 2 - 1

В общем:

Insight #1: Использовать SOTA LLM (типа ChatGPT) как разметчика и учиться на hard лейблах достаточно не только чтобы приблизиться к учителю, но и превзойти его.

Single vs Multi label

UniNER оценил 3 сценария с 3 разными моделями:

  • type — только одна сущность за форвард (например “PERSON”)

  • all in one — несколько сущностей за один форвард (например “PERSON”, “LOCATION”, “ORGANIZATION”)

  • definition — только описания, сгенерированные ChatGPT для сущностей

Тихая эволюция zero-shot энкодеров. От UniNER до GLiNER 2 - 2

Как видите, модель с одним лейблом на forward pass превосходит остальные в большинстве случаев. Запоминаем этот трейдофф:

Insight #2: Больше лейблов и обобщаемости ≈ ниже точность

Всё ещё авторегрессия

Хотя авторы UniNER написали и выложили пару моделей [6], они всё ещё не просто отвечают найденными сущностями в тексте. Они генерируют это на инференсе, так что мы по-прежнему застреваем не только с форвардом, а с целым декодинг-пайплайном текстовой генерации. Надо разбираться с KV-кэшем и прочими проблемами генерации текста. И тут вместо инсайта я задам вопрос:

Вопрос 1: Нужна ли нам генерация текста для open-domain NER с кастомными сущностями?

И именно на этот вопрос отвечает следующая статья.

GLiNER

GLiNER: Generalist Model for Named Entity Recognition using Bidirectional Transformer. by Urchade Zaratiana et. all [7]

Intro

Статья начинается со следующих проблем:

  1. Традиционные NER-модели ограничены заранее определённым набором сущностей. Новые сущности требуют новой разметки.

  2. Большие языковые модели (начиная со статьи “Large Language Models are Few-shot learners”) показывают высокую обощающую способность со сравнимой точностью. При этом они состоят из миллиардов параметров и стоимость инференса или API высока.

GLiNER предлагает маленькую двунаправленную языковую модель (bert-like), где типы сущностей мэтчатся с текстовыми спанами в латентном пространстве. Это не просто bert for token classification, как из transformers. Это Span Categorizer, который работает не с токенами, а со спанами (текстовыми последовательностями — кусками всего входного предложения). Кстати если вам интересна тема NER с точки зрения токенов и спанов возможно вам зайдет эта статья [8].

Как это работает

Тихая эволюция zero-shot энкодеров. От UniNER до GLiNER 2 - 3

В модель подаются:

  1. Входной текст

  2. Типы сущностей как список лейблов

Оба подаются через BERT-модель, и из его выхода мы получаем представления в пространстве эмбеддингов. Эти представления разделены (обучены быть разделёнными) внутри сети:

  • сущности: через FFN-слой

  • оригинальное предложение разбивается на спаны окном до 12 токенов внутри спана

Финально GLiNER мэтчит представления спанов с заданными сущностями:

Тихая эволюция zero-shot энкодеров. От UniNER до GLiNER 2 - 4

span (i,j) означает часть предложения, например: span (0,2) = “John Smith”

И как видите, мы можем использовать эти phi как вероятность, и вот как это выглядит во время инференса:

from gliner import GLiNER

model = GLiNER.from_pretrained("urchade/gliner_multi-v2.1")

text = """

Cristiano Ronaldo dos Santos Aveiro (Portuguese pronunciation: [kɾiʃˈtjɐnu ʁɔˈnaldu]; born 5 February 1985) ...

"""

labels = ["person", "award", "date", "competitions", "teams"]

entities = model.predict_entities(text, labels)

print(entities)

# {'start': 1,

# 'end': 36,

# 'text': 'Cristiano Ronaldo dos Santos Aveiro',

# 'label': 'person',

# 'score': 0.9164333343505859},

# {'start': 92,

# 'end': 107,

# 'text': '5 February 1985',

# 'label': 'date',

# 'score': 0.9581286311149597},

# 'score': 0.9164333343505859},

Вот это и есть phi из формулы выше.

Основные инсайты

Дистилляция знаний

Как и в UniNER:

Тихая эволюция zero-shot энкодеров. От UniNER до GLiNER 2 - 5

Это не просто работает в плане получения разметки. А работает всё ещё в плане получения SOTA результатов с моделью всего на 459M параметров с бэкбоном deberta-v3:

Тихая эволюция zero-shot энкодеров. От UniNER до GLiNER 2 - 6

Insight #3: Insight #1 про hard label distillation по-прежнему работает с энкодерами

Backbones

Оригинальная статья GLiNER протестировала различные существующие на то время бэкбоны:

Тихая эволюция zero-shot энкодеров. От UniNER до GLiNER 2 - 7

Как видим, Deberta-бэкбон лучший на момент выхода статьи. И эмпирически до сих пор лучший (или один из лучших) для всех моделей на gliner-like архитектуре.

Интересный поинт Backbone deberta-v3 до сих пор используется в GLiNER 2 и GliClass (скоро до них дойдём) как один из лучших энкодеров на данный момент

Мэтчим спаны, а не генерим текст

Как мы знаем из части Как это работает — GLiNER просто делает мэтч спанов между текстом и списком лейблов. Вот и решение проблемы LLM: GLiNER просто сделал задачу генерации текста ненужной для open-domain NER, превосходя предыдущие SOTA модели с меньшим количеством параметров.

Insight #4: 459M GLiNER > UniNER 7B > ChatGPT (~100B+) превосходит SOTA, декодер с авторегрессией не нужен.Экосистема GLiNER

Зоопарк моделей

Архитектура GLiNER оказалась чем-то большим, чем просто NER-решение. Основная идея — мэтч текстовых спанов с эмбеддингами лейблов в латентном пространстве — была достаточно простой для адаптации к другим NLP-задачам. Комьюнити подхватило это быстро.

GliREL [9] применил тот же подход к relation extraction. GLinker [10] расширил до entity linking. GliClass [11] адаптировал мэтч спанов для классификации текста, работая с полным текстом и списком лейблов. Каждая из этих работ по сути задавала один и тот же вопрос: «а что если заменить task‑specific голову, но оставить энкодерный бэкбон и идею zero‑shot мэтчинга?»

И это прекрасно работало.

Но это создало новую проблему: зоопарк single task моделей, каждая со своим инференс-пайплайном, своим рецептом файн-тюнинга, своим деплой-сетапом. Нужен GLiNER для NER, GliClass для классификации, GliREL для relation. Три модели, три форвард-пасса, три архитектуры которые надо поддерживать.

Именно эту проблему решает GLiNER 2.

GLiNER 2

GLiNER2: An Efficient Multi-Task Information Extraction System with Schema-Driven Interface, by Urchade Zaratiana et. all [12]

GLiNER 2 — это не новая архитектура. Это унификация.

Zaratiana et al. взяли всё, что выросло из экосистемы GLiNER — NER, классификацию , также другие Information Extraction подходы – и объединили в единый фреймворк с одним форвардом. Зоопарк моделей становится одной моделью со schema-driven интерфейсом, который вы уже видели в начале статьи.

При этом бэкбон deberta-v3 по-прежнему остался, учитывая что ModernBERT уже вышел и ощущается быстрее. Одна из возможных причин, почему авторы остаются с deberta — Disentangled Attention, предложенный Pengcheng He et. all [13]. Который даёт более сопоставимые результаты на задачах мэтчинга спанов и текста, особенно в NER-задачах.

Что изменилось

Много задач за один форвард Вместо запуска отдельных моделей для каждой задачи, GLiNER 2 обрабатывает их одновременно. Определяете схему, подаёте с текстом, получаете структурированный вывод.

Расширенный контекст. Авторы увеличили длину контекста, позволяя обрабатывать больше текста и лейблов за один инференс — это важно когда вы решаете много задач за один проход на длинных документах.

Описания лейблов. Как вариант definition в UniNER, GLiNER 2 поддерживает развёрнутые описания лейблов, улучшая точность на неоднозначных или domain-specific типах лейблов.

Тихая эволюция zero-shot энкодеров. От UniNER до GLiNER 2 - 8

Tradeoffs

Объединение задач в одну модель вносит свои трейдоффы:

Тихая эволюция zero-shot энкодеров. От UniNER до GLiNER 2 - 9

Gliner 2 — превосходит GliClass и deberta-v3, но проигрывает GPT-4o, в отличие от оригинального GLiNER.

В zero-shot NER качество тоже снизилось:

Тихая эволюция zero-shot энкодеров. От UniNER до GLiNER 2 - 10

Помните один из инсайтов UniNER?

Инсайт #2: Больше лейблов и обобщаемости ≈ ниже точность

Мы вернулись к этому, но уже для GLiNER 2:

Инсайт #5: Унификация на множестве задач стоит точности в отдельных задачах. Качество NER у GLiNER 2 ниже чем у GLiNER 1, классификация неплохая, но не бьёт GPT-4o.

Тихая эволюция zero-shot энкодеров. От UniNER до GLiNER 2 - 11

Скорость по сравнению с deberta-v3 и GPT-4o значительно лучше и деградирует медленнее, но деградирует, да.

GLiNER 2 заточен под деплой на CPU, но по факту, как мы знаем, для высоконагруженного инференса вам всё равно нужны видеокарты от Nvidia.

На этом конец, мы начали с LLM по типу ChatGPT, которые хорошо обобщаются на новые задачи, а закончили с энкодером в 205M параметров, делающим ту же работу не лучше, но сопоставимо по качеству, принимая это как инженерный трейдофф.

Ключевые выводы

Insight #1: Использовать SOTA LLM (типа ChatGPT) как разметчика и учиться на hard лейблах достаточно не только чтобы приблизиться к учителю, но и превзойти его.

Insight #2: Больше лейблов и обобщаемости ≈ ниже точность

Insight #3: Insight #1 про hard label distillation работает и с энкодерами

Insight #4: 459M GLiNER > UniNER 7B > ChatGPT (~100B+) превосходит SOTA, декодер с авторегрессией не нужен.

Insight #5: Унификация на множестве задач стоит точности в отдельных задачах. Качество NER у GLiNER 2 ниже чем у GLiNER 1, классификация неплохая, но не бьёт GPT-4o. (Привет, Инсайт 2)

Автор: Bogdan_m01

Источник [14]


Сайт-источник BrainTools: https://www.braintools.ru

Путь до страницы источника: https://www.braintools.ru/article/27091

URLs in this post:

[1] статьи: https://medium.com/towards-artificial-intelligence/silent-evolution-of-zero-shot-encoders-from-uniner-to-gliner-2-bb5671be880c

[2] эволюцию: http://www.braintools.ru/article/7702

[3] Zhou et al.: https://arxiv.org/abs/2308.03279

[4] обучения: http://www.braintools.ru/article/5125

[5] зрения: http://www.braintools.ru/article/6238

[6] моделей: https://huggingface.co/Universal-NER

[7] GLiNER: Generalist Model for Named Entity Recognition using Bidirectional Transformer. by Urchade Zaratiana et. all: https://arxiv.org/abs/2311.08526

[8] эта статья: https://habr.com/ru/companies/raft/articles/991404/

[9] GliREL: https://arxiv.org/abs/2501.03172

[10] GLinker: https://github.com/Knowledgator/GLinker

[11] GliClass: https://arxiv.org/abs/2508.07662

[12] GLiNER2: An Efficient Multi-Task Information Extraction System with Schema-Driven Interface, by Urchade Zaratiana et. all: https://arxiv.org/abs/2507.18546v1

[13] Pengcheng He et. all: https://arxiv.org/abs/2006.03654

[14] Источник: https://habr.com/ru/companies/raft/articles/1010028/?utm_source=habrahabr&utm_medium=rss&utm_campaign=1010028

www.BrainTools.ru

Rambler's Top100