Knowledgator Engineering has released GLiFormer, a schema-conditioned encoder framework for information extraction. One model handles named-entity recognition (NER), text classification, relation extraction, nested JSON structuring, and text embeddings. You pass labels and extraction schemas at inference time. Two checkpoints are on Hugging Face. GLiFormer Base v1 has 264.2M parameters, and GLiFormer Large v1 has 575.6M.
Deployable today? Yes. Both checkpoints are Apache 2.0, install with pip install gliformer, and run on CPU or GPU.
The Problem It Targets
Extraction stacks often chain separate models. One tags entities, another classifies documents, and a third rebuilds records. The research team argues these tasks share one core operation. Encode the source, represent the requested concepts, then score their compatibility.
LLMs can emit nested JSON, but they generate field names, punctuation, and values token by token. GLiFormer removes output generation from that path.
How GLiFormer Works
GLiFormer builds on GLiNER and generalizes its label matching through an ‘anchor.’ An anchor is the object each runtime label gets scored against. It can be a group vector for classification, an entity pair for relations, or a record slot.
The source is encoded once. Multiple schemas for the same document then run as task-local groups over that shared encoding. Head compute still grows with the number of groups, labels, and anchors.
For NER, the head scores start, end, and inside evidence for every token and label pair. Independent sigmoid outputs let nested mentions and shared boundaries coexist.
Structuring runs in 4 stages:
- Ground field values as spans taken directly from the source text.
- Assign spans to unordered record slots, trained with Hungarian matching.
- Predict directed parent-child links, restricted to paths the schema allows.
- Assemble nested JSON with a deterministic decoder.
Values are source spans, so the model cannot invent value text missing from the input. Span selection, record assignment, and hierarchy can still be wrong.
‘;
}).join(”);
function K(s){ return ‘“‘ + s + ‘”‘; }
function V(s, c){ return ‘“‘ + s + ‘”‘; }
var JSONL = [
‘{‘,
‘ ‘ + K(‘company’) + ‘: [{‘,
‘ ‘ + K(‘name’) + ‘: ‘ + V(‘Acme’,’cn’) + ‘,’,
‘ ‘ + K(‘departments’) + ‘: [‘,
‘ {‘,
‘ ‘ + K(‘name’) + ‘: ‘ + V(‘Engineering’,’dn’) + ‘,’,
‘ ‘ + K(’employees’) + ‘: [‘,
‘ {‘ + K(‘name’) + ‘: ‘ + V(‘Alice’,’en’) + ‘, ‘ + K(‘role’) + ‘: ‘ + V(‘software engineer’,’er’) + ‘},’,
‘ {‘ + K(‘name’) + ‘: ‘ + V(‘Bob’,’en’) + ‘, ‘ + K(‘role’) + ‘: ‘ + V(‘designer’,’er’) + ‘}’,
‘ ]’,
‘ },’,
‘ {‘,
‘ ‘ + K(‘name’) + ‘: ‘ + V(‘Sales’,’dn’) + ‘,’,
‘ ‘ + K(’employees’) + ‘: [{‘ + K(‘name’) + ‘: ‘ + V(‘Carol’,’en’) + ‘, ‘ + K(‘role’) + ‘: ‘ + V(‘account manager’,’er’) + ‘}]’,
‘ }’,
‘ ]’,
‘ }]’,
‘}’
];
$(‘#glf-json’).innerHTML = JSONL.map(function(l){ return ‘‘ + l + ‘‘; }).join(”);
var stepsEl = $(‘#glf-steps’);
stepsEl.innerHTML = STEPS.map(function(s, i){
return ‘‘;
}).join(”) + ‘
‘;
var step = 0, timers = [], playing = false, playT = null;
function clearTimers(){ timers.forEach(clearTimeout); timers = []; }
function later(fn, ms){ timers.push(setTimeout(fn, ms)); }
function spanEl(id){ return $(‘#glf-sent .f[data-id=”‘ + id + ‘”]’); }
function slotEl(k){ return slotsEl.querySelector(‘.slot[data-k=”‘ + k + ‘”]’); }
function box(el){
var S = stage.getBoundingClientRect();
var rs = el.getClientRects();
var r = rs.length ? rs[0] : el.getBoundingClientRect();
return { l:r.left – S.left, t:r.top – S.top, w:r.width, h:r.height };
}
function drawWires(anim){
if (!stage.offsetWidth) return;
var W = stage.offsetWidth, H = stage.offsetHeight;
wires.setAttribute(‘width’, W); wires.setAttribute(‘height’, H);
wires.setAttribute(‘viewBox’, ‘0 0 ‘ + W + ‘ ‘ + H);
var defs=”
return ‘
}).join(”) + ‘
var P = [];
function curve(x1, y1, x2, y2){ var d = (y2 – y1) * 0.5; return ‘M’ + x1 + ‘ ‘ + y1 + ‘ C’ + x1 + ‘ ‘ + (y1 + d) + ‘ ‘ + x2 + ‘ ‘ + (y2 – d) + ‘ ‘ + x2 + ‘ ‘ + y2; }
if (step === 3){
SPANLINKS.forEach(function(L, i){
var a = box(spanEl(L[0])), b = box(slotEl(L[1]));
var x2 = b.l + b.w / 2 + (L[2] === ‘er’ ? 14 : (L[1].indexOf(’emp’) === 0 ? -14 : 0));
P.push({ d:curve(a.l + a.w / 2, a.t + a.h, x2, b.t – 1), c:L[2], delay:i * 90 });
});
} else if (step >= 4){
TREE.forEach(function(L, i){
var a = box(slotEl(L[0])), b = box(slotEl(L[1]));
P.push({ d:curve(a.l + a.w / 2, a.t + a.h, b.l + b.w / 2, b.t – 1), c:’h’, delay:i * 140 });
});
}
wires.innerHTML = defs + P.map(function(p){
return ‘
}).join(”);
$$(‘path.w’, wires).forEach(function(p){
if (!anim || RM){ p.setAttribute(‘marker-end’, p.getAttribute(‘data-m’)); return; }
var len = p.getTotalLength(), dl = +p.getAttribute(‘data-delay’);
p.style.strokeDasharray = len; p.style.strokeDashoffset = len;
p.getBoundingClientRect();
p.style.transition = ‘stroke-dashoffset .7s ease ‘ + dl + ‘ms’;
p.style.strokeDashoffset = 0;
later(function(){ p.setAttribute(‘marker-end’, p.getAttribute(‘data-m’)); p.style.strokeDasharray = ‘none’; }, dl + 720);
});
}
function flip(mutate, animate){
var els = $$(‘.slot’, slotsEl);
var first = els.map(function(e){ return e.getBoundingClientRect(); });
mutate();
if (!animate || RM) return false;
els.forEach(function(e, i){
var f = first[i];
if (!f.width || getComputedStyle(e).display === ‘none’) return;
var l = e.getBoundingClientRect();
e.style.transition = ‘none’;
e.style.transform = ‘translate(‘ + (f.left – l.left) + ‘px,’ + (f.top – l.top) + ‘px)’;
});
requestAnimationFrame(function(){ requestAnimationFrame(function(){
els.forEach(function(e){ e.style.transition = ‘transform .7s cubic-bezier(.2,.8,.2,1),opacity .4s,border-color .4s’; e.style.transform = ”; });
}); });
return true;
}
function setStep(n, animate){
clearTimers();
var prev = step; step = n;
wires.innerHTML = ”;
for (var i = 1; i <= 3; i++) stage.classList.toggle(‘s’ + i, n >= i);
var needTree = n >= 4, hasTree = stage.classList.contains(‘s4’), flipped = false;
if (needTree !== hasTree){ flipped = flip(function(){ stage.classList.toggle(‘s4’, needTree); }, animate); }
stage.classList.toggle(‘s5’, n >= 5);
$(‘#glf-enc’).textContent = n >= 1 ? ‘DeBERTa encoder: 1 forward pass for text and schema’ : ‘DeBERTa encoder: waiting’;
if (n === 1 && animate && !RM){ stage.classList.remove(‘scan’); void stage.offsetWidth; stage.classList.add(‘scan’); }
$$(‘#glf-sent .f’).forEach(function(f, i){ f.style.transitionDelay = (animate && n === 2 && prev < 2) ? (i * 110) + ‘ms’ : ‘0ms’; });
$$(‘.slot .row’, slotsEl).forEach(function(r, i){ r.style.transitionDelay = (animate && n === 3 && prev < 3) ? (250 + i * 70) + ‘ms’ : ‘0ms’; });
var jl = $$(‘#glf-json .jl’);
jl.forEach(function(l, i){
if (n >= 5){
if (animate && prev < 5 && !RM){ l.classList.remove(‘on’); later(function(){ l.classList.add(‘on’); }, 120 + i * 70); }
else l.classList.add(‘on’);
} else l.classList.remove(‘on’);
});
$(‘#glf-jph’).hidden = n >= 5;
$(‘#glf-note’).textContent = n >= 4 ? ‘Empty anchors are dropped. The 6 filled anchors are arranged by their predicted parent to child links.’ : ‘8 of the 100 record anchors configured in each v1 checkpoint are shown.’;
$(‘#glf-copied’).textContent = n >= 5 ? ‘9’ : ‘0’;
if (n === 3) later(function(){ drawWires(animate); }, animate ? 120 : 0);
if (n >= 4) later(function(){ drawWires(animate && prev < 4); }, flipped ? 760 : 60);
$$(‘.stp’, stepsEl).forEach(function(b){
var s = +b.getAttribute(‘data-s’);
b.classList.toggle(‘done’, s <= n); b.classList.toggle(‘cur’, s === n);
b.setAttribute(‘aria-current’, s === n ? ‘step’ : ‘false’);
});
$(‘#glf-prev’).disabled = n <= 1;
$(‘#glf-next’).disabled = n >= 5;
$(‘#glf-cap’).innerHTML = n ? ‘Step ‘ + n + ‘ of 5. ‘ + STEPS[n – 1][1] : ‘Press Play to watch the 5 stages, or pick a stage. The example sentence and schema come from the GLiFormer README.’;
setTimeout(postH, 50);
}
function stopPlay(){ playing = false; clearTimeout(playT); $(‘#glf-play’).textContent = step >= 5 ? ‘Replay’ : ‘Play’; }
function tick(){
if (!playing) return;
if (step >= 5){ stopPlay(); return; }
setStep(step + 1, true);
playT = setTimeout(tick, step === 3 ? 2900 : 2500);
}
$(‘#glf-play’).addEventListener(‘click’, function(){
if (playing){ stopPlay(); return; }
playing = true; this.textContent=”Pause”;
if (step >= 5) setStep(0, false);
tick();
});
$(‘#glf-next’).addEventListener(‘click’, function(){ stopPlay(); if (step < 5) setStep(step + 1, true); stopPlay(); });
$(‘#glf-prev’).addEventListener(‘click’, function(){ stopPlay(); if (step > 1) setStep(step – 1, true); stopPlay(); });
$$(‘.stp’, stepsEl).forEach(function(b){ b.addEventListener(‘click’, function(){ stopPlay(); setStep(+b.getAttribute(‘data-s’), true); stopPlay(); }); });
var rz;
window.addEventListener(‘resize’, function(){ clearTimeout(rz); rz = setTimeout(function(){ if (step >= 3) drawWires(false); postH(); }, 120); });
if (document.fonts && document.fonts.ready) document.fonts.ready.then(function(){ if (step >= 3) drawWires(false); postH(); });
setStep(0, false);
/* ———- speed race (paper Table 7) ———- */
var D = [
{k:’3′, lab:’Depth 3′, i:456, o:175, g:64.3, gp:52.2, c:374.1, cp:240.0, sg:’48.9′, sc:’8.4′},
{k:’4′, lab:’Depth 4′, i:540, o:243, g:56.7, gp:54.2, c:488.4, cp:303.1, sg:’76.1′, sc:’8.8′},
{k:’5′, lab:’Depth 5′, i:771, o:522, g:108.6, gp:108.1, c:709.8, cp:551.7, sg:’83.6′, sc:’12.8′},
{k:’6′, lab:’Depth 6′, i:947, o:778, g:140.3, gp:127.8, c:890.4, cp:941.7, sg:’95.8′, sc:’15.1′},
{k:’all’, lab:’All 40 documents’, i:678, o:429, g:92.5, gp:69.0, c:615.7, cp:546.9, sg:’81.0′, sc:’12.2′}
];
var curD = D[3], raf = null;
var depthsEl = $(‘#glf-depths’);
depthsEl.innerHTML = D.map(function(d, i){ return ‘‘; }).join(”);
$$(‘.pill’, depthsEl).forEach(function(b){
b.addEventListener(‘click’, function(){
curD = D[+b.getAttribute(‘data-i’)];
$$(‘.pill’, depthsEl).forEach(function(x){ x.setAttribute(‘aria-pressed’, x === b ? ‘true’ : ‘false’); });
runRace();
});
});
$(‘#glf-run’).addEventListener(‘click’, runRace);
function fmt(n){ return n.toLocaleString(‘en-US’); }
function runRace(){
var d = curD;
var pre = d.i / 2000 * 1000, T = pre + d.o / 60 * 1000;
$(‘#ro-in’).textContent = fmt(d.i);
$(‘#ro-out’).textContent = fmt(d.o);
$(‘#ro-gp’).textContent = d.gp.toFixed(1) + ‘ ms’;
$(‘#ro-cp’).textContent = d.cp.toFixed(1) + ‘ ms’;
$(‘#glf-sum’).innerHTML = ‘Estimated LLM time: ‘ + (T / 1000).toFixed(2) + ‘ s (‘ + (pre / 1000).toFixed(2) + ‘ s prefill). The paper reports that as ‘ + d.sg + ‘× the GLiFormer-base GPU mean and ‘ + d.sc + ‘× the CPU mean.’;
var gpu = $(‘#lane-gpu’), cpu = $(‘#lane-cpu’), llm = $(‘#lane-llm’);
var fg = gpu.querySelector(‘.fill’), fc = cpu.querySelector(‘.fill’), fp = llm.querySelector(‘.f-pre’), fn = llm.querySelector(‘.f-gen’);
var tg = gpu.querySelector(‘.t’), tc = cpu.querySelector(‘.t’), tl = llm.querySelector(‘.t’);
var dur = RM ? 0 : 4200, t0 = null;
cancelAnimationFrame(raf);
function frame(now){
if (t0 === null) t0 = now;
var p = dur ? Math.min((now – t0) / dur, 1) : 1, t = p * T;
function w(v){ return (Math.min(t, v) / T * 100) + ‘%’; }
fg.style.width = w(d.g); fg.style.minWidth = t >= d.g ? ‘3px’ : ‘0’;
fc.style.width = w(d.c);
fp.style.width = w(pre);
fn.style.left = (pre / T * 100) + ‘%’;
fn.style.width = (Math.max(0, t – pre) / T * 100) + ‘%’;
gpu.classList.toggle(‘done’, t >= d.g); cpu.classList.toggle(‘done’, t >= d.c); llm.classList.toggle(‘done’, p >= 1);
tg.textContent = (t >= d.g ? d.g.toFixed(1) : t.toFixed(0)) + ‘ ms’;
tc.textContent = (t >= d.c ? d.c.toFixed(1) : t.toFixed(0)) + ‘ ms’;
tl.textContent = (t / 1000).toFixed(2) + ‘ s’;
$(‘#glf-tk’).textContent = p >= 1 ? d.o : Math.min(d.o, Math.floor(Math.max(0, t – pre) / 1000 * 60));
$(‘#glf-clock’).textContent = (t / 1000).toFixed(2) + ‘ s’;
if (p < 1) raf = requestAnimationFrame(frame);
}
raf = requestAnimationFrame(frame);
}
/* ———- scores (paper Tables 3 to 6) ———- */
var TASKS = [
{lab:’Nested JSON’, note:’Multilevel structuring on 500 examples, order-free and boundary-tolerant JSON F1. This is not exact JSON match. GPT-5.6-luna leads overall, but GLiFormer-large scores higher at depths 4, 5, and 6+ in Table 6 of the paper.’, rows:[
[‘GPT-5.6-luna’, null, 91.96], [‘GLiFormer-large’, 575.6, 91.10, 1], [‘GLiFormer-base’, 264.2, 87.20, 1], [‘GPT-5-mini’, null, 82.56], [‘Qwen3.5 9B’, 9653.1, 78.5]]},
{lab:’Classification’, note:’Mean macro-F1 across 13 datasets (79,828 examples). Larger LLMs still lead this aggregate.’, rows:[
[‘GPT-5-mini’, null, 79.79], [‘Gemma-4-31B-IT’, 31000, 79.69], [‘Gemma4-12B’, 11959.7, 77.8], [‘GPT-OSS-120B’, 117000, 77.76], [‘GLiFormer-large’, 575.6, 75.03, 1], [‘GLiFormer-base’, 264.2, 72.36, 1], [‘GLiClass Multilang ultra’, 1708.2, 71.01], [‘GLiNER2 large v1’, 486.4, 66.19], [‘GLiNER2.5′, 193.6, 64.89]]},
{lab:’CrossNER’, note:’Mean strict entity F1 across the 5 CrossNER domains (2,505 examples). Base slightly edges Large here.’, rows:[
[‘Gemma-4-31B-IT’, 31000, 70.74], [‘GPT-OSS-120B’, 117000, 70.24], [‘GPT-5-mini’, null, 69.97], [‘GLiNER Multitask Large v0.5’, 440.2, 67.97], [‘NuNER Zero-span’, 448.9, 66.82], [‘GLiFormer-base’, 264.2, 65.10, 1], [‘GLiFormer-large’, 575.6, 64.35, 1], [‘GLiNER2 Base’, 208.5, 59.06]]},
{lab:’Relations’, note:’Mean micro-F1 over CoNLL04, DocRED, FewRel, and CrossRE. GLiFormer uses predicted entities; Base and Large ran on different-sized subsets, and Large uses CoNLL04 zero-shot. GLiFormer trails the strongest baselines on this task.’, rows:[
[‘GLiNER-Relex’, null, 25.6], [‘Gemma-4-31B-IT’, 31000, 25.08], [‘GPT-OSS-120B’, 117000, 23.99], [‘GPT-5-mini’, null, 22.1], [‘GLiFormer-large’, 575.6, 21.33, 1], [‘GLiFormer-base’, 264.2, 18.94, 1], [‘GLiNER2’, null, 17.8]]}
];
var curTask = 0;
var tasksEl = $(‘#glf-tasks’);
tasksEl.innerHTML = TASKS.map(function(t, i){ return ‘‘; }).join(”);
$$(‘.pill’, tasksEl).forEach(function(b){
b.addEventListener(‘click’, function(){
curTask = +b.getAttribute(‘data-i’);
$$(‘.pill’, tasksEl).forEach(function(x){ x.setAttribute(‘aria-pressed’, x === b ? ‘true’ : ‘false’); });
renderScores(curTask);
});
});
function params(m){
if (m === null) return ‘parameter count not listed’;
return m >= 1000 ? (+(m / 1000).toFixed(2)) + ‘B parameters’ : m + ‘M parameters’;
}
function renderScores(ix){
var t = TASKS[ix], max = Math.max.apply(null, t.rows.map(function(r){ return r[2]; }));
var list = $(‘#glf-scores’);
list.innerHTML = t.rows.map(function(r){
return ‘
‘ + r[0] + ‘‘ + params(r[1]) + ‘
‘ + r[2].toFixed(2) + ‘
‘;
}).join(”);
$(‘#glf-scnote’).textContent = t.note + ‘ All figures are reported by Knowledgator in the GLiFormer paper.’;
var fills = $$(‘.fill’, list);
requestAnimationFrame(function(){ requestAnimationFrame(function(){ fills.forEach(function(f){ f.style.width = f.getAttribute(‘data-w’) + ‘%’; }); }); });
postH();
}
/* ———- code snippets (from the v1 model cards) ———- */
var LOAD = [
‘import torch’,
‘from gliformer import GLiFormer’,
”,
‘model = GLiFormer.from_pretrained(‘,
‘ “knowledgator/gliformer-large-v1”,’,
‘ load_tokenizer=True,’,
‘)’,
‘model = model.to(“cuda” if torch.cuda.is_available() else “cpu”).eval()’,
”
].join(‘\n’);
var SNIPS = [
{lab:’Install’, note:’Requires Python 3.10 or newer. Optional CUDA attention kernels install from source with pip install -e “.[flash]”. CPU inference uses eager attention.’, code:[
‘pip install gliformer -U’,
”,
‘# or from source’,
‘git clone https://github.com/Knowledgator/GLiFormer.git’,
‘cd GLiFormer’,
‘pip install -e .’].join(‘\n’)},
{lab:’Entities’, note:’Each entity returns text, label, start, end, and score. Offsets are character positions with an exclusive end.’, code:LOAD + [
‘entities = model.predict_entities(‘,
‘ “Alice works at Acme in London.”,’,
‘ [“person”, “organization”, “location”],’,
‘ threshold=0.5,’,
‘)’,
‘for entity in entities:’,
‘ print(entity[“text”], entity[“label”], entity[“score”])’].join(‘\n’)},
{lab:’Nested JSON’, note:’Pydantic validation checks the output schema, not factual correctness.’, code:LOAD + [
‘from pydantic import BaseModel’,
”,
‘class Employee(BaseModel):’,
‘ name: str’,
‘ role: str’,
”,
‘class Department(BaseModel):’,
‘ name: str’,
‘ employees: list[Employee]’,
”,
‘class Company(BaseModel):’,
‘ name: str’,
‘ departments: list[Department]’,
”,
‘records = model.structure(‘,
‘ “At Acme, Engineering includes Alice, a software engineer, and Bob, “‘,
‘ “a designer. Sales includes Carol, an account manager.”,’,
‘ {“company”: Company},’,
‘ validate_output=True,’,
‘)’,
‘print(records)’].join(‘\n’)},
{lab:’Many tasks, 1 call’, note:’inference returns a dictionary keyed by task, with one result per input text.’, code:LOAD + [
‘results = model.inference(‘,
‘ “Alice joined Acme as a software engineer.”,’,
‘ entities=[“person”, “organization”],’,
‘ classes=[“business”, “sports”, “technology”],’,
‘ structures={“employee”: [“name”, “company”]},’,
‘)’,
‘print(results[“ner”][0])’,
‘print(results[“classification”][0])’,
‘print(results[“structuring”][0])’].join(‘\n’)},
{lab:’Relations’, note:’The v1 checkpoints have a joint relation head only. predict_relations needs an open relation head, so use joint_relations.’, code:LOAD + [
‘results = model.inference(‘,
‘ “Alice works at Acme.”,’,
‘ joint_relations={‘,
‘ “employment”: {‘,
‘ “entities”: [“person”, “organization”],’,
‘ “relations”: [“works_at”],’,
‘ }’,
‘ },’,
‘ threshold=0.5,’,
‘)’,
‘for relation in results[“joint_relex”][0]:’,
‘ print(relation[“head”][“text”], relation[“relation”], relation[“tail”][“text”])’].join(‘\n’)}
];
var snipsEl = $(‘#glf-snips’), curSnip = 0;
snipsEl.innerHTML = SNIPS.map(function(s, i){ return ‘‘; }).join(”);
function showSnip(i){
curSnip = i;
$(‘#glf-code’).textContent = SNIPS[i].code;
$(‘#glf-codenote’).textContent = SNIPS[i].note;
$(‘#glf-copy’).textContent=”Copy”;
postH();
}
$$(‘.pill’, snipsEl).forEach(function(b){
b.addEventListener(‘click’, function(){
$$(‘.pill’, snipsEl).forEach(function(x){ x.setAttribute(‘aria-pressed’, x === b ? ‘true’ : ‘false’); });
showSnip(+b.getAttribute(‘data-i’));
});
});
$(‘#glf-copy’).addEventListener(‘click’, function(){
var txt = SNIPS[curSnip].code, btn = this;
function done(){ btn.textContent=”Copied”; setTimeout(function(){ btn.textContent=”Copy”; }, 1600); }
function fallback(){
var ta = document.createElement(‘textarea’); ta.value = txt; ta.style.position = ‘fixed’; ta.style.opacity = ‘0’;
document.body.appendChild(ta); ta.select();
try { document.execCommand(‘copy’); done(); } catch (e) { btn.textContent=”Select and copy”; }
document.body.removeChild(ta);
}
if (navigator.clipboard && navigator.clipboard.writeText){ navigator.clipboard.writeText(txt).then(done, fallback); } else fallback();
});
showSnip(0);
renderScores(0);
})();
“>
Both v1 checkpoints use the gliformer-layout model type with 5 heads: NER, classification, joint relations, multilevel structuring, and embeddings. Each configures a 12-word maximum span width and 100 record anchors. Full specs sit in the pretrained models docs.
GLiFormer-base starts from a DeBERTa backbone further pretrained on 100 billion tokens. The paper documents 1,357,671 examples for broad multitask training and 372,090 for task-focused post-training.
All scores below are reported by Knowledgator.
On combined NER and classification aggregates, the paper reports Large beats Gemma-4-E4B with about 14× fewer parameters.
Knowledgator timed GLiFormer-base on 40 structuring documents at batch size 1. Median latency was 69 ms on an NVIDIA RTX PRO 6000 Blackwell GPU in FP16. On an 8-thread AMD EPYC 9B45 CPU in FP32, it was 547 ms.
The key claim ‘up to 95.8× faster’ figure is an analytical estimate, not a measured LLM run. It assumes prefill at 2,000 input tokens per second and generation at 60 output tokens per second. It excludes queueing, network delay, and hidden reasoning, and assumes nothing about accuracy parity.
Nested Pydantic schemas work for multilevel records. One inference call can also run entities, classes, and structures together. Use joint_relations for relations, since the v1 checkpoints lack an open relation head.
Need to partner with us for promoting your GitHub Repo OR Hugging Face Page OR Product Release OR Webinar etc.? Connect with us
