[!NOTE] Automatische vertaling Dit artikel is automatisch vertaald vanuit de oorspronkelijke Engelse versie.

Het definitieve handboek over NER in 2026: Encoders, LLMs en de 3-laagse productiearchitectuur

Named entity recognition (NER) maakt nu gebruik van spans-soortige compacte encoders, open-vocabulary models-technieken en extractiemethoden gebaseerd op LLM. Uit de gepresenteerde CrossNER-resultaten blijkt dat een GLiNER-model met 300 miljoen parameters model een hoger zero-shot F1-score behaalt dan het 13 miljard parameter grote UniNER-model. Een nieuwere bi-encoder levert zelfs 130 keer zoveel throughput op als de oorspronkelijke cross-encoder, bij 1.024 verschillende entiteittypen. Deze resultaten ondersteunen een praktisch model voor expliciete span-extractie: gebruik eerst een LLM om domeingegevens te labelen, bekijk vervolgens een aantal voorbeelden, finetune een compacte encoder en zet deze uiteindelijk in met ONNX of Rust.

Het bijbehorende repository bevat uitvoerbare voorbeelden voor GLiNER, ONNX export, LLM-gegenereerde trainingslabels en gestructureerde extractie. Voor werklasten waarin expliciete spans een dominante rol spelen, bieden compacte encoders een sterke latency en kostenprestatie. LLMs blijven nuttig voor het genereren van trainingsdata en het verwerken van gevallen die inference of normalisatie vereisen.

Begeleidend repo: ner-veldgids, met uitvoerbare demos voor GLiNER, ONNX export, de LLM-as-teacher pipeline, en gestructureerde extractie met Instructor.

TL;DR: Gebruik GLiNER wanneer u open-vocabulary span extractie en CPU deployment nodig heeft. Voor domeinspecifieke taken kunt u de LLM-as-teacher pipeline methode uitproberen: genereer labels, bekijk een voorbeeld, finetunen een encoder en evalueer deze op een door mensen gelabeld dataset. Stuur gevallen met impliciete entiteiten, ontologie-mapping en andere zwaarbelaste reasoning situaties door naar een LLM via Instructor of Outlines. De drie-laags architectuur combineert deze aanpakken zonder dat er een vaste verdeling van het verkeer wordt aangenomen.


Waar moderne systemen NER gebruiken

NER vindt nog steeds spans tekstfragmenten en geeft deze labels. Wat is veranderd, is zijn positie binnen het systeem: nu levert het filters voor RAG, gestructureerde argumenten voor agent-tools, en velden voor documentverwerking pipelines. Door deze toepassingen worden latency, kosten en schemaflexibiliteit even belangrijk als de benchmark-nauwkeurigheid.

RAG: verbeterde retrieval via entiteitsextractie

Een simpele similariteitszoekopdracht heeft moeite wanneer een vraag exacte entiteiten bevat. Voor de vraag “Wat zei Anthropic over model veiligheid in het vierde kwartaal van 2024?”, moet het systeem “Anthropic” en “Q4 2024” extraheren als metadata-filters, in plaats van uitsluitend te vertrouwen op embeddings.

Tijdens het indexeren haalt u entiteiten uit elk chunk en slaat u deze op als metadata: {"organizations": ["Anthropic"], "dates": ["Q4 2024"], ...}. Hiermee kunt u eerst filteren op entiteiten voordat u vector search uitvoert. Een kennisgraaf RAG (GraphRAG, eigenschapsgrafen van LlamaIndex) gaat nog een stap verder: door NER te combineren met relatie-extractie wordt er een graaf gecreëerd die in staat is om meervoudige vragen te beantwoorden die een eenvoudige embeddings niet kan oplossen.

Tijdens het verwerken van een query zorgen de uit de vraag van de gebruiker geëxtraheerde entiteiten voor routing. Een vraag waarin een bedrijfsnaam wordt genoemd, wordt doorgestuurd naar een financiële index; een vraag met geneesmiddelnamen leidt naar een klinische kennisbase. GLiNER werkt hier goed omdat de query-entiteiten onvoorspelbaar zijn — er is geen mogelijkheid om opnieuw te trainen voor elk nieuw entiteittype dat gebruikers mogelijk gaan vragen.

AI agents: tekst omzetten in gestructureerde feiten

Agents ontvangt ongestructureerde tekst — webpagina’s, API-antwoorden en berichten van gebruikers — en moet hierop handelen. NER zet die tekst om in gestructureerde feiten die door de agent kunnen worden verwerkt, opgeslagen of doorgestuurd naar andere hulpmiddelen.

Twee gebieden waar het het meest van belang is.

Het eerste voorbeeld betreft het hulpprogramma routing. Wanneer een gebruiker zegt “plan een vergadering in met Sarah Chen van Accenture op donderdag om 14.00 uur”, moet de agent deze informatie extraheren PERSON: Sarah Chen, ORGANIZATION: Accenture, en DATETIME: Thursday 2pm vóór het oproepen van de kalender API. Een encoder NER model doet dit in minder dan 10 ms. Een LLM voegt per oproep 1-2 seconden toe, en die vertraging stapelt zich op bij meerdere stappen van het workflows proces, totdat een “instantane” agent oproep niet langer als instantane wordt ervaren.

