# Tokenizery otwartych modeli: polski, angielski i niemiecki, pomiar z 4 października 2026

Zbiór danych do artykułu w serwisie ekspertodsztucznejinteligencji.pl. Zawiera korpus, przypięcia plików,
skrypt i wyniki pomiaru. Licencja plików własnych: [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/),
z uznaniem autorstwa „Robert Marczyński, ekspertodsztucznejinteligencji.pl”. Teksty prawa pochodzą z EUR-Lex;
ponowne wykorzystanie na warunkach [decyzji Komisji 2011/833/UE](https://eur-lex.europa.eu/eli/dec/2011/833/oj).
Licencja zbioru nie zastępuje licencji tokenizerów ani modeli, które są zapisane w `manifest.json`.

## Pytanie

Ile tokenów zajmuje polski tekst prawny w tokenizerach otwartych modeli w porównaniu z odpowiadającymi
mu przepisami po angielsku i niemiecku? Ile tokenów na 1000 znaków przypada na polską prozę biznesową
i każdą z trzech wersji tekstu prawnego?

## Metoda

- Pomiar lokalny na CPU, 4 października 2026. Python 3.14.7, `tokenizers==0.23.2`,
  `huggingface_hub==1.33.0`, baza Unicode 16.0.0. Wersje zależności: `requirements.txt`.
- Każdy `tokenizer.json` pobrano anonimowo z oficjalnego repozytorium Hugging Face, z pełnym SHA commita.
  Skrypt używa `hf_hub_download(revision=SHA, token=False)` i sprawdza SHA-256 pobranego pliku.
  Wszystkie zmierzone repozytoria były bez bramki w dniu sprawdzenia. Nie pobierano wag modeli,
  nie używano logowania, płatnych API ani GPU.
- Tokenizacja: `tokenizers.Tokenizer.from_file(...)`, `encode(text, add_special_tokens=False)`,
  bez szablonu czatu. Padding i obcinanie są jawnie wyłączone. Wewnętrzny normalizer z pliku tokenizera
  pozostaje zachowany. Wszystkie zmierzone tokenizery mają wyłączony losowy dropout.
- Pliki są odczytywane z bajtów jako UTF-8 i normalizowane do NFC przed liczeniem znaków i tokenów.
  Znaki to `len(str)` po NFC, czyli punkty kodowe Unicode. Zachowano NBSP, tabulatory i końcowe LF.
  Wszystkie cztery pliki już były w NFC, więc normalizacja nie zmieniła ich treści.
- Tokeny na 1000 znaków = 1000 × tokeny / znaki. Stosunki PL/EN, DE/EN i PL/DE dotyczą całkowitych
  liczb tokenów tekstów prawnych. Nie są ilorazami wskaźników na 1000 znaków.
- Rozmiar słownika to `get_vocab_size(with_added_tokens=True)`; osobno podano wartość bez dodanych tokenów.
  Obecność tokenów specjalnych w słowniku nie oznacza dodania ich do mierzonego tekstu.
- Skrypt, manifest i korpus wystarczają do odtworzenia pomiaru. Daty pobrania w wynikach pochodzą
  z zamrożonego manifestu i opisują pobranie do tego zbioru, a nie czas kolejnego uruchomienia.

## Korpus

Trzy pliki skopiowano bajt w bajt z `public/badania/tokeny-pl-2026-09/korpus/`:
`prawo-PL.txt`, `prawo-EN.txt` i `biznes-PL.txt`. Sumy poniżej są identyczne jak w plikach źródłowych.
`biznes-PL.txt` zawiera początki trzech tekstów serwisu o kosztach i wdrożeniach AI.

| Plik | Znaki po NFC | SHA-256 pliku UTF-8 |
|---|---:|---|
| `biznes-PL.txt` | 9005 | `1943b50a0499e627c6b7c4d7a4f6b172f4bd5a3054771d0df2c5a78fd5b3d234` |
| `prawo-PL.txt` | 13868 | `86cd407e61bced5f0e44402504adde66bbcc5daaa258ce5fe6e632ba9aaa9023` |
| `prawo-EN.txt` | 12825 | `1e06524604275d6fe4c723efe6b03b4c44a5b4916e33f97dfb9e728851345037` |
| `prawo-DE.txt` | 14347 | `5530c5200e095af74662719718c72bcc1b9287cff42eb7bad7496e90a29e8089` |

Prawo obejmuje art. 4, 50 i 73 AI Act 2024/1689 oraz art. 33 i 34 RODO 2016/679.
Niemiecki tekst pobrano 4 października 2026 z oficjalnych wersji HTML EUR-Lex:
[AI Act DE](https://eur-lex.europa.eu/legal-content/DE/TXT/HTML/?uri=CELEX:32024R1689) oraz
[RODO DE](https://eur-lex.europa.eu/legal-content/DE/TXT/HTML/?uri=CELEX:32016R0679).

Z każdego artykułu pobrano nagłówek, tytuł i wszystkie akapity, w tym punkty list.
Zachowano układ plików PL/EN: puste linie między blokami, dwie puste linie między artykułami i osobne
linie tabulatorów w listach. W każdym języku jest 5 artykułów i 28 ustępów:
1 nienumerowany w art. 4 oraz kolejno 7, 11, 5 i 4 numerowane. Zachowano 7 punktów list oraz dodatkowe
akapity w art. 50 ust. 4, art. 73 ust. 2 i art. 73 ust. 6. Układ każdego pliku prawa to 127 LF,
65 całkiem pustych linii i 7 linii z samym tabulatorem. Struktury są zgodne.

Szczegółowy algorytm ekstrakcji, daty UTC, hashe HTML i wyniki kontroli są w `korpus-zrodla.json`.
Niemiecki oryginał RODO ma rozbieżność odesłania i późniejsze sprostowania opisane w ograniczeniach.

## Wynik

Pierwsze cztery kolumny liczbowe: tokeny na 1000 znaków. Ostatnie trzy: stosunki liczb tokenów
odpowiadających sobie tekstów prawnych. Zaokrąglenia służą prezentacji; pełne wartości i liczby
całkowite są w `wyniki.json`.

| Tokenizer | Biznes PL | Prawo PL | Prawo EN | Prawo DE | PL/EN | DE/EN | PL/DE |
|---|---:|---:|---:|---:|---:|---:|---:|
| Kolibri-1 | 439,2 | 460,0 | 195,3 | 174,0 | 2,547 | 0,996 | 2,556 |
| Bielik-11B-v2.3 | 419,4 | 431,4 | 224,9 | 324,2 | 2,074 | 1,613 | 1,286 |
| Llama-PLLuM-8B-2412 | 357,4 | 369,5 | 194,1 | 285,8 | 2,059 | 1,648 | 1,249 |
| PLLuM-12B-2512 | 332,5 | 330,1 | 200,9 | 236,6 | 1,776 | 1,317 | 1,348 |
| Mistral Small 3.1 | 332,5 | 330,1 | 200,9 | 236,6 | 1,776 | 1,317 | 1,348 |
| EuroLLM-9B-2512 | 282,4 | 308,0 | 230,3 | 247,4 | 1,447 | 1,202 | 1,203 |
| Qwen3-8B | 351,0 | 361,5 | 198,1 | 286,8 | 1,973 | 1,619 | 1,218 |
| Clef-flash | 305,1 | 310,6 | 201,6 | 220,3 | 1,666 | 1,222 | 1,363 |
| gpt-oss-20b | 311,6 | 321,5 | 193,7 | 217,1 | 1,795 | 1,254 | 1,431 |
| Phi-4-mini-instruct | 311,6 | 321,5 | 193,7 | 217,1 | 1,795 | 1,254 | 1,431 |

Kolibri: prawo PL 6379 tokenów, EN 2505, DE 2496. Różnica między DE i EN jest mała,
ale w danych zachowano dokładne wartości. PLLuM-12B-2512 i Mistral Small 3.1 dały takie same liczby
na wszystkich czterech plikach; podobnie gpt-oss-20b i Phi-4-mini. To zgodność wyników na tym korpusie,
a nie dowód identyczności tokenizerów: ich pliki mają różne SHA-256.

## Repozytoria i rewizje

Wszystkie tokenizer.json oraz karty modeli pobrano 4 października 2026. Pełne adresy pobrań,
dokładne daty UTC, SHA-256 tokenizer.json, SHA-256 kart i oznaczenia licencji są w `manifest.json`
oraz przy każdym zmierzonym modelu w `wyniki.json`.

| Repozytorium | Rewizja HF | Słownik z dodanymi / bez dodanych |
|---|---|---:|
| [Aleph-Alpha/Kolibri-1](https://huggingface.co/Aleph-Alpha/Kolibri-1/tree/e52eb4627d11516b0c01de49210ab5a4e4061444) | `e52eb4627d11516b0c01de49210ab5a4e4061444` | 127998 / 127900 |
| [speakleash/Bielik-11B-v2.3-Instruct](https://huggingface.co/speakleash/Bielik-11B-v2.3-Instruct/tree/73f5f7fb9a79a4409d02740155a3868c1ff0d2bc) | `73f5f7fb9a79a4409d02740155a3868c1ff0d2bc` | 32128 / 32000 |
| [CYFRAGOVPL/Llama-PLLuM-8B-instruct-2412](https://huggingface.co/CYFRAGOVPL/Llama-PLLuM-8B-instruct-2412/tree/57af3dddb681b3a695d40bc4f422927f9c386324) | `57af3dddb681b3a695d40bc4f422927f9c386324` | 128258 / 128000 |
| [CYFRAGOVPL/PLLuM-12B-instruct-2512](https://huggingface.co/CYFRAGOVPL/PLLuM-12B-instruct-2512/tree/2982a0b979c23af81a37cc47fa40007e2bd47e2a) | `2982a0b979c23af81a37cc47fa40007e2bd47e2a` | 131072 / 131072 |
| [mistralai/Mistral-Small-3.1-24B-Instruct-2503](https://huggingface.co/mistralai/Mistral-Small-3.1-24B-Instruct-2503/tree/68faf511d618ef198fef186659617cfd2eb8e33a) | `68faf511d618ef198fef186659617cfd2eb8e33a` | 131072 / 131072 |
| [utter-project/EuroLLM-9B-2512](https://huggingface.co/utter-project/EuroLLM-9B-2512/tree/3f5bacd0762eb45170985d6b699035f6a385ee3e) | `3f5bacd0762eb45170985d6b699035f6a385ee3e` | 128000 / 128000 |
| [Qwen/Qwen3-8B](https://huggingface.co/Qwen/Qwen3-8B/tree/b968826d9c46dd6066d109eabc6255188de91218) | `b968826d9c46dd6066d109eabc6255188de91218` | 151669 / 151643 |
| [Cloudflare/clef-flash](https://huggingface.co/Cloudflare/clef-flash/tree/17f0b0ad64efb65d273590632833508766b2aae6) | `17f0b0ad64efb65d273590632833508766b2aae6` | 248077 / 248044 |
| [openai/gpt-oss-20b](https://huggingface.co/openai/gpt-oss-20b/tree/6cee5e81ee83917806bbde320786a8fb61efebee) | `6cee5e81ee83917806bbde320786a8fb61efebee` | 200019 / 199998 |
| [microsoft/Phi-4-mini-instruct](https://huggingface.co/microsoft/Phi-4-mini-instruct/tree/cfbefacb99257ffa30c83adab238a50856ac3083) | `cfbefacb99257ffa30c83adab238a50856ac3083` | 200029 / 200019 |

Alias `CYFRAGOVPL/Llama-PLLuM-8B-instruct` przekierowuje do repozytorium z końcówką `-2412`.
PLLuM-12B wybrano w wersji `instruct-2512`. Mistral Small 3.1 zastępuje wersję 3.2, w której brakuje
`tokenizer.json`. EuroLLM-9B-2512 jest dostępną bez logowania wersją rodziny EuroLLM-9B.
Dodatkowym modelem z jawnie wymienionym polskim jest Phi-4-mini-instruct.

## Polski w karcie modelu

„Tak” oznacza wzmiankę o polskim lub kodzie `pl` w README.md, także w metadanych YAML.
„Nie” oznacza deklarowany zakres języków bez polskiego. „Nie podaje” oznacza brak wystarczającej
informacji w tej karcie. To opis deklaracji, nie wynik oceny umiejętności modelu.
Cytaty pochodzą z kart przypiętych do tych samych rewizji co tokenizery.

| Tokenizer | Polski w karcie | Krótki cytat i źródło |
|---|---|---|
| Kolibri-1 | nie | [German, English](https://huggingface.co/Aleph-Alpha/Kolibri-1/blob/e52eb4627d11516b0c01de49210ab5a4e4061444/README.md) |
| Bielik-11B-v2.3 | tak | [Language: Polish](https://huggingface.co/speakleash/Bielik-11B-v2.3-Instruct/blob/73f5f7fb9a79a4409d02740155a3868c1ff0d2bc/README.md) |
| Llama-PLLuM-8B-2412 | tak | [PLLuM is a family of large language models (LLMs) specialized in Polish and other Slavic/Baltic languages](https://huggingface.co/CYFRAGOVPL/Llama-PLLuM-8B-instruct-2412/blob/57af3dddb681b3a695d40bc4f422927f9c386324/README.md) |
| PLLuM-12B-2512 | tak | [PLLuM is a family of large language models (LLMs) specialized in Polish with additional English data](https://huggingface.co/CYFRAGOVPL/PLLuM-12B-instruct-2512/blob/2982a0b979c23af81a37cc47fa40007e2bd47e2a/README.md) |
| Mistral Small 3.1 | tak | [Nepali, Polish, Portuguese, Romanian](https://huggingface.co/mistralai/Mistral-Small-3.1-24B-Instruct-2503/blob/68faf511d618ef198fef186659617cfd2eb8e33a/README.md) |
| EuroLLM-9B-2512 | tak | [Latvian, Lithuanian, Maltese, Polish, Portuguese, Romanian](https://huggingface.co/utter-project/EuroLLM-9B-2512/blob/3f5bacd0762eb45170985d6b699035f6a385ee3e/README.md) |
| Qwen3-8B | nie podaje | [Support of 100+ languages and dialects](https://huggingface.co/Qwen/Qwen3-8B/blob/b968826d9c46dd6066d109eabc6255188de91218/README.md) |
| Clef-flash | nie podaje | [Clef-Flash is a 9B multimodal model that turns a state and a schema of typed questions into decisions.](https://huggingface.co/Cloudflare/clef-flash/blob/17f0b0ad64efb65d273590632833508766b2aae6/README.md) |
| gpt-oss-20b | nie podaje | [designed for powerful reasoning, agentic tasks, and versatile developer use cases.](https://huggingface.co/openai/gpt-oss-20b/blob/6cee5e81ee83917806bbde320786a8fb61efebee/README.md) |
| Phi-4-mini-instruct | tak | [- pl](https://huggingface.co/microsoft/Phi-4-mini-instruct/blob/cfbefacb99257ffa30c83adab238a50856ac3083/README.md) |

Qwen3 deklaruje ponad 100 języków bez listy w README; dlatego otrzymał „nie podaje”.
Clef-flash i gpt-oss-20b też nie wymieniają polskiego w swoich kartach. Nie przenoszono deklaracji
z modeli bazowych ani z dokumentów podlinkowanych. Dla Phi-4 kod `pl` pochodzi z pola `language` w YAML.

## Nie zmierzono

Stan sprawdzony 4 października 2026. Repozytoria za bramką zwracały anonimowo HTTP 401 z kodem
`GatedRepo` dla przypiętego `tokenizer.json`; Mistral 3.2 zwracał HTTP 404 `EntryNotFound`.
Dokładne rewizje, odpowiedzi i wybrane alternatywy są w `manifest.json` i `wyniki.json`.

| Repozytorium | Powód |
|---|---|
| [speakleash/Bielik-11B-v3.0-Instruct](https://huggingface.co/speakleash/Bielik-11B-v3.0-Instruct/tree/735bfee1125fe8b497ac2769de94822a11f77167) | nie zmierzono: dostęp wymaga logowania |
| [speakleash/Bielik-11B-v2.6-Instruct](https://huggingface.co/speakleash/Bielik-11B-v2.6-Instruct/tree/c4104c6c5b3c2b386bcf4cee4e16820373d3e742) | nie zmierzono: dostęp wymaga logowania |
| [meta-llama/Llama-3.1-8B-Instruct](https://huggingface.co/meta-llama/Llama-3.1-8B-Instruct/tree/0e9e39f249a16976918f6564b8830bc894c89659) | nie zmierzono: dostęp wymaga logowania |
| [google/gemma-3-4b-it](https://huggingface.co/google/gemma-3-4b-it/tree/093f9f388b31de276ce2de164bdc2081324b9767) | nie zmierzono: dostęp wymaga logowania |
| [utter-project/EuroLLM-9B](https://huggingface.co/utter-project/EuroLLM-9B/tree/41cbff50d11de071f84b2e4d49f03418d6fefb16) | nie zmierzono: dostęp wymaga logowania |
| [mistralai/Mistral-Small-3.2-24B-Instruct-2506](https://huggingface.co/mistralai/Mistral-Small-3.2-24B-Instruct-2506/tree/95a6d26c4bfb886c58daf9d3f7332c857cb27b43) | nie zmierzono: brak pliku tokenizer.json w tej rewizji |
| [CohereLabs/aya-expanse-8b](https://huggingface.co/CohereLabs/aya-expanse-8b/tree/5062468bf9bc0c6035fd64e06274333ec127d980) | nie zmierzono: dostęp wymaga logowania |
| [CohereLabs/tiny-aya-global](https://huggingface.co/CohereLabs/tiny-aya-global/tree/af89d219b53ed9b13b8a4645f9c8028973510324) | nie zmierzono: dostęp wymaga logowania |

Dwa repozytoria Cohere sprawdzono podczas szukania dodatkowego modelu z polskim.
Pozostałe rozważone kandydatury i powody ich niewybrania są w `manifest.json`.

## Odtworzenie

Pobierz [cały pakiet ZIP](https://ekspertodsztucznejinteligencji.pl/badania/tokenizery-otwarte-2026-10/tokenizery-2026-10.zip),
rozpakuj go i przejdź do katalogu `tokenizery-otwarte-2026-10`. Wymagane są Python 3.10 lub nowszy oraz dostęp do Internetu
przy pierwszym pobraniu. Poniższy przykład trzyma środowisko, cache i nowe wyniki poza zbiorem;
`PRACA` można zmienić. Nie nadpisuje opublikowanego `wyniki.json`.

```sh
PRACA="/tmp/tokenizery-2026-10"
python3 -m venv "$PRACA/venv"
"$PRACA/venv/bin/python" -m pip --cache-dir "$PRACA/pip-cache" install -r requirements.txt
export HF_HOME="$PRACA/hf-home"
"$PRACA/venv/bin/python" mierz_tokenizery.py --output "$PRACA/wyniki-pierwszy.json"
"$PRACA/venv/bin/python" mierz_tokenizery.py --offline --output "$PRACA/wyniki-drugi.json"
cmp "$PRACA/wyniki-pierwszy.json" "$PRACA/wyniki-drugi.json"
```

Skrypt wymaga tylko bibliotek `tokenizers` i `huggingface_hub` oraz biblioteki standardowej Pythona.
Zwykłe `pip install tokenizers huggingface_hub` zapewnia te zależności; plik `requirements.txt`
przypina wersje użyte w pomiarze. Opcja `--cache-dir` pozwala wskazać osobny cache.
W razie braku pliku, odmowy dostępu lub niezgodnego SHA-256 skrypt przerywa pracę i nie zapisuje
częściowego wyniku. Nie wymaga oryginalnego katalogu badania wrześniowego ani plików pilotażu.

Wykonano dwa uruchomienia gotowego skryptu. Pierwsze korzystało z cache plików pobranych z przypięć,
drugie zaczynało z pustym cache i pobrało wszystkie tokenizery ponownie. Wyniki są identyczne bajt w bajt.
SHA-256 obu plików `wyniki.json`:

`620ccf41101248e019896b2255aaf67329a053d9cef55af13c0609b80cabe4b8`

Rejestr sprawdzenia: `weryfikacja.json`. Niezależne przeliczenie 40 pomiarów przez `encode_batch`
potwierdziło wszystkie liczby tokenów, znaków i 30 stosunków. JSON zapisuje wersję Pythona i Unicode;
na innym środowisku te metadane mogą się różnić, nawet przy identycznych liczbach tokenów.
Dlatego polecenie `cmp` powyżej porównuje dwa własne uruchomienia w tym samym środowisku.
Porównując z opublikowanym `wyniki.json`, sprawdź przede wszystkim hashe wejść, liczby znaków i tokenów,
wskaźniki oraz stosunki. Różnica w metadanych środowiska nie jest sama w sobie rozbieżnością pomiaru.

## Pomiar własnych plików

`mierz_tokenizery.py` odtwarza wyłącznie zamrożony korpus: sprawdza jego sumy kontrolne i strukturę.
Do własnych dokumentów służy osobny `mierz_wlasny_tekst.py`, korzystający z tych samych 10 tokenizerów
i przypięć w `manifest.json`. Zachowaj oba skrypty i manifest w jednym katalogu. Nie podmieniaj korpusu.

Po przygotowaniu środowiska powyżej uruchom:

```sh
"$PRACA/venv/bin/python" mierz_wlasny_tekst.py \
  /sciezka/do/umowy.txt /sciezka/do/notatki.txt \
  --offline --output "$PRACA/moje-tokeny.json"
```

Podaj jeden lub więcej niepustych plików UTF-8 i obowiązkową ścieżkę `--output` poza katalogiem badania.
Jeśli nie pobrano jeszcze tokenizerów, pomiń `--offline`; można też wskazać cache przez `--cache-dir`.
Skrypt pobiera tylko pliki tokenizerów, anonimowo (`token=False`), sprawdza ich SHA-256 i liczy lokalnie
na CPU. Treści własnych dokumentów nie są wysyłane do Hugging Face. Wynik zawiera nazwy lub podane ścieżki
plików, ich hashe, liczby znaków i tokenów oraz tokeny na 1000 znaków. Liczenie zachowuje białe znaki,
stosuje NFC, wyłącza padding i obcinanie oraz nie dodaje szablonu czatu ani tokenów specjalnych.
Nie wylicza stosunków między plikami, bo nie sprawdza, czy są tłumaczeniami tej samej treści.
Nie zapisuje częściowych wyników, gdy którykolwiek plik lub tokenizer nie przejdzie kontroli.
Ten dodatkowy skrypt nie był narzędziem oryginalnego pomiaru zarejestrowanego w `weryfikacja.json`.

## Porównanie z niepublikowanym pilotażem

Wszystkie sześć podanych wartości zgadza się po zaokrągleniu do dwóch miejsc.

| Tokenizer | Pilotaż PL/EN | Nowy pomiar PL/EN | Po zaokrągleniu do 2 miejsc |
|---|---:|---:|---:|
| Kolibri-1 | 2,55 | 2,546507 | 2,55 |
| Bielik-11B-v2.3 | 2,07 | 2,074202 | 2,07 |
| Llama-PLLuM-8B-2412 | 2,06 | 2,058658 | 2,06 |
| PLLuM-12B-2512 | 1,78 | 1,776484 | 1,78 |
| Qwen3-8B | 1,97 | 1,972845 | 1,97 |
| Clef-flash | 1,67 | 1,665507 | 1,67 |

Dostarczone pliki pilota dla Kolibri, PLLuM-8B i Clef są bajtowo identyczne z nowymi pobraniami,
co potwierdzają SHA-256 w `weryfikacja.json`. Dla Bielika 2.3, PLLuM-12B i Qwen3 w dostarczonym
`pilot-tok/` nie było plików tokenizerów, więc porównano tylko podane stosunki.
Trzy pliki pilota dotyczące Bielika 2.6 i 3.0 zawierały po 143 bajty odpowiedzi błędu dostępu.
Nie są tokenizerami i nie zostały użyte do pomiaru.

## Ograniczenia

- Zmierzono tylko tokenizery. Wyniki nie oceniają jakości odpowiedzi, rozumienia polskiego, szybkości,
  pamięci, kosztu GPU ani ceny wykonania zadania. Nie uruchamiano modeli. Pominięto szablony czatu,
  tokeny specjalne dodawane przez szablony i narzut protokołów takich jak Harmony.
- Dwie próbki gatunkowe: prawo UE oraz polska proza biznesowa. Prawo to pięć artykułów dwóch aktów,
  a nie reprezentatywna próbka całego języka. Biznes występuje tylko po polsku; nie liczy się dla niego
  stosunków między językami. PL ma 13 868 znaków, EN 12 825, DE 14 347, więc długości tłumaczeń też wpływają
  na stosunki liczb tokenów.
- Oficjalne wersje językowe mają różną interpunkcję i numerację: DE używa `(1)`, PL i EN `1.`;
  EN używa `(a)`, PL i DE `a)`. Te różnice, białe znaki i sposób ekstrakcji mogą zmieniać wyniki.
  Kontrola struktury nie jest pełnym audytem równoważności wszystkich zdań.
- Pierwotna niemiecka wersja RODO art. 33 ust. 1 odsyła do art. 51, a odziedziczone PL/EN do art. 55.
  [Sprostowanie z 22 listopada 2016](https://eur-lex.europa.eu/legal-content/DE/TXT/?uri=CELEX%3A32016R0679R%2801%29)
  zmieniło to odesłanie na 55. Zachowano oficjalny oryginał DE bez ręcznej poprawki. Porównanie dotyczy
  tych samych przepisów, z tą jawną rozbieżnością.
- Niemiecki korpus nie zawiera też późniejszych poprawek redakcyjnych w art. 33 ust. 5 i art. 34 ust. 3
  lit. a-c widocznych w [wersji skonsolidowanej](https://eur-lex.europa.eu/legal-content/DE/TXT/?uri=CELEX%3A02016R0679-20160504).
  Wyrywkowe porównanie wykazało te same obowiązki i przesłanki w PL/EN. Korpus nie jest aktualnym tekstem prawa.
- Nie potwierdzono ponownym pobraniem dokładnej źródłowej edycji HTML wrześniowych plików PL/EN:
  EUR-Lex zwracał przy tej próbie HTTP 202 lub pustą odpowiedź. Zachowano te pliki bez zmian i zweryfikowano
  ich hashe. Oba źródła DE pobrano poprawnie jako pełne HTML z HTTP 200.
- Dostęp bez logowania i licencja modelu są odrębnymi cechami. Llama-PLLuM-8B ma oznaczenie `llama3.1`,
  Phi-4 `mit`, pozostałe zmierzone modele `apache-2.0`. Kryterium operacyjne to publiczny plik tokenizera
  bez logowania. Dobór nie jest przeglądem wszystkich otwartych modeli, a status dostępu może się zmienić.
- Przypięcie SHA i SHA-256 pozwala sprawdzić tożsamość pliku; odtworzenie z pustego cache nadal zależy
  od dostępności tego pliku na Hugging Face. Tokenizery nie są dołączone do zbioru.
- Wrześniowe badanie używało przybliżenia różnicowego zgłaszanego zużycia API. Tutaj liczony jest
  bezpośrednio sam tekst przez lokalny tokenizer. Są to różne metody pomiaru.

## Pliki

- `mierz_tokenizery.py`: pobranie z przypięć, kontrola SHA-256, kontrola struktury i pomiar.
- `mierz_wlasny_tekst.py`: osobny pomiar własnych plików UTF-8 tymi samymi tokenizerami.
- `requirements.txt`: wersje dwóch wymaganych bibliotek.
- `manifest.json`: korpus, rewizje, hashe, daty pobrania, cytaty językowe, licencje i pominięcia.
- `wyniki.json`: kompletne liczby znaków i tokenów, wskaźniki oraz trzy stosunki dla każdego tokenizera.
- `korpus/`: cztery pliki UTF-8 stanowiące wejście do pomiaru.
- `korpus-zrodla.json`: źródła DE, metoda ekstrakcji i porównanie struktury PL/EN/DE.
- `weryfikacja.json`: zgodność dwóch uruchomień i porównanie z pilotażem.
