# Protokół: Clef-flash na polskich poleceniach (pre-rejestracja 2.10.2026, przed pilotem)

## Pytania
1. Jak trafnie Clef-flash (otwarte wagi Cloudflare, uruchomione lokalnie) rozpoznaje intencję w poleceniach po polsku,
   w porównaniu z tymi samymi poleceniami po angielsku?
2. Czy pewność modelu jest skalibrowana w obu językach?
3. Ile tokenów wejścia zajmuje jedna decyzja po polsku i po angielsku i ile kosztuje 10 tys. decyzji w Workers AI
   (Clef-flash i Clef)?

Bez hipotezy kierunkowej. Raportujemy różnicę PL−EN z przedziałem ufności.

## Dane
- MASSIVE 1.1 (Amazon, CC BY 4.0; polskie zdania to tłumaczenia angielskich z SLURP), podział `test`, pl-PL i en-US,
  2974 pary łączone po `id` (etykiety intencji identyczne w obu językach, sprawdzone). Archiwum SHA-256
  4cba5faa11c71437928e17cb1b9b3d8b8e727e7ea363a3a9a8045e19c0491577.
- Bez filtrowania zdań. 60 intencji w zbiorze, 59 w części testowej (brak `cooking_query`); model wybiera spośród 60.

## Model i środowisko
- `Cloudflare/clef-flash`, rewizja 17f0b0ad64efb65d273590632833508766b2aae6, BF16, Apple M5 Pro 48 GB, MPS.
- torch 2.11.0, torchvision 0.26.0, transformers 5.10.2; kod `joint_schema_model.py` z repozytorium modelu.
- Ścieżka bez „fast path” (flash-linear-attention niedostępne na MPS): możliwe drobne różnice numeryczne wobec GPU.
- Tokenizer i `joint_schema_model.py` dużego Clefa (rewizja 2f3de3dd85f379784083b0814d997ab627200f0c) są bajt w bajt
  identyczne z Clef-flash (sprawdzone 2.10.2026), więc liczba tokenów wejścia jest ta sama dla obu modeli.

## Schemat zapytania (ten sam dla obu języków, po angielsku, mechaniczny)
- `state`: samo zdanie (`utt`).
- Jedno pytanie `intent`, typ `choice`, `instructions`: "Which intent does the user's request express?"
- `criteria`: 60 opcji; identyfikator = etykieta MASSIVE, opis = etykieta z `_` zamienionym na spację
  (bez opisów pisanych przez autora, żeby nie wprowadzać jego interpretacji).

## Pilot (przed pełnym pomiarem)
- 100 par wylosowanych z ziarnem 20261002 (`random.Random(20261002).sample(ids, 100)`, ids posortowane numerycznie).
- Powtarzalność: pilot uruchomiony dwa razy; raport: liczba zgodnych decyzji top-1 i maksymalna różnica prawdopodobieństw.
- Reguła: mediana czasu ≤ 3 s na decyzję → pełny podział testowy (2974 × 2). W przeciwnym razie losowa próba 1000 par
  (`random.Random(20261002).sample(ids, 1000)`). Jeśli w pilocie oba języki ≥ 98 procent trafności, pytanie 1 nie ma
  wariancji: raportujemy to wprost.

## Miary
- Trafność intencji (top-1), trafność scenariusza (prefiks etykiety przewidzianej intencji), makro-F1 po intencjach.
- Kalibracja: ECE (15 równych przedziałów pewności top-1) i wielozbiorowy wynik Briera.
- Różnica PL−EN: sparowany bootstrap (10 000 losowań, ziarno 20261002), 95-procentowy przedział; dokładny test McNemara.
- Tokeny: długość zakodowanego wejścia (`len(input_ids)`, tak jak `usage.input_tokens` w `systemone`), średnia i mediana,
  stosunek PL/EN.
- Koszt 10 tys. decyzji: średnia liczba tokenów × 10 000 × stawka Workers AI z cennika odczytanego 2.10.2026
  (clef 0,24 USD, clef-flash 0,09 USD za mln tokenów wejścia; za wyjście cennik stawki nie podaje), po kursie NBP
  z 2.10.2026 (tabela 192/A/NBP/2026, 3,8881 zł). Założenie: Workers AI liczy tokeny tak jak kod z repozytorium modelu.
- Czas na Macu: mediana na decyzję, wyłącznie jako opis środowiska (nie mówi nic o GPU w chmurze).

## Nie mierzymy (osobna kategoria w raporcie)
- Trafności Clef 27B (BF16 ok. 55 GB, więcej niż 48 GB pamięci; skwantyzowany wariant byłby innym modelem).
- Opóźnień i zgodności odpowiedzi z Workers AI (brak konta), innych modeli (GPT, Claude, Gemini).
- Rekordy, które zwrócą błąd, idą do kategorii „nie zmierzono”, nie do mianownika.