Het tweede aspect betreft entiteitsvolging over meerdere gesprekken heen. Agent memory-systemen moeten in staat zijn om te bepalen dat “Sarah” in gesprek 3 en “Ms. Chen” in gesprek 12 dezelfde persoon zijn. NER identificeert de spans; entiteitslinking zorgt er vervolgens voor dat ze worden gekoppeld aan dezelfde ID.

In beide gevallen is de beperking latency. Een 200ms durende NER-aanroep binnen een keten van 10 stappen die bestaat uit agent, zorgt voor een gevoelde vertraging van 2 seconden. Daarom vormen encoder models-methoden, in plaats van extractiemethoden gebaseerd op LLM, de juiste keuze voor het verwerken van entiteiten binnen agent-lussen.

Documentintelligentie: van afbeeldingen naar gestructureerde gegevens

OCR zet afbeeldingen om in tekst. NER zet tekst om in gestructureerde velden. Samen maken ze het mogelijk om documenten op grote schaal te digitaliseren.

Een standaard pipeline maakt eerst gebruik van OCR, zoals Tesseract, Azure Document Intelligence of AWS Textract, om tekst en bounding boxes te genereren. Vervolgens extracteert NER velden zoals invoice_number, vendor_name, line_items, total, en due_date. Dezelfde procedure is van toepassing op contracten, medische dossiers en regelgevende documenten.

Moderne platforms combineren drie stappen: begrip van de lay-out (is dit een kop of een tabelcel?), entiteitsextractie (wat voor type tekst is dit?) en relatieextractie (welke waarden horen bij elkaar?). GLiNER 2 verwerkt al deze stappen in één enkele forward pass; één enkele aanroep van model kan de resultaten teruggeven {vendor: "Acme Corp", amount: "\$4,200", due_date: "2026-04-15"} uit een factuur.

Hier speelt de kostenfactor een belangrijke rol. Prijst pipeline op basis van het daadwerkelijke maandelijkse documentaantal, inclusief herproberingen en revisies. Een compacte encoder kan draaien op CPU, terwijl een op API gebaseerde LLM extra kosten in rekening brengt per document voor inference en latency. Een praktische test omvat het labelen van een representatieve groep facturen met LLM, het fine-tunen van GLiNER op de gerespecteerde gegevens, en het vergelijken van beide aanpakken op het niveau van velden, F1-waarden, latency en de totale kosten.

Detectie van PII en LLM guardrails

Volgens de privacyregelgeving (GDPR, HIPAA, CCPA) is het noodzakelijk om persoonsgegevens op te sporen voordat deze bij downstream-systemen terechtkomen. Voor LLM deployments betekent dit dat invoer moet worden gescand voordat deze de model bereikt, en dat uitvoer moet worden gecontroleerd voordat deze de gebruiker bereikt.

NER behandelt dit rechtstreeks. De-identificatie models vinden PERSON, SSN, PHONE, EMAIL, en ADDRESS spans moeten zowel worden gecensureerd als vervangen door synthetische equivalenten. In de eigen vergelijking van aanbieders, John Snow Labs publiceert rapporten 96% F1 voor de detectie van PHI, vergeleken met Azure op 91%, AWS op 83% en GPT-4o op 79%. Een apart rapport deployment beschrijft dat Providence dagelijks meer dan 100.000 klinische notities verwerkt.

Voor LLM guardrails fungeert NER als een voorsorteerlaag: het scant gebruikersinvoer op PII voordat deze naar een externe API wordt gestuurd, om vervolgens te blokkeren of te anonimiseren. Dit is sneller en eenvoudiger dan de LLM te vragen om zelf te modereren. GLiNER is hier bijzonder nuttig omdat de categorieën PII per rechtsgebied verschillen. U kunt nieuwe entiteittypen, zoals “genetische informatie”, onder een nieuwe regelgeving toevoegen zonder opnieuw te trainen.


GLiNER verandert de economie met een model van 300 miljoen parameters NER

GLiNER (NAACL 2024, Zaratiana et al.) maakte encoder gebaseerde NER-methoden concurrerend met LLMs, bij een aanzienlijk lager kostenniveau. In plaats van NER te behandelen als sequentie-labeling of tekstgeneratie, ziet GLiNER dit als een matching-probleem: er wordt een score berekend voor elke mogelijke tekst span (elke opeenvolgende reeks woorden zoals “Bill Gates” of “Microsoft”) ten opzichte van elk entiteittype-label, waarna alleen de hoogst gescorede paren worden behouden.

De model ontvangt entiteittype-etiketten en invoertekst als één enkele sequentie: [ENT] person [ENT] organization [ENT] date [SEP] Bill Gates founded Microsoft.... Een bidirectionele transformer (DeBERTa-v3) encodeert alles samen.

Uit de uitvoer genereert model twee sets representaties: één voor entiteittypen (uit [ENT] voor token-posities) en één voor tekst spans (door de begin- en eind token-vectoren te combineren met behulp van een kleine FFN). Een schaalwaarde wordt verkregen uit het dotproduct tussen een span-representatie en een representatie van het entiteittype.

Door toepassing van de sigmoidfunctie verkrijg je de waarschijnlijkheid dat de span van token ii tot token jj behoort tot het entiteittype tt: ϕ(i,j,t)=σ(SijTqt)\phi(i, j, t) = \sigma(S_{ij}^T \cdot q_t), waarbij SijS_{ij} de span-vector is die wordt gegenereerd door de FFN en qtq_t het entiteittype embedding is uit de corresponderende [ENT] token (Zaratiana e.a., 2024, Vergelijking 1): Spans zijn begrensd op 12 tokens om de prestaties te behouden.

