GLiNER: lokale Entscheidungen und Entitätsextraktion

Entwicklungsvorschau. Die Gewichte sind auf Hugging Face veröffentlicht; das Swift-Modul ist im Review und noch in keinem speech-swift-Release enthalten.

Das GLiNER-Modul führt GLiNER2.5-Decide in MLX Swift aus. Übergeben Sie Text und eine Liste erlaubter Labels, um Klassifikationswerte zu erhalten, oder fragen Sie Entitäten-Spans wie eine Person und eine Uhrzeit ab.

Funktionsweise

Ein DeBERTa-Encoder liest Text und Schema gemeinsam. Klassifikationsköpfe bewerten Ihre Labels. Entitätsköpfe bestimmen Spans im ursprünglichen Satz. Die Laufzeit erzeugt keine JSON-Antwort Token für Token.

import GLiNER
let model = try await GLiNER.fromPretrained()
let choices = try model.classify(
    "Remind me to call Dad at six PM.",
    labels: ["create_reminder", "send_message", "other"]
)
let spans = try model.extractEntities(
    "Remind me to call Dad at six PM.",
    labels: ["person", "time"]
)

Gewichte

Drei MLX-Konvertierungen der fixierten Upstream-Revision 7ee5da4c sind auf Hugging Face veröffentlicht. Die Laufzeit lädt die gewählte Variante beim ersten Aufruf herunter und nutzt danach den lokalen Cache; Python wird nicht benötigt.

VarianteRepositoryGewichteRoutingExtraktionSpitzenspeicher
int8 (Standard)aufklarer/GLiNER2.5-Decide-340M-MLX-8bit567 MB7.6 ms8.9 ms0.85 GB
fp16aufklarer/GLiNER2.5-Decide-340M-MLX-fp16973 MB8.8 ms10.0 ms1.58 GB
fp32aufklarer/GLiNER2.5-Decide-340M-MLX1.95 GB11.1 ms12.6 ms2.55 GB

Apple M5 Pro, ohne andere Last: Median einer vollständigen Anfrage einschließlich Tokenisierung und Spitzenspeicher des Prozesses. Alle drei Varianten liefern auf 24 Referenzfällen dieselben Labels, Spans und Offsets wie das Upstream-PyTorch-Modell, mit Konfidenzabweichungen unter 0,006.

Kommandozeile

Die speech-CLI bietet beide Aufgaben als speech gliner classify und speech gliner extract. Labels werden kommagetrennt übergeben; --description label=text lässt sich wiederholen. Ohne Text wird von stdin gelesen. --variant wählt int8 (Standard), fp16 oder fp32, und --model-dir lädt ein lokales Bundle statt eines Downloads. Ungültige Argumente werden abgewiesen, bevor das Modell lädt. Mit --json enthält die Ausgabe jede Label-Wahrscheinlichkeit oder Spans mit UTF-16-Offsets sowie Lade- und Inferenzzeiten.

swift build -c release --product speech --disable-sandbox
scripts/build_mlx_metallib.sh release
.build/release/speech gliner classify "Remind me to call Dad at six PM." \
  --labels create_reminder,send_message,set_timer,other
.build/release/speech gliner extract "Remind me to call Dad at six PM." \
  --labels person,time --json

Die Modellkarte für Agenten ist eine Markdown-Datei mit der genauen API, den Ausgabefeldern und den verifizierten Ergebnissen.

Genauigkeit auf einem kleinen Befehlssatz

Von sechzehn handgeschriebenen Routing-Beispielen entsprachen 12 der Erwartung, von acht Extraktionsbeispielen 7. Die Swift-Portierung reproduziert das Upstream-PyTorch-Modell auf 24 Referenzfällen: identische Token-IDs, Labels und Spans, Werte innerhalb von 0,001. Diese kleinen Sätze prüfen Verhalten und Treue; sie sind kein breiter Genauigkeits-Benchmark.

Umfang und Grenzen

Präzision und Speicher

FP16 halbiert den Gewichtsspeicher auf 973 MB. INT8 quantisiert die Encoder-Matrizen und Token-Embeddings in Gruppen von 64 auf 8 Bit, Köpfe, Normalisierung und Aktivierungen bleiben in FP16; die Datei hat 567 MB. Die Laufzeit hält INT8-Matrizen gepackt und dekodiert nur die Embedding-Zeilen, die eine Anfrage nutzt.

Die Projektionen der relativen Positionen hängen nur von den Gewichten ab und werden daher einmal beim Laden statt bei jeder Anfrage berechnet. Der optionale Modus GLiNER.load(from:evaluateLayers:) materialisiert Encoder-Schichten einzeln, um Spitzenallokationen zu senken.

Quellen und Urheber