arlo-extract / README.md
joranvnbeekAI's picture
Documenteer meertalige werking
0d67622 verified
|
Raw History Blame Contribute Delete
6.3 kB
---
language: nl
license: mit
base_model: microsoft/mdeberta-v3-base
pipeline_tag: question-answering
tags:
- question-answering
- extractive-qa
- information-extraction
- dutch
- nederlands
- multilingual
---
# Arlo Extract 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 — altijd met een confidence
score.
Dit model dekt het **Extraction**-primitief: getypeerde velden uit vrije tekst
halen. Datums, bedragen, kenmerken, locaties, namen — je stelt per veld een
vraag en krijgt de letterlijke waarde uit de tekst terug.
## Arlo in actie
<video controls loop muted playsinline src="https://huggingface.co/NoaberAI/arlo-extract/resolve/main/demo.mp4"></video>
## Wat dit model onderscheidt
Het model wijst een stuk van de originele tekst aan als antwoord. Het verzint
dus niets: wat je terugkrijgt staat er letterlijk, op de positie waar het model
het gevonden heeft. En staat het gevraagde veld er niet in, dan zegt het model
dat — `value` is dan `None` in plaats van een plausibel klinkende gok.
Dat laatste is waar veel extractie-oplossingen op stukloopt. Een ontbrekend veld
moet leeg blijven, niet ingevuld worden met het dichtstbijzijnde stukje tekst.
## Gebruik
```python
from transformers import AutoModel, AutoTokenizer
model = AutoModel.from_pretrained("NoaberAI/arlo-extract", trust_remote_code=True)
tokenizer = AutoTokenizer.from_pretrained("NoaberAI/arlo-extract")
model.extract(tokenizer,
"Melding: kapotte straatverlichting aan de Julianalaan ter hoogte van "
"huisnummer 42, gemeld op 3 september 2026.",
"Waar is het probleem?")
# {"value": "Julianalaan", "confidence": 1.00}
```
### Meerdere velden tegelijk
```python
model.extract_fields(tokenizer,
"Factuur 4471 van Bakkerij Jansen, totaalbedrag 47 euro 50, "
"vervaldatum 15 oktober 2026.",
{
"factuurnummer": "Wat is het factuurnummer?",
"bedrag": "Wat is het totaalbedrag?",
"vervaldatum": "Wat is de vervaldatum?",
})
# {"factuurnummer": {"value": "4471", "confidence": 1.00},
# "bedrag": {"value": "47 euro 50", "confidence": 0.84},
# "vervaldatum": {"value": "15 oktober 2026", "confidence": 1.00}}
```
### Een veld dat er niet in staat
```python
model.extract(tokenizer,
"Het pakket wordt morgen bezorgd door PostNL.",
"Wat kost de bezorging?")
# {"value": None, "confidence": 0.93}
```
## Hoe het werkt
Het model voorspelt voor elke positie in de tekst hoe waarschijnlijk het is dat
daar een antwoord begint en eindigt. De beste combinatie daarvan is de
kandidaat-span.
Die kandidaat wordt vervolgens afgewogen tegen een aparte "geen antwoord"-score.
Alleen als de beste span duidelijk sterker is dan die drempel, wordt hij
teruggegeven. De drempel (`null_bias`) is gekalibreerd op een validatieset en
zit in de modelconfiguratie — je hoeft er zelf niets aan te doen.
### Vraagformulering
Hoe specifieker de vraag, hoe scherper het antwoord. Vraag je "Waar is het
probleem?" dan krijg je de locatie; vraag je "Wat is er kapot?" dan krijg je het
object. Twee vragen op dezelfde tekst leveren dus netjes twee verschillende
velden op:
```python
model.extract_fields(tokenizer,
"Kapotte lantaarnpaal aan de Julianalaan ter hoogte van huisnummer 42.",
{"object": "Wat is er kapot?", "locatie": "Aan welke straat is het probleem?"})
# {"object": {"value": "lantaarnpaal", "confidence": 1.00},
# "locatie": {"value": "Julianalaan", "confidence": 1.00}}
```
## Ook op andere talen
Het model is op Nederlands getraind, maar de backbone (`mdeberta-v3-base`) is
multilingual en dat blijft merkbaar. Dezelfde factuur in drie talen, met de
vraag in de taal van het document:
```python
model.extract(tok, "Invoice 8842 from Baker Jones, due date March 3rd 2027.",
"What is the due date?")
# {"value": "March 3rd 2027", "confidence": 1.00}
model.extract(tok, "Rechnung 8842 von Bäcker Jones, Fälligkeitsdatum 3. März 2027.",
"Was ist das Fälligkeitsdatum?")
# {"value": "3. März 2027", "confidence": 1.00}
model.extract(tok, "Facture 8842 de Boulanger Jones, date d'échéance 3 mars 2027.",
"Quelle est la date d'échéance?")
# {"value": "3 mars 2027", "confidence": 1.00}
```
Handig voor administraties die ook buitenlandse facturen verwerken.
## 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 |
Extraction wordt sterker in combinatie met de andere twee: `arlo-classify`
bepaalt wat voor soort document je voor je hebt, en op basis daarvan stel je
gericht de juiste extractievragen. Een factuur vraagt om andere velden dan een
bezwaarschrift.
```python
soort = classify.choice(tokenizer_c, tekst, ["factuur", "bezwaarschrift", "melding"])
velden = VELDEN_PER_SOORT[soort[0]["label"]]
resultaat = extract.extract_fields(tokenizer_e, tekst, velden)
```
## Technische details
- **Backbone**: `microsoft/mdeberta-v3-base` (~280M parameters)
- **Kop**: extractive question answering (start/eind-posities)
- **Taal**: Nederlands
- **Trainingsdata**: Nederlandstalige extractieve QA-data, aangevuld met
domeinspecifieke voorbeelden in de stijl van meldingen, aanvragen en formele
correspondentie — inclusief vragen waarop géén antwoord in de tekst staat
- **Hardware**: getraind op een NVIDIA A100
- **Licentie**: MIT
Gemaakt door [NoaberAI](https://huggingface.co/NoaberAI).