GLiNER-architectuur: entiteittypen tokens en tekst tokens worden gezamenlijk gecodeerd met behulp van DeBERTa, waarna de span-representaties worden beoordeeld ten opzichte van entiteittypen embeddings aan de hand van een dotproduct.

In de praktijk betekent dit dat elke beschrijving in natuurlijke taal op elk moment kan dienen als label bij inference. Er is geen hertraining nodig. U kunt zoveel entiteittypen invoeren als u wilt (“persoon”, “nadelige medicijnreactie”, “financieel instrument”), en de model geeft dan scores spans voor deze typen. Er zijn drie varianten beschikbaar: GLiNER-S (50 miljoen parameters), GLiNER-M (90 miljoen) en GLiNER-L (300 miljoen). De trainingsgegevens komen uit de Pile-NER dataset: 44.889 teksten met 240.000 entiteit spans uit 13.000 entiteittypen, allemaal gelabeld door ChatGPT. Het trainen van GLiNER-L duurt ongeveer 4 uur op één A100-machine.Zaratiana e.a., 2024).

Resultaten van Benchmark

Resultaten bij zero-shot learning Zaratiana e.a. (2024), Tabel 1 en 2:

ModelParametersCrossNER F1-scoreGemiddelde (20 datasets)
GLiNER-L300 miljoen60.9%47.8%
GoLLIE7B58.0%
UniNER-13B13 miljard55.6%
GLiNER-M90 miljoen55.4%
UniNER-7B7B53.7%45.7%
GLiNER-S50 miljoen52.7%
ChatGPT (GPT-3.5)47.5%36.5%

GLiNER-M met 90 miljoen parameters komt in de CrossNER-tabel van het artikel bijna overeen met UniNER-13B (55,4% versus 55,6% F1), ondanks dat het ongeveer 140 keer minder parameters gebruikt. De versie GLiNER-S met 50 miljoen parameters overtreft het gemelde resultaat van ChatGPT (GPT-3.5) met 5 F1-punten. De multilinguele variant, die uitsluitend op Engelse gegevens is getraind, doet het beter dan dezelfde ChatGPT-basis in 8 van de 10 niet-Engelse talen.Zaratiana e.a., 2024). Bij deze vergelijkingen worden de model-versies uit het artikel en de evaluaties harness gebruikt; ze geven geen rangorde weer ten opzichte van nieuwere LLMs-versies.

Het ecosysteem is uitgebreid: er zijn meer dan 280 GLiNER-compatibele models modellen op HuggingFace, ongeveer 350.000 downloads van PyPI per maand, en zo’n 2.800 GitHub sterren. De verschillende varianten zijn geschikt voor biomedisch tekstverwerking, detectie van PII, nieuwsanalyse en multilinguaal gebruik.

Van 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']} ({entity['score']:.3f})")
# Bill Gates => person (0.987)
# Microsoft => organization (0.991)
# April 4, 1975 => date (0.974)

Hoe GLiNER zich verhoudt tot spaCy

Elk NER-handleiding zou onvolledig zijn zonder spaCyOngeveer 21 miljoen downloads per maand, en een van de meest betrouwbare NLP-bibliotheken in productieomgevingen. Echter, deze werkt volgens fundamenteel andere architectonische beperkingen dan GLiNER.

spaCy’s pipelines (en_core_web_sm, en_core_web_trf) voer een gesloten vocabulaire NER uit: een vaste verzameling entiteittypen (PERSON, ORG, GPE, DATE, enz.) die tijdens het trainen worden gedefinieerd. Wil je een nieuwe entiteittype? Verzamel gelabelde gegevens en train opnieuw. Dit wordt ondersteund door transformatormodellen. en_core_web_trf aanvallen 89,8% F1-score op OntoNotes 5.0, maar uitsluitend voor de 18 vooraf gedefinieerde typen.

GLiNER ondersteunt open-vocabulary NER: elke label kan op elk moment inference worden gebruikt, zonder dat er opnieuw getraind hoeft te worden. Dit maakt het de geschiktere keuze wanneer entiteittypen van tevoren onbekend zijn, vaak veranderen of specifiek zijn voor een bepaald domein (“adverse drug reaction”, “financial instrument”, “threat indicator”).

Mijn aanbeveling is om spaCy te gebruiken voor standaard entiteitytypen, waarbij de vooraf getrainde pipelines-modellen goed gevalideerd zijn. Gebruik GLiNER wanneer u flexibele, zero-shot typen nodig heeft of wanneer uw pipeline-modellen zich moeten aanpassen zonder opnieuw getraind te hoeven worden. Ze kunnen een gemeenschappelijke pipeline delen, waarbij spaCy verantwoordelijk is voor het verwerken van tokenization en het splitsen van zinnen, terwijl GLiNER de entiteitsextractie uitvoert.


UniNER en NuNER: hoe klein kan het gaan?

UniNER (ICLR 2024, Zhou et al.) en NuNER (EMNLP 2024, Bogdanov et al.) reduceren beide LLM-annotaties tot kleinere NER models — maar ze verschillen van mening over tot welk minimumformaat dit kan worden gebracht.

UniNER: het maximalistische pad

