Files
boc/intelligence/build-a3-torrkorning.md
T
Bernt bae705aa97 ARCHITECTURE: NFC roadmap, edge AI, audit logging
- 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
2026-06-29 16:24:48 +00:00

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)