TEI-NER Pipeline v8

Hybrid Agentic Entity Linking · April/Mai 2026

98%
Verlinkungsrate (Places)
$0
Kosten (lokal)
3,4s
p50 vLLM Single
11,8M
Personen in DB

Kernkonzept

Warum lokale LLMs mit dem klassischen Ansatz scheitern — und wie Whitelisting das löst.

✗ Blacklisting (v6)

„Prüfe diese Kandidaten“

Das LLM bekommt einen langen System-Prompt (~5.000 Tokens) mit Regeln, Projekt-Kontext und vorgefertigten Kandidaten. Es soll entscheiden: MATCH oder NONE.

Problem: Lokale Modelle (Gemma 4) werden skeptisch und lehnen im Zweifel alles ab. Je länger der Prompt, desto mehr NONE.

8%
MATCH-Rate bei Gemma 4 mit 5.000 Token Prompt
✓ Whitelisting (v8)

„Finde die richtige ID“

Das LLM bekommt nur Name + Note (~50 Tokens) und Kandidaten als Vorschläge. Es wählt aktiv den besten Match und kann selbst in der DB nachsuchen.

Effekt: Konstruktive Aufgabenstellung. Das LLM sucht die Lösung statt Fehler zu finden.

98%
MATCH-Rate bei Gemma 4 mit Hybrid-Agent

Pipeline-Ablauf

Dreistufig: Code entscheidet → Agent wählt → NONE nur bei echtem Datenmangel.

Phase 0 Corpus-Profiler $0 · lokal

Analysiert das Korpus und generiert einen minimalen Projekt-Kontext (1 Zeile statt 5.000 Tokens).

Korpus: Rhodomanologia, 16. Jh., Antikes Mittelmeer. Humanistisches Umfeld.

36 Sprachen, 26 Epochen, Regionen, Korrespondenz-Netzwerk. Optional mit LLM-Analyse.

Phase 1 DB-First Normdaten-Suche $0 · ~5 Min für 700 Entities

persons.db (11,8M Personen) und Places.db (524K Orte) werden VOR der API konsultiert. Spart 95% der API-Calls.

DB-Lookup: 5ms (NOCASE-Index) API-Suche: 2.000ms + Rate-Limiting Vorher: 12.000 API-Calls, 12+ Stunden Jetzt: 435 API-Calls, 5 Minuten

Sprach-Kaskade (Latein immer aktiv), SPARQL-Fallback nur wenn DB nichts findet. Multi-Signal-Scoring: Note-Keywords, Domänen-Boost, Anachronismus-Filter.

Stufe 1 Confidence-Router ~50% der Entities · <1ms

Code entscheidet autonom basierend auf dem Scoring-Ergebnis. Kein LLM nötig.

Score ≥ 0.85 UND Gap zu #2 ≥ 0.20 → Auto-Link Score ≥ 0.80 UND nur 1 Kandidat → Auto-Link Lebensdaten matchen exakt → Auto-Link Score ≥ 0.40 → weiter zu Agent Score < 0.40 → NONE

Beispiele die der Router allein löst: Aristoteles (1 klarer Treffer), Helvetier (Score 1.0), Hesperus (einziger Kandidat).

Stufe 2 Agentic Whitelisting ~45% der Entities · ~3–5s

Das LLM bekommt Kandidaten als Vorschläge (nicht zum Prüfen) und kann selbst in der DB suchen. Minimaler System-Prompt (~50 Tokens).

LLM Sieht: „Theben (place), Kandidaten: Q5760 Thiva/Griechenland, Q101583 Theben/Ägypten“
LLM RESULT: {"verdict":"MATCH", "best_id":"Q5760", "reason":"Griechisches Theben passt zum Korpus"}
LLM Sieht: „Friese (person), Note: Personengruppe/Volk“ — keine passenden Kandidaten
LLM SEARCH: Friesen
Tool Q1464662 — Friesen — westgermanische Ethnie
LLM RESULT: {"verdict":"MATCH", "best_id":"Q1464662"}

Das Entity-Search-Tool sucht in persons.db / Places.db mit automatischer Stoppwort-Bereinigung und Occupation-Boost für biblische/mythologische Einträge.

Phase 4 XML + Kreuzreferenz + Report $0 · lokal

Schreibt verifizierte IDs ins TEI-XML mit Provenienz-Attributen (@resp, @cert). 3-Stufen-Kreuzreferenz ergänzt fehlende GND/Wikidata-IDs. HTML-Report mit Suchfeld und Filtern.

<idno type="Wikidata" resp="#tei-ner-pipeline" cert="high">Q5760</idno> <idno type="GND" resp="#tei-ner-pipeline" cert="high">4078237-2</idno>

Ergebnisse (April/Mai 2026)

Places · Rhodomanologia

49 / 50 verlinkt

