bae705aa97
- Add NFC ePassport roadmap (ICAO 9303, eIDAS) - Add TensorFlow.js edge face detection (BlazeFace) - Add structured audit logger (GDPR-compliant) - Risk scoring support Part of KYC Apple Native UX v1.1.0
155 lines
5.3 KiB
Markdown
155 lines
5.3 KiB
Markdown
# BUILD-A3: Torrkörning — Valideringsresultat (aamos_train_v3 / aamos_val_v3)
|
|
|
|
**Datum:** 2026-06-06
|
|
**Utfört av:** Subagent BUILD-A3
|
|
**Script körd på:** AAMOS-server (ej GPU-boxen — ingen GPU krävdes)
|
|
**Valideringsscript:** `/home/bernt/.openclaw/workspace/build/validate_training_data.py`
|
|
|
|
---
|
|
|
|
## 🟢 SLUTDOM: DATAN ÄR KLAR FÖR TRÄNING
|
|
|
|
**Noll problem hittades.** Alla 37 052 exempel (33 352 träning + 3 700 validering) passerar samtliga tester.
|
|
|
|
---
|
|
|
|
## Resultat per test
|
|
|
|
### [1] JSONL-integritet
|
|
|
|
| Mätvärde | Träning | Validering |
|
|
|----------|---------|------------|
|
|
| Icke-tomma rader | 33 352 | 3 700 |
|
|
| Korrekt laddade records | 33 352 | 3 700 |
|
|
| JSON-parse-fel | **0** | **0** |
|
|
| Format-distribution | `messages_key: 33352` | `messages_key: 3700` |
|
|
|
|
Alla rader är giltig JSON. Alla hamnar direkt i `messages_key`-grenen — det enklaste och mest robusta flödet i `load_dataset_from_jsonl()`.
|
|
|
|
---
|
|
|
|
### [2] Chat-format validering
|
|
|
|
| Kontroll | Träning | Validering |
|
|
|----------|---------|------------|
|
|
| Har system-meddelande | 33 352 / 33 352 ✅ | 3 700 / 3 700 ✅ |
|
|
| Har user-meddelande | 33 352 / 33 352 ✅ | 3 700 / 3 700 ✅ |
|
|
| Har assistant-meddelande | 33 352 / 33 352 ✅ | 3 700 / 3 700 ✅ |
|
|
| Tomma content-fält | **0** ✅ | **0** ✅ |
|
|
| Valideringsfel (messages) | **0** ✅ | **0** ✅ |
|
|
| Roll-profil | `[assistant, system, user]` (100%) | `[assistant, system, user]` (100%) |
|
|
|
|
100% av exemplen har exakt triaden system+user+assistant. Noll avvikelser.
|
|
|
|
---
|
|
|
|
### [3] Token-längd-distribution
|
|
|
|
**Uppskattningsmetod:** `len(text) // 4` på ChatML-formaterad text (`<|im_start|>role\ncontent<|im_end|>\n`)
|
|
|
|
#### Träningsdata (33 352 exempel)
|
|
|
|
| Percentil | Tokens |
|
|
|-----------|--------|
|
|
| p50 (median) | 176 |
|
|
| p75 | 202 |
|
|
| p90 | 339 |
|
|
| p95 | 632 |
|
|
| p99 | 723 |
|
|
| p100 (max) | **1 006** |
|
|
|
|
**Histogram:**
|
|
```
|
|
0-200 : 24 544 ( 73.6%) █████████████████████████████
|
|
200-400 : 5 607 ( 16.8%) ██████
|
|
400-600 : 878 ( 2.6%) █
|
|
600-800 : 2 233 ( 6.7%) ██
|
|
800-1000 : 89 ( 0.3%)
|
|
1000-1200 : 1 ( 0.0%)
|
|
1200+ : 0 ( 0.0%)
|
|
```
|
|
|
|
#### Valideringsdata (3 700 exempel)
|
|
|
|
| Percentil | Tokens |
|
|
|-----------|--------|
|
|
| p50 | 176 |
|
|
| p95 | 626 |
|
|
| p99 | 702 |
|
|
| max | 884 |
|
|
|
|
---
|
|
|
|
### [4] Verifiering av load_dataset_from_jsonl()
|
|
|
|
Scriptet simulerade exakt `load_dataset_from_jsonl()`-logiken mot de faktiska filerna:
|
|
|
|
- ✅ Alla 33 352 träningsexempel laddas utan fel
|
|
- ✅ Alla 3 700 valideringsexempel laddas utan fel
|
|
- ✅ Samtliga hamnar i `messages_key`-grenen (rätt format)
|
|
- ✅ `Dataset.from_list()` kan köras utan problem
|
|
- ✅ Alla `content`-fält är strängar (inga null, inga icke-strängar)
|
|
- ✅ Strikt `[system, user, assistant]`-struktur i 100% av fallen
|
|
|
|
Scriptet hanterar formatet **korrekt** utan modifikationer.
|
|
|
|
---
|
|
|
|
### [5] CANON-stickprov
|
|
|
|
| Nyckelord | Träning | Validering | Status |
|
|
|-----------|---------|------------|--------|
|
|
| `infrastrukturkontroll` | 97 förekomster | 0 | ✅ (injicerat i träning, ej val — förväntat) |
|
|
| `559141-7042` (korrekt org-nr) | 33 352 förekomster | 3 700 | ✅ (finns i ALLA system-prompts) |
|
|
| `eskalera` | 156 förekomster | 5 | ✅ |
|
|
| `559316-3881` (felaktigt org-nr) | **0** förekomster | **0** | ✅ Rensat |
|
|
|
|
**CANON-fix bekräftad:** Det gamla felaktiga org-numret `559316-3881` finns i noll rader. Det korrekta `559141-7042` är genomgående i 100% av exemplen (i system-prompten).
|
|
|
|
Att `infrastrukturkontroll` inte finns i valdata är förväntat — CANON-exempel injicerades primärt i träningsdatan.
|
|
|
|
---
|
|
|
|
## max_seq_length-rekommendation (A2-relevant)
|
|
|
|
| Statistik | Värde |
|
|
|-----------|-------|
|
|
| p95 | 632 tokens |
|
|
| p99 | 723 tokens |
|
|
| max | **1 006 tokens** |
|
|
| Överstiger 2048 | **0 av 33 352 (0.0%)** |
|
|
| Överstiger 1024 | **0 av 33 352 (0.0%)** |
|
|
|
|
### DOM: max_seq_length=2048 ÄR TILLRÄCKLIGT ✅
|
|
|
|
Det **längsta** exemplet i hela datasetet är ~1 006 tokens. Det innebär att `max_seq_length=2048` ger **dubbel marginal** mot det faktiska maximum. Ingen trunkering sker överhuvudtaget.
|
|
|
|
**Konsekvens för A2:s VRAM-kalkyl:** A2:s antagande om `max_seq_length=2048` är korrekt — men om VRAM är ont kan `max_seq_length=1024` användas utan dataförlust (99% av exemplen är ≤723 tokens). Det längsta enskilda exemplet (1 006 tokens) skulle trunkeras marginellt vid 1024.
|
|
|
|
**Rekommendation:** Behåll `max_seq_length=2048` som planerat. Det ger säker marginal och inga pad/truncation-överraskningar. Sänk till 1024 om VRAM är ett problem (inga reella dataförluster, minimal effekt på kvalitet).
|
|
|
|
---
|
|
|
|
## Sammanfattning
|
|
|
|
```
|
|
Träningsdata: 33 352 records — 0 fel
|
|
Valideringsdata: 3 700 records — 0 fel
|
|
JSON-parse-fel: 0
|
|
Format-fel: 0
|
|
Tomma content: 0
|
|
Överstiger 2048: 0 (max är 1006 tokens)
|
|
CANON korrekt: Ja (org-nr, nyckelbegrepp, 0 fel org-nr)
|
|
load_dataset(): Fungerar korrekt
|
|
DOM: 🟢 KLAR FÖR TRÄNING
|
|
```
|
|
|
|
---
|
|
|
|
## Bilagor
|
|
|
|
- Valideringsscript: `/home/bernt/.openclaw/workspace/build/validate_training_data.py`
|
|
- Träningsscript: `/home/bernt/.openclaw/workspace/build/train_eslm.py`
|
|
- Träningsdata: `/opt/amos/data/finetune-exports/aamos_train_v3.jsonl` (33 352 rader)
|
|
- Valideringsdata: `/opt/amos/data/finetune-exports/aamos_val_v3.jsonl` (3 700 rader)
|