UniNER voert fine-tuning uit op LLaMA-7B/13B met behulp van 44.889 NER paren (240K entiteiten, 13K typen) die door ChatGPT zijn gegenereerd. Voor elk entiteitentype beantwoordt de model de vraag “Wat beschrijft [type] in de tekst?” en genereert JSON-lijsten. Een belangrijk trainingstruc is frequentiegebaseerd negatief sampling, waardoor de F1-waarde stijgt van 31,5% naar 53,4%.Zhou et al., 2024).

UniNER-7B behaalt een 41,7% zero-shot F1-score op 43 datasets — waarmee het met 7 punten voorloopt op de 34,9% van ChatGPT. De 13B-versie scoort 43,4%, slechts 1,7 punten meer bij bijna twee keer zoveel rekenkracht.Zhou et al., 2024).

Het productieprobleem: als 7B-autoregressieve model-model heeft UniNER N voorwaartse doorlooptijden nodig voor elke entiteitentype, vereist het 14GB+ VRAM aan geheugen (wat betekent dat uw GPU-budget al vóór de lunch op is), en beschikt het over een beperkende licentie van type CC BY-NC 4.0.

NuNER: het minimalistische pad

NuNER vertrekt vanaf RoBERTa-base (125 miljoen parameters) en maakt gebruik van contrastieve training met 4,38 miljoen annotaties van GPT-3.5 voor 200.000 concepten — de totale kosten voor annotaties blijven onder $500. Na de training wordt de conceptencoder weggegooid; de textencoder kan worden ingezet in elke standaard NER pipeline als vervanging voor RoBERTa.Bogdanov et al., 2024).

De resultaten: NuNER doet het beter dan de eenvoudige RoBERTa met 6-15 F1-punten bij alle groottes van few-shot data. Met slechts een dozijn voorbeelden per entiteittype komt NuNER overeen met UniNER-7B, ondanks dat het 56 keer kleiner is.Bogdanov et al., 2024).

Beide artikelen ondersteunen het samenvatten van LLM-annotaties tot kleinere NER models-structuren. NuNER laat zien dat een encoder met 125 miljoen parameters in staat is om overeen te komen met de gemelde resultaten van UniNER-7B wanneer er taakspecifieke fine-tuning-gegevens beschikbaar zijn, en dit onder licentie van MIT met CPU-vriendelijke inference-eigenschappen.


GLiNER 2: één model, vier taken

Het oorspronkelijke GLiNER-ecosysteem kende een steeds groter wordend probleem: er waren aparte models voor NER (GLiNER), relatie-extractie (GLiREL), classificatie (GLiClass) en documentniveau REL (GLiDRE) — waarbij elk van deze componenten zijn eigen deployment, Docker-container, monitoring-omgeving en manieren om fouten aan te pakken nodig had. GLiNER 2 (EMNLP 2025, Zaratiana et al.) fusingeert al deze onderdelen tot één enkele 205 miljoen parameters tellende model met een door een schema gedreven interface.

De architectuur behoudt het ontwerp van de cross-encoder, maar breidt de context uit tot 2.048 tokens (4 keer zoveel als oorspronkelijk) en voegt declaratieve schema’s toe voor het definiëren van extractietaken. Voor de training worden 135.698 echte documenten gebruikt die zijn gecodeerd met GPT-4o, naast 118.636 synthetische voorbeelden.Zaratiana e.a., 2025).

Bij zero-shot CrossNER behaalt GLiNER 2 een F1-score van 0,590, wat dicht in de buurt ligt van de 0,599 van GPT-4o volgens het onderzoek uit midden 2025 benchmark. Voor classificatie bedraagt de gemiddelde score 0,72 over 7 benchmarks, vergeleken met 0,69 voor DeBERTa-v3-large. Op CPU rapporteert het onderzoek een classificatietijd van 130-208 ms latency voor de geteste aantallen labels. De referentieprestaties van DeBERTa stijgen van 1.714 ms voor 5 labels tot 16.897 ms voor 50 labels.Zaratiana e.a., 2025).

from gliner2 import GLiNER2
extractor = GLiNER2.from_pretrained("fastino/gliner2-base-v1")

# Multi-task composition in ONE forward pass
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"))
results = extractor.extract(text, schema)

Voor toepassingen die alle vier de taken nodig hebben, kan de gedeelde model vier afzonderlijke deployments vervangen, zonder dat de nauwkeurigheid die in het originele onderzoek wordt gerapporteerd, verloren gaat.


De bi-encoder: schalen naar miljoenen labels NER

In de oorspronkelijke GLiNER worden labels en tekst samen gecodeerd — waardoor er een bottleneck ontstaat. Meer entiteittypen leiden tot een langere invoersekvens, en de prestaties dalen snel zodra er meer dan ongeveer 30 typen zijn. De GLiNER bi-encoder (februari 2026, Stepanov et al.; arXiv 2602.18487) lost dit op door de codering van tekst en labels op te splitsen in twee aparte transformers.

Cross-encoder versus bi-encoder: de cross-encoder encodeert labels en tekst gezamenlijk, terwijl de bi-encoder aparte encoders gebruikt die vooraf gerekende labels bevatten embeddings

De tekstencoder maakt gebruik van ModernBERT (de Ettin-familie), terwijl de labelencoder wordt aangestuurd door sentence transformers (BGE of MiniLM). Spans en labels worden gewaardeerd aan de hand van het dotproduct. Het voordeel is dat entity type embeddings één keer kan worden voorverwerkt en opgeslagen in cache. Op inference hoeft alleen de tekst te worden gecodeerd — het opzoeken van labels verloopt dan onmiddellijk.