## Dziennik zmian (jawnie)
- 2.10.2026, przebieg 1: pilot wykonany (100 par, mediana 3,76 s na decyzję → reguła: próba 1000 par), wyniki pilota:
  trafność PL 0,90, EN 0,92; powtarzalność 200/200, różnica prawdopodobieństw 0. Pełny pomiar przerwany po 228 rekordach
  (koniec sesji), a katalog roboczy w /tmp został wyczyszczony razem z wynikami. Żadnych wyników pełnej próby nie
  analizowano.
- 2.10.2026, przebieg 2 (ten katalog, poza /tmp): pliki odtworzone 1:1, z jedną zmianą techniczną: `pomiar.py` może liczyć
  kilka zdań w jednej porcji (`--batch`), bo kod modelu dopełnia wejście z prawej i używa maski uwagi. Warunek użycia:
  pilot w porcjach po 8 musi dać te same decyzje top-1 co pilot pojedynczo, a różnica prawdopodobieństw ≤ 0,01.
  Najpierw pilot pojedynczo (sprawdzenie, że odtworzenie daje wyniki przebiegu 1), potem pilot w porcjach.
- 2.10.2026, przebieg 2, pilot (przed pełną próbą): pojedynczo identyczne decyzje top-1, trafność i tokeny jak w przebiegu 1;
  ECE i Brier różnią się od przebiegu 1 na trzecim–czwartym miejscu po przecinku (PL ECE 0,0664 → 0,0635), bo przebieg 2
  liczy w `torch.inference_mode()`, a przebieg 1 przez `systemone` bez niego. Porcje po 8: decyzje 200/200 identyczne,
  różnica prawdopodobieństw 0 (po zaokrągleniu do 4 miejsc), ale wolniej (mediana 2,21 s wobec 1,70 s), więc pomiar
  liczy pojedynczo. Mediana 1,70 s ≤ 3 s → według reguły pełny podział testowy. Kolejność: najpierw 1000 par z próby
  wybranej w przebiegu 1 (analiza główna, tak jak ustalono przed wynikami), potem pozostałe 1974 pary (rozszerzenie
  do pełnego podziału). Decyzja podjęta przed jakimkolwiek wynikiem pełnej próby.
- 3.10.2026, publikacja: wyniki analizy głównej (1000 par) opublikowane. Rozszerzenie na pozostałe 1974 pary nadal się
  liczy (komputer usypiał w nocy i pracował przy braku wolnej pamięci, około 4 s na decyzję); jego wynik zostanie dopisany
  do zbioru jako uzupełnienie, bez zmiany analizy głównej, także gdy będzie inny. Na prośbę recenzentów dodano analizy po
  fakcie (różnica wyniku Briera, błędy przy pewności od 0,9, pasmo pewności 0,90–0,95, makro-F1, podział na rzadkie
  i częste intencje, ECE przy 10 przedziałach, progi pewności 0,8, 0,85, 0,95 i 0,97, rozkład wyniku Briera),
  opisane w README jako spoza protokołu.
- 3.10.2026, doprecyzowanie terminu: „wielozbiorowy wynik Briera” w planie oznacza wieloklasowy wynik Briera, czyli sumę
  (p_k − y_k)² po wszystkich 60 opcjach dla jednej decyzji, uśrednioną po decyzjach; zakres od 0 do 2. Wiersza planu nie zmieniano.
- 3.10.2026, ok. 14:00, uzupełnienie: rozszerzenie zakończone, 1974 pary (3948 decyzji), bez rekordów z błędem. 1000 par
  analizy głównej w surowym zapisie jest identycznych z opublikowanymi, a `przygotuj.py` uruchomiony na pełnym zapisie daje
  ten sam `wyniki.json`. Analizy głównej nie zmieniano. `uzupelnienie.py` liczy te same miary tymi samymi wzorami co
  `przygotuj.py` i z tym samym ziarnem bootstrapu, osobno dla nowych par i dla całej części testowej
  (`wyniki-uzupelnienie.json`); dla 1000 par analizy głównej daje dokładnie liczby z `wyniki.json`. Na nowych parach
  sprawdzono też analizy po fakcie z próby głównej. Progi pewności były w skrypcie przed pierwszym wynikiem nowych par;
  pasmo 0,90–0,95 oraz podział na rzadkie i częste intencje (według liczności w próbie głównej) dołączono po pierwszym
  przeliczeniu, a rozkład wyniku Briera na decyzje błędne i trafne oraz przedział dla pasma po pierwszej rundzie recenzji.
  Na nowych parach nie liczono przedziału ufności dla makro-F1 ani ECE przy 10 grupach. Za sprawdzenie analiz po fakcie uznano
  tylko nowe pary, bo cała część testowa zawiera próbę, na której różnice zauważono. Po wyniku uzupełnienia teza artykułu
  opiera się na całej części testowej, którą po pilocie wskazała reguła z protokołu.
