NER-gids 2026: GLiNER, spaCy, Transformers en LLMs
Automatische vertaling Dit artikel is automatisch vertaald vanuit de oorspronkelijke Engelse versie.
Artikelupdate
Oorspronkelijk gepubliceerd op 2 april 2026. Gereviewd en bijgewerkt op 6 september 2026. De update behandelt nieuwere GLiNER-modellen, streaming-PII-detectie, APIs voor structured extraction en de interpretatie van benchmarks.
Named entity recognition (NER) zet tekst om in gelabelde onderdelen die een programma kan gebruiken. Gegeven “Bill Gates founded Microsoft on April 4, 1975,” kan het de aaneengesloten tekstspans Bill Gates, Microsoft en April 4, 1975 retourneren met de types person, organization en date. In een span-based encoder zoals GLiNER leest het model de tekst één keer en scoort het candidate spans tegen de labels die je aanlevert. Een NER-systeem kiezen betekent bepalen hoeveel latency, kosten, labelflexibiliteit en reasoning deze extractie vereist.
De companion repository bevat smoke examples voor GLiNER, ONNX-export, het genereren van annotaties en structured extraction. De vergelijking van drie zinnen is geen modelranking: de scorer voegt herhaalde combinaties van tekst en type samen en kan afsluitende gold-documenten negeren wanneer predictions ontbreken. Het teacher-script bevat bovendien geen gedemonstreerde conversie naar gereviewde trainingsspans. Gebruik deze voorbeelden om APIs te inspecteren, niet om een afgeronde training- of evaluatieworkflow te claimen. Voor workloads die vooral uit expliciete spans bestaan, zijn compacte encoders meestal de snellere en goedkopere optie. LLMs blijven nuttig voor het genereren van trainingsdata en voor gevallen die inference of normalisatie vereisen. De benchmarksecties leggen de gepubliceerde vergelijkingen en hun beperkingen uit; geen daarvan is een nieuwe benchmarkrun voor deze gids.
Voor een retrieval- of privacy-pipeline zou ik eerst vragen of de output een letterlijke mention moet zijn. Die beslissing onderscheidt een span recognizer van systemen die waarden ook normaliseren, records linken of feiten afleiden.
Companion repo: ner-field-guide, met uitvoerbare demo’s voor GLiNER, ONNX-export, de LLM-as-teacher-pipeline en structured extraction met Instructor.
Zie voor de korte modelvergelijking Best NER Models in 2026.
Wat is named entity recognition?
Named entity recognition vindt spans in tekst en kent daaraan types toe, zoals person, organization, date, product of domeinspecifieke labels. Een span is een aaneengesloten onderdeel van de oorspronkelijke tekst. NER identificeert de mention; entity linking is de afzonderlijke stap waarin deze wordt gekoppeld aan een canonical record of ontology-concept.
| Workload | Eerste model om te testen | Escaleren wanneer |
|---|---|---|
| IDs of controlled dictionaries | Rules of spaCy EntityRuler | Recall buiten bekende patterns belangrijk wordt. |
| Stabiele labels en veel trainingsdata | spaCy of een fine-tuned encoder | De labelset verandert of recall op rare types stagneert. |
| Veranderende labels; kleine type-inventory | GLiNER cross-encoder | De inventory groeit of labels in veel documenten worden hergebruikt. |
| Grote, herbruikbare type-inventory | GLiNER bi-encoder | De domain set een regressie in kwaliteit of calibration laat zien. |
| Meerdere extraction-taken in één text-pipeline | GLiNER2.5 | De joint-task-kwaliteit het doel per taak niet haalt. |
| Implicit facts of schema reasoning | Structured LLM extraction | Latency, kosten of unsupported claims het productbudget overschrijden. |
Waar moderne systemen NER gebruiken
NER vindt nog steeds spans in tekst en kent daar labels aan toe. Wat is veranderd, is de positie ervan in het systeem. NER levert nu filters voor RAG, structured arguments voor agent-tools en velden voor document-processing-pipelines. Daardoor zijn latency, kosten en schemadeflexibiliteit net zo belangrijk geworden als benchmarknauwkeurigheid.
RAG: betere retrieval door entity extraction
Similarity search alleen heeft moeite met vragen die exacte entities bevatten. Bij “what did Anthropic say about model safety in Q4 2024?” kan entity extraction bijvoorbeeld “Anthropic” en “Q4 2024” als filters voorstellen. Pas een hard filter alleen toe wanneer de geïndexeerde metadata en date semantics dit ondersteunen; gebruik het anders als ranking-signaal of behoud een unfiltered retrieval path. Een gemiste alias of een onjuist afgeleide date range kan het antwoord uitsluiten.
Tijdens indexing extraheer je entities uit elke chunk en sla je ze op als metadata: {"organizations": ["Anthropic"], "dates": ["Q4 2024"], ...}. Zo kun je eerst op entity filteren en daarna vector search uitvoeren. Knowledge graph RAG (GraphRAG, LlamaIndex property graphs) voegt named relationships toe die retrieval over meerdere hops kan volgen. Vergelijk dit met herhaalde vector searches op de vragen en het corpus die je moet ondersteunen.
Op querytijd sturen entities uit de vraag de routing aan. Een vraag met een bedrijfsnaam gaat naar een finance-index; een vraag met geneesmiddelnamen naar een clinical knowledge base. GLiNER is nuttig wanneer het query-time-schema of de entity types veranderen. Onbekende bedrijfs- of geneesmiddelnamen vereisen op zichzelf geen open-vocabulary labels; een closed-label-model kan nieuwe mentions van bekende types nog steeds herkennen.
AI agents: tekst omzetten in structured facts
Agents ontvangen unstructured text, zoals webpagina’s, API-responses en user messages. NER zet die tekst om in structured facts waarover de agent kan redeneren, die hij kan opslaan of aan tools kan doorgeven.
Voor tool routing kan een request als “schedule a meeting with Sarah Chen from Accenture on Thursday at 2pm” PERSON: Sarah Chen, ORGANIZATION: Accenture, DATE: Thursday en TIME: 2pm opleveren. Een calendar resolver combineert de datum en tijd vervolgens tot de timestamp die de API vereist. Een lokale encoder vermijdt de API round trip en is vaak aanzienlijk sneller, maar latency hangt af van het model, de runtime, hardware, batch size en het aantal labels. Meet beide paden op de calendar-workload in plaats van uit te gaan van een vast verschil in milliseconden.
NER ondersteunt ook entity tracking over gesprekken heen. Agent memory-systemen moeten weten dat “Sarah” in turn 3 en “Ms. Chen” in turn 12 dezelfde persoon zijn. NER identificeert de spans; coreference resolution bepaalt of de mentions in context naar dezelfde persoon verwijzen. Entity linking koppelt die persoon vervolgens aan een canonical record, wanneer dat bestaat.
In beide gevallen is latency de beperking. Als elk van tien sequential steps een NER-call van 200 ms uitvoert, voegen die NER-calls 2 seconden perceived delay toe. Eén call voegt 200 ms toe. Encoder-modellen passen meestal beter binnen agent loops voor entity work dan LLM-based extraction.
Document intelligence: van images naar structured data
OCR zet images om in tekst. NER zet die tekst om in structured fields.
Een standaardpipeline gebruikt eerst OCR, zoals Tesseract, Azure Document Intelligence of AWS Textract, om tekst en bounding boxes te produceren. NER vindt vervolgens spans voor velden zoals invoice_number, vendor_name, total en due_date. Een schema- of relation-extraction-stap moet omschrijvingen, hoeveelheden en prijzen van line items groeperen in line_items. Dezelfde sequence geldt voor contracten, medische dossiers en regulatory filings.
Moderne document-pipelines combineren mogelijk layout understanding, entity extraction en relation extraction. OCR of een layout-aware document model levert nog steeds tekst, reading order, tabellen en bounding boxes. De huidige GLiNER2.5 stelt entities, relations, classification en structured records beschikbaar via een schema-interface. Evalueer elke output afzonderlijk; het oudere GLiNER2-paper benchmarkte niet elke taak die nu door de library wordt aangeboden.
Kosten bepalen het grootste deel van deze pipelines. Bereken je prijs op basis van het werkelijke maandelijkse documentvolume, inclusief retries en review. Een compacte encoder kan op CPU draaien, terwijl een API-based LLM per-document inference-kosten en latency toevoegt. Een praktische test is om een representatieve invoiceset met een LLM te labelen. Fine-tune GLiNER op de gereviewde records en vergelijk beide paden vervolgens op field-level F1, latency en totale kosten.
PII-detectie en LLM guardrails
De gegevensbeschermingsprincipes en beveiligingsplichten van de GDPR (Articles 5, 25, and 32), de technologie-neutrale Security Rule van HIPAA (HHS guidance) en de Californische CCPA, zoals gewijzigd door CPRA, leggen verschillende rechten en risk-based safeguards op. De aangehaalde bepalingen schrijven geen NER of specifieke pre-model scanning architecture voor. Dit is geen juridisch advies; laat counsel de vereisten beoordelen die op jouw data en jurisdictie van toepassing zijn. NER kan data inventory, minimization of de-identification ondersteunen, maar is slechts één control waarvan recall moet worden gevalideerd voor de relevante data en jurisdictie.
NER handelt dit rechtstreeks af. De-identification-modellen vinden spans zoals PERSON, SSN, PHONE, EMAIL en ADDRESS en redigeren deze of vervangen ze door synthetische equivalenten. Microsoft Presidio combineert recognizers met anonymization operators; de voorbeelden bevatten ook GLiNER as a recognizer. De 0.3B-parameter GLiNER2-PII is een andere kandidaat: het paper behandelt 42 PII-types op character-span resolution. Geen van beide vormt compliance evidence. Valideer recall per dataformaat, jurisdictie, taal en PII-class voordat je een detector als control gebruikt.
In John Snow Labs’ vendor-run comparison omvatten 48 door experts geannoteerde documenten zes PHI-classes. Provider-labels zijn remapped en niet-mappable predictions zijn uitgesloten, wat de cross-provider-interpretatie beperkt. Het Providence report beschrijft 281 gelekte PHI-events in een review van 1.000 notes met 34.701 zinnen. Events zijn geen afzonderlijke affected sentences: tel in een privacy-evaluatie zowel gelekte instances als affected documents.
Voor LLM guardrails werkt NER als een pre-screeninglaag: scan user input op PII voordat je die naar een externe API stuurt en blokkeer of anonymiseer de input vervolgens. Dat kan sneller of eenvoudiger zijn dan de LLM vragen zichzelf te modereren. Behandel dit als een deployment-hypothesis: meet beide paden op jouw model, hardware, inputmix en recall-target. False negatives blijven mogelijk, dus voeg een andere control toe voor de PII-exposure die je systeem niet kan accepteren. GLiNER is hier bijzonder nuttig omdat PII-categorieën per jurisdictie verschillen. Een API kan een nieuw label zoals “genetic information” accepteren zonder retraining. Dat bewijst geen recall voor de nieuwe categorie; valideer die eerst op gereviewde voorbeelden voordat je erop vertrouwt.
GLiNER: span-to-label matching voor open-vocabulary NER
GLiNER (NAACL 2024, Zaratiana et al.) maakte encoder-based NER concurrerend met LLMs tegen een fractie van de kosten. In plaats van NER te behandelen als sequence labeling of text generation, behandelt GLiNER het als een matchingprobleem. Het scoort elke candidate text span (elke aaneengesloten woordreeks, zoals “Bill Gates” of “Microsoft”) tegen elk entity-type-label en behoudt vervolgens de pairs met een hoge score.
Het model krijgt entity-type-labels en inputtekst als één sequence: [ENT] person [ENT] organization [ENT] date [SEP] Bill Gates founded Microsoft.... Een bidirectional transformer (DeBERTa-v3) encodeert alles gezamenlijk.
Uit de output bouwt het model twee representatiesets. De ene verfijnt elke entity-type-representatie vanaf een [ENT]-tokenpositie via een kleine feed-forward network (FFN) die de vector van de encoder transformeert. De andere representeert text spans door start- en end-word-vectors via een andere FFN te combineren. Een dot product tussen een span-representatie en een entity-type-representatie levert een score op.
Pas sigmoid toe en je krijgt de probability dat de span van word position tot word position tot entity type behoort: . Hier is de span-vector die door de FFN is geproduceerd en de door de FFN verfijnde entity-type-embedding van de corresponderende [ENT]-token (Zaratiana et al., 2024, Eqs. 1–2). Candidate spans zijn begrensd op 12 woorden; de tokenizer kan één woord in meerdere subword-tokens splitsen.
GLiNER accepteert natural-language label descriptions tijdens inference zonder retraining, maar de extraction-kwaliteit hangt af van label wording en domain fit. Je geeft entity types door zoals “person”, “adverse drug reaction” of “financial instrument”, waarna het model spans daartegen scoort. De 50M-, 90M- en 300M-configuraties hieronder zijn de modellen uit het oorspronkelijke paper. De v2.1 model card vermeldt daarentegen 166M-, 209M- en 459M-English-checkpoints plus een 209M-multilingual checkpoint, alle onder Apache 2.0. Vergelijk latency of memory tussen die generaties niet alsof de parameterbenamingen identiek zijn (GLiNER v2.1 model card).
Voor een echte hard zero-shot-test houd je zowel target types als target examples apart: het model heeft geen gelabelde voorbeelden voor de target task. Een type description zoals “a medically confirmed adverse effect caused by a treatment” geeft het model meer informatie dan alleen adverse event. Dat garandeert geen transfer, maar description-driven ZeroNER presteerde beter dan name-only baselines op de benchmarks met held-out types (Cocchieri et al., 2025).
De trainingsdata voor het oorspronkelijke model kwam uit de Pile-NER-dataset: 44.889 passages met 240K entity spans over 13K entity types, allemaal gelabeld door ChatGPT. Het trainen van GLiNER-L duurde ongeveer 5 uur op één A100 (Zaratiana et al., 2024).
Benchmarkresultaten
Zero-shotresultaten uit Zaratiana et al. (2024), Tables 1 en 2. F1 combineert precision en recall in één score; een hogere score is alleen beter onder dezelfde task- en evaluatieregels. Het gemiddelde over zeven datasets combineert vijf CrossNER-datasets met MIT Movie en MIT Restaurant:
| Model | Params | Gem. F1 (CrossNER + MIT) | Gem. F1 (20 datasets) |
|---|---|---|---|
| GLiNER-L | 300M | 60,9% | 47,8% |
| GoLLIE | 7B | 58,0% | — |
| UniNER-13B | 13B | 55,6% | — |
| GLiNER-M | 90M | 55,4% | — |
| UniNER-7B | 7B | 53,7% | 45,7% |
| GLiNER-S | 50M | 52,7% | — |
| ChatGPT (GPT-3.5) | — | 47,5% | 36,5% |
GLiNER-M met 90M parameters benadert UniNER-13B in het gemiddelde over zeven datasets uit het paper (55,4% versus 55,6% F1), terwijl het ongeveer 140 keer minder parameters gebruikt. De 50M GLiNER-S overtreft het gerapporteerde ChatGPT-resultaat (GPT-3.5) met 5 F1-punten. De multilingual variant, die uitsluitend op Engelse data is getraind, overtreft dezelfde ChatGPT-baseline in 8 van 10 niet-Engelse talen (Zaratiana et al., 2024). Deze vergelijkingen gebruiken de modelversies en evaluation harness van het paper; ze stellen geen ranking tegenover nieuwere LLMs vast.
GLiNER-varianten bestrijken biomedical text, PII-detectie, nieuws en multilingual support.
De companion gebruikt v2.1 voor de quickstart. Neem voor een nieuwe cross-encoder-vergelijking daarnaast de maintained GLiNER v2.5 checkpoints op; versienummers zijn geen bewijs voor een domain-F1-gain. GLiNER v2.5 en Fastino GLiNER2.5 hieronder zijn verschillende modelfamilies.
Van scripts/01_gliner_quickstart.py:
from gliner import GLiNER
model = GLiNER.from_pretrained("urchade/gliner_medium-v2.1")
text = "Bill Gates founded Microsoft on April 4, 1975."
labels = ["person", "organization", "date"]
entities = model.predict_entities(text, labels, threshold=0.5)
for entity in entities:
print(f" {entity['text']} => {entity['label']}")
# Bill Gates => person
# Microsoft => organization
# April 4, 1975 => date
Hoe GLiNER zich verhoudt tot spaCy
spaCy is een van de meest gevestigde NLP-libraries voor production. De library werkt bovendien onder andere architecturale constraints dan GLiNER.
De pipelines van spaCy (en_core_web_sm, en_core_web_trf) doen closed-vocabulary NER: een vaste set entity types (PERSON, ORG, GPE, DATE enzovoort) die tijdens training wordt gedefinieerd. Het uitbreiden van de getrainde ner-component vereist gelabelde voorbeelden en training. Voor identifiers of een controlled dictionary kan EntityRuler custom labels toevoegen via patterns zonder retraining; test de recall buiten die patterns. Pin het onderhouden 3.8-modelpackage in plaats van aan te nemen dat een niet-uitgebrachte major line een production upgrade is. De model card van en_core_web_trf 3.8.0 rapporteert 90.19 NER F1 op OntoNotes 5.0, maar alleen voor de 18 vooraf gedefinieerde types (spaCy model card).
GLiNER doet open-vocabulary NER: het accepteert nieuwe labeltekst tijdens inference zonder retraining. Dat garandeert geen bruikbare extraction voor elk label; wording en domain fit blijven belangrijk. Het is een sterke kandidaat wanneer entity types vooraf onbekend zijn, vaak veranderen of domeinspecifiek zijn (“adverse drug reaction”, “financial instrument”, “threat indicator”).
Mijn aanbeveling: gebruik spaCy voor standaard entity types waarvoor pretrained pipelines goed gevalideerd zijn. Gebruik GLiNER wanneer je flexibele zero-shot types nodig hebt of wanneer je pipeline zich zonder retraining moet aanpassen. Ze kunnen één pipeline delen, waarbij spaCy de tokenization en sentence splitting uitvoert en GLiNER de entity extraction afhandelt.
Een supervised Transformer-baseline
Begin bij stabiele labels met representatieve geannoteerde spans met een fine-tuned token classifier, zoals RoBERTa of DeBERTa, als supervised baseline. Dit ruilt labelflexibiliteit in voor task-specific accuracy. Vergelijk het model met spaCy en GLiNER op exact-span F1, recall per label, calibration, latency en kosten op dezelfde domain set.
UniNER en NuNER: hoe klein kun je gaan?
UniNER (ICLR 2024, Zhou et al.) en NuNER (EMNLP 2024, Bogdanov et al.) distilleren beide LLM-annotaties naar kleinere NER-modellen — maar ze verschillen van mening over hoe klein je kunt gaan.
UniNER: de maximalistische route
UniNER fine-tunet LLaMA-7B/13B op 45.889 input-output pairs die door ChatGPT zijn gegenereerd. Voor elk entity type beantwoordt het model “What describes [type] in the text?” en genereert het JSON-lists. Een belangrijke trainingstruc: frequency-based negative sampling verhoogt F1 van 31,5% naar 53,4% (Zhou et al., 2024).
UniNER-7B behaalt 41,7% zero-shot F1 over 43 datasets — 7 punten beter dan ChatGPT met 34,9%. De 13B-variant bereikt 43,4%, slechts 1,7 punten meer voor bijna tweemaal zoveel parameters (Zhou et al., 2024).
De production trade-off: de UniNER-type-opzet met de hoogste score uit het paper vraagt elk entity type sequential op. De all-in-one-variant gebruikt één response maar lag gemiddeld 3,3% lager. Bij FP16 heeft een 7B-checkpoint ongeveer 14 GB nodig alleen voor de weights; quantization met minder bits kan die footprint verkleinen. De UniNER-7B-all checkpoint vermeldt CC BY-NC 4.0; controleer het exacte checkpoint en draag dat label niet over op elke variant.
NuNER: de minimalistische route
NuNER start met RoBERTa-base (125M parameters) en gebruikt contrastive training met 4,38 miljoen GPT-3.5-annotaties over 200K concepts. Na training wordt de concept encoder verwijderd; de text encoder past als RoBERTa-vervanger in elke standaard NER-pipeline (Bogdanov et al., 2024).
Table 3 van NuNER rapporteert ongeveer 6,1–16,2 punten verbetering ten opzichte van RoBERTa in macro-average token-classification F1 met frozen encoders en linear heads, over vier datasets en gesamplede trainingsgroottes. Het paper vergelijkt ook task-specific fine-tuning met UniNER-7B; de afzonderlijke bespreking van meer dan een dozijn voorbeelden gaat over GPT-4 in-context learning, niet over een threshold om UniNER te evenaren (Bogdanov et al., 2024).
Beide papers ondersteunen leren uit LLM-annotaties. Ze bewijzen niet dat een kleiner model zijn teacher op een nieuw domein zal overtreffen. Houd een afzonderlijke, gereviewde testset aan.
GLiNER2 en GLiNER2.5: scheid het paper van het checkpoint
Het oorspronkelijke GLiNER-ecosysteem verdeelde NER, relation extraction, classification en document-level extraction over afzonderlijke modellen. Het GLiNER2-paper uit EMNLP 2025 verenigde NER, classification en hierarchical extraction in één model met 205M parameters; latere releases voegden relation extraction toe aan dezelfde schema-interface.
Die architectuur uit 2025 behoudt het cross-encoder-design, maar breidt de context uit naar 2.048 tokens (4x het origineel) en voegt declarative schemas toe voor het definiëren van extraction-taken. De training gebruikt 135.698 echte documenten die met GPT-4o zijn geannoteerd, plus 118.636 synthetische voorbeelden (Zaratiana et al., 2025).
Op zero-shot CrossNER scoort GLiNER 2 0,590 F1, dicht bij de 0,599 van GPT-4o in de mid-2025-benchmark van het paper. Voor classification bedraagt het gemiddelde 0,72 over 7 benchmarks, tegenover 0,69 voor DeBERTa-v3-large. Op CPU rapporteert het paper 130–208 ms classification latency over de geteste aantallen labels. De zero-shot DeBERTa-baseline heeft één forward pass per candidate label nodig en loopt op van 1.714 ms voor 5 labels naar 16.897 ms voor 50; dit is niet de runtime van een supervised DeBERTa-classifier (Zaratiana et al., 2025).
Het onderstaande voorbeeld laadt daarentegen GLiNER2.5: 194M parameters, een boundary architecture en een geconfigureerd venster van 4.096 tokens. AutoExtractor selecteert BoundaryExtractor; de legacy GLiNER2-loader is hiervoor ongeschikt. Sparse start/end pairing verandert welke spans worden gescoord, niet de finite context limit. Gebruik gedocumenteerde overlapping-chunk helpers voor lange documenten en controleer de remapped offsets. De bovenstaande scores uit 2025 beschrijven dit checkpoint niet.
from gliner2 import AutoExtractor
# Requires `pip install gliner2[local]` and downloads the checkpoint.
extractor = AutoExtractor.from_pretrained("fastino/gliner2.5-base-v1")
# Compose tasks through the current schema interface
schema = (extractor.create_schema()
.entities({"person": "Names of people", "company": "Organization names"})
.classification("sentiment", ["positive", "negative", "neutral"])
.relations(["works_for", "founded", "located_in"])
.structure("product_info")
.field("name", dtype="str")
.field("price", dtype="str"))
text = "Acme launched a $19 widget in Berlin."
results = extractor.extract(text, schema)
Huidige GLiNER2-releases stellen entity recognition, classification, hierarchical extraction en relation extraction beschikbaar via één schema. Het EMNLP-paper evalueert NER en classification; het rapporteert geen benchmark voor hierarchical extraction en behandelt de latere relation API niet. Beschouw het four-task-pad als een deployment-capability die je moet benchmarken, niet als bewijs dat één model de accuracy van vier gespecialiseerde modellen behoudt.
Toevoegingen voor 2026: kies de architectuur die bij de bottleneck past
Het GLiNER-ecosysteem bevat nu verschillende architecturen. Het zijn kandidaten voor een domeinvergelijking, geen enkele leaderboard.
| Behoefte | Kandidaat | Wat je moet verifiëren |
|---|---|---|
| Veel herbruikbare entity types | GLiNER bi-encoder | Exact-span F1 en calibration na caching van type-embeddings. |
| Entities en relations in één pass | GLiNER-Relex | Zowel span- als relation-F1 op dezelfde documenten. |
| Lokale PII-kandidaat | GLiNER2-PII | Recall per taal, documentformaat en PII-type. |
| Multilingual open-vocabulary-kandidaat | GLiNER-X | Kwaliteit per taal; de card vermeldt 23 talen. |
| Gegenereerde of veranderende types | GLiNER Decoder | Of gegenereerde types stabiel en downstream bruikbaar zijn. |
Het oorspronkelijke GLiNER-paper, het bi-encoder-paper en GLiNER-Relex gebruiken elk hun eigen modellen en harnesses. De model cards van GLiNER-X en GLiNER Decoder beschrijven uitgebrachte checkpoints, maar het gaat niet om een peer-reviewed, vergelijkbare benchmark. Houd dat onderscheid bij in een architecture decision record.
Streaming-PII verandert wanneer je tekst kunt vrijgeven
GLiNER Streaming PII voegt incremental detection toe met een Qwen3-0.6B causal backbone en gecachte session state. De API retourneert de volledige current session snapshot, met offsets in de accumulated text. Behoud chunk boundaries, houd labels vast tot een volledige recompute en clear afgeronde sessions. GLiNER 0.2.28 of later is vereist.
Voor streaming redaction zou ik tekst die nog niet is vrijgegeven bufferen en entities testen die over chunks zijn gesplitst. Een telefoonnummer vinden nadat je de eerste helft hebt verstuurd, kan die bytes niet meer intrekken. Meet vóór vrijgave het aantal gelekte tekens en de added delay, evenals de recall van de final span. De model card rapporteert PIIMB masking F2 afzonderlijk van strict typed-span F1; ze beantwoorden verschillende vragen. De multilingual weakness verhindert bovendien dat je het uitgebrachte checkpoint als universele privacyfilter behandelt.
Checkpointlicenties maken deel uit van de modelkeuze
Verifieer vóór deployment de exacte voorwaarden voor code, weights en datasets. De momenteel aangehaalde releases zijn niet uitwisselbaar:
| Release | Gepubliceerde licentie | Praktische consequentie |
|---|---|---|
| GLiNER v2.1 en GLiNER bi | Apache 2.0 | Permissieve model-card-voorwaarden; review dependencies en data nog steeds. |
| GLiNER2 en GLiNER2-PII | Apache 2.0 | Bevestig het geselecteerde checkpoint, niet alleen de library. |
| UniNER-7B-all | CC BY-NC 4.0 | Niet gebruiken voor een commerciële path zonder afzonderlijke toestemming. |
| NuNER | MIT | Het uitgebrachte model en de dataset vermelden MIT-voorwaarden. |
Licentielabels zijn geen juridisch advies. Een production review moet de voorwaarden van het base model, de trainingsdata en de provider omvatten.
De bi-encoder: opschalen naar NER met een miljoen labels
De oorspronkelijke GLiNER encodeert labels en tekst gezamenlijk. Joint encoding wordt geleidelijk duurder naarmate labeltekst context verbruikt en voor elk document opnieuw moet worden geëncodeerd. Het omslagpunt hangt af van het checkpoint, de label descriptions en de hardware. Wanneer dezelfde grote type-inventory over veel documenten wordt hergebruikt, maak dan de GLiNER bi-encoder de standaardvergelijking. Deze splitst text encoding en label encoding over twee afzonderlijke transformers (Stepanov et al., 2026).
De text encoder gebruikt ModernBERT (Ettin-family); de label encoder gebruikt sentence transformers (BGE of MiniLM). Spans en labels worden via dot product gescoord. Door die splitsing kunnen entity-type-embeddings vooraf worden berekend en gecachet. Tijdens inference voorkomen gecachte labels herhaalde label encoding. Het scoren van candidate spans tegen die labels vereist nog steeds compute en memory; een toepassing met een miljoen labels heeft ook bounded candidate retrieval of batching nodig, waarbij recall moet worden gemeten voor labels die vóór het scoren worden uitgesloten.
Er zijn vier modelgroottes beschikbaar, allemaal gebenchmarkt op CrossNER (Stepanov et al., 2026, Table 1):
| Model | Parameters | Gem. F1 (CrossNER + MIT) | Throughput (H100) | Met vooraf berekende labels |
|---|---|---|---|---|
| gliner-bi-edge-v2.0 | 60M | 54,0% | 13,64 ex/s | 24,62 ex/s |
| gliner-bi-small-v2.0 | 108M | 57,2% | 7,99 ex/s | 15,22 ex/s |
| gliner-bi-base-v2.0 | 194M | 60,3% | 5,91 ex/s | 9,51 ex/s |
| gliner-bi-large-v2.0 | 530M | 61,5% | 2,68 ex/s | 3,60 ex/s |
Bij 1.024 entity types verliest de pre-computed gliner-bi-edge-v2.0 bi-encoder slechts 5,2% throughput ten opzichte van één label (19,3 → 18,3 ex/s). De vergelijkbare gliner_small-v2.5 uni-encoder verliest 98,7% (10,7 → 0,14 ex/s). In de single-H100-tests uit het paper, met batch size 1 over inputs van 64, 256 en 512 tokens, bereikt de pre-computed bi-encoder een tot 130× throughput advantage ten opzichte van gliner_small-v2.5. Met 100 entity types op één H100 verwerkt de bi-encoder 1,96 miljoen predictions per dag tegenover 368K voor de cross-encoder (Stepanov et al., 2026).
Het bi-encoder-paper rapporteert 61,5% voor gliner-bi-large-v2.0 tegenover 60,9% voor gliner_large-v2.5 op hetzelfde CrossNER-plus-MIT-gemiddelde. Het oorspronkelijke GLiNER-paper rapporteert eveneens 60,9%, maar voor een ander checkpoint en een andere evaluation. Behandel de vergelijking uit het bi-paper als een paper-resultaat en test vervolgens beide architecturen op de domain set. De auteurs bevelen bi-base-v2.0 (194M) aan als sweet spot: 98% van de accuracy van het large model bij 2,6x de speed (Stepanov et al., 2026).
from gliner import GLiNER
model = GLiNER.from_pretrained("knowledgator/gliner-bi-base-v2.0")
# Pre-compute embeddings for a reused label set; rebuild this cache when labels or the checkpoint change.
entity_types = ["person", "organization", "date"] # Small example; large inventories need bounded candidate selection
entity_embeddings = model.encode_labels(entity_types, batch_size=8)
# Encode text and score spans against the cached labels
texts = ["Bill Gates founded Microsoft on April 4, 1975."]
outputs = model.batch_predict_with_embeds(texts, entity_embeddings, entity_types)
De timing sweep stopt bij 1.024 labels en gebruikt een H100, batch size één en tien forward passes per configuratie. Er wordt geen deployed service met een miljoen labels gemeten. Grotere biomedical of enterprise inventories zijn toepassingen die je moet evalueren; entity linking is beschikbaar via het companion GLiNKER-framework.
LLMs als teachers: een $70-case study en een deployable pipeline
Het LLM-as-teacher-pattern scheidt dure annotation van goedkopere inference. Twee gepubliceerde case studies laten zien hoe teams dit onder verschillende omstandigheden hebben toegepast.
De CFM-case study
In een Hugging Face-case study extraheerde Capital Fund Management bedrijfsnamen uit ongeveer 900.000 headlines van financieel nieuws. Zero-shot GLiNER scoorde 87,0% F1. Het team gebruikte Llama 3.1-70B om de dataset in ongeveer 8 uur te annoteren voor ongeveer $70, waarna het in nog eens 8 uur 2.714 samples via Argilla reviewde.
Fine-tuning van GLiNER op deze data bereikte in de case study 93,4% F1, tegenover 92,7% voor de Llama-70B-teacher. De auteurs rapporteren $0.10 per hour on CPU voor het fine-tuned model en $8 per uur voor de teacher (CFM case study). Deze cijfers beschrijven één financial-news-task en één infrastructure setup.
De Refuel AI-study
Het technical report van Refuel AI benchmarkt LLM-labeling over 8 NLP-datasets, waaronder CoNLL-2003. Het rapporteert 88,4% agreement with ground truth voor GPT-4 (maart 2023) en 86,2% voor menselijke annotators in hun setup, plus labeling die 20 keer sneller en 7 keer goedkoper was. Een afzonderlijk ensemble-experiment op proprietary data overschreed 95% agreement, waarbij de beste individuele LLM 89% behaalde. Confidence-based routing naar goedkopere of sterkere modellen is een voorgesteld gebruik, niet het gemeten mechanisme achter het resultaat over acht datasets (Refuel AI technical report). Behandel dit als vendor-reported results onder het annotation protocol van die studie.
Een production pipeline
Een praktische production flow heeft zes stappen:
- Schrijf annotation guidelines in natuurlijke taal
- Maak human-labeled validation- en held-out testsets met een omvang die is gebaseerd op entity prevalence, vereisten voor slices per label en de gewenste confidence-interval width. Een pilot van 50–200 documenten kan guidelines kalibreren, maar is geen standaardomvang voor production evaluation.
- Gebruik een LLM met een versioned prompt en expliciet output schema om bulk training labels voor te stellen. Bewaar het gevraagde en daadwerkelijke model, de prompt, source text en fallback status. Verwerp onbekende types en spans die niet aan de source kunnen worden uitgelijnd; de companion valt momenteel stil terug en moet worden gecorrigeerd voordat de output als training gold wordt behandeld.
- Review een subset via Argilla of Label Studio
- Fine-tune een compacte encoder (GLiNER, SpanMarker, RoBERTa)
- Deploy pas nadat de encoder een held-out quality- en total-cost-check doorstaat. CFM rapporteerde in zijn setup 16–80x lagere hourly infrastructure cost; neem annotation, review, serving en retraining op in je vergelijking.
De LLM kan het volume handmatige annotation verlagen, maar het team blijft eigenaar van de validation set, annotation guidelines, targeted review en error analysis.
Waar GLiNER faalt en LLMs nuttig blijven
De Sease-benchmark (oktober 2025) testte GLiNER tegenover GPT-4.1-mini op 30 query-parsing-taken. GPT-4.1-mini behaalde 100% fully correct. GLiNER behaalde 53% (16 van 30). GLiNER antwoordde echter in 0,08 seconden, tegenover 1,21 seconden voor de LLM — 15x sneller.
In deze benchmark met 30 taken faalde GLiNER volgens drie terugkerende patterns:
- Implicit entities: “event” extraheren uit “Elton John performed at Madison Square Garden” — in de tekst staat nergens letterlijk “event”, maar de LLM leidt “concert” af
- Gevoeligheid voor label phrasing: “2022” scoort 0,388 tegenover “date”, maar 0,958 tegenover “year” — kleine labelwijzigingen veroorzaken grote scoreverschillen
- Value mapping: GLiNER retourneert de exacte surface text (“family houses”) in plaats van de canonical value (“Single family house”). Een LLM kan die normalisatie uitvoeren wanneer de prompt en het schema de doelwaarden definiëren.
Geneste en overlappende entities
GLiNER gebruikt standaard flat decoding, waarbij overlappende spans worden onderdrukt. De API ondersteunt ook flat_ner=False, waardoor nested predictions mogelijk zijn, hoewel de kwaliteit afhangt van het checkpoint, de labels en de domeindata. Benchmark beide decoding modes op een nested testset op span-niveau voordat je een gespecialiseerd model kiest.
Gebruik GLiNER voor explicit entity extraction en routeer gevallen die inference, reasoning of mapping naar predefined ontologies vereisen naar een LLM. De routing-threshold moet afkomstig zijn uit een gelabelde domain set.
NER evalueren: metrics, valkuilen en testsets
Een model kan 95% F1 scoren op een gecureerde testset en toch falen op de documentmix die het na deployment ziet. Bouw de evaluation set uit de production distribution en houd slices aan voor de rare formats en entity types die aggregate F1 kan verbergen.
De kernmetrics
Identificeer elke occurrence met document-ID, half-open start/end offsets en type, en controleer of text[start:end] de mention terugvindt. Twee occurrences van “John” zijn twee targets. Valideer document counts voordat je gaat matchen: ontbrekende predictions moeten false negatives opleveren en niet verdwijnen via zip(). Tel verkeerde types of offsets als een unmatched prediction en een unmatched gold span. Rapporteer micro precision, recall en F1, support en recall per type, en definieer macro-aggregatie en empty cases.
- Entity-level F1: De standaardmetric. Een prediction is alleen correct wanneer zowel de span boundaries als het type exact overeenkomen met de ground truth. Dit rapporteren de meeste papers.
- Token-level F1: Scoort elke token afzonderlijk. Hierdoor kan een gedeeltelijke boundary beter lijken dan een exact-span-score. Rapporteer exact-span F1 wanneer boundary correctness belangrijk is; gebruik token-level metrics alleen wanneer de downstream decision op token-niveau ligt.
- Precision versus Recall: Hieraan zijn vaak asymmetrische kosten verbonden. Voor de-identification is recall belangrijker — een gemiste naam is erger dan te veel redaction. Voor database extraction is precision belangrijker — false entries vervuilen downstream analysis.
Veelvoorkomende evaluatieproblemen
- Inflatie door partial matches: “Bill” wordt geëxtraheerd terwijl het gold-label “Bill Gates” is — sommige scripts tellen dit als een partial match. Gebruik exact span matching tenzij je een reden hebt om dat niet te doen.
- Type confusion: “Microsoft” is correct als span geïdentificeerd, maar gelabeld als PERSON in plaats van ORG; dit moet een score van nul krijgen. Controleer of je evaluation code dit correct afhandelt.
- Testset leakage: Houd duplicate en near-duplicate records, documenten en annotaties uit de testset. Houd voor een hard zero-shot-claim ook target entity types uit de training; herhaalde surface strings zijn op zichzelf geen leakage.
- Ongecontroleerde label prompts: Een korte type name en een geteste type description zijn verschillende inputs. Versioneer label descriptions, thresholds, checkpoint revisions en decoding mode samen met de score.
- Zero-shot-claims op basis van één taal: Leid geen multilingual quality af uit Engels. OpenNER omvat 36 corpora en 52 talen; de baselines vonden geen enkel model dat in elke taal het beste was (Palen-Michel et al., 2025). In FiNERweb-experimenten veranderde het wisselen van Engels naar labels in de doeltaal F1 met 0,02–0,09, afhankelijk van de setting (Golde et al., 2026). Test beide labeltalen wanneer het product lokale terminologie gebruikt.
- Eén run is een verdict: Rapporteer waar van toepassing variatie over random seeds, threshold sweeps en herhaalde production samples. Kleine slice counts maken een modelranking instabiel.
Houd normalization, entity linking, record grouping en relation endpoints gescheiden van extractive F1. Rapporteer voor privacy leaked instances en affected auto-accepted documents, false redactions en review fraction. Rapporteer voor serving completion rate, p50/p95 document latency, cold en warm runs, batch- en label sizes, peak memory en kosten per accepted document.
Een domain testset bouwen
Voor production evaluation raad ik het volgende aan:
- Sample uit production data, niet uit gecureerde voorbeelden. Neem de rommelige documenten op die het model daadwerkelijk zal zien.
- Stem de omvang van de testset af op de schatting die je nodig hebt. Kies de omvang op basis van entity prevalence, slice sizes per label en de gewenste confidence-interval width. Rapporteer bootstrap- of analytische confidence intervals.
- Gebruik minstens twee annotators op een calibration subset. Adjudiceer meningsverschillen en rapporteer een span-aware agreement measure. Agreement legt ambiguity en guideline quality bloot; het is geen bovengrens voor model performance.
- Stratificeer op difficulty — eenvoudige gevallen (schone tekst, standaardtypes) en moeilijke gevallen (ambiguous entities, jargon, noisy text).
- Behoud privacy- en fairness-slices. Rapporteer voor PII recall per PII-type, taal, locale, documentformaat en relevante demografische of name-origin-slices. Beperk evaluator access tot raw sensitive text, stel retention limits in en review false negatives.
Continual NER heeft een immutable regression set nodig
Production taxonomies veranderen. Voeg nieuwe types toe zonder stilzwijgend de betekenis van een oud type te veranderen. Houd een versioned, immutable regression set voor bestaande types, een afzonderlijke testset voor het nieuwe type en een changelog voor wijzigingen in annotation guidelines. Rapporteer old-type- en new-type-scores afzonderlijk voordat je een checkpoint vervangt. Dit is de eenvoudigste manier om forgetting en taxonomy drift te detecteren.
Production NER in vier sectoren
Dit zijn geselecteerde industrievoorbeelden met specifieke cijfers onder hun gerapporteerde omstandigheden. De bronnen combineren vendor-reported comparisons, door bedrijven of projecten gerapporteerde case studies en peer-reviewed papers of preprints. Behandel ze als praktische voorbeelden, niet als maturity ranking.
Healthcare
De voorbeelden van John Snow Labs en Providence hierboven laten zien waarom de-identification zowel entity-level als document-level reporting vereist. Hun evaluation protocols zijn nuttiger voor het ontwerpen van een review dan voor een ongekwalificeerde provider ranking.
OpenMeds retrospective, gepubliceerd op 6 januari 2026, rapporteert 481 modellen; 380+ beschrijft de inventory bij de launch in juli. Downloads meten distribution, niet deployments. De claim van toonaangevende resultaten op 10 van 12 benchmarks komt uit een afzonderlijke author preprint van augustus 2025, niet uit onafhankelijk geverifieerde productieresultaten.
Financial NER
Financial extraction omvat company mentions in nieuws en fields in filings; hun schemas en documentlengtes verschillen. De CFM-case study behandelt het eerste. FinBERT-MRC formuleert extraction als machine reading comprehension en rapporteert 92,78±0,56 F1 op ChFinAnn en 96,80±0,38 op AdminPunish, beide Chinese datasets. Deze resultaten bewijzen geen accuracy op Engelstalige SEC-filings. Test lange documenten en nested financial entities in de beoogde taal.
E-commerce
Walmarts KDD 2023-paper gebruikt QU-965M-multitask-querydata; de ongeveer 60 NER-labels zijn IOB2-classes. Section 6.8 schrijft de 0,51% GMV-lift toe aan de MTDNN-baseline die op die data is getraind, terwijl EAMT’s online evaluation toekomstig werk bleef. De business delta kan niet uitsluitend aan NER worden toegeschreven. Home Depots TripleLearn rapporteert een verbetering van held-out F1 van 69,5 naar 93,3, een online experiment en meer dan negen maanden in production. De overdraagbare les is iteratieve domain supervision, niet een actuele architectuurranking.
Cybersecurity
iACE is een historisch voorbeeld van geautomatiseerde threat-intelligence-extraction. Het paper over CyNER combineert neural recognition met andere extraction sources en rapporteert 76,66 span micro-F1 voor XLM-RoBERTa-large, geëvalueerd met seqeval. De CyberNER-preprint harmoniseert vier datasets naar 21 STIX 2.1-aligned labels en rapporteert voor RoBERTa 0,736 F1. Dit zijn onderzoeksresultaten, geen bewijs van production uptake.
Deployment optimization: van Python naar lower-latency inference
De companion repo demonstreert GLiNER ONNX-export en INT8-packaging. De repository registreert artifact sizes, maar reproduceert niet de latency- of F1-cijfers die externe projecten rapporteren.
Native GLiNER serving
Test voordat je naar een nieuwe runtime overstapt het Ray Serve-pad van het project. gliner[serve] levert dynamic batching, memory-aware batch sizing, multi-replica scaling en een HTTP-client. Batching en replicas kunnen throughput verbeteren terwijl de modelcode behouden blijft; batching kan ook waiting time toevoegen en replicas elimineren queueing niet. Benchmark queue latency, warm latency, throughput en exact-span F1 onder jouw requestmix voordat je dit vergelijkt met ONNX of Rust.
ONNX-export
GLiNER heeft native ONNX-conversion en er bestaan pre-converted models op Hugging Face (onnx-community/gliner_small-v2.1). Meet latency tegen hetzelfde PyTorch-checkpoint, met dezelfde batch size, hardware en warm-upprotocol.
Voer scripts/02_onnx_export.py uit vanuit de companion repository om een model te exporteren en het ONNX-artifact dynamisch te quantizen. Hiervoor zijn die environment en een gedownload checkpoint nodig; het is dus een command om daar uit te voeren en geen self-contained article snippet:
uv run python scripts/02_onnx_export.py
INT8-quantization
Dynamic quantization kan de storage- en memory requirements van een ONNX-model verlagen. Het effect op latency en F1 per label hangt af van het checkpoint en de CPU; het exportscript is dus packaging evidence en geen deployment benchmark.
from onnxruntime.quantization import quantize_dynamic, QuantType
# Quantize weights dynamically, then evaluate the result
quantize_dynamic("gliner.onnx", "gliner_int8.onnx", weight_type=QuantType.QInt8)
gline-rs: Rust-reimplementatie
gline-rs (Apache 2.0) verwijdert de Python-runtime uit het inference path. De token-mode benchmark van v0.9.0 op een Intel i9 met drie labels rapporteert 6,67 seq/s tegenover 1,61 voor Python, op 100 NuNER-samples. Een afzonderlijk v0.9.1-experiment op een RTX 4080 met 1.000 samples rapporteert 248,75 seq/s, zonder gematchte Python GPU-vergelijking. Dit zijn de eigen omstandigheden van het project en geen resultaten die door de companion repo zijn gereproduceerd. Het ondersteunt span- en token-modellen, GPU/NPU via ONNX Runtime en wordt als crate op crates.io geleverd.
use gliner::{GLiNER, TokenMode, Parameters, RuntimeParameters, TextInput};
let model = GLiNER::<TokenMode>::new(
Parameters::default(), RuntimeParameters::default(),
"tokenizer.json", "model.onnx")?;
let input = TextInput::from_str(
&["My name is James Bond."], &["person", "vehicle"])?;
let output = model.inference(input)?;
// => "James Bond" : "person" (99.7%)
Het fast-gliner-package levert Python-bindings via PyO3.
Wat het optimization evidence wel en niet omvat
| Path | Beschikbaar evidence | Meten vóór deployment |
|---|---|---|
| ONNX-export | Companion script exporteert een GLiNER-checkpoint | Warm latency, throughput en exact-span F1 |
| INT8-package | Companion script maakt een dynamic-quantized model | Artifact size, latency en recall per label |
| gline-rs | Projectbenchmark onder de gedocumenteerde hardware/setup | Jouw modelmode, labels, hardware en batch |
Structured extraction: native schemas, Instructor en lokale decoders
Wanneer je meer flexibiliteit nodig hebt dan encoder-modellen bieden — implicit entities, reasoning, ontology mapping — begin dan met het native schema-mechanisme van de provider. OpenAI ondersteunt strikte json_schemaresponse formats, Anthropic structured outputs ondersteunt JSON-output en strict tool inputs, en de Gemini API ondersteunt een subset van JSON Schema. Een gedeeld Pydantic- of Zod-model kan het contract beschrijven, maar elke provider accepteert een andere schema-subset en heeft ander refusal- en complexity behavior.
Schema conformance maakt parsing betrouwbaar. Het bewijst niet dat een geëxtraheerde span in de source text bestaat of dat een normalized value correct is. Valideer field values, bewaar offsets of quotations waar mogelijk en score semantic accuracy op een gelabelde set.
Instructor wikkelt provider-clients met Pydantic-validation en optionele retries na validation failures.
Aangepast uit het Instructor-pattern in scripts/05_structured_extraction.py. Het vereist de genoemde packages en een OPENAI_API_KEY; het companion-script valt terug op GLiNER wanneer geen key beschikbaar is. Dit artikel gebruikt nu GPT-5.6 Terra, waarvan de model card Chat Completions, function calling, structured outputs en none reasoning effort ondersteunt. Vergelijk dit met de goedkopere oudere baseline voordat je een high-volume extractor omschakelt; een nieuwe generatie bewijst geen betere NER-accuracy.
import instructor
from pydantic import BaseModel
from typing import List, Literal
from openai import OpenAI
class Entity(BaseModel):
name: str
label: Literal["PERSON", "ORGANIZATION", "LOCATION"]
class ExtractEntities(BaseModel):
entities: List[Entity]
client = instructor.from_openai(OpenAI())
result = client.chat.completions.create(
model="gpt-5.6-terra", reasoning_effort="none",
response_model=ExtractEntities,
messages=[{"role": "user", "content": "BioNTech SE acquired InstaDeep in the U.K."}])
# entities=[Entity(name='BioNTech SE', label='ORGANIZATION'), ...]
Outlines van dottxt kiest een andere aanpak: constrained token generation via finite-state machines. De decoder maskeert tokens die de target grammar zouden schenden, in plaats van te wachten op een validation failure en vervolgens een retry uit te voeren. Een AWS-overzicht noemt 98% schema adherence tegenover 76% voor post-generation validation. Het herhaalt afzonderlijk de claim van .txt Engineering dat generation door de coalescence approach tot 5 keer sneller kan zijn; de pagina publiceert onvoldoende methodology om beide cijfers als één controlled benchmark te behandelen.
Het volgende kleine lokale voorbeeld houdt Phi-3 als een historisch decoder-integration example, niet als een modelaanbeveling voor 2026. Neem voor een nieuwe self-hosted extraction-vergelijking huidige Qwen3.8-27B of de kleinere Qwen3.5-checkpoints op. Gebruik hun gedocumenteerde model loader, chat template en serving backend; alleen de string hieronder vervangen bewijst geen compatibility met een multimodal architecture of het reasoning format daarvan.
import outlines
from transformers import AutoModelForCausalLM, AutoTokenizer
from pydantic import BaseModel
from typing import Literal
class Entity(BaseModel):
name: str
label: Literal["PERSON", "ORGANIZATION", "LOCATION"]
class ExtractEntities(BaseModel):
entities: list[Entity]
model_id = "microsoft/Phi-3-mini-4k-instruct"
model = outlines.from_transformers(
AutoModelForCausalLM.from_pretrained(model_id),
AutoTokenizer.from_pretrained(model_id),
)
result = model(
"Extract entities from: BioNTech SE acquired InstaDeep in the U.K.",
ExtractEntities,
)
LangExtract is nuttig wanneer een generated field aan de source moet worden ge-ground: het retourneert character intervals en ondersteunt hosted of lokale LLM-backends. Voor self-hosted document extraction zet NuExtract JSON schemas om in templates en bevat het multimodal document models. Behandel beide als structured-extraction-systemen, niet als automatische replacements voor span NER. Hun targets voor fields, offsets, document-layout en latency vereisen eigen tests.
De keuze hangt af van waar je je modellen uitvoert. Native schemas zijn het pad met de minste frictie voor een ondersteunde provider. Instructor voegt een provider-agnostic Pydantic validation- en retrylaag toe. Outlines constrains lokale generation tegen een schema. LangExtract prioriteert source grounding, terwijl NuExtract zich richt op self-hosted document extraction. Alle LLM-paden omvatten nog steeds autoregressive generation. Benchmark elk pad tegen een encoder met dezelfde batch size, hardware, entity schema en rubric voor semantic accuracy.
De three-tier production architecture
Ik zou production NER routeren op basis van task shape, niet op basis van één modelranking.
Tier 1: encoder-modellen voor expliciete spans. Gebruik een GLiNER cross-encoder voor een kleine type-inventory. Vergelijk bij een grote inventory de bi-encoder met gecachte type-embeddings. Fine-tune via de LLM-as-teacher-pipeline en deploy vervolgens met native serving, ONNX, INT8 of gline-rs, maar alleen wanneer dat path de domain benchmark doorstaat.
Tier 2: multi-task of relation extraction. Wanneer één request NER, classification en hierarchical fields nodig heeft, test dan het huidige GLiNER2.5-checkpoint met 194M parameters tegen afzonderlijke per-task baselines. Wanneer de kernbehoefte joint spans plus relations is, test dan GLiNER-Relex. Het GLiNER2-paper rapporteert 130–208 ms CPU-classification latency over de geteste label counts; dit is geen bewijs voor de latere relation API of een andere deployment.
Tier 3: LLMs voor reasoning-heavy extraction. Routeer implicit entities, contextual inference en ontology mapping naar een native schema-API of Instructor voor cloud APIs, en naar Outlines voor lokale constrained output. Gebruik LangExtract wanneer source intervals essentieel zijn en NuExtract wanneer het document zelf de input is. Log deze gevallen voor review. Alleen expliciete, source-aligned spans kunnen gewone Tier 1-training targets worden; inferred facts en normalized values hebben hun eigen targets en evaluation nodig.
De CFM-case study geeft één cost reference voor Tier 1: 93,4% F1 tegen een gerapporteerde $0.10 per hour on CPU, tegenover 92,7% F1 en $8 per uur voor de Llama-70B-teacher. Hourly instance prices bepalen zonder throughput niet de cost per document. Bereken dit opnieuw met jouw hardware, teachermodel, labelset, utilization en reviewkosten.
Trade-offs en beperkingen
Bij elke trade-off hieronder zijn de relevante vragen waar die zichtbaar wordt en of je die vóór deployment kunt meten.
Fouten van de LLM-as-teacher propageren. Als de LLM een specifiek entity type consequent verkeerd verwerkt (bijvoorbeeld subsidiary names verwart met parent companies), erft de fine-tuned encoder die bias. Review low-confidence of inconsistente types grondig en houd een stratified random sample aan om confident systematic errors te detecteren.
Een valid schema kan false facts bevatten. Native structured output, Instructor en constrained decoders kunnen een response parseable maken. Ze kunnen niet garanderen dat elk field grounded is, dat een span boundary correct is of dat een normalized value naar het juiste record verwijst. Bewaar source evidence en valideer semantics afzonderlijk.
Quantization losses zijn checkpoint- en data-dependent. De companion maakt een dynamic-quantized INT8-artifact, maar meet de F1 niet. Huidige GLiNER-guidance beveelt quantization-aware training aan wanneer INT8-accuracy behouden moet blijven. Vergelijk de quantized en oorspronkelijke checkpoints op exact-span F1 en recall per label vóór deployment.
Wanneer de three-tier architecture overkill is. Een enkel domein met stabiele entity types en genoeg gelabelde voorbeelden heeft mogelijk alleen een fine-tuned RoBERTa- of spaCy-pipeline nodig. Het three-tier-pattern past bij meerdere domeinen, evoluerende entity types of een gemeten mix van expliciete en reasoning-heavy extraction. Een smalle invoice-pipeline die namen en datums extraheert, kan stoppen bij Tier 1.
Bi-encoderkwaliteit varieert per dataset. Joint encoding kan op sommige datasets helpen, terwijl de bi-encoder de CrossNER-vergelijking uit het paper wint en de uni-encoder op CoNLL-2003 een kleine voorsprong heeft. Benchmark beide op de domain set; kies op basis van gemeten exact-span quality, calibration, label count en throughput, niet door “high stakes” als regel voor een modelfamilie te gebruiken.
PII- en multilingual claims vereisen slices. Een hoge aggregate score kan een gevaarlijk recallverlies verbergen voor een locale, name form, document layout of rare PII-class. Behandel een privacy model als één layer in defense in depth, stel een response process voor false negatives in en evalueer opnieuw wanneer de taxonomy, taalmix of databron verandert.
Belangrijkste conclusies
- Gebruik een compacte encoder voor expliciete spans pas nadat deze een domain testset met support per type en confidence intervals heeft doorstaan.
- Gebruik GLiNER voor veranderende labelvocabularies. Vergelijk eerst de bi-encoder wanneer een grote type-inventory wordt hergebruikt; schakel
flat_ner=Falsepas in nadat je de nested-span quality hebt gemeten. - Gebruik geteste type descriptions voor hard zero-shot claims en test voor multilingual products Engelse en gelokaliseerde label wording afzonderlijk.
- Houd OCR, NER, relation extraction en entity linking als afzonderlijke evaluation stages, ook wanneer één model meerdere tasks aanbiedt.
- Behandel een LLM-teacher als een annotation proposal system. Human guidelines, adjudication, immutable regression sets en een held-out testset blijven noodzakelijk.
- Gebruik native schemas voor ondersteunde LLM-providers, maar valideer semantic correctness en source grounding afzonderlijk van JSON-validity.
- Benchmark native serving, ONNX, quantization en Rust paths afzonderlijk en gezamenlijk. Vermenigvuldig nooit niet-gemeten speedups.
Referenties
Papers
- GLiNER: Generalist Model for Named Entity Recognition using Bidirectional Transformer - Zaratiana et al., NAACL 2024. De fundamentele span-entity-matchingarchitectuur.
- GLiNER2: An Efficient Multi-Task Information Extraction System with Schema-Driven Interface - Zaratiana et al., EMNLP 2025 System Demonstrations. Verenigt NER, classification en hierarchical extraction; huidige releases voegden later relation extraction toe.
- GLiNER Bi-Encoder: Scalable Named Entity Recognition with Bi-Encoder Architecture - Stepanov et al., februari 2026. Decoupled encoding voor million-label scale.
- GLiNER-Relex: A Unified Framework for Joint Named Entity Recognition and Relation Extraction - Stepanov et al., 2026. Joint, zero-shot entity- en relation extraction.
- GLiNER2-PII: A Multilingual Model for Personally Identifiable Information Extraction - Zaratiana et al., 2026. 42 PII-types op character-span resolution.
- ZeroNER: Fueling Zero-Shot Named Entity Recognition via Entity Type Descriptions - Cocchieri et al., ACL 2025. Hard zero-shot evaluation met type descriptions.
- OpenNER 1.0: Standardized Open-Access Named Entity Recognition Datasets in 50+ Languages - Palen-Michel et al., EMNLP 2025. 36 corpora, 52 talen en multi-ontology baselines.
- FiNERweb: Datasets and Artifacts for Scalable Multilingual Named Entity Recognition - Golde et al., EACL 2026. Multilingual labels en transfer evaluation.
- UniversalNER: Targeted Distillation from Large Language Models for Open Named Entity Recognition - Zhou et al., ICLR 2024. LLM-based universal NER via distillation from ChatGPT.
- NuNER: Entity Recognition Encoder Pre-training via LLM-Annotated Data - Bogdanov et al., EMNLP 2024. Onderzoekt een 125M-encoder die op LLM-annotaties is pretrained.
Industry papers
- EAMT: Entity-Aware Multi-Task Learning for Query Understanding - Walmart, KDD 2023. Multitask querystudie; het online resultaat hoort bij de MTDNN-baseline.
- TripleLearn: End-to-End NER for E-Commerce Search - Home Depot, AAAI 2021. F1 van 69,5 naar 93,3.
- Acing the IOC Game: Toward Automatic Discovery and Analysis of Open-Source Cyber Threat Intelligence - Liao et al., CCS 2016. Historische extraction-aanpak.
- CyberNER: A Harmonized STIX Corpus for Cybersecurity NER - 21 STIX 2.1-aligned entity types.
- FinBERT-MRC: Financial NER via Machine Reading Comprehension - MRC-formulering geëvalueerd op Chinese financial datasets.
Case studies
- CFM Case Study: Fine-tuning GLiNER for Financial NER - Capital Fund Managements $70 LLM-labelingpipeline die 93,4% F1 behaalt.
- Refuel AI: LLM Labeling Technical Report - GPT-4 behaalt 88,4% annotation agreement en overtreft menselijke annotators.
- Sease: GLiNER as an Alternative to LLMs for Query Parsing - Waar GLiNER faalt en LLMs nog steeds nodig zijn.
- John Snow Labs: Medical Text De-Identification Benchmark - Vendor study met label remapping en exclusions.
- OpenMed: Year in Review 2025 - Retrospective van januari 2026; inventory en downloads zijn geen deployments.
Tools en frameworks
- ner-field-guide demo repo - Companion-demo’s voor dit artikel: GLiNER quickstart, ONNX-export, LLM-as-teacher en structured extraction.
- gline-rs: Rust reimplementation of GLiNER - Afzonderlijke CPU- en GPU-experimenten van de maintainer; Apache 2.0-code.
- GLiNER serving - Ray Serve-pad met dynamic batching en multi-replica deployment.
- spaCy English pipelines - Versioned closed-label pipeline metrics.
- Microsoft Presidio - PII analysis en anonymization met custom recognizers.
- Instructor - Structured LLM extraction via Pydantic models.
- Outlines - Constrained token generation via FSMs, met een gerapporteerde schema-adherence benchmark.
- LangExtract - Source-grounded structured extraction met character intervals.
- NuExtract - Self-hosted, schema-to-template document extraction.
- OpenAI Structured Outputs - Reference voor strict JSON-schema response formats.
- Anthropic Structured Outputs - JSON outputs en strict tool inputs.
- Gemini Structured Outputs - JSON Schema-subset voor structured responses.
- AWS: Structured Output with Outlines - 98% schema-adherence benchmark.