File size: 7,344 Bytes
cfd08a3 410d3c9 cfd08a3 5b17a3c cfd08a3 410d3c9 cfd08a3 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 | ---
language: nl
license: mit
base_model: microsoft/mdeberta-v3-base
pipeline_tag: zero-shot-classification
tags:
- zero-shot-classification
- text-classification
- natural-language-inference
- dutch
- nederlands
- multilingual
---
# Arlo Classify 1.0
**Arlo** is een Nederlandse modelfamilie voor snelle, getypeerde beslissingen.
Waar een taalmodel tekst genereert die je daarna moet interpreteren, geeft Arlo
direct een waarde terug waar software mee kan werken — een label, een getal, een
veld — altijd met een confidence score.
Dit model dekt twee van de vier Arlo-primitieven: **Choice** (kiezen uit opties)
en **Noul** (hoe waar is een stelling).
## Arlo in actie
<video controls loop muted playsinline src="https://huggingface.co/NoaberAI/arlo-classify/resolve/main/demo.mp4"></video>
## Waarom dit anders is dan een taalmodel
Een LLM beantwoordt zo'n vraag door token voor token tekst te genereren. Dat
kost tijd, kost geld per token, en levert output op die je nog moet parsen —
met het risico dat er iets terugkomt dat niet in je schema past.
Arlo doet per vraag **één forward pass** door een encoder-model van 280M
parameters. Het genereert niets; het weegt de vraag tegen de tekst en geeft een
score. Daardoor:
- **snel**: tientallen milliseconden per vraag, ook op een CPU
- **voorspelbaar**: de uitkomst is altijd een label uit jouw lijst of een getal
tussen 0 en 1 — nooit iets daarbuiten
- **lokaal draaibaar**: geen API-aanroep nodig, dus geschikt voor situaties waar
data de deur niet uit mag
- **zonder tokenkosten**: je draait het zelf
## Gebruik
```python
from transformers import AutoModel, AutoTokenizer
model = AutoModel.from_pretrained("NoaberAI/arlo-classify", trust_remote_code=True)
tokenizer = AutoTokenizer.from_pretrained("NoaberAI/arlo-classify")
```
### Choice — kiezen uit opties
De opties geef je pas op het moment van gebruik mee. Er is geen hertraining
nodig om een nieuwe categorie-indeling te gebruiken: je verandert simpelweg de
lijst.
```python
model.choice(tokenizer,
"Kan ik mijn abonnement een maand pauzeren?",
["klacht", "vraag", "compliment"])
# [{"label": "vraag", "confidence": 0.68},
# {"label": "klacht", "confidence": 0.18},
# {"label": "compliment", "confidence": 0.15}]
model.choice(tokenizer,
"De stoeptegels op de Molenstraat liggen los.",
["openbare ruimte", "vergunningen", "burgerzaken", "belastingen", "sociaal domein"])
# [{"label": "openbare ruimte", "confidence": 0.61}, ...]
```
Voor gevallen waar meerdere labels tegelijk waar kunnen zijn:
```python
model.choice(tokenizer, tekst, labels, multi_label=True)
```
### Noul — hoe waar is deze stelling?
Noul geeft een waarheidsgraad tussen 0 en 1 in plaats van een hard ja/nee, zodat
je zelf de drempel bepaalt die bij jouw proces past.
```python
model.noul(tokenizer,
"Er ligt een gaslek open op straat, mensen worden geëvacueerd!",
"Dit is een spoedeisende melding.")
# {"truth": 0.72}
model.noul(tokenizer,
"Dit is niet urgent, maar de bank in het park kan wel geschilderd worden.",
"Dit is een spoedeisende melding.")
# {"truth": 0.16}
```
### Zonder trust_remote_code
Het model is een gewone NLI-classifier, dus de standaardpipeline werkt ook:
```python
from transformers import pipeline
classifier = pipeline("zero-shot-classification", model="NoaberAI/arlo-classify")
classifier("De put op de Kerkstraat is verstopt.",
candidate_labels=["verkeer", "riolering", "afval"])
```
## Hoe het werkt
Het model is getraind als natural language inference-classifier: het krijgt een
tekst en een stelling, en bepaalt of die stelling volgt uit de tekst
(*entailment*), eruit weersproken wordt (*contradiction*), of geen van beide
(*neutral*).
Beide primitieven bouwen daarop voort:
- **Choice** zet elk label om in een stelling ("Dit gaat over riolering.") en
vergelijkt de entailment-scores. Daardoor werkt het zero-shot met elke
labelverzameling die je meegeeft.
- **Noul** neemt je stelling rechtstreeks en normaliseert entailment tegen
contradiction tot één waarheidsgraad.
## Ook op andere talen
Het model is op Nederlands getraind, maar de backbone (`mdeberta-v3-base`) is
multilingual en dat blijft merkbaar: dezelfde melding in vijf talen levert
vrijwel dezelfde uitkomst op.
```python
labels = ["openbare ruimte", "belastingen", "burgerzaken"]
model.choice(tok, "De straatlamp voor mijn huis is kapot.", labels) # 0.68
model.choice(tok, "The streetlight in front of my house is broken.", labels) # 0.69
model.choice(tok, "Die Straßenlaterne vor meinem Haus ist kaputt.", labels) # 0.71
model.choice(tok, "Le lampadaire devant ma maison est cassé.", labels) # 0.67
model.choice(tok, "La farola delante de mi casa está rota.", labels) # 0.66
```
Alle vijf kiezen `openbare ruimte`. Je labels en stellingen mag je in het
Nederlands laten staan, ook als de tekst dat niet is — voor Noul werkt dat zelfs
beter dan de stelling meevertalen:
```python
tekst = "There is a tree across the road, very dangerous!"
model.noul(tok, tekst, "Dit is een spoedeisende melding.") # {"truth": 0.87}
model.noul(tok, tekst, "This is an urgent report.") # {"truth": 0.61}
```
## De Arlo-familie
Arlo bestaat uit drie modellen die samen een complete laag vormen voor
gestructureerde beslissingen. Ze delen dezelfde backbone-architectuur en
hetzelfde output-contract — een waarde plus een confidence — en zijn
onafhankelijk of gecombineerd te gebruiken.
| Model | Primitieven | Waarvoor |
|---|---|---|
| **[arlo-classify](https://huggingface.co/NoaberAI/arlo-classify)** | Choice, Noul | categoriseren, routeren, waarheidsvragen |
| [arlo-score](https://huggingface.co/NoaberAI/arlo-score) | Score | numeriek beoordelen tegen een rubric |
| [arlo-extract](https://huggingface.co/NoaberAI/arlo-extract) | Extraction | getypeerde velden uit tekst halen |
Eén binnenkomende tekst door alle drie halen geeft in één keer een volledig
gestructureerd beeld:
```python
tekst = ("Al drie dagen ligt er een dode boom over het fietspad aan de "
"Dorpsstraat, gevaarlijke situatie voor fietsers, graag snel actie.")
classify.choice(tokenizer_c, tekst, ["openbare ruimte", "vergunningen", "burgerzaken"])
# [{"label": "openbare ruimte", "confidence": 0.75}, ...]
classify.noul(tokenizer_c, tekst, "Dit is een spoedeisende melding.")
# {"truth": 0.77}
extract.extract(tokenizer_e, tekst, "Waar is het probleem?")
# {"value": "Dorpsstraat", "confidence": 1.00}
```
Van vrije tekst naar een compleet ingevuld formulier, in een fractie van de tijd
die een taalmodel nodig heeft — en zonder dat er iets te parsen valt.
## Technische details
- **Backbone**: `microsoft/mdeberta-v3-base` (~280M parameters)
- **Kop**: sequence classification, 3 klassen (entailment / neutral / contradiction)
- **Taal**: Nederlands
- **Trainingsdata**: Nederlandse natural language inference-data, aangevuld met
domeinspecifieke voorbeelden uit overheid en klantenservice
- **Hardware**: getraind op een NVIDIA A100
- **Licentie**: MIT
Gemaakt door [NoaberAI](https://huggingface.co/NoaberAI).
|