joranvnbeekAI commited on
Commit
cfd08a3
·
verified ·
1 Parent(s): f341fd7

Voeg link naar de demo-Space toe

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