Большие языковые модели показывают впечатляющую обобщающую способность, причём не только в задачах генерации текста вроде 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 или больше задач за один форвард
Так что давайте разберёмся и поймём историю за этим кодом, а я проведу вас через неё.
В 2023, до релиза GLiNER, Zhou et al. показали Universal NER — Open Domain NER, дистиллированный из ChatGPT и построенный поверх обучения других LLM: Vicuna 7B и 13B, превосходящий ChatGPT в большинстве случаев. Я не планирую фокусироваться на этой модели с точки зрения подробностей ее обучения или сбора датасетов, моя цель - собрать основные инсайты.
UniNER использует ChatGPT для разметки текстов следующим промптом:
Позже тот же промпт будет использован в статье GLiNER как отсылка к этой работе и подтверждение эффективности.
UniNER по факту использует hard label distillation, тот же подход использовался относительно недавно (целый год назад!? D) в работе DeepSeek. (Думаю, вы все слышали эту историю)
В итоге UniNER показывает следующие результаты:
В общем:
UniNER оценил 3 сценария с 3 разными моделями:
type — только одна сущность за форвард (например "PERSON")
all in one — несколько сущностей за один форвард (например "PERSON", "LOCATION", "ORGANIZATION")
definition — только описания, сгенерированные ChatGPT для сущностей
Как видите, модель с одним лейблом на forward pass превосходит остальные в большинстве случаев. Запоминаем этот трейдофф:
Хотя авторы UniNER написали и выложили пару моделей, они всё ещё не просто отвечают найденными сущностями в тексте. Они генерируют это на инференсе, так что мы по-прежнему застреваем не только с форвардом, а с целым декодинг-пайплайном текстовой генерации. Надо разбираться с KV-кэшем и прочими проблемами генерации текста. И тут вместо инсайта я задам вопрос:
И именно на этот вопрос отвечает следующая статья.
GLiNER: Generalist Model for Named Entity Recognition using Bidirectional Transformer. by Urchade Zaratiana et. all
Статья начинается со следующих проблем:
Традиционные NER-модели ограничены заранее определённым набором сущностей. Новые сущности требуют новой разметки.
Большие языковые модели (начиная со статьи "Large Language Models are Few-shot learners") показывают высокую обощающую способность со сравнимой точностью. При этом они состоят из миллиардов параметров и стоимость инференса или API высока.
GLiNER предлагает маленькую двунаправленную языковую модель (bert-like), где типы сущностей мэтчатся с текстовыми спанами в латентном пространстве. Это не просто bert for token classification, как из transformers. Это Span Categorizer, который работает не с токенами, а со спанами (текстовыми последовательностями — кусками всего входного предложения). Кстати если вам интересна тема NER с точки зрения токенов и спанов возможно вам зайдет эта статья.
В модель подаются:
Входной текст
Типы сущностей как список лейблов
Оба подаются через BERT-модель, и из его выхода мы получаем представления в пространстве эмбеддингов. Эти представления разделены (обучены быть разделёнными) внутри сети:
сущности: через FFN-слой
оригинальное предложение разбивается на спаны окном до 12 токенов внутри спана
Финально GLiNER мэтчит представления спанов с заданными сущностями:
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:
Это не просто работает в плане получения разметки. А работает всё ещё в плане получения SOTA результатов с моделью всего на 459M параметров с бэкбоном deberta-v3:
Insight #3: Insight #1 про hard label distillation по-прежнему работает с энкодерами
Оригинальная статья GLiNER протестировала различные существующие на то время бэкбоны:
Как видим, Deberta-бэкбон лучший на момент выхода статьи. И эмпирически до сих пор лучший (или один из лучших) для всех моделей на gliner-like архитектуре.
Как мы знаем из части Как это работает — GLiNER просто делает мэтч спанов между текстом и списком лейблов. Вот и решение проблемы LLM: GLiNER просто сделал задачу генерации текста ненужной для open-domain NER, превосходя предыдущие SOTA модели с меньшим количеством параметров.
Архитектура GLiNER оказалась чем-то большим, чем просто NER-решение. Основная идея — мэтч текстовых спанов с эмбеддингами лейблов в латентном пространстве — была достаточно простой для адаптации к другим NLP-задачам. Комьюнити подхватило это быстро.
GliREL применил тот же подход к relation extraction. GLinker расширил до entity linking. GliClass адаптировал мэтч спанов для классификации текста, работая с полным текстом и списком лейблов. Каждая из этих работ по сути задавала один и тот же вопрос: «а что если заменить task‑specific голову, но оставить энкодерный бэкбон и идею zero‑shot мэтчинга?»
И это прекрасно работало.
Но это создало новую проблему: зоопарк single task моделей, каждая со своим инференс-пайплайном, своим рецептом файн-тюнинга, своим деплой-сетапом. Нужен GLiNER для NER, GliClass для классификации, GliREL для relation. Три модели, три форвард-пасса, три архитектуры которые надо поддерживать.
Именно эту проблему решает 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 типах лейблов.
Объединение задач в одну модель вносит свои трейдоффы:
Gliner 2 — превосходит GliClass и deberta-v3, но проигрывает GPT-4o, в отличие от оригинального GLiNER.
В zero-shot NER качество тоже снизилось:
Помните один из инсайтов UniNER?
Инсайт #2: Больше лейблов и обобщаемости ≈ ниже точность
Мы вернулись к этому, но уже для GLiNER 2:
Инсайт #5: Унификация на множестве задач стоит точности в отдельных задачах. Качество NER у GLiNER 2 ниже чем у GLiNER 1, классификация неплохая, но не бьёт GPT-4o.
Скорость по сравнению с 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)
Источник


Рынки
Поделиться
Поделиться этой статьей
Скопировать ссылкуX (Twitter)LinkedInFacebookEmail
Circle обгоняет BlackRock по токенизированным Trea
