joranvnbeekAI commited on
Commit
04dc045
·
verified ·
1 Parent(s): 357db13

Werk model card bij

Browse files
Files changed (1) hide show
  1. README.md +124 -42
README.md CHANGED
@@ -2,74 +2,156 @@
2
  language: nl
3
  license: mit
4
  base_model: microsoft/mdeberta-v3-base
 
5
  tags:
6
- - text-classification
7
  - zero-shot-classification
 
8
  - natural-language-inference
9
  - dutch
 
10
  ---
11
 
12
- # NBClas mDeBERTa NLI — Choice & Noul
13
 
14
- Onderdeel van [NBClas](https://github.com/Noaber-AI/NBClas), een open-source
15
- Nederlands "System One"-model: snelle, getypeerde beslissingen met een
16
- confidence score, zonder de latency en kosten van tekstgeneratie.
 
17
 
18
- Dit model dekt twee primitieven:
19
- - **Choice** — kiezen uit een lijst opties, met een kansverdeling per label.
20
- - **Noul** — een waarheidsgraad (0-1) voor een stelling gegeven een tekst.
21
 
22
- Beide draaien op dezelfde NLI-backbone (entailment/neutral/contradiction) en
23
- werken **zero-shot**: je geeft de labels of stellingen pas op het moment van
24
- gebruik mee, geen hertraining nodig per taak.
25
 
26
- Getraind op een NVIDIA A100, op multilinguale NLI-data plus Nederlandse
27
- domeinspecifieke voorbeelden (overheid, klantenservice).
 
28
 
29
- ## Gebruik
 
 
30
 
31
- ### Standaard — zero-shot classificatie via de transformers-pipeline
 
 
 
 
 
 
 
32
 
33
  ```python
34
- from transformers import pipeline
 
 
 
 
 
 
35
 
36
- classifier = pipeline("zero-shot-classification", model="NoaberAI/nbclas-mdeberta-nli")
37
- classifier(
 
 
 
 
38
  "De put op de Kerkstraat is verstopt.",
39
- candidate_labels=["verkeer", "riolering", "afval", "overig"],
40
- )
 
41
  ```
42
 
43
- ### Choice + Noul via de NBClas-wrapper (aanbevolen)
44
 
45
  ```python
46
- from src.infer import Classifier # uit github.com/Noaber-AI/NBClas
 
47
 
48
- clf = Classifier("NoaberAI/nbclas-mdeberta-nli")
49
 
50
- clf.classify(
51
- "De put op de Kerkstraat is verstopt.",
52
- ["verkeer", "riolering", "afval", "overig"],
53
- )
54
- # [{"label": "riolering", "confidence": 0.91}, ...]
55
 
56
- clf.noul(
 
57
  "Er hangt al twee dagen een losse tak dreigend boven het fietspad.",
58
- "Dit is een spoedeisende melding.",
59
- )
60
- # {"truth": 0.8}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
61
  ```
62
 
63
- ## Voorbeelden
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
64
 
65
  ```python
66
- clf.classify(
67
- "Ik wil me graag inschrijven op mijn nieuwe adres.",
68
- ["openbare ruimte", "vergunningen", "burgerzaken", "belastingen", "sociaal domein"],
69
- )
70
- # [{"label": "burgerzaken", "confidence": 0.9x}, ...]
71
-
72
- clf.noul("Geen haast bij, maar het voetpad bij nummer 12 is wat verzakt.",
73
- "Dit is een spoedeisende melding.")
74
- # {"truth": 0.4} -- lage urgentie correct herkend
 
 
75
  ```
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
  "De put op de Kerkstraat is verstopt.",
59
+ ["verkeer", "riolering", "afval", "overig"])
60
+ # [{"label": "riolering", "confidence": 0.91},
61
+ # {"label": "overig", "confidence": 0.05}, ...]
62
  ```
63
 
64
+ Voor gevallen waar meerdere labels tegelijk waar kunnen zijn:
65
 
66
  ```python