Er zijn vier model groottes beschikbaar, die allemaal zijn getest op CrossNER.Stepanov et al., 2026,

Table 1:
ModelParametersCrossNER F1-scoreThroughput (H100)Met vooraf berekende labels
bi-edge-v2.060 miljoen54.0%13,64 ex/s24,62 ex/s
bi-small-v2.0108 miljoen57.2%7,99 ex/s15,22 ex/s
bi-base-v2.0194 miljoen60.3%5,91 ex/s9,51 ex/s
bi-large-v2.0530 miljoen61.5%2,68 ex/s3,60 ex/s

Bij 1.024 entiteittypen verliest de bi-encoder (edge, vooraf berekend) slechts 5,2% throughput vergeleken met één enkele label. De cross-encoder verliest daarentegen 98,7% (van 10,7 naar 0,14 ex/s). Dat betekent een 130x throughput groter voordeel bij grote schaal. Met 100 entiteittypen op één H100 verwerkt de bi-encoder 1,96 miljoen voorspellingen per dag, terwijl de cross-encoder er slechts 368K van kan verwerken.Stepanov et al., 2026).

De nauwkeurigheid blijft eveneens hoog. Bi-encoder-large behaalt een 61,5% CrossNER F1, wat iets beter is dan de 60,9% van de cross-encoder. De auteurs raden bi-base-v2.0 (194M) aan als de optimale keuze, aangezien deze 98% van de nauwkeurigheid van de grote model bereikt bij maar 2,6 keer de snelheid.Stepanov e.a., 2026).

from gliner import GLiNER

model = GLiNER.from_pretrained("knowledgator/gliner-bi-base-v2.0")

# Pre-compute embeddings for massive label sets — encode once, use forever
entity_types = ["person", "organization", "date"]  # Can be thousands or millions
entity_embeddings = model.encode_labels(entity_types, batch_size=8)

# Inference only encodes text — labels are a cached lookup
outputs = model.batch_predict_with_embeds(texts, entity_embeddings, entity_types)

Toepassingen omvatten biomedische NER analyses tegen de UMLS-ontologie (meer dan 4 miljoen concepten), bedrijfsinterne taxonomieën die zich kunnen ontwikkelen zonder model hertraining, en entiteitskoppelingen via het bijbehorende systeem. GLiNKER framework.


LLMs als docenten: een casestudy van 70 dollar en een inzetbare pipeline

Het LLM-als-leraar-patroon scheidt dure annotatieprocessen van goedkopere inference-processen. Twee gepubliceerde casestudy’s tonen aan hoe teams dit patroon onder verschillende omstandigheden hebben toegepast.

De LLM-als-docent pipeline: LLM labelt ruwe gegevens, mensen controleren een deel daarvan, waarna de encoder wordt gefine-tuned en tegen 80 keer lagere kosten wordt geïmplementeerd

Het CFM-casestudy

In een Hugging Face casestudy haalde Capital Fund Management bedrijfsnamen uit ongeveer 900.000 koppen financiële nieuwsberichten. Zero-shot GLiNER behaalde een 87,0% F1-score. Het team gebruikte Llama 3.1-70B om de dataset in ongeveer 8 uur aan te duiden, met een kostenpost van ongeveer $70, en bekeek vervolgens 2.714 voorbeelden via Argilla in nog eens 8 uur.

Fine-tuning GLiNER behaalde in dit casestudy een F1-score van 93,4%, vergeleken met 92,7% voor de Llama-70B-teacher. De auteurs geven aan dat de kosten bedragen $0,10 per uur op CPU voor de gefineerde model, en $8 per uur voor de teacher.CFM casestudy). Deze figuren geven een financiële nieuwsopdracht en een infrastructuurconfiguratie weer.

De Refuel AI-studie

Voeg nieuwe labels toe aan het technische rapport van AI benchmarks LLM voor 8 NLP datasets-datasets, waaronder CoNLL-2003. Hierin wordt gemeld dat er een overeenstemming van 88,4% is met de referentiewaarden voor GPT-4 (maart 2023), en een overeenstemming van 86,2% voor de menselijke annotatoren in het gebruikte systeem. Bovendien verloopt het labelproces 20 keer sneller en is de kostenfactor 7 keer lager. Het ensemble-algoritme stuurt eenvoudige voorbeelden door naar goedkopere models-systemen en complexere voorbeelden naar GPT-4, waardoor in de gepresenteerde experimenten een overeenstemming van meer dan 95% wordt behaald.Herladen van het technische rapport voor AI). Beschouw deze als resultaten die door de leverancier zijn gerapporteerd volgens het annotatieprotocol van dat onderzoek.

Een productie pipeline

Een praktische productieflow bestaat uit zes stappen:

  1. Schrijf richtlijnen voor annotatie in natuurlijke taal.
  2. Maak een klein, door mensen gelabeld validatieset aan (50-200 documenten).
  3. Gebruik een LLM (GPT-5.4 Mini, Llama 4 Maverick of Qwen3.5) om de bulktraininggegevens te labelen.
  4. Bekijk een deel daarvan via Argilla of Label Studio
  5. Fine-tunen van een compacte encoder (GLiNER, SpanMarker, RoBERTa)
  6. Implementeer met een kostenverlaging van 16-80x ten opzichte van inference

