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.
| Variante | Repository | Gewichte | Routing | Extraktion | Spitzenspeicher |
|---|---|---|---|---|---|
int8 (Standard) | aufklarer/GLiNER2.5-Decide-340M-MLX-8bit | 567 MB | 7.6 ms | 8.9 ms | 0.85 GB |
fp16 | aufklarer/GLiNER2.5-Decide-340M-MLX-fp16 | 973 MB | 8.8 ms | 10.0 ms | 1.58 GB |
fp32 | aufklarer/GLiNER2.5-Decide-340M-MLX | 1.95 GB | 11.1 ms | 12.6 ms | 2.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
- Einzel-Label-Klassifikation und Entitäten-Spans; bis zu 512 kodierte Token pro Anfrage.
- Span/count_lstm-Checkpoints mit geteilter relativer Attention, in FP32, FP16 oder INT8. Boundary-Modelle, Relationsgraphen und gemeinsame Constraints gehören nicht zu dieser ersten API.
- Entitäts-Offsets verwenden UTF-16, passend zu NSRange. Datums- und Zeitangaben müssen separat normalisiert werden.
- Werte garantieren nicht, dass eine Entscheidung richtig ist. Das Modul führt keine Tools aus.
- Download-Größe, Prozessspeicher und physischer Footprint im Unified Memory sind unterschiedliche Messgrößen.
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.