67
+ model.choice(tokenizer, tekst, labels, multi_label=True)
68
+ ```
69
 
70
+ ### Noul — hoe waar is deze stelling?
71
 
72
+ Noul geeft een waarheidsgraad tussen 0 en 1 in plaats van een hard ja/nee, zodat
73
+ je zelf de drempel bepaalt die bij jouw proces past.
 
 
 
74
 
75
+ ```python
76
+ model.noul(tokenizer,
77
  "Er hangt al twee dagen een losse tak dreigend boven het fietspad.",
78
+ "Dit is een spoedeisende melding.")
79
+ # {"truth": 0.85}
80
+
81
+ model.noul(tokenizer,
82
+ "Geen haast bij, maar het voetpad bij nummer 12 is wat verzakt.",
83
+ "Dit is een spoedeisende melding.")
84
+ # {"truth": 0.39}
85
+ ```
86
+
87
+ ### Zonder trust_remote_code
88
+
89
+ Het model is een gewone NLI-classifier, dus de standaardpipeline werkt ook:
90
+
91
+ ```python
92
+ from transformers import pipeline
93
+
94
+ classifier = pipeline("zero-shot-classification", model="NoaberAI/arlo-classify")
95
+ classifier("De put op de Kerkstraat is verstopt.",
96
+ candidate_labels=["verkeer", "riolering", "afval"])
97
  ```
98
 
99
+ ## Hoe het werkt
100
+
101
+ Het model is getraind als natural language inference-classifier: het krijgt een
102
+ tekst en een stelling, en bepaalt of die stelling volgt uit de tekst
103
+ (*entailment*), eruit weersproken wordt (*contradiction*), of geen van beide
104
+ (*neutral*).
105
+
106
+ Beide primitieven bouwen daarop voort:
107
+
108
+ - **Choice** zet elk label om in een stelling ("Dit gaat over riolering.") en
109
+ vergelijkt de entailment-scores. Daardoor werkt het zero-shot met elke
110
+ labelverzameling die je meegeeft.
111
+ - **Noul** neemt je stelling rechtstreeks en normaliseert entailment tegen
112
+ contradiction tot één waarheidsgraad.
113
+
114
+ ## De Arlo-familie
115
+
116
+ Arlo bestaat uit drie modellen die samen een complete laag vormen voor
117
+ gestructureerde beslissingen. Ze delen dezelfde backbone-architectuur en
118
+ hetzelfde output-contract — een waarde plus een confidence — en zijn
119
+ onafhankelijk of gecombineerd te gebruiken.
120
+
121
+ | Model | Primitieven | Waarvoor |
122
+ |---|---|---|
123
+ | **[arlo-classify](https://huggingface.co/NoaberAI/arlo-classify)** | Choice, Noul | categoriseren, routeren, waarheidsvragen |
124
+ | [arlo-score](https://huggingface.co/NoaberAI/arlo-score) | Score | numeriek beoordelen tegen een rubric |
125
+ | [arlo-extract](https://huggingface.co/NoaberAI/arlo-extract) | Extraction | getypeerde velden uit tekst halen |
126
+
127
+ Eén binnenkomende tekst door alle drie halen geeft in één keer een volledig
128
+ gestructureerd beeld:
129
 
130
  ```python
131
+ tekst = ("Al drie dagen ligt er een dode boom over het fietspad aan de "
132
+ "Dorpsstraat, gevaarlijke situatie voor fietsers, graag snel actie.")
133
+
134
+ classify.choice(tokenizer_c, tekst, ["openbare ruimte", "vergunningen", "burgerzaken"])
135
+ # [{"label": "openbare ruimte", "confidence": 0.99}, ...]
136
+
137
+ classify.noul(tokenizer_c, tekst, "Dit is een spoedeisende melding.")
138
+ # {"truth": 0.74}
139
+
140
+ extract.extract(tokenizer_e, tekst, "Waar is het probleem?")
141
+ # {"value": "Dorpsstraat", "confidence": 0.99}
142
  ```
143
+
144
+ Van vrije tekst naar een compleet ingevuld formulier, in een fractie van de tijd
145
+ die een taalmodel nodig heeft — en zonder dat er iets te parsen valt.
146
+
147
+ ## Technische details
148
+
149
+ - **Backbone**: `microsoft/mdeberta-v3-base` (~280M parameters)
150
+ - **Kop**: sequence classification, 3 klassen (entailment / neutral / contradiction)
151
+ - **Taal**: Nederlands
152
+ - **Trainingsdata**: Nederlandse natural language inference-data, aangevuld met
153
+ domeinspecifieke voorbeelden uit overheid en klantenservice
154
+ - **Hardware**: getraind op een NVIDIA A100
155
+ - **Licentie**: MIT
156
+
157
+ Gemaakt door [NoaberAI](https://huggingface.co/NoaberAI).