De LLM kan de hoeveelheid handmatige annotatie verminderen, maar het team blijft verantwoordelijk voor het validatieset, de annotatierichtlijnen, de gerichte review en de foutanalyse.


Waar GLiNER faalt en LLMs nog steeds nuttig blijven

De Sease benchmark (October 2025) GLiNER is getest tegen GPT-4.1-mini op 30 taken voor query-parseren. GPT-4.1-mini behaalde 100% volledig correcte resultaten. GLiNER haalde 53% (16 van de 30). Echter reageerde GLiNER in 0,08 seconden, terwijl de LLM dat deed in 1,21 seconden — 15 keer sneller.

In deze set met 30 taken benchmark faalde GLiNER bij drie herhalende patronen:

  1. Impliciete entiteiten: het extraheren van “evenement” uit de zin “Elton John performed at Madison Square Garden” – er staat letterlijk geen “evenement” in, maar LLM leidt hieruit af dat het om een “concert” gaat.
  2. Gevoeligheid van labelformuleringen: “2022” scoort 0,388 tegenover “datum”, maar 0,958 tegenover “jaar” – kleine veranderingen in labels leiden tot grote schommelingen in de scores.
  3. Waardekoppeling: GLiNER geeft de exacte oppervlaktekst (“family houses”) terug in plaats van de canonieke waarde (“Eengezinswoning”). Een LLM kan deze normalisatie uitvoeren wanneer zijn prompt en het schema de gewenste waarden definiëren.

Geneste en overlappende entiteiten

GLiNER heeft ook moeite met geneste entiteiten. In “New York University” zou een mens zowel “New York” (LOCATIE) als “New York University” (ORGANISATIE) kunnen labelen. GLiNER kiest alleen de entiteit met de hoogste score voor span. Dit is belangrijk in biomedisch tekstmateriaal (“acute myeloid leukemia” omvat zowel een ziekte als een modificator) en in juridische teksten (geneste organisatorische hiërarchieën). Gespecialiseerde models-oplossingen kunnen genestheid verwerken, maar GLiNER’s platte span-ontwerp doet dit niet.

Gebruik GLiNER voor expliciete entiteitsextractie en leid gevallen die inference, reasoning of een mapping naar vooraf gedefinieerde ontologieën vereisen, door naar een LLM. De routing-schwellenwaarde dient afkomstig te zijn uit een gelabeld domeinset.


Evaluatie van NER: metrics, valkuilen en testsets

Een model kan een F1-score van 95% behalen op een zorgvuldig geselecteerd testgeheel, maar faalt nog steeds bij het verwerken van documentmixen die hij na deployment tegenkomt. Bouw het evaluatiegeheel op basis van de productiedistributie en bewaar aparte onderverdelingen voor zeldzame formaten en entiteittypen, want anders kunnen aggregaties van de F1-score relevante details verbergen.

De kernmetrieken

Veelvoorkomende fouten bij evaluatie

  1. Inflatie door gedeeltelijke overeenkomst: “Bill” wordt geëxtraheerd wanneer de gouden label “Bill Gates” is — sommige scripts beschouwen dit als een gedeeltelijke overeenkomst. Gebruik altijd een exacte span-overeenkomst, tenzij er een goede reden is om dit niet te doen.
  2. Typeverwarring: “Microsoft” wordt correct geïdentificeerd als een span, maar als het in plaats van als ORG als PERSON wordt gelaagd, moet de score nul zijn. Controleer of uw evaluatiecode hiermee omgaat.
  3. Lekken uit de testset: Als de entiteiten in de testset overlappen met die in de trainingsset, worden de scores verhoogd. Er bestaan zero-shot benchmarks-methoden (CrossNER, Few-NERD) om de generalisatie te testen.

Het opbouwen van een domeintestset

Voor de evaluatie in productie raad ik aan:

  1. Voorbeelden uit productiedata, en niet geselecteerde voorbeelden. Voeg de ongeordende documenten toe die uw model daadwerkelijk zal tegenkomen.
  2. 200-500 geannoteerde documenten leveren stabiele F1-schattingen op. Bij minder dan 100 documenten zijn de betrouwbaarheidsintervallen te breed.
  3. Minimaal twee annotators, met overeenstemming tussen annotators (Cohen’s kappa > 0.8). Als mensen het oneens zijn, kan uw model niet beter presteren.
  4. Stratificeer op moeilijkheidsgraad — eenvoudige gevallen (schoon tekst, standaardtypen) en moeilijke gevallen (ambigue entiteiten, jargon, ruisig tekst).

Productie NER in vier industrieën

Dit zijn de meest geavanceerde NER deployments die ik heb gevonden, inclusief specifieke cijfers.

Gezondheidszorg

Zorgsector beschikt over de meest geavanceerde tooling voor NER. John Snow Labs biedt meer dan 2.500 vooraf getrainde models, waarvan er meer dan 1.200 zijn gericht op de zorgsector en meer dan 400 verschillende klinische entiteiten omvatten die gekoppeld zijn aan ICD-10, SNOMED CT, LOINC en RxNorm. Binnen het bedrijf Vergelijking van providers, De de-identificatie models bereikte een F1-waarde van 96%, vergeleken met Azure op 91%, AWS op 83% en GPT-4o op 79%. Een aparte casestudy rapporteert Providence St. Joseph Health verwerkt dagelijks 100.000 tot 500.000 klinische notities..

