# 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)