|
Download README.md from NoaberAI/arlo-extract: direct link, hf CLI and curl.
- Browser
- Download file 6.3 kB
-
https://huggingface.co/NoaberAI/arlo-extract/resolve/main/README.md
- Command line
-
hf download hf://NoaberAI/arlo-extract/README.md
-
curl -L -o README.md https://huggingface.co/NoaberAI/arlo-extract/resolve/main/README.md
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). | |