In de projectbeoordeling van 2025 voor deze open-source- OpenMed-project Er worden meer dan 380 biomedische NER models gerapporteerd, 29,7 miljoen Hugging Face downloads, en de beste resultaten op 10 van de 12 openbare biomedische benchmarks.

Financiën NER

Het belangrijkste toepassingsgebied is de extrahie van gegevens uit SEC-aangiften. Finance NLP van John Snow Labs haalt meer dan 11 verschillende entiteittypen uit 10-K/10-Q-aangiften (adressen, aandelenkoersen, boekjaren, effectenbeurzen). FinBERT-MRC De varianten behalen een F1-score van 0,87 tot 0,93 bij taken op het gebied van financiële entiteiten. De belangrijkste uitdaging zijn lange documenten en genestte entiteiten in complexe financiële instrumenten.

E-commerce

Walmarts EAMT-systeem (KDD 2023) wordt getraind op 965 miljoen queries met ongeveer 60 entiteitenlabels; het artikel rapporteert een 0,51% GMV-verhoging in A/B-tests. Van Home Depot’s TripleLearn framework (AAAI 2021) heeft door iteratief trainen de NER F1-waarde verhoogd van 69,5 naar 93,3.

Cyberbeveiliging

De iACE-systeem (CCS 2016) werden 71.000 artikelen uit 45 beveiligingsblogs verwerkt, waarbij 900.000 IOC-items werden geëxtraheerd met een precisie van 98% en een recall van 93%. Moderne systemen zoals CyNER Combineer DeBERTa (F1 >91%) met IOC-heuristieken gebaseerd op regex. CyberNER Unified dataset (2025) brengt vier datasets samen tot 21 entiteittypen die zijn afgestemd op STIX 2.1, waarbij RoBERTa een F1-score van 0.736 behaalt.


Deployment optimalisatie: van Python naar een lagere latency inference

In het bijbehorende repository heb ik drie manieren getest om GLiNER te versnellen voor productiegebruik.

ONNX exporteren

GLiNER beschikt over een geïntegreerde ONNX-conversie, en vooraf geconverteerde models-voorbeelden zijn beschikbaar op HuggingFace.onnx-community/gliner_small-v2.1). ONNX Runtime levert een 1,5-3 keer hogere snelheid op CPU ten opzichte van PyTorch, met vier optimalisatieniveaus, variërend van basis tot gemengde precisie.

Van onnx_export.py:

# Export with quantization
# python convert_to_onnx.py --model_path model/ --save_path onnx/ --quantize True

# Load ONNX model — same API, faster inference
from gliner import GLiNER
model = GLiNER.from_pretrained("path/to/model", load_onnx_model=True)

# Same predict_entities call, 1.5-3x faster on CPU
entities = model.predict_entities(text, labels, threshold=0.5)

INT8 quantization

Dynamische quantization verkleint models met 2,4 keer (438MB → 181MB), met een F1-verlies van minder dan 0,6%. De snelheid neemt toe met 1,8 keer op CPU. Met Intel VNNI CPUs en ONNX Runtime bereikt INT8 een versnelling van tot wel 6 keer ten opzichte van PyTorch FP32.

from onnxruntime.quantization import quantize_dynamic, QuantType

# One-line quantization — 2.4x smaller, <1% F1 loss
quantize_dynamic("gliner.onnx", "gliner_int8.onnx", weight_type=QuantType.QInt8)

gline-rs: Herimplementatie in Rust

gline-rs (Apache 2.0) vermindert de overhead van Python. Op CPU: 6,67 seq/s vergeleken met 1,61 bij Python — een 4,1x versnelling. Op een RTX 4080: 248,75 seq/sgline-rs benchmarks). Het ondersteunt span en token models, GPU/NPU via ONNX Runtime, en is beschikbaar als een crate op crates.io.

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%)

De fast-gliner Het pakket biedt Python-bindingen via PyO3: de snelheid van Rust gecombineerd met de gebruiksvriendelijkheid van Python.

Samenvatting van de optimalisatiestack

OptimalisatieVersnelling versus PyTorchModel GrootteF1 ImpactBestemd voor
ONNX Runtime1,5-3 keerHetzelfdeGeenEen snelle oplossing, elke hardware
INT8 Quantization3-6 keer2,4 keer kleinerVerlies van 0,6%CPU deployment, met beperkte geheugencapaciteit
4.1x (CPU)ONNX formaatGeenHog-throughput, latency-kritiek
gline-rs + INT84-8 keer2,4 keer kleiner1% verliesProductie op grote schaal

Gestructureerde extractie: Instructeur versus Overzichten

Wanneer u meer flexibiliteit nodig heeft dan die wordt geboden door de encoder models — zoals impliciete entiteiten, reasoning, en ontologie-mapping — dan zorgen twee bibliotheken voor gestructureerde extractie uit LLMs.

Instructeur (~12.600 GitHub sterren, ~8,8 miljoen downloads per maand per maart 2026) – ontwikkeld door Jason Liu – corrigeert LLM SDKs zodat deze Pydantic-respondenten models kunnen verwerken, met automatische herprobering bij fouten bij validatie. Het ondersteunt meer dan 15 providers en heeft de ontwikkeling van OpenAI’s eigen structured output functie geïnspireerd.

Van structured_extraction.py:

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.4-mini", temperature=0.0,
    response_model=ExtractEntities,
    messages=[{"role": "user", "content": "BioNTech SE acquired InstaDeep in the U.K."}])
# entities=[Entity(name='BioNTech SE', label='ORGANIZATION'), ...]

