Тихая эволюция zero-shot энкодеров. От UniNER до GLiNER 2. ai.. ai. encoder.. ai. encoder. Gliner.. ai. encoder. Gliner. gliner2.. ai. encoder. Gliner. gliner2. llm.. ai. encoder. Gliner. gliner2. llm. ml.. ai. encoder. Gliner. gliner2. llm. ml. Natural Language Processing.. ai. encoder. Gliner. gliner2. llm. ml. Natural Language Processing. nlp.. ai. encoder. Gliner. gliner2. llm. ml. Natural Language Processing. nlp. zero-shot.. ai. encoder. Gliner. gliner2. llm. ml. Natural Language Processing. nlp. zero-shot. Блог компании Raft.. ai. encoder. Gliner. gliner2. llm. ml. Natural Language Processing. nlp. zero-shot. Блог компании Raft. искусственный интеллект.. ai. encoder. Gliner. gliner2. llm. ml. Natural Language Processing. nlp. zero-shot. Блог компании Raft. искусственный интеллект. Машинное обучение.

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

Intro

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

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

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

В этой статье мы разберём эволюцию, которую вы возможно пропустили, полагаясь на 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. показали Universal NER — Open Domain NER, дистиллированный из ChatGPT и построенный поверх обучения других LLM: Vicuna 7B и 13B, превосходящий ChatGPT в большинстве случаев. Я не планирую фокусироваться на этой модели с точки зрения подробностей ее обучения или сбора датасетов, моя цель – собрать основные инсайты.

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

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 написали и выложили пару моделей, они всё ещё не просто отвечают найденными сущностями в тексте. Они генерируют это на инференсе, так что мы по-прежнему застреваем не только с форвардом, а с целым декодинг-пайплайном текстовой генерации. Надо разбираться с KV-кэшем и прочими проблемами генерации текста. И тут вместо инсайта я задам вопрос:

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

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

GLiNER

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

Intro

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

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

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

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

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

Тихая эволюция 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 применил тот же подход к relation extraction. GLinker расширил до entity linking. GliClass адаптировал мэтч спанов для классификации текста, работая с полным текстом и списком лейблов. Каждая из этих работ по сути задавала один и тот же вопрос: «а что если заменить 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

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

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

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

Источник

Rambler's Top100