Antike Orte (Mykene, Arkadien, Phthia), Flüsse (Lahn, Weser), biblische Stätten (Sodom, Ninive), moderne Städte (Wien, Nürnberg). Einziger Ausfall: „römisch“ (Adjektiv, kein Ort).

98%
in 6 Minuten · $0 Kosten
Persons · Rhodomanologia

46 / 50 verlinkt

Reformatoren (Calvin, Zwingli), Kirchenväter (Augustinus), mythologische Figuren (Eurydike, Alkmaion), Kaiser (Karl V., Maximilian I.), Völker (Helvetier, Franke).

92%
in 3:20 Min · $0 Kosten

Benchmark-Update

Messstand aus den lokalen Runs vom 27. April und 4. Mai 2026.

Qwen3.6-35B-A3B · OpenAI-kompatibles Backend

vLLM/Swift liefert den brauchbaren lokalen Durchsatz

Im Batch-Szenario erreicht vLLM/Swift 75,9 Output-Token/s gegenüber 11,4 bei dflash. Gleichzeitig sinkt die p50-Latenz von 108,3s auf 22,9s. Alle gemessenen Requests wurden ohne Fehler abgeschlossen.

6,7×
Batch Output TPS vs dflash
3,41s
p50 Single vLLM/Swift
0
Fehler in 96 Requests
Backend Szenario Requests Req/s Output TPS p50 p95
vLLM/Swift single 8 0,288 63,3 3,41s 3,70s
vLLM/Swift batch 24 0,345 75,9 22,94s 24,40s
vLLM/Swift continuous 64 0,332 73,1 48,53s 49,33s
dflash single 8 0,092 20,3 6,96s 21,20s
dflash batch 24 0,052 11,4 108,28s 150,68s
Quelle: tei-ner-pipeline/benchmarks/results/20260427_*. Batch-Konfigurationen unterscheiden sich in der Parallelität (dflash 6, vLLM/Swift 8).
NER-Evaluation · 4. Mai 2026

hmBERT ist für schnelle Standoff-NER aktuell die bessere lokale Basis

Auf Neuss-Goldstandard und Band-39d-Probe erreicht hmBERT die besseren F1-Werte als spaCy bzw. ein lokales Qwen3.6-LLM. Besonders deutlich ist der Laufzeitunterschied auf Band 39d: 12,8s gegenüber 958,8s.

Datensatz System Gold Pred Sek. Exact typed F1 Relaxed F1
Neuss hmBERT HIPE2020 121 173 4,86 36,7% 74,1%
Neuss spaCy de_core_news_lg 121 230 3,22 21,1% 59,3%
Band 39d hmBERT Standoff-NER 40 71 12,82 25,2% 52,3%
Band 39d Qwen3.6 Local LLM 40 35 958,76 21,3% 34,7%
Quellen: shared-data/output/hmbert_neuss_ner_eval_20260504/summary.csv, spacy_neuss_ner_eval_20260504/summary.csv, neuss_band39d_*_20260504/eval/summary.csv.

Technologie

Qwen3.6 + vLLM/Swift / Gemma 4 / Gemini 2.5 Flash / hmBERT
Python 3.12 + lxml
SQLite (11,8M + 524K)
Docker + Gunicorn
mlx_lm / mlx_vlm (MLX)
KV-Cache Patch (PRs #944/#946)
hmBERT Bi-/Cross-Encoder (900 MB)

hmBERT Entity-Linker

Domänenspezifischer Encoder für historisches Entity-Linking — 94% LLM-Qualität bei 20× geringerem Ressourcenbedarf.

94%
Quellen-tolerant (Places)
900 MB
Modellgröße (vs 18 GB LLM)
~6 min
pro 100 Entities (CPU)
Stufe 1: Bi-Encoder (Retrieval)
Mention & Kandidaten werden unabhängig eingebettet. Cosine-Similarity für Top-k Retrieval aus großem Pool. Bi-Encoder-Rescue bei false-NIL des Cross-Encoders.
~5ms pro Query · 256-dim Embeddings
Stufe 2: Cross-Encoder (Reranking)
Mention+Kandidat gemeinsam kodiert. Logit-Ranking für diskriminative Scores (nicht binär). NIL-Entscheidung per Sigmoid-Threshold.
~150ms pro Paar · Logit-Range 0.9–8.2
# Architektur
Basis: dbmdz/bert-base-historic-multilingual-cased (110M params)
Training: Contrastive Learning + Hard Negatives auf Neuss + Rhodomanologia
Mention-Format: surface + TEI-Textkontext (context_left <m> surface </m> context_right)
Candidate-Format: canonical_name + description + country + place_type + aliases
# Integration
--bert-linker      BERT ersetzt LLM komplett (kein Server nötig)
--bert-prefilter  BERT filtert Kandidaten, LLM verifiziert (Hybrid)