Samenvattingen door dottxt wordt een andere aanpak gevolgd: beperkte token generatie via finite-state machines. De decoder maskereert tokens die de doelgrammatica zou schenden, in plaats van te wachten op een validatiefout en opnieuw te proberen. In een AWS benchmark, Deze route bereikte een 98% schema-compliantie, vergeleken met 76% voor de validatie na generatie, en genereerde het uitvoerresultaat 5 keer sneller dan de geteste, onbeperkte workflow-versie met herproberingen. Het resultaat hangt af van die model, de schema-instellingen en de serving-configuratie.

import outlines

model = outlines.models.transformers("microsoft/Phi-3-mini-128k-instruct")
generator = outlines.generate.json(model, ExtractEntities)
result = generator("Extract entities from: BioNTech SE acquired InstaDeep in the U.K.")

De keuze hangt af van waar u uw models uitvoert. Instructor biedt cloud LLM APIs een bekende werkwijze voor validatie met Pydantic en herproberingen. Outlines beperkt de lokale generatie tot een specifiek schema. Beide methoden ondersteunen extractie in NER-stijl, terwijl hun latency nog steeds autoregressieve model-generatie omvat. Benchmark kan beide benaderingen toepassen met dezelfde batchgrootte, hardware en entiteitsschema.


De drie-laagse productiearchitectuur

Ik zou de productie NER routeren op basis van de vorm van de taak in plaats van via één enkele model-ranking.

Een drie-laags NER-architectuur die expliciete spans-gegevens routeert naar encoders, multi-taakextractie uitvoert met GLiNER 2, en gevallen waarbij veel reasoning wordt gebruikt doorleidt naar LLMs.

Niveau 1: encoder models voor expliciete spans. Gebruik een GLiNER-crossencoder voor kleinere sets labels en testeer de bi-encoder naarmate het aantal labels toeneemt. Fine-tune via LLM-as-teacher pipeline, en zet hem vervolgens in gebruik met ONNX, INT8 of gline-rs wanneer deze aanpakken voldoen aan de vereisten van het domein benchmark.

Niveau 2: GLiNER 2 voor multi-taak extractie. Wanneer één verzoek NER, classificatie, relatie-extractie en gestructureerde gegevens vereist, wordt het 205 miljoen parameters tellende gedeelde model van GLiNER 2 getest. In het artikel worden tijden van 130–208 ms gemeld voor de CPU classificatie latency bij de verschillende geteste labelaantallen.

Niveau 3: LLMs voor extractie die zwaar leunt op reasoning. Stuur impliciete entiteiten, contextuele inference-gegevens en ontologie-mappingen door naar een LLM via Instructor voor cloudgebaseerde APIs-oplossingen of Outlines voor lokale models-omgevingen. Log deze gevallen, aangezien ze in aanmerking komen voor de volgende trainingsset van Niveau 1.

Het CFM-casestudy biedt een kostenreferentie voor Tier 1: 93,4% F1 tegen een gemelde kost van $0,10 per uur op CPU, vergeleken met 92,7% F1 en $8 per uur voor de Llama-70B-teacher. Recalculeer deze vergelijking op basis van uw eigen hardware, teacher model, labelset en beoordeel de daadwerkelijke kosten.


Afwegingen en beperkingen

ML-systemen hebben altijd compromissen. De belangrijke vraag is waar deze compromissen zich voordoen en of ze kunnen worden gemeten vóór deployment.

LLM-as-teacher errors propageren. Als de LLM consequent een bepaald type entiteit verkeerd identificeert (bijvoorbeeld door dochterondernemingen te verwarren met moedermaatschappijen), neemt de gefineerde encoder deze voorkeur over. De oplossing is gerichte menselijke review: richt de inspanningen op entiteittypen waarbij het vertrouwen van de LLM laag is of onconsistent, in plaats van willekeurig te samplen.

Quantization-verliezen zijn niet gelijkmatig. Het gemiddelde F1-verlies van ongeveer 0,6% bij INT8 kan hoger uitvallen voor zeldzame entiteittypen met subtiele grenspatronen (chemische verbindingen, meervoudige afkortingen). Quantificeer altijd benchmark de models voor je specifieke entiteittypen, in plaats van alleen het algemene F1-waarde te gebruiken.

Wanneer een drie-laags architectuur overdreven is. Een enkele domein met stabiele entiteittypen en voldoende gelabelde voorbeelden heeft mogelijk alleen al een gefineerde versie van RoBERTa of spaCy pipeline nodig. Het drie-laags patroon is geschikt voor meerdere domeinen, veranderende entiteittypen, of een gecombineerde aanpak waarbij zowel expliciete extractie als extractie gebaseerd op reasoning wordt gebruikt. Een eenvoudige factuur pipeline die alleen namen en data extrahiert, kan volstaan bij Laag 1.

Plafond voor de kwaliteit van de bi-encoder. De bi-encoder offert gecombineerde attention op ten gunste van throughput. Wanneer de semantiek van labels samenwerkt met de tekstcontext (“datum”, “jaar” of “periode” voor dezelfde span), blijft de cross-encoder superieur. Gebruik de cross-encoder voor taken waarbij veel op het spel staat en er weinig labels beschikbaar zijn; gebruik de bi-encoder voor een breder bereik.


Referenties

Artikelen

Industriële artikelen

Casestudy’s

Hulpmiddelen en frameworks