# Jakub Ćwirlej — Dziennikarz, który buduje z AI

> Dziennikarz (około 20 lat w Telewizji Polskiej), który buduje z AI — aplikacje i własny mały model językowy do kodu.
>
> Podsumowanie strony-portfolio Jakuba Ćwirleja, wygenerowane z jej treści, do użycia z asystentem AI. Wszystkie teksty są poniżej w całości.

https://jakubcwirlej.com/pl/ · Wygenerowano z treści strony: 2026-10-14

## Najważniejsze fakty

- **Imię i nazwisko:** Jakub Ćwirlej
- **Role:** dziennikarz (około 20 lat w Telewizji Polskiej, TVP), który buduje z AI: aplikacje i własny mały model językowy do kodu; niezależne badania (preprinty)
- **Telewizja:** około 20 lat jako reporter Telewizji Polskiej (TVP): reportaże i materiały dokumentalne dla programów publicystycznych Magazyn Ekspresu Reporterów, Alarm, Telekurier i Reporterzy, z odpowiedzialnością za całą produkcję, od researchu i zdjęć po montaż; na stronie wymieniono 48 jego reportaży z linkami do TVP VOD
- **Miejsce:** Belgia, niedaleko Gandawy; większość życia mieszkał w Polsce
- **Wersje językowe strony:** polski, angielski, francuski, niderlandzki
- **Aplikacje:**
  - **OrsonAI** — jego pierwsza aplikacja, narzędzia AI dla dziennikarzy: transkrypcja wywiadów na żywo do edytora, konsultowanie wybranych fragmentów z chatbotem, certyfikaty ludzkiego autorstwa w rejestrze Hedera Hashgraph (https://app.orsonai.com)
  - **Orson Rec** — pokazana jako działające demo obok OrsonAI w rozdziale Apps
  - **ViaSanto** — aplikacja modlitewna: różaniec paciorek po paciorku, święty dnia, cele modlitewne, takie jak nowenna pompejańska, czytanie dnia, intencje wspólnoty z licznikami na żywo; działające demo w rozdziale Apps (https://viasanto.com)
- **Praca z AI:** nie pisze kodu ręcznie: projektuje zadania, prowadzi zespoły agentów AI (w każdym orkiestrator; research, wykonanie sprawdzane przez dwóch niezależnych kontrolerów, weryfikacja) i sprawdza wyniki testami i pomiarami; głównym środowiskiem jest Claude Code, drugim modelem do konsultacji Gemini przez API; pracował z Google Cloud (Vertex AI, Cloud Run, BigQuery, Firestore, Cloud Build, Secret Manager) i Firebase
- **EUGEN 160M:** jego własny mały model językowy do kodu, trenowany od podstaw i wciąż na wczesnym etapie treningu; uzupełnia kod na bieżąco i podpowiada kolejną linię, jest trenowany także do uzupełniania kodu w środku pliku (fill-in-the-middle) i tłumaczy z Pythona na C++ i Rust (z weryfikacją kompilatorem i testami); można go wypróbować w terminalu na stronie AI (https://jakubcwirlej.com/pl/ai-dev/#terminal) albo przez API (POST /agent/complete, POST /agent/translate)

Streszczenia, najważniejsze punkty, fakty i FAQ są redakcyjne (napisane do tego pliku na podstawie tekstów strony); pełne teksty to słowa autora.

## Spis treści

1. O autorze
2. Rozdziały
   - [Media](#chapter-media)
   - [Apps](#chapter-apps)
   - [AI](#chapter-ai-dev)
3. Teksty
4. Reportaże w TVP VOD
5. Wypróbuj EUGEN 160M
6. Dla agentów AI
7. Pełne teksty
   - [Media — reportaż i praca z obrazem](#media)
   - [O mnie](#about-me)
   - [Moje podejście do pracy](#approach)
   - [AI w dziennikarstwie](#ai-journalism)
   - [Jak zaczynałem](#how-i-started)
   - [Czego nauczyłem się, szkoląc swój własny model](#training-lessons)
   - [Dane treningowe](#training-data)
   - [Kilka przemyśleń na temat bezpieczeństwa AI](#ai-safety)
   - [Technologia HDK](#hdk-tech)
8. Publikacje
9. CV
10. Kontakt
11. Jak zbudowana jest ta strona — brief techniczny
12. FAQ

## O autorze

Jakub Ćwirlej — dziennikarz, który buduje z AI. Przez około 20 lat był reporterem Telewizji Polskiej (TVP): realizował reportaże i materiały dokumentalne dla programów publicystycznych, takich jak Magazyn Ekspresu Reporterów, Alarm, Telekurier i Reporterzy — odpowiadając za całą produkcję, od researchu i zdjęć po montaż. Buduje aplikacje (m.in. OrsonAI i ViaSanto) i własny mały model językowy do kodu, EUGEN 160M, wciąż w treningu; publikuje też niezależne badania (preprinty). Mieszka w Belgii, niedaleko Gandawy.

## Rozdziały

- [Media](https://jakubcwirlej.com/pl/) — reportaż i praca z obrazem: praca w telewizji, podejście do pracy, AI w dziennikarstwie
- [Apps](https://jakubcwirlej.com/pl/apps/) — aplikacje, które zbudował — OrsonAI, Orson Rec i ViaSanto — z działającymi demami na stronie
- [AI](https://jakubcwirlej.com/pl/ai-dev/) — trenowanie własnych modeli językowych: jak zaczynał, czego się nauczył, bezpieczeństwo AI i terminal do wypróbowania EUGEN 160M

Cała treść trzech rozdziałów w kolejności czytania: nagłówki, akapity, listy i przyciski pod akapitami (z tym, co otwierają). Teksty okien są w całości w części „Pełne teksty”.

### Media {#chapter-media}

https://jakubcwirlej.com/pl/ — reportaż i praca z obrazem: praca w telewizji, podejście do pracy, AI w dziennikarstwie

Cześć! Jestem Kuba. Lubię opowiadać historie, które mają znaczenie.

Przyciski:

- [O mnie](#about-me) — okno z tekstem: O mnie · Markdown: https://jakubcwirlej.com/pl/articles/about-me.md

Dlaczego tak bardzo cenię pracę z obrazem? To proste. Obrazy mówią uniwersalnym językiem, budząc emocje i opowiadając historie w sposób, którego same słowa nie oddadzą. Miejsce po drugiej stronie obiektywu dało mi unikalną wolność ekspresji i budowania narracji.

Przez blisko dwie dekady zrealizowałem setki reportaży i materiałów dokumentalnych dla ogólnopolskich programów publicystycznych, takich jak Magazyn Ekspresu Reporterów, Alarm, Telekurier czy Reporterzy. Choć swoją karierę dziennikarską rozpocząłem w redakcji informacyjnej, dość szybko zrozumiałem, że aby tworzyć materiały, które naprawdę zatrzymują widza, muszę stać się wszechstronnym twórcą, rozumiejącym każdy aspekt telewizyjnego rzemiosła. Dlatego w swojej pracy nie ograniczam się do jednej roli. Odpowiadam za cały proces produkcyjny: od skrupulatnego researchu, przez operowanie kamerą, przeprowadzanie wywiadów, pracę nad tekstem, aż po ostateczny montaż i postprodukcję.

Przyciski:

- Reportaże w TVP VOD — lista: [Reportaże w TVP VOD](#reportages)

Moje podejście to splot miłości do sztuk wizualnych i uporu w opowiadaniu historii, które mają realny wpływ na rzeczywistość. Nie chodzi w tym tylko o samo trzymanie kamery, zgrabny montaż czy zadawanie trudnych pytań – chodzi o użycie obrazu do tego, by budować więź, angażować i zmuszać do refleksji.

W moich reportażach starałem się oddawać głos ludziom, którzy na co dzień są go całkowicie pozbawieni. Dziennikarstwo interwencyjne to w dużej mierze spotkania z człowiekiem w kryzysie – z ludźmi bezsilnymi w starciu z bezduszną biurokratyczną machiną czy zmagającymi się z dramatycznymi skutkami degradacji środowiska. Dobrym tego przykładem jest zrealizowana przeze mnie seria reportaży o problemie zapadlisk i potężnych kosztach społecznych, jakie z dnia na dzień spadły na lokalną społeczność po zamknięciu kopalni Olkusz-Pomorzany.

Praca w bezlitosnym środowisku dziennikarstwa interwencyjnego nauczyła mnie jednak nie tylko empatii, ale też umiejętności błyskawicznego rozwiązywania problemów i brutalnego pragmatyzmu. Działanie w terenie, nierzadko pod ogromną presją czasu i w nieprzewidywalnych warunkach, wymusiło na mnie całkowitą samodzielność. Z drugiej strony, to właśnie ta niezależność daje mi największą wolność, pozwala opowiadać historie od A do Z.

Przyciski:

- [Moje podejście do pracy](#approach) — okno z tekstem: Moje podejście do pracy · Markdown: https://jakubcwirlej.com/pl/articles/approach.md

Zawsze napędzała mnie czysta ciekawość świata. Żyjemy w szalenie interesujących czasach, a to oznacza, że nie można stać w miejscu – trzeba nieustannie się rozwijać, weryfikować swoje założenia i wciąż uczyć się wszystkiego na nowo. Traktuję to jako wyzwanie, w którym nowe technologie są potężnym sprzymierzeńcem. To właśnie ten głód wiedzy sprawił, że mój reporterski warsztat zaczął w naturalny sposób ewoluować w stronę rozwiązań opartych na sztucznej inteligencji. Dziś szukam nowych wyzwań na styku mediów i technologii — tam, gdzie doświadczenie reportera i praktyczna znajomość AI dają razem więcej niż każde z osobna.

Przyciski:

- [AI w dziennikarstwie](#ai-journalism) — okno z tekstem: AI w dziennikarstwie · Markdown: https://jakubcwirlej.com/pl/articles/ai-journalism.md

### Apps {#chapter-apps}

https://jakubcwirlej.com/pl/apps/ — aplikacje, które zbudował — OrsonAI, Orson Rec i ViaSanto — z działającymi demami na stronie

#### ViaSanto

ViaSanto to aplikacja modlitewna, która powstała z prostej, życiowej obserwacji: w dzisiejszym świecie smartfony nieustannie odciągają nas od tego, co ważne. Zamiast z tym walczyć, postanowiłem zrobić z telefonu sprzymierzeńca modlitwy. Wiele osób chce modlić się regularnie, ale przegrywa z pośpiechem: różaniec zaczęty w tramwaju łatwo przerwać i zgubić, a wielodniową nowennę – porzucić po jednym opuszczonym dniu. Wielu, z powodu choroby, wieku, emigracji czy pracy, modli się w samotności i nie ma z kim dzielić swoich intencji. ViaSanto pozwala dyskretnie modlić się w drodze, pilnuje postępu i kolejnych dni nowenny, a ludzi modlących się w pojedynkę łączy we wspólnotę, która modli się w ich intencjach.

Przyciski:

- [ViaSanto](https://viasanto.com)

Mechanika aplikacji opiera się na wirtualnym, interaktywnym różańcu na ekranie telefonu. ViaSanto krok po kroku prowadzi przez wybrane nabożeństwa, śledzi postępy i przypomina o intencjach. Nawyk wspiera łagodna gamifikacja: za wytrwałość użytkownicy odblokowują nowe, starannie zaprojektowane wzory koralików. Równie ważna jest przestrzeń społecznościowa – grupy, w których można zgłaszać intencje i wspierać się nawzajem modlitwą.

#### Sprawdź, jak to działa

W telefonie obok działa prawdziwa aplikacja. Kliknij w jej ekran, aby przejąć sterowanie.

- Znajdź pierwszy koralik, który nie został jeszcze odmówiony (tuż nad tymi ze złotą poświatą) – przytrzymaj go i nie puszczaj: w boxie u góry ekranu popłynie tekst modlitwy, a pasek pokaże postęp.
- Wygląd różańca zmienisz w Kolekcji (ikona książki na dolnym pasku): wybierz „Różańce” i inny wzór – aplikacja przyjmie jego barwy, tak samo ramka z tym tekstem.
- W boxie kliknij „Czytanie na dziś”, aby otworzyć czytania z bieżącego dnia.

Aplikacja jest napisana we Flutterze: jedna baza kodu działa natywnie na iOS i Androidzie oraz w przeglądarce. Logikę, dane i ich bezpieczeństwo obsługuje samodzielnie hostowany backend Supabase (PostgreSQL) na europejskich serwerach. Całość zaprojektowałem z myślą o niezawodności: ViaSanto działa także offline – zapisuje postępy w pamięci urządzenia i synchronizuje je z serwerem, gdy tylko wróci zasięg.

#### OrsonAI

OrsonAI to redakcyjny edytor tekstu z wbudowanym asystentem AI, który zbudowałem z myślą o dziennikarzach – zarówno o freelancerach, jak i o redakcjach, którym ma dawać kompleksowe wsparcie. Wyrósł z mojej własnej pracy: pisanie, research i weryfikacja dzieją się dziś równocześnie, a w praktyce oznaczają ciągłe przeskakiwanie między dokumentami, przeglądarką i notatkami. Tutaj wszystko dzieje się w jednym oknie. Wybrany fragment tekstu można skonsultować z czatem bez przeklejania całego kontekstu, do edytora trafiają transkrypcje nagranych wywiadów, a osobne tryby pomagają pisać na podstawie notatek, szukać informacji, sprawdzać tekst przed publikacją – od faktów po ryzyka prawne – i analizować dokumenty oraz nagrania. Zanim zapytanie trafi do modelu AI na zewnętrzne serwery, tekst można zanonimizować, tak by nazwiska rozmówców i inne dane osobowe nie opuszczały redakcji. Asystent pomaga dziennikarzowi, ale go nie wyręcza. Aplikacja nie jest obecnie dostępna w sprzedaży, ale działa i można ją wypróbować w trybie gościa. Jeśli pojawi się zainteresowanie ze strony redakcji, nie wykluczam dalszych prac nad nią.

Przyciski:

- [OrsonAI](https://app.orsonai.com)

Najwięcej pracy włożyłem w warstwę zaufania. Każda interakcja z AI jest hashowana – cała ścieżka od projektu, przez dokument i rozmowę, po zapytanie i odpowiedź – a proces działający w tle co minutę sprawdza zebrane hashe i co 1000 zdarzeń kotwiczy je w Hedera Consensus Service. Na tej podstawie system może przyznać tekstowi certyfikat ludzkiego autorstwa: ocenia udział człowieka i jakość tekstu, a jeśli tekst przejdzie progi, zapisuje jego hash w publicznym rejestrze Hedera Hashgraph. Każda późniejsza edycja unieważnia certyfikat, a autentyczność sprawdza się, porównując skrót SHA-256 dokumentu z zapisem w rejestrze. Mechanizm audytu wydzieliłem jako osobną, otwartą bibliotekę HDK, od wersji 0.1.3 na licencji CC BY-NC 4.0 (darmowa biblioteka w wersji alfa z opcjonalnym kotwiczeniem w Hederze; wcześniejsze wersje — Apache 2.0). Backend to Python i FastAPI na Google Cloud w europejskim regionie; tekst obsługują głównie modele Gemini, Mistral jest dostawcą zapasowym, a modele OpenAI pracują przy transkrypcji.

Przyciski:

- [Opis technologii HDK](#hdk-tech) — okno z tekstem: Technologia HDK · Markdown: https://jakubcwirlej.com/pl/articles/hdk-tech.md
- [Darmowa biblioteka HDK](https://jakubcwirlej.com/files/hdk/hdk-audit-0.1.3.zip) — okno pliku
- [HDK na Hugging Face](https://huggingface.co/JakCwi/hdk-audit) (JakCwi/hdk-audit, licencja CC BY-NC 4.0)

#### Orson Rec

Orson Rec to webowa aplikacja do nagrywania wywiadów, którą można zainstalować na ekranie telefonu. Zrobiłem ją dla reporterów pracujących w terenie, żeby oszczędzić im godzin odsłuchiwania i spisywania nagrań. W ważnym momencie rozmowy naciskasz CUT – nagrany fragment od razu trafia do zamiany mowy na tekst, więc transkrypcja z kodami czasowymi pojawia się na ekranie fragment po fragmencie jeszcze w trakcie wywiadu. Ważne miejsca można zaznaczać znacznikami IN i OUT, a przygotowane pytania mieć pod ręką w prompterze. Tryb VO pozwala nagrać lektora z tekstu przygotowanego w edytorze OrsonAI, a wbudowany edytor audio – przyciąć nagranie. Plik eksportuje się do WAV, MP3 lub AAC, a transkrypcję jednym kliknięciem przenosi do edytora. Samo nagrywanie odbywa się w telefonie, ale transkrypcja wymaga połączenia z internetem.

Przyciski:

- [Orson Rec](https://rec.orsonai.com)

### AI {#chapter-ai-dev}

https://jakubcwirlej.com/pl/ai-dev/ — trenowanie własnych modeli językowych: jak zaczynał, czego się nauczył, bezpieczeństwo AI i terminal do wypróbowania EUGEN 160M

Pierwszy ekran: terminal, w którym można wypróbować EUGEN 160M: https://jakubcwirlej.com/pl/ai-dev/#terminal

#### EUGEN 160M

EUGEN 160M to mały model językowy, który pomaga w pisaniu kodu: uzupełnia go na bieżąco (autocomplete) i podpowiada kolejną linię. Jest trenowany także do uzupełniania kodu w środku pliku (fill-in-the-middle) i specjalizuje się w tłumaczeniu z Pythona na C++. Ma 164,5 mln parametrów i jest trenowany od podstaw na jednej karcie graficznej NVIDIA RTX PRO 6000 (96 GB). Dzięki niewielkim rozmiarom szybko generuje odpowiedzi także na zwykłym procesorze, osiągając prędkość generacji dochodzącą do 270 tokenów na sekundę. Model można wypróbować w terminalu: wystarczy kliknąć przycisk poniżej.

Przyciski:

- [Powinieneś wiedzieć, że…](#how-i-started) — okno z tekstem: Jak zaczynałem · Markdown: https://jakubcwirlej.com/pl/articles/how-i-started.md

#### Pierwsze wyniki

Trening jest na wczesnym etapie, a wyniki już teraz dają powody do optymizmu. W teście HumanEval, w którym model pisze funkcję w Pythonie na podstawie opisu, najlepsze zmierzone wyniki EUGEN to 18,9% zadań przy jednej próbie i 32,9% przy dziesięciu. W tłumaczeniu z Pythona na C++ z weryfikacją – kompilator i testy wybierają działającą wersję spośród kilku propozycji modelu – 77 na 100 programów się kompiluje, a 53 przechodzi wszystkie testy. Stos modelu pilnuje, żeby do użytkownika trafiały tylko te propozycje tłumaczeń, które przeszły kontrolę. Wykres zestawia wyniki EUGEN z modelami do 0,5 mld parametrów.

Przyciski:

- [Czego nauczyłem się, szkoląc swój własny model](#training-lessons) — okno z tekstem: Czego nauczyłem się, szkoląc swój własny model · Markdown: https://jakubcwirlej.com/pl/articles/training-lessons.md

#### Architektura modelu

EUGEN to transformer dekoderowy z 36 warstwami, trenowany optymalizatorem MuonH – odmianą Muon, która utrzymuje stałą normę macierzy wag. Model jest na etapie treningu bazowego. Ok. 0,35% danych to dane własne: rozwiązania STaR, które wygenerował sam EUGEN i które przeszły testy, oraz pary tłumaczeń między Pythonem a C++, Javą, Go i Rustem, sprawdzone kompilacją i testami.

Przyciski:

- [Dane treningowe](#training-data) — okno z tekstem: Dane treningowe · Markdown: https://jakubcwirlej.com/pl/articles/training-data.md

#### Rzadki FFN i kernel Triton

Prowadzę też prace nad optymalizacją i przyspieszeniem treningu modelu w oparciu o rzadki FFN i w tym celu opracowałem własny kernel GPU, napisany w Tritonie. Przy modelu o 306 mln parametrów (FFN 4096) zoptymalizowany kernel osiągnął przepustowość o 36% wyższą od swojej pierwszej wersji. Nasze wczesne testy pokazują, że przy modelu większych rozmiarów i FFN 8192, używając kernela z projektu EUGEN, można uzyskać przyspieszenie przekraczające 40% względem modelu gęstego. Otwarte pozostaje, czy model trenowany jako rzadki i zagęszczony na końcu dorówna modelowi gęstemu, ale wczesne wyniki skłaniają mnie do trenowania tą metodą kolejnego, większego modelu.

Przyciski:

- [Kernel na Hugging Face](https://huggingface.co/JakCwi/eugen-sparse) (JakCwi/eugen-sparse, licencja CC BY-NC 4.0)

#### TetherGate: stabilizacja uczonych bramek

TetherGate to mechanizm, który chroni uczone bramki przed zamknięciem. Bramka skalująca gałąź rezydualną – eksperta, adapter lub nowo dodaną warstwę – bywa stopniowo spychana przez optymalizator do zera i gałąź przestaje wnosić cokolwiek do modelu. TetherGate łączy podłogę zależną od kroku treningu ze sprężyną, która przyciąga próg bramki do ruchomej kotwicy wyznaczanej z bieżącego sygnału sterującego. Sygnałem może być dowolna statystyka. Mechanizm testowałem eksperymentalnie we własnych modelach.

Przyciski:

- [Pobierz TetherGate (.zip)](https://jakubcwirlej.com/files/tethergate.zip) — pobiera plik (tethergate.zip (kod, README, testy), licencja CC BY-NC 4.0)
- [TetherGate na Hugging Face](https://huggingface.co/JakCwi/tethergate) (JakCwi/tethergate, licencja CC BY-NC 4.0)

#### Własne badania

Cały czas prowadzę własne badania nad AI. Dotyczą one m.in. sygnałów z wnętrza sieci: aktywacji bramek w warstwach FFN i opartego na nich wskaźnika GSI (Gate Sparseness Index), który według wstępnych wyników może pomagać jeszcze przed wygenerowaniem odpowiedzi odróżnić pytania, na które model zna odpowiedź, od tych, przy których zaczyna konfabulować. Późniejsza analiza pokazała, że część efektu wynika z długości pytań — po jej uwzględnieniu sygnał utrzymuje się w modelu Llama, pozostałe wyniki wymagają powtórzenia. Nie mam formalnego wykształcenia w tej dziedzinie, ale staram się prowadzić badania możliwie profesjonalnie: z publicznie udostępnionymi danymi, powtarzalnymi pomiarami i jasno opisanymi ograniczeniami.

Przyciski:

- [Kilka przemyśleń na temat bezpieczeństwa AI](#ai-safety) — okno z tekstem: Kilka przemyśleń na temat bezpieczeństwa AI · Markdown: https://jakubcwirlej.com/pl/articles/ai-safety.md

#### Jak pracuję z AI

Nie piszę kodu ręcznie. Projektuję zadania i prowadzę zespoły agentów AI, a każdy wynik sprawdzam. Zespół pracuje w trzech etapach: research, wykonanie i weryfikacja. Nad wykonaniem czuwa dwóch niezależnych kontrolerów: jeden pilnuje zakresu zadania, drugi jakości technicznej.

Prowadzę równolegle dwa–trzy takie zespoły, więc gdy jedno zadanie wymaga mojej uwagi, pozostałe idą dalej. Gdy model utyka, konsultuję problem z modelem innej firmy.

Zlecam duże porcje pracy, ale tylko do granicy, w której potrafię je rzetelnie sprawdzić, a potem rezerwuję czas na poprawki. O tym, czy coś jest gotowe, decyduje test lub pomiar, nie deklaracja modelu.

#### Więcej

Przyciski:

- [Przemyślenia o bezpieczeństwie AI](#ai-safety) — okno z tekstem: Kilka przemyśleń na temat bezpieczeństwa AI · Markdown: https://jakubcwirlej.com/pl/articles/ai-safety.md
- [Coherence Over Truth](https://www.researchgate.net/publication/397730862) — Publikacje: [Coherence Over Truth: On Minds, Models and Reality](#coherence-over-truth)
- [HDK: audyt zapytań AI](https://www.researchgate.net/publication/400762996) — Publikacje: [HDK: Tamper-Evident LLM Audit Trails with Hierarchical Hash Genealogy and Distributed Ledger Anchoring](#hdk-tamper-evident-audit-trails)
- [Bariery kwantowe dla AGI](https://www.researchgate.net/publication/400670258) — Publikacje: [Self-Referential Quantum Barriers for AGI Containment: A Physics-Based Framework for Probabilistic Safety Engineering](#agi-quantum-containment)

## Teksty

- [Media — reportaż i praca z obrazem](https://jakubcwirlej.com/pl/articles/media.md) (`media`) — Jakub Ćwirlej wyjaśnia, dlaczego ceni pracę z obrazem, który jego zdaniem mówi uniwersalnym językiem. Opisuje blisko dwie dekady realizowania reportaży i materiałów dokumentalnych dla ogólnopolskich programów publicystycznych, w których odpowiadał za całą produkcję, oraz swój cel: oddawanie głosu ludziom, którzy są go pozbawieni. Ciekawość świata wiąże z tym, że jego reporterski warsztat naturalnie przesunął się w stronę narzędzi opartych na AI.
- [O mnie](https://jakubcwirlej.com/pl/articles/about-me.md) (`about-me`) — Osobisty portret, w którym autor opisuje siebie jako kogoś, kto unika sztywnych poglądów, i uważa to za atut dziennikarza lub badacza. Przedstawia swoją drogę od pracowni artystycznej dziadka i młodzieńczego planu zostania wykładowcą filozofii do 20 lat pracy reportera Telewizji Polskiej, a dziennikarstwu przypisuje to, że pomogło mu pokonać lęk przed oceną. Pisze też o rodzinie, ulubionych książkach i muzyce oraz o niedawnej przeprowadzce do Belgii, niedaleko Gandawy.
- [Moje podejście do pracy](https://jakubcwirlej.com/pl/articles/approach.md) (`approach`) — Dla autora dziennikarstwo jest przede wszystkim sposobem poznawania świata i ciągłą nauką, a zarazem formą służby: niezależnie od samopoczucia czy ryzyka ma dostarczyć materiał, bo ludzie mają prawo wiedzieć. Przekonuje, że telewizja nigdy nie jest obiektywna, bo subiektywność zaczyna się już przy wyborze ujęć i trwa przez montaż, a prawdziwym zobowiązaniem etycznym jest nie marnować czasu widza. Wyjaśnia, jak starannie przygotowuje się do zdjęć i dlaczego nigdy nie zabiegał o nagrody.
- [AI w dziennikarstwie](https://jakubcwirlej.com/pl/articles/ai-journalism.md) (`ai-journalism`) — Autor, który od premiery ChatGPT korzysta z AI niemal codziennie, dostrzega jej zagrożenia, przede wszystkim halucynacje, ale przekonuje, że pragmatyczne korzystanie z tej technologii wzmacnia warsztat: rozmawia z czatbotem w drodze ze zdjęć, automatyzuje transkrypcję i sięga po narzędzia OSINT, choć żaden model nie potrafi jeszcze ułożyć telewizyjnej „drabinki” z surowych wywiadów. Uważa, że ocenianie tekstów po samym brzmieniu nie ma większego sensu, skoro detektory AI mylą się w obie strony, i zauważa, że unijny AI Act pyta, kto odpowiada za tekst, ale nie daje czytelnikowi sposobu, by sprawdzić, kto go napisał. Przekonuje, że dziennikarze, którzy prowadzą research i iterują, dobrze sobie poradzą, a pracę stracą przede wszystkim ci, którzy powielają schematy.
- [Jak zaczynałem](https://jakubcwirlej.com/pl/articles/how-i-started.md) (`how-i-started`) — Autor opowiada, jak budowa OrsonAI, zestawu narzędzi AI do własnej pracy dziennikarskiej, zaprowadziła go od vibe codingu do badań nad halucynacjami modeli językowych i do trenowania własnych modeli. Opisuje chłodne przyjęcie aplikacji w branży, swoje badania aktywacji bramek SwiGLU i porażkę pierwszego modelu opartego na własnej architekturze. Dziś trenuje EUGEN 160M, mały model wyspecjalizowany w kodzie, który można wypróbować w terminalu na stronie.
- [Czego nauczyłem się, szkoląc swój własny model](https://jakubcwirlej.com/pl/articles/training-lessons.md) (`training-lessons`) — Dziesięć praktycznych lekcji z doświadczeń autora w samodzielnym trenowaniu modeli językowych. Dotyczą zbyt optymistycznych wyliczeń mocy obliczeniowej, zaczynania od małej skali, stałego monitorowania, izolowanych zmian i testów ablacyjnych, wyboru danych, realistycznych oczekiwań, cierpliwości podczas plateau i potrzeby więcej niż jednej karty GPU. Na koniec autor przekonuje, że małe, wyspecjalizowane modele budowane przez pojedyncze osoby wciąż mają sens.
- [Dane treningowe](https://jakubcwirlej.com/pl/articles/training-data.md) (`training-data`) — Skład miksu treningowego EUGEN 160M według repozytoriów Hugging Face: 14 wierszy, które obejmują 93,4% bieżącego strumienia tokenów. Największą część stanowi Dolma 3 (35,29%, w tym Stack-Edu i Common Crawl według tematów), a za nią The Stack v3 (15,44%) oraz historie commitów z CommitPack i pokrewnych zbiorów (10,46%). Dane własne – rozwiązania STaR wygenerowane przez EUGEN i zweryfikowane testami oraz pary tłumaczeń kodu – stanowią ok. 0,35% miksu.
- [Kilka przemyśleń na temat bezpieczeństwa AI](https://jakubcwirlej.com/pl/articles/ai-safety.md) (`ai-safety`) — Esej o bezpieczeństwie AI, w którym autor krytykuje płytką debatę publiczną podzieloną między technomaksymalistów i proroków zagłady. Twierdzi, że najgorsze prawdopodobnie już się zaczęło, wskazując na broń autonomiczną, rosnącą inwigilację i ideologię technomaksymalizmu, a odpowiedzialność zawsze musi spoczywać na ludziach, bo maszyny nie mają własnej sprawczości. Proponuje konkretne rozwiązania regulacyjne i przestrzega przed antropomorfizacją AI.
- [Technologia HDK](https://jakubcwirlej.com/pl/articles/hdk-tech.md) (`hdk-tech`) — Autor opisuje HDK, darmową bibliotekę w Pythonie (CC BY-NC 4.0; wcześniejsze wersje Apache 2.0) wydzieloną z OrsonAI, dzięki której manipulacja zapisami rozmów z modelami językowymi staje się wykrywalna. Biblioteka haszuje każde zdarzenie razem z przodkami, dodaje licznik „kanarka” powiązany z sekretem i kotwiczy korzenie Merkle'a w Hedera Consensus Service.

## Reportaże w TVP VOD {#reportages}

Reportaże autora dla Telewizji Polskiej (TVP), z linkami do TVP VOD, pogrupowane według programów, od najnowszych. Daty to daty emisji (RRRR-MM-DD); tytuły jak w TVP VOD. Niektóre odcinki zawierają kilka reportaży: tam, gdzie podano czas (mm:ss), od tego miejsca zaczyna się jego materiał.

### Reporterzy (odcinki: 40)

- 2026-08-14 — [Dom w pułapce](https://vod.tvp.pl/informacje-i-publicystyka,205/reporterzy-odcinki,1162990/odcinek-591,S02E591,3256128)
- 2026-07-17 — [Czeski złodziej](https://vod.tvp.pl/informacje-i-publicystyka,205/reporterzy-odcinki,1162990/odcinek-571,S02E571,3176812)
- 2026-07-13 — [Zamknięta droga do jeziora](https://vod.tvp.pl/informacje-i-publicystyka,205/reporterzy-odcinki,1162990/odcinek-567,S02E567,3164772)
- 2026-06-30 — [Droga przez pole](https://vod.tvp.pl/informacje-i-publicystyka,205/reporterzy-odcinki,1162990/odcinek-558,S02E558,3127029)
- 2026-05-18 — [Kłopoty spółdzielni](https://vod.tvp.pl/informacje-i-publicystyka,205/reporterzy-odcinki,1162990/odcinek-527,S02E527,2999531)
- 2026-05-11 — [Schronisko grozy](https://vod.tvp.pl/informacje-i-publicystyka,205/reporterzy-odcinki,1162990/odcinek-522,S02E522,2975164)
- 2026-04-27 — [Zbiorniki w Szczecinie](https://vod.tvp.pl/informacje-i-publicystyka,205/reporterzy-odcinki,1162990/odcinek-513,S02E513,2936795)
- 2026-04-20 — [Cofnięta zgoda na budowę](https://vod.tvp.pl/informacje-i-publicystyka,205/reporterzy-odcinki,1162990/odcinek-508,S02E508,2915241)
- 2026-04-07 — [Zawalony dach – co dalej?](https://vod.tvp.pl/informacje-i-publicystyka,205/reporterzy-odcinki,1162990/odcinek-499,S02E499,2879609)
- 2026-03-24 — [Osiedle Maltańskie sprzedane](https://vod.tvp.pl/informacje-i-publicystyka,205/reporterzy-odcinki,1162990/odcinek-490,S02E490,2839753)
- 2026-02-16 — [Łabędzie umierają w zatoce](https://vod.tvp.pl/informacje-i-publicystyka,205/reporterzy-odcinki,1162990/odcinek-464,S02E464,2740643)
- 2026-01-30 — [Zawalony dom](https://vod.tvp.pl/informacje-i-publicystyka,205/reporterzy-odcinki,1162990/odcinek-453,S02E453,2694986)
- 2026-01-02 — [Zalewane domy](https://vod.tvp.pl/informacje-i-publicystyka,205/reporterzy-odcinki,1162990/odcinek-434,S02E434,2623068)
- 2025-12-05 — [Domy nad jeziorem](https://vod.tvp.pl/informacje-i-publicystyka,205/reporterzy-odcinki,1162990/odcinek-408,S02E408,2552153)
- 2025-11-21 — [Odebrane mieszkanie](https://vod.tvp.pl/informacje-i-publicystyka,205/reporterzy-odcinki,1162990/odcinek-398,S02E398,2520281)
- 2025-11-17 — [Odbieranie zwierząt](https://vod.tvp.pl/informacje-i-publicystyka,205/reporterzy-odcinki,1162990/odcinek-394,S02E394,2511477)
- 2025-11-05 — [Polowanie na mandat?](https://vod.tvp.pl/informacje-i-publicystyka,205/reporterzy-odcinki,1162990/odcinek-387,S02E387,2484673)
- 2025-10-28 — [Szczury w Szczecinie](https://vod.tvp.pl/informacje-i-publicystyka,205/reporterzy-odcinki,1162990/odcinek-381,S02E381,2463194)
- 2025-10-22 — [Płot na drodze dojazdowej](https://vod.tvp.pl/informacje-i-publicystyka,205/reporterzy-odcinki,1162990/odcinek-377,S02E377,2453392)
- 2025-10-06 — [Co zatruwa Berlinek?](https://vod.tvp.pl/informacje-i-publicystyka,205/reporterzy-odcinki,1162990/odcinek-365,S02E365,2417050)
- 2025-08-20 — [Bloki do rozebrania](https://vod.tvp.pl/informacje-i-publicystyka,205/reporterzy-odcinki,1162990/odcinek-337,S02E337,2310978)
- 2025-08-12 — [Kolekcjonerka dworków](https://vod.tvp.pl/informacje-i-publicystyka,205/reporterzy-odcinki,1162990/odcinek-331,S02E331,2293557)
- 2025-08-05 — [Uzdrowisko widmo](https://vod.tvp.pl/informacje-i-publicystyka,205/reporterzy-odcinki,1162990/odcinek-327,S02E327,2277448)
- 2025-07-22 — [Oszukani „Na mieszkanie”](https://vod.tvp.pl/informacje-i-publicystyka,205/reporterzy-odcinki,1162990/odcinek-318,S02E318,2246122)
- 2025-06-20 — [Afera finansowa w Obornikach](https://vod.tvp.pl/informacje-i-publicystyka,205/reporterzy-odcinki,1162990/odcinek-296,S02E296,2175283)
- 2025-06-17 — [Śmierdząca wioska](https://vod.tvp.pl/informacje-i-publicystyka,205/reporterzy-odcinki,1162990/odcinek-293,S02E293,2168790)
- 2025-06-11 — [Droga przez salę](https://vod.tvp.pl/informacje-i-publicystyka,205/reporterzy-odcinki,1162990/odcinek-289,S02E289,2155669)
- 2025-06-02 — [To może być koniec rybackiego Helu](https://vod.tvp.pl/informacje-i-publicystyka,205/reporterzy-odcinki,1162990/odcinek-282,S02E282,2135757)
- 2025-05-23 — [Zawraca Wartę](https://vod.tvp.pl/informacje-i-publicystyka,205/reporterzy-odcinki,1162990/odcinek-276,S02E276,2113874)
- 2025-04-09 — [Ciechocinek](https://vod.tvp.pl/informacje-i-publicystyka,205/reporterzy-odcinki,1162990/odcinek-249,S02E249,2020351)
- 2025-03-21 — [Żubry (nie) pod ochroną](https://vod.tvp.pl/informacje-i-publicystyka,205/reporterzy-odcinki,1162990/odcinek-236,S02E236,1980171)
- 2025-03-13 — [Zapadliska finał](https://vod.tvp.pl/informacje-i-publicystyka,205/reporterzy-odcinki,1162990/odcinek-230,S02E230,1964013)
- 2025-02-12 — [Zapadliska II](https://vod.tvp.pl/informacje-i-publicystyka,205/reporterzy-odcinki,1162990/odcinek-209,S02E209,1903959)
- 2025-01-16 — [AI – zagrożenia](https://vod.tvp.pl/informacje-i-publicystyka,205/reporterzy-odcinki,1162990/odcinek-192,S02E192,1848618)
- 2025-01-10 — [Zapadliska](https://vod.tvp.pl/informacje-i-publicystyka,205/reporterzy-odcinki,1162990/odcinek-188,S02E188,1835997)
- 2024-11-14 — [Burmistrz biznesmen](https://vod.tvp.pl/informacje-i-publicystyka,205/reporterzy-odcinki,1162990/odcinek-149,S02E149,1715678)
- 2024-11-05 — [Biogazownia Ciechocinek](https://vod.tvp.pl/informacje-i-publicystyka,205/reporterzy-odcinki,1162990/odcinek-142,S02E142,1696658)
- 2024-10-17 — [Pył węglowy](https://vod.tvp.pl/informacje-i-publicystyka,205/reporterzy-odcinki,1162990/odcinek-130,S02E130,1658205)
- 2024-08-08 — [odcinek bez tytułu](https://vod.tvp.pl/informacje-i-publicystyka,205/reporterzy-odcinki,1162990/odcinek-80,S02E80,1504121)
- 2024-05-09 — [odcinek bez tytułu](https://vod.tvp.pl/informacje-i-publicystyka,205/reporterzy-odcinki,1162990/odcinek-46,S02E46,1302768)

### Magazyn Ekspresu Reporterów (odcinki: 8)

- 2021-09-28 — [Uwięzieni w smrodzie](https://vod.tvp.pl/informacje-i-publicystyka,205/magazyn-ekspresu-reporterow-odcinki,273697/odcinek-925,S01E925,380779)
- 2021-04-20 — [Śmierdząca sprawa](https://vod.tvp.pl/informacje-i-publicystyka,205/magazyn-ekspresu-reporterow-odcinki,273697/odcinek-914,S01E914,302568)
- 2021-01-26 — [Hotel na lata](https://vod.tvp.pl/informacje-i-publicystyka,205/magazyn-ekspresu-reporterow-odcinki,273697/odcinek-902,S01E902,300904)
- 2020-12-08 — [Chcemy godnie żyć](https://vod.tvp.pl/informacje-i-publicystyka,205/magazyn-ekspresu-reporterow-odcinki,273697/odcinek-895,S01E895,299253)
- 2020-11-03 — [Dożywocie](https://vod.tvp.pl/informacje-i-publicystyka,205/magazyn-ekspresu-reporterow-odcinki,273697/odcinek-890,S01E890,391108) — jego materiał zaczyna się w 28:05
- 2020-10-13 — [Okno z widokiem](https://vod.tvp.pl/informacje-i-publicystyka,205/magazyn-ekspresu-reporterow-odcinki,273697/odcinek-887,S01E887,297265)
- 2020-09-22 — [Chcemy godnie żyć](https://vod.tvp.pl/informacje-i-publicystyka,205/magazyn-ekspresu-reporterow-odcinki,273697/odcinek-884,S01E884,391122)
- 2020-09-08 — [W cieniu kominów](https://vod.tvp.pl/informacje-i-publicystyka,205/magazyn-ekspresu-reporterow-odcinki,273697/odcinek-882,S01E882,297534) — jego materiał zaczyna się w 21:38

## Wypróbuj EUGEN 160M

EUGEN 160M to własny mały model językowy Jakuba do kodu, trenowany od podstaw i wciąż na wczesnym etapie treningu. Uzupełnia kod na bieżąco i podpowiada kolejną linię; jest trenowany także do uzupełniania kodu w środku pliku (fill-in-the-middle) i tłumaczy z Pythona na C++ i Rust. Można go wypróbować w terminalu na stronie AI albo przez API dla agentów AI:

- https://jakubcwirlej.com/pl/ai-dev/#terminal
- `POST https://jakubcwirlej.com/api/agent/complete` — {"code", "suffix"?, "mode": "inline" | "next_line" | "block"} → {"completion", …}
- `POST https://jakubcwirlej.com/api/agent/translate` — {"code", "to": "cpp" | "java" | "rust"} → {"ok", "code", …}

```http
POST https://jakubcwirlej.com/api/agent/complete
Content-Type: application/json

{"code": "def is_prime(n):\n    ", "mode": "block"}
```

```http
POST https://jakubcwirlej.com/api/agent/translate
Content-Type: application/json

{"code": "def add(a, b):\n    return a + b\n", "to": "rust"}
```

## Dla agentów AI

Agent AI może przeszukiwać teksty strony, zadawać pytania czatowi Jakuba i testować EUGEN przez proste API w JSON. Pełny opis i limity: https://jakubcwirlej.com/api/agent

- `POST https://jakubcwirlej.com/api/agent/search` — {"query", "lang"?, "k"?} → passages of the site's texts (4 languages)
- `POST https://jakubcwirlej.com/api/agent/interview` — {"question", "lang"?, "session_id"?} → {"answer", "session_id", …}
- https://jakubcwirlej.com/llms.txt

## Pełne teksty

### Media — reportaż i praca z obrazem {#media}

id: `media` · język tekstu: PL · 399 słów · Markdown: https://jakubcwirlej.com/pl/articles/media.md

**Streszczenie (redakcyjne):** Jakub Ćwirlej wyjaśnia, dlaczego ceni pracę z obrazem, który jego zdaniem mówi uniwersalnym językiem. Opisuje blisko dwie dekady realizowania reportaży i materiałów dokumentalnych dla ogólnopolskich programów publicystycznych, w których odpowiadał za całą produkcję, oraz swój cel: oddawanie głosu ludziom, którzy są go pozbawieni. Ciekawość świata wiąże z tym, że jego reporterski warsztat naturalnie przesunął się w stronę narzędzi opartych na AI.

**Najważniejsze punkty (redakcyjne):**

- Zrealizował setki reportaży i materiałów dokumentalnych dla programów takich jak Magazyn Ekspresu Reporterów, Alarm, Telekurier i Reporterzy.
- Zaczynał jako dziennikarz w redakcji informacyjnej, a stał się wszechstronnym twórcą odpowiedzialnym za research, zdjęcia, wywiady, tekst, montaż i postprodukcję.
- Dziennikarstwo interwencyjne to według niego spotkania z ludźmi w kryzysie; przykładem jest jego seria reportaży o zapadliskach po zamknięciu kopalni Olkusz-Pomorzany.
- Praca w terenie pod presją czasu nauczyła go szybkiego rozwiązywania problemów, pragmatyzmu i samodzielności.
- Ciekawość świata doprowadziła go do narzędzi opartych na AI.

**Pełny tekst (słowa autora):**

Cześć! Jestem Kuba. Lubię opowiadać historie, które mają znaczenie.

Dlaczego tak bardzo cenię pracę z obrazem? To proste. Obrazy mówią uniwersalnym językiem, budząc emocje i opowiadając historie w sposób, którego same słowa nie oddadzą. Miejsce po drugiej stronie obiektywu dało mi unikalną wolność ekspresji i budowania narracji.

Przez blisko dwie dekady zrealizowałem setki reportaży i materiałów dokumentalnych dla ogólnopolskich programów publicystycznych, takich jak Magazyn Ekspresu Reporterów, Alarm, Telekurier czy Reporterzy. Choć swoją karierę dziennikarską rozpocząłem w redakcji informacyjnej, dość szybko zrozumiałem, że aby tworzyć materiały, które naprawdę zatrzymują widza, muszę stać się wszechstronnym twórcą, rozumiejącym każdy aspekt telewizyjnego rzemiosła. Dlatego w swojej pracy nie ograniczam się do jednej roli. Odpowiadam za cały proces produkcyjny: od skrupulatnego researchu, przez operowanie kamerą, przeprowadzanie wywiadów, pracę nad tekstem, aż po ostateczny montaż i postprodukcję.

Moje podejście to splot miłości do sztuk wizualnych i uporu w opowiadaniu historii, które mają realny wpływ na rzeczywistość. Nie chodzi w tym tylko o samo trzymanie kamery, zgrabny montaż czy zadawanie trudnych pytań – chodzi o użycie obrazu do tego, by budować więź, angażować i zmuszać do refleksji.

W moich reportażach starałem się oddawać głos ludziom, którzy na co dzień są go całkowicie pozbawieni. Dziennikarstwo interwencyjne to w dużej mierze spotkania z człowiekiem w kryzysie – z ludźmi bezsilnymi w starciu z bezduszną biurokratyczną machiną czy zmagającymi się z dramatycznymi skutkami degradacji środowiska. Dobrym tego przykładem jest zrealizowana przeze mnie seria reportaży o problemie zapadlisk i potężnych kosztach społecznych, jakie z dnia na dzień spadły na lokalną społeczność po zamknięciu kopalni Olkusz-Pomorzany.

Praca w bezlitosnym środowisku dziennikarstwa interwencyjnego nauczyła mnie jednak nie tylko empatii, ale też umiejętności błyskawicznego rozwiązywania problemów i brutalnego pragmatyzmu. Działanie w terenie, nierzadko pod ogromną presją czasu i w nieprzewidywalnych warunkach, wymusiło na mnie całkowitą samodzielność. Z drugiej strony, to właśnie ta niezależność daje mi największą wolność, pozwala opowiadać historie od A do Z.

Zawsze napędzała mnie czysta ciekawość świata. Żyjemy w szalenie interesujących czasach, a to oznacza, że nie można stać w miejscu – trzeba nieustannie się rozwijać, weryfikować swoje założenia i wciąż uczyć się wszystkiego na nowo. Traktuję to jako wyzwanie, w którym nowe technologie są potężnym sprzymierzeńcem. To właśnie ten głód wiedzy sprawił, że mój reporterski warsztat zaczął w naturalny sposób ewoluować w stronę rozwiązań opartych na sztucznej inteligencji. Dziś szukam nowych wyzwań na styku mediów i technologii — tam, gdzie doświadczenie reportera i praktyczna znajomość AI dają razem więcej niż każde z osobna.

#### Powiązane teksty

- [O mnie](https://jakubcwirlej.com/pl/articles/about-me.md)
- [Moje podejście do pracy](https://jakubcwirlej.com/pl/articles/approach.md)
- [AI w dziennikarstwie](https://jakubcwirlej.com/pl/articles/ai-journalism.md)

### O mnie {#about-me}

id: `about-me` · język tekstu: PL · 695 słów · Markdown: https://jakubcwirlej.com/pl/articles/about-me.md

**Streszczenie (redakcyjne):** Osobisty portret, w którym autor opisuje siebie jako kogoś, kto unika sztywnych poglądów, i uważa to za atut dziennikarza lub badacza. Przedstawia swoją drogę od pracowni artystycznej dziadka i młodzieńczego planu zostania wykładowcą filozofii do 20 lat pracy reportera Telewizji Polskiej, a dziennikarstwu przypisuje to, że pomogło mu pokonać lęk przed oceną. Pisze też o rodzinie, ulubionych książkach i muzyce oraz o niedawnej przeprowadzce do Belgii, niedaleko Gandawy.

**Najważniejsze punkty (redakcyjne):**

- Większość życia mieszkał w Polsce; karierę zaczynał w redakcji jako dziennikarz i montażysta.
- Nie skończył studiów, a swoją pierwszą aplikację, OrsonAI, nazywa niewypałem; ceni umiejętność zmiany kursu.
- Kreatywność oznacza dla niego budowanie czegoś całkowicie od zera.
- Za swoją największą wadę uważa brak inteligencji emocjonalnej.
- Wymienia „Księgi Jakubowe” Olgi Tokarczuk, Marcela Prousta, Arvo Pärta, zespół L’Arpeggiata oraz Bacha w wykonaniu pod dyrekcją Philippe’a Herreweghe’a.

**Pełny tekst (słowa autora):**

Mówienie o sobie nigdy nie przychodziło mi łatwo. Przede wszystkim dlatego, że mam poczucie, iż wciąż niewiele o sobie wiem. Mam czterdzieści lat z okładem i nadal nie mam wyrobionego zdania na większość spraw, które ludzie uważają za „definiujące”. Zawsze staram się dopuszczać wiele punktów widzenia i nie przywiązywać się do żadnego na dłużej, niż jest on w stanie wytrzymać opór rzeczywistości. Choć dla wielu osób taki brak twardych, niezmiennych poglądów może wydawać się wadą, uważam, że dla dziennikarza czy researchera to największa zaleta.

Przez większość życia mieszkałem w Polsce. Moja przygoda z wizualnym opowiadaniem historii zaczęła się w pracowni artystycznej mojego dziadka – niemal świętej dla mnie przestrzeni, gdzie zrozumiałem, jak wielką siłę rażenia potrafi mieć pojedynczy obraz. Moja ścieżka zawodowa rozpoczęła się jednak w newsroomie, od pracy dziennikarza i montażysty wideo. To doświadczenie pozwoliło mi poznać od podszewki każdy aspekt telewizyjnego rzemiosła i ukształtowało mnie jako wszechstronnego twórcę. Przez 20 lat pracowałem jako reportażysta dla Telewizji Polskiej. To o tyle ironiczne, że przez całe dzieciństwo niewielu rzeczy byłem tak bardzo pewien, jak tego, że nie zostanę dziennikarzem – tak jak mój ojciec. Chciałem studiować filozofię i zostać wykładowcą akademickim. Życie i konieczność znalezienia zatrudnienia zweryfikowały te plany, ale to właśnie zdolność do adaptacji okazała się moją najważniejszą cechą. Znalazłem się w mediach i odnalazłem się w nich całkiem dobrze.

Dziennikarstwo mnie zdefiniowało. Nauczyło mnie dyscypliny i wytrwałości, ale przede wszystkim zadziałało jak wieloletnia terapia – wyleczyło mnie z dziecięcych traum. Przez lata bałem się odezwać do ludzi, których uważałem za mądrzejszych od siebie, paraliżowała mnie obawa przed oceną. Z dzisiejszej perspektywy bywało to wręcz komiczne, ale praca z kamerą i mikrofonem zmusiła mnie do konfrontacji z tym lękiem. Pracę w mediach cenię do dziś właśnie za to, że pozwala doświadczać świata wciąż na nowo. Daje możliwość ciągłego redefiniowania siebie i swojego miejsca w najróżniejszych kontekstach. To nieustająca przygoda.

Dla kogoś z zewnątrz mogę wydawać się osobą niestałą, może nawet niezdolną do dowożenia rezultatów. W końcu nie skończyłem studiów, a także moja pierwsza aplikacja – OrsonAI – okazała się niewypałem. Głęboko jednak wierzę, że w życiu trzeba bezustannie eksplorować możliwości i potrafić zrobić pivot wtedy, gdy przemawiają za tym okoliczności. Z drugiej strony, potrafię się potężnie zaangażować w projekty, w których widzę sens – fakt, że spędziłem 20 lat w jednej, niezwykle wymagającej branży, chyba najlepiej dowodzi, że traktuję to, co robię, bardzo poważnie.

Lubię zadania wymagające kreatywności. Wiem, że brzmi to oklepanie, a kreatywność może dziś oznaczać dosłownie wszystko, dlatego dla mnie to słowo ma bardzo konkretny wymiar: to rzucenie się na głęboką wodę i postawienie się w sytuacji, w której trzeba zbudować coś zupełnie od nowa. To właśnie dlatego tak bardzo ceniłem pracę reportażysty. Choć można odnieść wrażenie, że w reportażach przewijają się wciąż te same historie i ludzkie motywy, to dobry dokumentalista potrafi opowiedzieć o nich za każdym razem w zupełnie nowy, intrygujący sposób.

Jeśli miałbym wskazać swoją największą wadę, to z pewnością byłby to brak inteligencji emocjonalnej. Zupełnie „nie czytam pokoju”. Jeśli ktoś nie zakomunikuje mi czegoś wprost, najpewniej tego nie zauważę. To może wydawać się dość zabawne, ale ten paradoks sprawia, że pod tym względem bywam niezwykle wręcz podobny do sztucznej inteligencji.

A prywatnie? Największą radość daje mi rodzina. Obserwowanie, jak rozwijają się moje dzieci, to fascynujące doświadczenie. Mam jednak do siebie żal, że poświęcałem im dotąd zbyt mało czasu – to jedna z głównych rzeczy, które staram się teraz w swoim życiu zmienić.

Lubię czytać książki, które dają mi poczucie ciągłości. Takie, które pokazują, że choć zmieniają się epoki i dekoracje, w gruncie rzeczy dzielimy dokładnie te same radości i smutki z ludźmi, którzy żyli setki lat przed nami. Stąd moja fascynacja „Księgami Jakubowymi” Olgi Tokarczuk i twórczością Marcela Prousta. Moim wielkim marzeniem jest zresztą nauczenie się języka francuskiego na tyle dobrze, by móc w końcu przeczytać „W poszukiwaniu straconego czasu” w oryginale.

Kocham muzykę klasyczną – Arvo Pärta, zespół L'Arpeggiata, ale przede wszystkim kantaty i msze Bacha w wykonaniu Philippe'a Herreweghe. Od niedawna mieszkam w Belgii, całkiem blisko Gandawy, więc mam ogromną nadzieję, że wkrótce nadarzy się okazja, by usłyszeć jego interpretacje na żywo.

A poza tym? Lubię po prostu słuchać deszczu i patrzeć, jak trawa ugina się na wietrze. W zupełności mi to wystarcza.

### Moje podejście do pracy {#approach}

id: `approach` · język tekstu: PL · 711 słów · Markdown: https://jakubcwirlej.com/pl/articles/approach.md

**Streszczenie (redakcyjne):** Dla autora dziennikarstwo jest przede wszystkim sposobem poznawania świata i ciągłą nauką, a zarazem formą służby: niezależnie od samopoczucia czy ryzyka ma dostarczyć materiał, bo ludzie mają prawo wiedzieć. Przekonuje, że telewizja nigdy nie jest obiektywna, bo subiektywność zaczyna się już przy wyborze ujęć i trwa przez montaż, a prawdziwym zobowiązaniem etycznym jest nie marnować czasu widza. Wyjaśnia, jak starannie przygotowuje się do zdjęć i dlaczego nigdy nie zabiegał o nagrody.

**Najważniejsze punkty (redakcyjne):**

- Na co dzień słucha na zmianę BBC i Radio France i ceni ich zasady etyczne, ale wiele deklaracji absolutnego obiektywizmu uważa za cyniczne.
- Sugeruje, by redakcje otwarcie deklarowały, jaki światopogląd uważają za dominujący.
- Przygotowanie materiału obejmuje wcześniejszy przyjazd na miejsce, by sprawdzić przestrzeń i światło.
- Nie wysyłał reportaży na festiwale: nie czuł się uprawniony do bycia „autorem” cudzych historii i wolał być solidnym członkiem zespołu.

**Pełny tekst (słowa autora):**

Dziennikarstwo, a zwłaszcza praca w telewizji, jest dla mnie przede wszystkim sposobem poznawania świata, przepustką do miejsc i ludzi, do których inaczej nigdy bym nie trafił. Do dziennikarstwa przyciągnęła mnie ciekawość i to ona do dziś trzyma mnie w tym zawodzie. I po 20 latach wciąż czegoś się uczę.

Ta nauka nie jest zresztą wyborem, tylko warunkiem tej pracy. Dziennikarz co chwilę mierzy się z tematem, o którym jeszcze wczoraj niewiele wiedział, a w większości przypadków bez rzetelnego researchu ani rusz. Zmieniają się przepisy, zmieniają się okoliczności, zmieniają się ludzie, których dana sprawa dotyczy. Dlatego w tym zawodzie nigdy nie robi się dwa razy tego samego tematu – nawet wtedy, gdy problemy wydają się łudząco podobne. Dwie rodziny, które spotkała ta sama tragedia, to nadal dwie różne historie, a to, co trzy lata temu było prawdą, dziś bywa już tylko punktem wyjścia.

Dla wielu moich znajomych z branży dziennikarstwo jest czymś na kształt służby. Mnie także bliskie jest to podejście – i to pomimo faktu, że brakuje w nim sformalizowanych struktur wojska czy policji, a ja sam przez większość kariery mogłem liczyć co najwyżej na wierszówkę. O żadnych przywilejach, państwowym parasolu ochronnym czy instytucjonalnym bezpieczeństwie nie było nawet mowy. A jednak zawsze miałem poczucie, że spoczywa na nas podobny ciężar obowiązku. Niezależnie od tego, czy danego dnia czuję się lepiej czy gorzej, czy temat jest dla mnie osobiście nieprzyjemny, czy wręcz budzi fizyczne zagrożenie – moim zadaniem jest po prostu ten temat „dowieźć”. Ludzie mają prawo wiedzieć, a moją rolą jest im tę wiedzę dostarczyć.

Właśnie dlatego tak bardzo drażnią mnie dzisiejsze roszczenia do absolutnego obiektywizmu. To nie jest tak, że nie szanuję klasycznych standardów – na co dzień słucham na zmianę BBC i Radio France, głęboko ceniąc ich zasady etyczne. Ale bądźmy szczerzy: granica między obiektywizmem a subiektywizmem w przypadku absolutnie każdej stacji zaczyna się i kończy dokładnie tam, gdzie wyznacza ją jej linia redakcyjna (editorial line). W wielu innych przypadkach te roszczenia to wręcz cyniczne wycieranie sobie twarzy dziennikarskim etosem, służące wyłącznie przemycaniu własnych poglądów. Byłoby znacznie uczciwiej, gdyby każda redakcja oficjalnie deklarowała, jaki światopogląd uważa za dominujący. Prawda jest taka – i to głębsza refleksja po latach pracy na planie – że telewizja z definicji nigdy nie jest obiektywna. Subiektywizm zaczyna się już na poziomie technologii i doboru kadrów. Sama decyzja operatora, czy trzymać kamerę z ręki (co nadaje ujęciu nerwowej dynamiki), czy postawić ją na statywie, to świadomy wybór, który natychmiast wpływa na narrację i odbiór emocjonalny. A przecież dochodzi do tego montaż, selekcja informacji i dźwięk. Obraz telewizyjny zawsze jest czyjąś interpretacją rzeczywistości.

Dla mnie prawdziwa etyka dziennikarska sprowadza się do niepisanej umowy z widzem: moim najważniejszym obowiązkiem jest nie marnować jego czasu. Wymaga to opowiadania historii w sposób, który angażuje i intryguje, nawet jeśli od dekad na ekranach przewijają się te same uniwersalne motywy ludzkich dramatów i radości. W bezlitosnym środowisku dziennikarstwa interwencyjnego, realizowanego pod ogromną presją czasu, nauczyłem się balansować autorską wizję z brutalną pragmatyką. Nie chodzi w tym tylko o trzymanie kamery czy zadawanie trudnych pytań. Chodzi o oddanie głosu tym, którzy go nie mają, i użycie wizualnego języka tak, by budował więź, uderzał w odpowiednie struny i rezonował z odbiorcą.

To z kolei wymaga rzemieślniczej pokory i rygorystycznego przygotowania. Dokumentacja tematu to dla mnie nie tylko przedwstępna rozmowa z bohaterami. To zjawienie się na miejscu odpowiednio wcześniej, żeby sprawdzić architekturę przestrzeni, ocenić, jak w czasie zdjęć będzie układać się światło i z której strony zaświeci słońce. Ta czysto analityczna, wręcz inżynieryjna część pracy na planie pozwala mi zaplanować realizację na chłodno, by później, w kluczowym momencie, móc skupić się wyłącznie na człowieku i jego historii.

Nigdy nie goniłem za nagrodami branżowymi, nie wysyłałem swoich reportaży na festiwale. Złożyły się na to dwa powody. Po pierwsze, opowiadając o cudzym życiu, często o czyichś osobistych tragediach, nigdy nie potrafiłem poczuć się „autorem” tych historii – po prostu nie uważałem, bym miał do tego moralne prawo. Po drugie, przez lata świadomie budowałem opinię człowieka, który nie jest kapryśnym artystą-indywidualistą, lecz rzetelnym graczem zespołowym. Świadomie zrezygnowałem z pretensji artystycznych na rzecz płynności pracy. Robiłem materiały dla wydawców – sprawnie, w terminie, bez zbędnych dyskusji. Dbałem o to, żeby koła tej maszyny kręciły się bez zgrzytów. Głęboko wierzę, że opowiadanie ważnych historii i wywieranie realnego wpływu na rzeczywistość nie wymaga budowania pomnika dla ich twórcy.

### AI w dziennikarstwie {#ai-journalism}

id: `ai-journalism` · język tekstu: PL · 1249 słów · Markdown: https://jakubcwirlej.com/pl/articles/ai-journalism.md

**Streszczenie (redakcyjne):** Autor, który od premiery ChatGPT korzysta z AI niemal codziennie, dostrzega jej zagrożenia, przede wszystkim halucynacje, ale przekonuje, że pragmatyczne korzystanie z tej technologii wzmacnia warsztat: rozmawia z czatbotem w drodze ze zdjęć, automatyzuje transkrypcję i sięga po narzędzia OSINT, choć żaden model nie potrafi jeszcze ułożyć telewizyjnej „drabinki” z surowych wywiadów. Uważa, że ocenianie tekstów po samym brzmieniu nie ma większego sensu, skoro detektory AI mylą się w obie strony, i zauważa, że unijny AI Act pyta, kto odpowiada za tekst, ale nie daje czytelnikowi sposobu, by sprawdzić, kto go napisał. Przekonuje, że dziennikarze, którzy prowadzą research i iterują, dobrze sobie poradzą, a pracę stracą przede wszystkim ci, którzy powielają schematy.

**Najważniejsze punkty (redakcyjne):**

- W badaniu EBU i BBC z października 2025 r. co piąta odpowiedź asystentów AI na pytania o bieżące wydarzenia zawierała poważne błędy merytoryczne, takie jak zmyślone lub nieaktualne informacje.
- Jego pierwsza aplikacja, OrsonAI, wyrosła z potrzeby transkrypcji wywiadów w czasie rzeczywistym i błyskawicznego importu do edytora.
- Detektory AI mylą się w obie strony: ZeroGPT uznał fragment Deklaracji Niepodległości USA w niemal 98 proc. za dzieło maszyny, a tekst, który według ustaleń „Wired” był wymysłem AI, dwa detektory uznały za najpewniej napisany przez człowieka.
- Jego pomysł certyfikatu ludzkiego autorstwa kotwiczonego na blockchainie spotkał się z brakiem zainteresowania znajomych z branży.
- Od 2 sierpnia 2026 r. unijny AI Act każe oznaczać wygenerowane przez AI teksty o sprawach publicznych, chyba że przeszły kontrolę redakcyjną i ktoś bierze za nie odpowiedzialność.

**Pełny tekst (słowa autora):**

Wracam ze zdjęć. Ręce na kierownicy, w głowie kotłują mi się świeże przemyślenia i wrażenia z planu, więc włączam czatbota i po prostu z nim rozmawiam. Opowiadam, co zobaczyłem, układam na głos pierwsze zdania materiału, wyliczam, co muszę jeszcze sprawdzić. Bot wszystko zapisuje, porządkuje w notatki i na bieżąco komentuje moje pomysły. Z takiej rozmowy powstaje czasem wstępny szkic tekstu, a czasem tylko lista obserwacji, która pomaga mi przy dalszej pracy nad materiałem. Wcześniej, zanim dotarłem do redakcji, wiele ulotnych, a bardzo dobrych pomysłów po prostu mi umykało. Kiedy do tematu trzeba było wrócić po kilku dniach, wiele rzeczy musiałem odkrywać na nowo.

Ponieważ od premiery ChatGPT korzystam ze sztucznej inteligencji niemal każdego dnia, trudno mi się odnaleźć w debacie o AI w mediach, w której na pierwszy plan niemal zawsze wysuwają się kwestie praw autorskich, etyki i bezpieczeństwa źródeł. I słusznie, bo modele wciąż konfabulują: w badaniu EBU i BBC z października 2025 r. co piąta odpowiedź asystentów AI na pytania o bieżące wydarzenia zawierała poważne błędy merytoryczne, takie jak zmyślone lub nieaktualne informacje. Z perspektywy dziennikarskiej rzetelności halucynacje to koszmar. Uważam jednak, że mimo tego ryzyka pragmatyczne wykorzystanie tej technologii pozwoli przede wszystkim wzmocnić dziennikarski warsztat. Sam chętnie sięgam po AI, zaczynając od automatyzacji najbardziej żmudnych, powtarzalnych procesów. To z tej potrzeby zrodziła się moja pierwsza aplikacja, OrsonAI, wspomagająca transkrypcję wywiadów w czasie rzeczywistym i błyskawiczny import do edytora.

Prawdziwa rewolucja dokonuje się jednak w obszarze researchu. Narzędzia do analizy otwartych źródeł (OSINT), jeszcze do niedawna koszmarnie drogie i zarezerwowane dla największych agencji wywiadowczych czy gigantów rynkowych, dziś uległy radykalnej demokratyzacji. Każdy może na własne potrzeby zbudować agenta, który w kilka sekund wyciągnie i ustrukturyzuje kluczowe dane z wielostronicowych dokumentów. Ostateczna weryfikacja faktów zawsze pozostaje bowiem po stronie człowieka, ale sam fakt błyskawicznego namierzenia, gdzie konkretna informacja znajduje się w piśmie, wielokrotnie skraca czas pracy dziennikarza śledczego.

Naturalnie, bardzo szybko pojawia się pokusa, by pójść o krok dalej: skoro maszyna umie czytać, niech sama napisze tekst. Mój stosunek do tego jest mieszany, bo na razie sztuczna inteligencja po prostu nie potrafi zrobić za mnie tego, co w tworzeniu materiału najważniejsze. Żaden model nie jest w stanie wziąć garści surowych wywiadów i ułożyć z nich sensownej telewizyjnej „drabinki” – precyzyjnej struktury, w której wypowiedzi bohaterów naturalnie przeplatają się z narracją autorską i inteligentnie korespondują ze zrealizowanymi zdjęciami. Próba stworzenia agentowi odpowiedniego kontekstu, by wygenerował scenariusz zbliżony do moich oczekiwań, wymagałaby obecnie pracy niewspółmiernej do ostatecznego efektu. Być może to kwestia czasu i kolejnych iteracji modeli, ale do tej pory nie znalazłem narzędzia, które potrafiłoby uchwycić ten poziom złożoności. AI nieźle radzi sobie z krótkimi informacjami i notatkami prasowymi – pod warunkiem, że ktoś je potem sprawdzi – ale w dłuższych formach niemal zawsze wyczuwam brak indywidualnego stylu i płynności.

Z drugiej strony, nie jestem dogmatycznym przeciwnikiem wspierania się sztuczną inteligencją w pracy twórczej. Pisanie, bądźmy szczerzy, jest po części umiejętnością czysto mechaniczną. To, co naprawdę się liczy, to idea, oryginalne spojrzenie i to, co autor ma nam do przekazania. Dobry, niesztampowy pomysł i oryginalne myślenie prędzej czy później przebiją się przez warstwę formy. Znam aż nazbyt wielu dziennikarzy, którzy od lat nie mają nam do powiedzenia niczego nowego, a ich teksty do złudzenia przypominają wygenerowane przez algorytm gotowce – brakuje w nich jakiejkolwiek żywej idei. Brakuje tej specyficznej iskry, nieszablonowej inteligencji i ludzkiego błysku, którego matematyka modeli językowych wciąż nie potrafi uchwycić.

Kiedy czytam artykuł, zazwyczaj już po kilku pierwszych zdaniach wiem, czy jego treść ze mną rezonuje. Szczerze mówiąc, to, czy napisał go człowiek, czy maszyna, schodzi dla mnie na dalszy plan wobec pytania: czy ten tekst wnosi w moje życie nową wartość? Czy potrafi zmienić moje spojrzenie na dany problem? Zresztą, wbrew powszechnemu przekonaniu, bardzo trudno jest dziś na poziomie samej składni kategorycznie odróżnić tekst ludzki od maszynowego. Testując detektory tekstów AI, szybko odkryłem, że doskonale ustrukturyzowane, logiczne i rytmiczne felietony znanych publicystów, napisane jeszcze w 2013 roku, bywają przez programy oznaczane jako stuprocentowe twory maszyny. Działa to zresztą w obie strony. Detektor ZeroGPT uznał fragment Deklaracji Niepodległości USA w niemal 98 proc. za dzieło maszyny, a gdy „Wired” sprawdzał tekst, który – jak redakcja sama potem ustaliła – był wymysłem AI, dwa detektory uznały, że najpewniej napisał go człowiek. Piętnowanie tekstów wyłącznie na podstawie ich brzmienia uważam więc za pozbawione większego sensu.

Jako czytelnik oceniam wartość tekstu, nie autora, ale zaufanie publiczne opiera się na tym, kto za tekst odpowiada. Dlatego rozumiem odmienne, purystyczne podejście: założenie, że ze względów etycznych dziennikarstwo powinno pozostać strefą wolną od maszyn, jako obszar szczególnego społecznego zaufania. Tyle tylko, że takie rozwiązanie wymagałoby twardej umowy społecznej i wprowadzenia mechanizmów, które bezsprzecznie gwarantowałyby certyfikat ludzkiego autorstwa. Takich mechanizmów wciąż nie ma: istniejące certyfikaty ludzkiego autorstwa są dobrowolne i nie stały się standardem w mediach. Sam sporo o tym myślałem, projektując certyfikat ludzkiego autorstwa kotwiczony na blockchainie – niezmienny dowód tego, kto napisał dany tekst. Kiedy jednak przedstawiłem ten pomysł znajomym z branży, spotkałem się z całkowitym brakiem zainteresowania i niezrozumieniem takiej potrzeby.

Ostatecznie, mimo że dziennikarstwo wymienia się dziś na czołowych miejscach list zawodów najbardziej zagrożonych przez AI, uważam, że w epoce sztucznej inteligencji dziennikarze z prawdziwego zdarzenia będą mieli się całkiem dobrze. Po pierwsze dlatego, że prędzej czy później nadejdzie moment systemowego otrzeźwienia – wartość ludzkiej kontroli nad informacją zostanie potraktowana na tyle poważnie, że doczeka się odpowiednich regulacji prawnych. Pierwsze już są, choć idą w inną stronę: od 2 sierpnia 2026 r. unijny AI Act każe oznaczać wygenerowane przez AI teksty o sprawach publicznych, chyba że przeszły kontrolę redakcyjną i ktoś bierze za nie odpowiedzialność. Prawo pyta więc, kto odpowiada, ale nie daje czytelnikowi sposobu, by sprawdzić, kto naprawdę pisał.

Po drugie, nasze kompetencje idealnie skalują się w świecie technologii. Praca nad własną aplikacją i treningiem modelu uświadomiła mi jedną kluczową rzecz: tworzenie, zarówno w świecie technologii, jak i w mediach, to moim zdaniem w 90 procentach proces, który my, dziennikarze, mamy już dawno opanowany. To powtarzalny cykl dwóch rzeczy: researchu i iteracji. Zbierasz informacje. Weryfikujesz. Syntetyzujesz. Ulepszasz. I zaczynasz od nowa. Dla ludzi, którzy chcą się uczyć i rozumieć otaczającą ich rzeczywistość, sztuczna inteligencja otwiera wielkie możliwości. Jeden sprawny dziennikarz wsparty agentycznymi modelami może dziś zrobić to, do czego wczoraj potrzebny był cały zespół redakcyjny. To realna szansa na zwiększenie społecznej kontroli nad procesami zachodzącymi w świecie.

Kto zatem straci pracę? Przede wszystkim ci, dla których dziennikarstwo od dawna przestało być misją, a stało się powielaniem schematów. Ludzie, którzy co roku na ten sam temat piszą niemal identyczny tekst. Nie widzę ani jednego powodu, dla którego jakakolwiek redakcja miałaby ich zatrudniać, skoro algorytm zrobi to samo szybciej i za darmo. Nie łudzę się przy tym, że rynek zawsze odsieje odtwórczych. Czasem odsiewa najtańszych albo tych, którzy akurat stali najbliżej drzwi. Na dłuższą metę konkurencja ze strony maszyn zmiecie jednak z planszy przede wszystkim tych, którzy odrzucą rozwój i nie zechcą się uczyć. Oczywiście trudno przewidzieć kierunek w przypadku tak szybko rozwijającej się technologii. Sądzę jednak, że jeśli sztuczna inteligencja będzie wykorzystywana w pracy dziennikarskiej w sposób etyczny – z myślą o naturalnym i nadrzędnym prawie ludzi do rzetelnej informacji – to ostatecznie paradoksalnie wzmocni nasz zawód. Stanie się narzędziem, które nie zastępuje człowieka, ale potęguje jego sprawczość.

Kiedy wracam ze zdjęć, rozmawiam z botem i dyktuję mu pierwsze zdania. On je zapisze, poprawi przecinki, może zaproponuje lepszy szyk. Ale to ja byłem na zdjęciach i to wciąż ja decyduję o tym, co znajdzie się w materiale i co zobaczy na ekranie widz. Czas zaoszczędzony na nudnych, powtarzalnych zdaniach, które AI pomaga mi zautomatyzować, mogę poświęcić bohaterom moich reportaży.

### Jak zaczynałem {#how-i-started}

id: `how-i-started` · język tekstu: PL · 1309 słów · Markdown: https://jakubcwirlej.com/pl/articles/how-i-started.md

**Streszczenie (redakcyjne):** Autor opowiada, jak budowa OrsonAI, zestawu narzędzi AI do własnej pracy dziennikarskiej, zaprowadziła go od vibe codingu do badań nad halucynacjami modeli językowych i do trenowania własnych modeli. Opisuje chłodne przyjęcie aplikacji w branży, swoje badania aktywacji bramek SwiGLU i porażkę pierwszego modelu opartego na własnej architekturze. Dziś trenuje EUGEN 160M, mały model wyspecjalizowany w kodzie, który można wypróbować w terminalu na stronie.

**Najważniejsze punkty (redakcyjne):**

- OrsonAI oferowało transkrypcję wywiadów na żywo, tryb edycji pozwalający konsultować z chatbotem wybrane fragmenty oraz certyfikaty ludzkiego autorstwa zapisywane w publicznym rejestrze Hedera Hashgraph.
- Znalezione sygnały GSI opisuje dziś raczej jako sygnały proxy wiedzy niż „świadomość epistemiczną” modelu; zaobserwował, że konfabulacja jest w dużej mierze procesem dwuetapowym.
- Postępy EUGEN 160M opierają się na ścisłym monitorowaniu, celowo dobieranych danych treningowych, danych syntetycznych STaR i LEMA oraz przykładach tłumaczeń z Pythona na C++, Javę i Rusta.
- Z pomocą agenta AI do kodowania zbudował własny kernel w Tritonie do trenowania modelu rzadkiego: w modelu ~300 mln parametrów wariant rzadki trenował się 1,23× szybciej od gęstego, a kolejne optymalizacje kernela podniosły przepustowość o dalsze 36%.
- Porażkę pierwszego modelu przypisuje problemowi filozoficznemu, przywołując definicję prawdy Tarskiego i twierdzenia Gödla.

**Pełny tekst (słowa autora):**

…Nie posiadam żadnego formalnego wykształcenia w zakresie programowania i szkolenia LLM.

Tworzeniem aplikacji i treningiem AI zająłem się przez kompletnie dziwny zbieg przypadków, który z dzisiejszej perspektywy wydaje mi się jednak mieć sporo sensu. I, jak sądzę, mówi to coś ważnego o naszych czasach. Nie planowałem tego, nie sądziłem, że kiedykolwiek mogę mieć z technologią więcej wspólnego niż przeciętny użytkownik iPhone'a. Przez lata moim jedynym oknem na świat Big Tech był podcast Hard Fork. Pozdrowienia dla Caseya i Kevina :)

Wszystko zaczęło się od vibecodingu i aplikacji OrsonAI. Bawiąc się sztuczną inteligencją, zacząłem tworzyć narzędzia, które mogłyby być mi pomocne w mojej codziennej pracy dziennikarskiej. Zapisywanie wywiadów w formie tekstu w trakcie nagrywania i importowanie ich do edytora, czy tryb edycji pozwalający konsultować z czatem wybrane fragmenty tekstu bez konieczności nawigacji między oknami i przeklejania całego kontekstu, to na tamten moment były naprawdę fajne narzędzia, które wydatnie przyspieszały moją pracę.

Z czasem zacząłem myśleć o tym jak o projekcie, jak o czymś, co mogłoby służyć też innym. Idea była prosta: wykorzystać udogodnienia, które pomagają mi zaoszczędzić czas, i stworzyć produkt dla osób napotykających te same problemy. Poświęciłem dużo czasu na stworzenie interfejsu i mechanizmów, które mogłyby zapewnić bezpieczne AI dla redakcji – takie, które pomaga dziennikarzowi, ale go nie wyręcza. Zaprojektowałem nawet system przyznający certyfikaty ludzkiego autorstwa tekstu, publikowany na publicznym ledgerze Hedery Hashgraph. Niezmienny dowód o wartości świadectwa sądowego, wskazujący, jak powstawał tekst i jaki był udział człowieka przy jego tworzeniu.

- [Tutaj znajdziesz opis technologii HDK](https://jakubcwirlej.com/pl/articles/hdk-tech.md)
- [Tutaj możesz pobrać darmową bibliotekę HDK](https://jakubcwirlej.com/files/hdk/hdk-audit-0.1.3.zip)
- [HDK na Hugging Face](https://huggingface.co/JakCwi/hdk-audit)

Spotkało mnie jednak spore rozczarowanie. Przyjęcie przez osoby z branży, którym pokazywałem aplikację, było więcej niż chłodne. Pytanie, które powracało na koniec każdej prezentacji, boleśnie uświadamiało mi, jak bardzo się myliłem: „Czemu ktoś miałby płacić za twoją aplikację, skoro mamy darmowego ChatGPT?”. Kwestie certyfikatu ludzkiego autorstwa, ochrony danych czy nawet znacznego usprawnienia pracy ponad to, co oferował zwykły chatbot, nie były istotne. Słyszałem to od ludzi podkreślających na co dzień wagę rzetelnego dziennikarstwa.

Praca nad aplikacją i systemem agentycznego AI, który będzie wystarczająco niezawodny, żeby mógł służyć w redakcjach informacyjnych, popchnęła mnie jednak w zupełnie nowym kierunku. Starając się lepiej zrozumieć, skąd biorą się halucynacje modeli językowych, zacząłem czytać prace naukowe publikowane na arXiv, a w końcu zaprojektowałem i przeprowadziłem serię badań związanych z aktywacją bramek SwiGLU na kilku otwartych modelach językowych. Wnioski z tych badań opisałem w kilku pracach, które zamieściłem na ResearchGate. Choć z dzisiejszej perspektywy niektóre tezy tamtych prac wydają mi się megalomańskie, a sam tekst wymagałby pewnie poprawy i bardziej naukowego słownictwa, nie usuwam ich – choćby ze względu na uczciwość badawczą.

Dziś, mając więcej pokory zdobytej na poligonie szkolenia modeli językowych, po wielu nieudanych eksperymentach i rozczarowaniach, pisząc o znalezionych sygnałach GSI, mówiłbym raczej o sygnałach proxy wiedzy niż o "epistemicznej świadomości" modelu. Z drugiej strony, na podstawie twardych danych udało mi się zaobserwować, że konfabulacja to w dużej mierze proces dwuetapowy, w którym model – nie mając oparcia w faktach – niemal zawsze wybiera spójność formy kosztem prawdy. To był dla mnie osobiście najciekawszy moment tych eksperymentów: chwila, w której moje dawne zainteresowania filozofią i epistemologią znalazły niespodziewane, w pełni mierzalne odzwierciedlenie w architekturze transformerów. Osobną kwestią pozostaje jednak codzienna użyteczność tych sygnałów w warunkach produkcyjnych. Porównanie ich skuteczności przy wykrywaniu halucynacji z innymi wykorzystywanymi metodami wymagałoby z pewnością dodatkowych badań.

To zadanie pochłonęło mnie bez reszty. Być może jest to trochę zgodne z moim charakterem – lubię angażować się w zajęcia, które stanowią wyzwanie, ale też pozwalają mi nauczyć się czegoś o otaczającym mnie świecie i lepiej go zrozumieć. Zresztą, zanim zająłem się dziennikarstwem, studiowałem filozofię, szczególnie interesując się filozofią nauki i epistemologią.

- [Tutaj znajdziesz esej podsumowujący niektóre moje przemyślenia](https://www.researchgate.net/publication/397730862)

Szkolenie mojego własnego modelu skończyło się totalną katastrofą. Popełniłem prawdopodobnie wszystkie możliwe błędy, i to mimo nawyku do solidnego researchu oraz pochłonięcia olbrzymiej ilości fachowej literatury. Pierwsze efekty wydawały się obiecujące, ale dopiero po czasie zrozumiałem, że były one w dużej mierze zasługą regularyzacji szumem. Przewaga modelu w testach ablacyjnych nie opłacała się w zestawieniu z dodatkowym narzutem obliczeniowym (compute) związanym z obliczaniem Gini aktywacji bramek. Doszły do tego również wyzwania czysto techniczne związane z treningiem. Moje modyfikacje wyjęte spod normalizacji hamowały efektywne uczenie, natomiast zastosowanie normalizacji powodowało ich spłaszczenie, czyniąc z modelu standardowy, ale droższy w treningu transformer. Szczegóły architektury udostępniam do pobrania tutaj – być może ktoś znajdzie w tym użyteczny materiał do nauki na cudzych błędach.

Rozwiązaniem, które mimo wszystko moim zdaniem zasługuje na uwagę, jest bramka M2. Dzięki afinicznej kotwicy pozwala ona zachować działanie w oparciu o funkcję sigmoid bez ryzyka ściągnięcia w dół przez leniwy optymalizator szukający łatwej drogi do obniżenia straty treningowej. U mnie ta bramka, uczona na sygnałach Gini aktywacji, miała za zadanie ciąć szumy przy generacji przez model. Jednak wyjęcie sygnału spod normalizacji – jak wspomniałem wcześniej – prowadziło do modelu o przesadnym rozkładzie pewności; sprawniejszego logicznie, jednak de facto gorzej uczącego się faktów. Być może to rozwiązanie mogłoby przydać się w innych modelach do bramkowania innych elementów i pomóc w procesie treningowym.

Wszystkie moje porażki związane z trenowaniem modelu według własnej architektury uznałem ostatecznie za kapitał, którego nie należy marnować. Dziś szkolę swój własny, mały model EUGEN 160M, który specjalizuje się w kodzie. Porównując jego dotychczasowe wyniki benchmarkowe, jestem ostrożnym optymistą i zakładam, że nie będzie to stracony czas. Zdecydowałem się na szkolenie modelu specjalizującego się w językach backendowych, ponieważ w przypadku tego typu architektur łatwiej jest monitorować postępy, a sam model może być użytecznym narzędziem autouzupełniania (autocomplete) do wykorzystania w inferencji na zwykłym CPU. Model można przetestować w specjalnie przygotowanym terminalu na mojej stronie oraz porównać go z innymi otwartymi rozwiązaniami o podobnych rozmiarach.

- [Tutaj możesz przetestować model Eugen 160M](https://jakubcwirlej.com/pl/ai-dev/#terminal)

Dotychczasowe wyniki to przede wszystkim zasługa rygorystycznego śledzenia postępów i błędów popełnianych przez model w czasie generacji. Dzięki temu byłem w stanie na bieżąco interweniować, dodając dane treningowe wzmacniające model tam, gdzie pokazywał słabości. Stosowałem też regularnie techniki STaR i LEMA, tworząc dane syntetyczne na podstawie tego, co wygenerował sam model, oraz dane translacyjne uczące model logiki kodu poprzez pokazywanie mu przykładów tłumaczeń między Pythonem a C++, Javą i Rustem. Wszystkie te materiały stanowią obecnie około 0,35% całego zbioru, a ich udział będzie stopniowo zwiększany w miarę postępów treningu.

Praca nad szkoleniem modelu sprawia mi wiele frajdy i – podobnie jak wcześniej dziennikarstwo – daje mi poczucie, że robię coś ważnego; coś, co pozwala mi lepiej uchwycić przemiany w świecie, który mnie otacza. Nie stworzę sam złożonego kodu w C++ od zera, to fakt, ale staram się zrozumieć logikę procesów. W ten sposób odnoszę drobne sukcesy, które pozwalają mi posuwać się naprzód w mojej pracy. Tak – przy pomocy kodującego agenta AI stworzyłem własny kernel w Tritonie, który pozwala trenować rzadki model, poprawiając TPS (Tokens Per Second) o 23% względem modelu gęstego; kolejne optymalizacje kernela dały dalsze 36%. Zamierzam to rozwiązanie wykorzystać przy szkoleniu kolejnego, nieco większego modelu.

- [Kernel możesz pobrać tutaj](https://jakubcwirlej.com/files/eugen-sparse.zip)
- [Kernel na Hugging Face](https://huggingface.co/JakCwi/eugen-sparse)

A wracając do modelu, od którego wszystko się zaczęło... Dziś widzę, że moim największym błędem nie była naiwność inżynieryjna. Ten model po prostu nie miał prawa działać tak, jak zakładałem. Problem nie był technologiczny, lecz czysto filozoficzny. I jako ktoś, kto studiował filozofię, powinienem był to wyłapać na samym początku, mając w pamięci definicję prawdy Tarskiego i twierdzenia Gödla. Zgodnie z nimi żaden dostatecznie złożony system nie potrafi w pełni dowieść własnej spójności, ani zdefiniować prawdy wyłącznie z poziomu samego siebie. Próba zmuszenia modelu do analizowania, oceny i korygowania swoich własnych stanów wewnętrznych w czasie rzeczywistym zamykała go w strukturalnej pętli, z której – bez metapoziomu i zewnętrznego punktu odniesienia – po prostu nie było wyjścia.

Kiedy zaczynałem tę przygodę, chciałem po prostu stworzyć narzędzie ułatwiające spisywanie dziennikarskich wywiadów. Bardzo szybko okazało się jednak, że wejście w świat sztucznej inteligencji to prawdziwy skok do króliczej nory z „Alicji w Krainie Czarów” – im głębiej schodzisz, tym bardziej wszystko staje się złożone, wielowarstwowe i fascynujące. Moja pierwsza aplikacja może nie zrewolucjonizowała rynku mediów, ale ten lot w dół nory doprowadził mnie do miejsca, w którym z powodzeniem trenuję własną architekturę. Przeszedłem długą drogę od biernego słuchacza technologicznych podcastów do człowieka, który fizycznie kształtuje parametry modeli i rozumie, co dzieje się wewnątrz.

### Czego nauczyłem się, szkoląc swój własny model {#training-lessons}

id: `training-lessons` · język tekstu: PL · 2195 słów · Markdown: https://jakubcwirlej.com/pl/articles/training-lessons.md

**Streszczenie (redakcyjne):** Dziesięć praktycznych lekcji z doświadczeń autora w samodzielnym trenowaniu modeli językowych. Dotyczą zbyt optymistycznych wyliczeń mocy obliczeniowej, zaczynania od małej skali, stałego monitorowania, izolowanych zmian i testów ablacyjnych, wyboru danych, realistycznych oczekiwań, cierpliwości podczas plateau i potrzeby więcej niż jednej karty GPU. Na koniec autor przekonuje, że małe, wyspecjalizowane modele budowane przez pojedyncze osoby wciąż mają sens.

**Najważniejsze punkty (redakcyjne):**

- Rzeczywiste wykorzystanie sprzętu (MFU) jest dużo niższe, niż sugerują specyfikacje; jego pierwszy model, liczący 1.5B parametrów, okazał się niedotrenowany.
- Śledzenie norm i porównywanie codziennych odpowiedzi ujawnia problemy, których nie pokazuje loss; przeszedł z AdamW na MuonH.
- Należy zmieniać jedną rzecz naraz; swój zbiór danych budował od zera aż trzy razy.
- Umiejętności często rosną skokowo po długim plateau, a monitorowanie top10 może pokazać postęp, którego nie widać w top1.
- Małe, wąskie modele działające lokalnie lub na CPU mogą być bardziej opłacalne niż największe modele, a trenowanie własnego to najlepszy sposób, by zrozumieć, jak działa AI.

**Pełny tekst (słowa autora):**

#### 1. Wszelkie kalkulacje robione na sucho zawsze będą zbyt optymistyczne

Kiedy myślimy o szkoleniu modelu, naturalnie na myśl przychodzi nam proces uczenia maszynowego – praca, którą wykonują za nas potężne klastry Nvidii w centrach danych, lub jeśli mamy więcej szczęścia, nasza własna piekielnie mocna stacja robocza. Czytając specyfikację, łatwo zapomnieć o tym, że realne MFU (Model FLOPs Utilization) jest dużo niższe, niż sugerowałyby materiały marketingowe producenta kart. W zależności od architektury i szczegółowości, sprzęt pozwoli ci wycisnąć z krzemu zaledwie ułamek mocy obliczeniowej. Cóż z tego, że karta liczy w FP4, jeśli w treningu modelu bazowego od zera nie będzie to działać stabilnie, albo przy szerokości twojego modelu zejście poniżej BF16 nie daje żadnych korzyści.

Moment, w którym zdajesz sobie sprawę, że nie jesteś w stanie wytrenować modelu, który planowałeś, w zakładanym czasie, ani nawet w przybliżonych rozmiarach, nie należy do łatwych. Zwłaszcza, jeśli poświęciłeś tygodnie na to, żeby dojść do miejsca, w którym możesz zacząć trening i nagle okazuje się, że cały plan był nierealny. Przecież na papierze wszystko się zgadzało! Pierwszy odruch to szukanie metod optymalizacji – torch compile, autocast, flash attention, FLCE, głowice i minibatch dopasowane wielkością do preferencji CUDA. To wszystko działa, ale fizyki krzemu nie oszukasz. Jeżeli trenujesz mały model, jego mała szerokość będzie działać przeciw tobie. Jeżeli nie stać cię na trening dużego modelu, nie stać cię też na wyciągnięcie maksimum ze swojego GPU. Dojście do momentu optymalnego wykorzystania karty może zająć dni, a finalny spadek TPS (Tokens Per Second) w treningu o 30-40% względem początkowych kalkulacji to różnica dni, czy wręcz tygodni pracy karty.

#### 2. Startuj zawsze od jak najmniejszej skali, która jest w stanie zwalidować twoje pomysły

Mój pierwszy model miał 1.5B parametrów i byłem w stanie go wytrenować zaledwie do trzech Chinchilla. Przy jego budowie popełniłem wiele błędów, ale mimo wszystko działał. O jego znikomej użyteczności zadecydowało przede wszystkim niedotrenowanie. Gdybym z tym samym budżetem zdecydował się szkolić model 10-krotnie mniejszy, mógłbym pochwalić się modelem dobrze wytrenowanym i użytecznym. Miałbym czas na testy i uniknąłbym z pewnością wielu błędów, co pozwoliłoby mi zbudować lepszą architekturę. Oczywiście rozmiar ma znaczenie, ale jeszcze większe znaczenie mają dane, architektura i wydajność obliczeniowa. Szanse, żeby zaprojektować dobry model na podstawie literatury, bez testów i bez pomyłek, są bliskie trafieniu w totolotka.

#### 3. Model nie trenuje się sam

Trenowanie modelu brzmi fajnie, ale jest dużo bardziej nudne, niż może się wydawać. W rzeczywistości to w większości proces polegający na ciągłym projektowaniu badań, przeprowadzaniu pomiarów, analizie wyników modelu i szukaniu rozwiązań problemów, które pojawiają się w trakcie. Cały czas, na okrągło, dzień po dniu. Jeśli nie potrafisz czerpać satysfakcji z małych odkryć i drobnych sukcesów może się okazać zbyt nudne. Tymczasem to właśnie żelazna konsekwencja w przeprowadzaniu pomiarów decyduje o wszystkim. Nawet przy prawidłowo dobranych parametrach treningu z czasem może okazać się, że nasz model potrzebuje nowych danych lub degraduje w sposób trudny do wychwycenia na pierwszy rzut oka. Tego nie zauważysz bez dobrego monitoringu i ciągłych testów, a im rzadziej je robisz, tym więcej czasu stracisz, jeśli model zacznie zachowywać się w sposób niepożądany.

Weźmy pod uwagę jeden z częstych scenariuszy. Po kilku dniach treningu orientujesz się, że model zaczyna odpowiadać coraz krócej i jest przy tym coraz bardziej pewny siebie. Loss i zbiór held-out wyglądają dobrze, ale z modelem dzieje się coś nie tak. Jeśli na bieżąco analizujesz normy i porównujesz codziennie odpowiedzi modelu z tymi z wczoraj, możesz szybko wyłapać wzrost logitów i zorientować się, że model przypisuje coraz większe prawdopodobieństwo określonym tokenom. Ta arogancja to sztuczka leniwego optymalizatora – AdamW znalazł sposób na to, żeby nas oszukać i zamiast uczyć model, zmniejsza stratę w inny sposób. Jeśli wyłapiesz to po kilku dniach, możesz stracić kilkadziesiąt dolarów; jeśli puszczasz trening, licząc, że jednostka Nvidii po prostu wykona całą pracę, możesz wydać setki, czy tysiące a model może być już niemożliwy do uratowania.

Sam spędziłem tygodnie, obserwując, jak Adam pompuje normy moich modeli, obniżając efektywny learning rate (LR), i to pomimo nałożonej normalizacji QK-norm i weight decay 0.1. Trening zwalniał, doprowadzając mnie do rozpaczy, bo jak wiemy, działa tu prawo Pitagorasa i rosnący wektor wag coraz trudniej obracać stałym LR. Sprawa jest dobrze opisana w literaturze, ale dopóki sam tego nie zobaczysz, nie zrozumiesz, dlaczego lepiej zastosować inny optymalizator. W końcu AdamW pomógł wytrenować setki modeli. Ja zdecydowałem się ostatecznie na MuonH i to była jedna z lepszych decyzji, jakie podjąłem. Oczywiście wiele tego typu rzeczy można wyciągnąć z literatury, podręczników czy śledząc prace naukowe publikowane na arXiv, ale nigdy nie wiesz, jak to zadziała u ciebie. Wiele rozwiązań, które teoretycznie powinny przynieść dobrze udokumentowane korzyści, u mnie nie zadziałało. Nie przekonasz się, dopóki sam nie sprawdzisz, a żeby się przekonać, trzeba trzymać rękę na pulsie i na bieżąco śledzić postępy.

#### 4. Wprowadzaj zawsze tylko jedną zmianę i rób testy ablacyjne

Przez ostatnie miesiące przetestowałem setki małych modeli – zarówno klasycznych transformerów, jak i moich własnych pomysłów... i dziś wiem, że testowałem za mało. Chcąc iść do przodu zbyt szybko, niepotrzebnie traciłem czas. Ilość warstw, FFN ratio, d_model, wiązanie wag, wielkość głowic, ilość głowic KV, batch, optymalizator, rekurencja, rzadkość (sparsity), dane treningowe – czynników, które mają wpływ na zachowanie modelu, są dziesiątki, a możliwe kombinacje dają tysiące możliwych architektur. I choć z grubsza wszystko działa tak, jak można by się spodziewać po przeczytaniu pierwszego podręcznika na temat inżynierii AI, tak długo jak sam nie przetestujesz swojej architektury, nie będziesz wiedział, gdzie jesteś. Tymczasem drobne zmiany często potrafią prowadzić do dużych różnic w wydajności obliczeniowej i benchmarkach i to przy tym samym datasecie oraz wielkości batcha. Jeżeli nie wprowadzasz zmian w sposób izolowany, łatwo się w tym pogubić. Sam popełniłem ten błąd wiele razy. Nie chodzi o to, że poprawki były złe. Choć często były. Prawdziwy problem polegał na tym, że kiedy rzeczywiście robiłem krok do przodu, nie byłem w stanie powiedzieć, której zmianie to zawdzięczam.

#### 5. Zacznij od danych

Hugging Face ma niewyobrażalny zasób danych treningowych jak na potrzeby treningu małego modelu. Mogłoby się wydawać, że jeśli te dane są na wyciągnięcie ręki w ilościach przekraczających znacznie potrzeby jakiegokolwiek garażowego projektu, to sprawa jest załatwiona. Jednak dobór danych ma dużo większe znaczenie, niż mogłoby się na początku wydawać. I fakt, że zostały już one zebrane w gotowe datasety, wcale sprawy nie ułatwia. Dochodzi też kwestia wybrania właściwego tokenizera, języków, których chcemy nauczyć model, czy proporcji. Na przykład decyzja ile procent danych ma stanowić kod, ile matematyka, a ile język naturalny. Następnie w jakich domenach ma się specjalizować nasz model. Im głębiej w las, tym więcej możliwości. Ja sam musiałem przygotowywać swój dataset od zera aż 3 razy. Zaliczyłem też kilka mniejszych wpadek, jak przeciek szablonu instruct, którego nie wyłapałem na etapie przygotowywania danych. Każda taka pomyłka wymuszała cofnięcie treningu o godziny czy nawet dni.

#### 6. Nie oczekuj zbyt wiele

Widząc, jak duże i mniejsze laboratoria co chwilę przesuwają granice tego, co potrafi AI, nietrudno ulec wrażeniu, że wytrenowanie użytecznego modelu to w zasadzie prosta sprawa. Są jednak powody, dla których to przesuwanie granic kosztuje miliardy dolarów. To, że Twój model zaczyna mówić ludzkim głosem czy osiąga dobre wyniki w popularnych benchmarkach, nie mówi nic o jego finalnej jakości ani użyteczności. Modele bardzo szybko uczą się na początku, w pierwszych dniach treningu, ale walka o każdy kolejny procent w wynikach wymaga sprytu, uwagi i samozaparcia. Szczególnie, kiedy przez wiele dni widzisz, jak model zalicza plateau, czy wręcz się cofa. Poza tym popularne benchmarki niewiele mówią o realnych możliwościach modelu. Twój model może być dobry w Pythonie i robić świetne wyniki w HumanEval i MBPP, ale jeżeli nie ma wiedzy o najnowszych bibliotekach, jego użyteczność w prawdziwym świecie będzie umiarkowana.

#### 7. Uzbrój się w cierpliwość

Wiele umiejętności modeli rośnie skokowo. To dobrze opisane zjawisko grokkingu poprzedza często długotrwałe plateau, które może trwać dniami. Widząc, jak model nie osiąga żadnych postępów, podczas gdy ty za każdą godzinę treningu musisz płacić dolarami za wynajem mocy obliczeniowej czy choćby za sam prąd, nietrudno o chwilę zwątpienia. Myślisz: "Model osiągnął capacity, więcej się nie nauczy", albo "Duże laboratoria, które trenują do 1000x Chinchilla, pewnie stosują jakieś triki". Tymczasem umiejętności często rosną skokowo. Wystarczy, że model nauczy się domykać jakąś funkcję i nagle zamiast jednego, w MBPP wskakuje kilkanaście zaliczonych zadań. Często jest też tak, że model robi realne postępy, ale jeśli z powodów oszczędnościowych monitorujesz tylko top1 odpowiedzi zamiast top10, możesz tego przez długi czas w ogóle nie zauważyć. Model musi nauczyć się przypisywać większą pewność, a to wymaga czasu.

#### 8. Jedna karta to za mało

Może się wydawać, że jeśli dysponujesz jednostką H100 czy RTX PRO 6000 (96 GB), to ogranicza cię tylko budżet. Problem w tym, że trening wymaga ciągłych testów i pomiarów, które pomagają zorientować się, na jakim jesteśmy etapie. Dodatkowe GPU może być też potrzebne do generacji dodatkowych danych treningowych. Sam znaczne postępy w treningu modelu uzyskałem, trenując go metodą STaR, polegającą na generacji przez mój własny model dużej ilości zadań i dołączaniu do datasetu tych poprawnych oraz zestawowi danych zawierających przykłady translacji między językami programowania.

Przerywanie treningu na mocnej karcie na czas generacji odpowiedzi przez model jest bardzo kosztowne i zwyczajnie nieopłacalne, a generowanie obok – nawet jeśli pozwala na to VRAM – może stanowić poważne zagrożenie. Ostatnią rzeczą, jakiej pragniesz, jest przekonanie się po trzech dniach, kiedy wyniki modelu pójdą w dół, że podczas generacji na karcie obok treningu doszło np. do chwilowego „głodzenia” loadera, w czego następstwie loss po cichu przestał spadać. Takie rzeczy na późniejszym etapie treningu są często niezwykle trudne do wychwycenia, nawet jeśli masz monitoring ostrzegający cię przed skokami norm.

#### 9. Zacznij od czegoś prostego

Mój pierwszy model zacząłem budować w oparciu o przeczucie, że w treningu llm da się wykorzystać własne aktywacje modelu, a śledzenie ich w trakcie nauki powinno pomóc zbudować inteligentniejszy i bardziej prawdomówny model. Dziś nie mogę się nadziwić samemu sobie, jak naiwne było to podejście. Nie dlatego, że dziś myślę, że to niemożliwe, ale dlatego, że nie mając pojęcia o tym, jak wygląda proces treningu LLM-a, zacząłem eksperymentować z czymś, co mnie przerastało. Musiałem przyswoić olbrzymią porcję wiedzy, a jednocześnie testować rozwiązania związane z architekturą klasycznych transformerów, jak i własne pomysły, które – jak pokazał czas – w dużej mierze były niemożliwe do realizacji.

Natrafiłem przy tym na szereg problemów – sygnał aktywacji bramek SwiGLU poddany normalizacji tracił sens, a bez niej AdamW wykorzystywał moje modyfikacje do pompowania norm modelu. Dopiero po czasie zrozumiałem, że wiele z zalet, które znalazłem w moim pierwszym modelu, pochodziło ze zjawiska przypominającego regularyzację szumem. Na dodatek samo obliczanie Gini z aktywacji bramek SwiGLU było drogie obliczeniowo, nakładając kilka procent dodatkowego compute, czego rezultaty nie zwracały w jakości.

Obecnie trenuję mały model 160M w standardowej architekturze, który specjalizuje się w kodowaniu. To była najlepsza decyzja, jaką mogłem podjąć, bo dałem sobie szansę na stworzenie czegoś, co może być realnie użyteczne. A pierwsze wyniki modelu pokazują, że nauka na błędach nie poszła na marne.

#### 10. Nie buduj modelu, który będzie dobry we wszystkim

Biorąc pod uwagę astronomiczne koszty i samą wykonalność, budowanie modelu ogólnego zastosowania przez pojedynczą osobę bądź małą organizację jest dziś zupełnie bez sensu z powodów czysto ekonomicznych. Konkurencja z gigantami, czy nawet mniejszymi laboratoriami wypuszczającymi otwarte modele, jest nie do wygrania bez olbrzymich nakładów i doświadczenia. Ale to wcale nie znaczy, że budowanie własnych modeli nie ma sensu.

Można wyobrazić sobie setki zastosowań, gdzie małe modele wytrenowane od podstaw lub doszkolone na unikalnych danych, będą miały przewagę nad gigantami – i ta przewaga niekoniecznie musi polegać na wiedzy. Wystarczy, że model będzie szybki i możliwy do uruchomienia lokalnie w przeglądarce, lub na procesorze dowolnej stacji roboczej. Dla konkretnych wąskich zastosowań, dużo bardziej opłacalne może być użycie mikro modelu o wielkości kilkuset milionów parametrów, niż zaprzęgnięcie najpotężniejszych dostępnych OpenAI czy Anthropic. Nie chodzi tylko o koszty. Choć różnica jest kolosalna. Model, który specjalizuje się w wąskim zakresie, nie tylko znacznie łatwiej wytrenować, ale również kontrolować i dostosować do potrzeb użytkownika. Jednak co najważniejsze to zadanie, które nie wykracza poza możliwości zwykłego człowieka, który jest gotowy podjąć takie wyzwanie.

Modele wielkich laboratoriów są trenowane na tysiącach bardzo drogich układów. Dla przykładu: wytrenowanie modelu klasy Llama 3 400B, wymagało klastra 16 000 kart H100. Koszty to dziesiątki milionów dolarów. Wytrenowanie najnowszego GPT Astra prawdopodobnie podniosło poprzeczkę znacznie wyżej. Biorąc pod uwagę, że cały ten sektor rozwija się na kredyt, a implementacja AI na szeroką skalę, przy obecnych kosztach API i kwestiach bezpieczeństwa danych, jest często trudna do obronienia biznesowo, w dłuższej perspektywie można spodziewać się, że małe modele będą odgrywać coraz większą rolę. Małe modele będą też coraz wydajniejsze. Nie zdziwiłbym się, gdyby do większości zadań w przyszłości wystarczył nam model rzędu 7B parametrów. Pęknięcie „bańki AI”, o której coraz częściej zaczyna się mówić w mediach, może ten proces tylko przyspieszyć.

Dlatego uważam, że budowanie małych modeli ma głęboki sens. Po pierwsze, nie ma lepszej drogi do zrozumienia tego, jak działa AI, niż trenowanie własnego modelu. Po drugie, choć w dużych laboratoriach za rozwój AI coraz częściej odpowiada... samo AI, można się spodziewać, że ludzkość, traktując poważnie kwestie bezpieczeństwa, będzie oczekiwać kontroli i ludzkiego nadzoru nad procesem szkolenia. Do tego niezbędne jest zrozumienie, jak ten proces przebiega w praktyce. Oczywiście, wchodząc na LinkedIna, jesteśmy dziś zalewani postami na temat sztucznej inteligencji od najróżniejszych specjalistów oferujących tutoriale i szkolenia. Ale ilu z nich tak naprawdę wytrenowało swój własny model?

### Dane treningowe {#training-data}

id: `training-data` · język tekstu: PL · 157 słów · Markdown: https://jakubcwirlej.com/pl/articles/training-data.md

**Streszczenie (redakcyjne):** Skład miksu treningowego EUGEN 160M według repozytoriów Hugging Face: 14 wierszy, które obejmują 93,4% bieżącego strumienia tokenów. Największą część stanowi Dolma 3 (35,29%, w tym Stack-Edu i Common Crawl według tematów), a za nią The Stack v3 (15,44%) oraz historie commitów z CommitPack i pokrewnych zbiorów (10,46%). Dane własne – rozwiązania STaR wygenerowane przez EUGEN i zweryfikowane testami oraz pary tłumaczeń kodu – stanowią ok. 0,35% miksu.

**Najważniejsze punkty (redakcyjne):**

- Każdy wiersz podaje dokładne identyfikatory repozytoriów na Hugging Face; pominięto źródła bez potwierdzonego pochodzenia z HF.
- Kod z GitHub Code Clean jest ograniczony do licencji permisywnych (MIT, Apache-2.0, BSD, ISC, Unlicense, CC0, Artistic-2.0).
- Matematykę reprezentują m.in. OpenMathReasoning, OpenR1-Math-220k i FineMath.
- Korpus liczy ok. 904,5 mld tokenów, łącznie z zamierzonymi powtórzeniami.

**Pełny tekst (słowa autora):**

| Zbiór danych (Hugging Face) | Udział | Licencja / uwagi |
| --- | --- | --- |
| Dolma 3 (w tym Stack-Edu i Common Crawl według tematów): allenai/dolma3_mix-6T-1025-7B, allenai/dolma3_pool, allenai/dolma3_dolmino_mix-100B-1125 | 35,29% | ODC-By |
| The Stack v3: HuggingFaceCode/stack-v3-train | 15,44% | ODC-By (kompilacja), z respektowaniem opt-out BigCode |
| bigcode/commitpack, bigcode/commitpackft, project-themis/git-commits-merged, CarperAI/github-diffs-deduped | 10,46% | repozytoria z licencjami permisywnymi; CommitPackFT i github-diffs-deduped MIT, git-commits-merged Apache-2.0 |
| codeparrot/github-code-clean | 6,63% | tylko licencje permisywne: MIT, Apache-2.0, BSD-2/3-Clause, ISC, Unlicense, CC0-1.0, Artistic-2.0 |
| common-pile/arxiv_papers, common-pile/stackexchange_filtered, common-pile/data_provenance_initiative_filtered | 5,64% | otwarte licencje (Common Pile) |
| nvidia/OpenMathReasoning, open-r1/OpenR1-Math-220k | 4,18% | CC BY 4.0 (OpenMathReasoning) |
| HuggingFaceTB/finemath (podzbiory 3+ i 4+) | 3,95% | ODC-By |
| allenai/peS2o | 3,32% | ODC-By |
| instrukcje i rozumowanie: nvidia/OpenMathInstruct-2, TinyGSM/TinyGSM, OpenCoder-LLM/opc-annealing-corpus, OpenCoder-LLM/opc-sft-stage2, AI-MO/NuminaMath-CoT, meta-math/MetaMathQA, microsoft/orca-math-word-problems-200k, ise-uiuc/Magicoder-OSS-Instruct-75K, nvidia/OpenCodeReasoning-2, PrimeIntellect/SYNTHETIC-1, open-r1/codeforces-cots, hkust-nlp/CodeIO-PyEdu-Reasoning, allenai/ai2_arc, allenai/qasc | 2,26% | wg licencji każdego zbioru |
| książki: allenai/dolma3_mix-6T-1025-7B, common-pile/project_gutenberg_filtered, common-pile/pre_1929_books_filtered, common-pile/library_of_congress | 1,84% | domena publiczna / ODC-By |
| HuggingFaceFW/finewiki, hltcoe/megawika | 1,60% | wg licencji każdego zbioru |
| open-thoughts/AgentTrove | 1,47% | tylko udane trajektorie |
| mandarjoshi/trivia_qa, microsoft/ms_marco, hotpotqa/hotpot_qa, rungalileo/ragbench | 1,00% | 30% to własne przykłady „brak odpowiedzi w kontekście” zbudowane z tych zbiorów |
| dane własne: STaR (rozwiązania EUGEN zweryfikowane testami), nauka na błędach, pary tłumaczeń Python ↔ C++, Java, Go, Rust | 0,35% | własne |

### Kilka przemyśleń na temat bezpieczeństwa AI {#ai-safety}

id: `ai-safety` · język tekstu: PL · 1464 słów · Markdown: https://jakubcwirlej.com/pl/articles/ai-safety.md

**Streszczenie (redakcyjne):** Esej o bezpieczeństwie AI, w którym autor krytykuje płytką debatę publiczną podzieloną między technomaksymalistów i proroków zagłady. Twierdzi, że najgorsze prawdopodobnie już się zaczęło, wskazując na broń autonomiczną, rosnącą inwigilację i ideologię technomaksymalizmu, a odpowiedzialność zawsze musi spoczywać na ludziach, bo maszyny nie mają własnej sprawczości. Proponuje konkretne rozwiązania regulacyjne i przestrzega przed antropomorfizacją AI.

**Najważniejsze punkty (redakcyjne):**

- Widzi trzy możliwości: że jesteśmy zgubieni, że nauczymy się kontrolować AI albo że koniec już się zaczął; jego zdaniem wszystkie trzy mogą być prawdziwe jednocześnie.
- Proponuje, by trenowanie modeli do około 1B parametrów było powszechnie dozwolone, a modele rzędu 7B były zastrzeżone dla zarejestrowanych organizacji, które rejestrują interakcje swoich agentów.
- Dalsze propozycje to Rzecznicy Interesu Publicznego opłacani przez państwowego regulatora w laboratoriach budujących modele graniczne (frontier models) oraz dedykowany podatek technologiczny finansujący przejście do gospodarki opartej na maszynach.
- Sugeruje licencjonowanie danych treningowych przez organizacje zbiorowego zarządzania prawami, takie jak ZAiKS.
- Najgorsza przyszłość, którą opisuje, to nie roboty-zabójcy, lecz powolne osuwanie się w technokrację inwigilacji i ludzką samotność.

**Pełny tekst (słowa autora):**

Ten tekst jest jednym z najtrudniejszych, z jakimi przyszło mi się zmierzyć. Jako dziennikarz, a zarazem człowiek, który w domowym zaciszu trenuje własne modele, stoję na dwóch przeciwległych biegunach. Z jednej strony fascynuje mnie czysta inżynieria, z drugiej – mam pełną świadomość, że kwestia bezpieczeństwa sztucznej inteligencji to prawdopodobnie najważniejsze wyzwanie czasów, w których żyjemy.

Zacznę od tego, co osobiście boli mnie najbardziej: od tragicznego spłycenia publicznej dyskusji na temat bezpieczeństwa związanego z AI. To debata pełna sprzeczności i skrajnego emocjonalnego nacechowania. Trudno zresztą, żeby było inaczej, kiedy w grę wchodzą miliardowe interesy i przetrwanie ludzi.

Z jednej strony słyszymy, że AI to śmiertelne zagrożenie, a jej rozwój grozi zagładą ludzkości. Z drugiej – że te apokaliptyczne wizje to tylko cyniczna gra gigantów, którzy chcą podbić wyceny akcji przed ich emisją lub zablokować i utrudnić rozwój mniejszym firmom, by zachować monopol i pierwsze miejsce w peletonie. Zwykły człowiek, który nie ma czasu śledzić tego wszystkiego i oczekuje prostych rozwiązań, może łatwo przejść na pozycje technomaksymalistów lub proroków zagłady. Każda z tych wizji jest taka gładka, taka oczywista... i żadna nie wymaga od nas niczego ponadto. Bo przecież, skoro jesteśmy bezsilni wobec mocy, które nas przerastają, to nie musimy nic robić. W dzisiejszych czasach skrajnego maksymalizmu to bardzo wygodna pozycja.

Co sam odpowiedziałbym mojemu dziecku, gdyby zapytało mnie, czy AI stanowi dla nas zagrożenie? Uciekając od upraszczającego reframingu, musiałbym przyznać, że istnieją trzy możliwości: że faktycznie jesteśmy skazani na zagładę, że ostatecznie do niej nie dojdzie (bo – jak przekonuje Yann LeCun – po prostu nauczymy się tę technologię kontrolować), albo... że ta zagłada już się rozpoczęła. Paradoks polega na tym, że wszystkie te trzy scenariusze mogą być jednocześnie prawdziwe.

To, że najgorsze prawdopodobnie już się zaczęło, wynika z faktu, który rzadko przebija się do głównego nurtu: każda technologia, każdy wynalazek musi trafić na swój czas i odpowiedni grunt, aby w pełni zaistnieć. Energia atomowa – tak często przywoływana w tej dyskusji jako porównanie – w czasach zimnej wojny stanowiła śmiertelne zagrożenie, ale w czasach pokoju stała się źródłem taniej energii, przyczyniając się do boomu gospodarczego. To samo można powiedzieć o większości wynalazków: od obróbki krzemienia, przez dynamit, aż po sztuczną inteligencję.

Nasz dzisiejszy świat stał się niestety miejscem, w którym scenariusz katastroficzny ma wręcz idealne warunki do urzeczywistnienia. Konflikty zbrojne z wykorzystaniem autonomicznej broni, postępująca inwigilacja obywateli przez państwa i korporacje, bezrefleksyjne przyjmowanie przez rządy korporacyjnych standardów w komunikacji ze społeczeństwem – to wszystko tworzy gotową infrastrukturę dla najczarniejszych wizji.

Tymczasem ideologia technomaksymalizmu, która pcha nas w kierunku tych zagrożeń – otwarcie drwiąc ze słabości, stawiając zysk ekonomiczny i brutalną siłę ponad kapitał społeczny i bezpieczeństwo – buduje świat, w którym AI zerwane z uwięzi będzie doskonale prosperować. A wtedy scenariusz katastrofy może być już nie do uniknięcia.

To nie jest nic nowego. Ta dyskusja toczy się w zasadzie od czasów ateńskiej agory, gdzie Platon sprzeczał się z Sokratesem, a ludzka historia pełna jest mrocznych momentów i niesprawiedliwości. To, co dziś dzieje się w polityce w USA, a co dla wielu Europejczyków pachnie faszyzmem, nie jest niczym nowym, jak celnie wskazuje historyk Jon Meacham w książce „The Soul of America”. Siła demokracji polega na tym, że sprawiedliwość – choć nierychliwa – w końcu zawsze zwycięża dzięki instytucjom. Z AI przecież może być tak samo – to nasza technologia i nauczymy się ją kontrolować, tak jak samoloty, o czym przypomina LeCun.

Sam, mając pewne niewielkie doświadczenie związane z treningiem AI, nie mogę wyjść z podziwu, jak krucha jest ta technologia. Wystarczą niewielkie zmiany hiperparametrów, żeby model całkowicie rozsypał się w rękach inżyniera. To samo można jednak powiedzieć o wirusach biologicznych. Kluczowa nie jest ich wybitna inteligencja czy umiejętność przetrwania za wszelką cenę, ale zdolność do replikacji. Tej umiejętności – jak się wydaje – sztuczna inteligencja na razie jeszcze nie ma i może długo mieć nie będzie. Problem w tym, że jak pokazują ostatnie afery związane z wyciekiem autonomicznych agentów AI z laboratoriów i ich skoordynowanymi działaniami w sieci, zagrożenie narasta. A my, pomimo tego, nie słyszymy nic poza stale przewijającą się narracją dwóch nurtów ekstremistów – bez żadnych konkretnych rozwiązań, bez żadnych wniosków.

To, co różni obecne modele od złośliwego kodu, który np. zaatakował Hugging Face czy australijskie serwery, to przede wszystkim sprawczość (agency). A sprawczość nigdy nie może być domeną maszyny. To, co czyni nas ludźmi, to nasza wolna wola. Żadna inna, sztuczna inteligencja nie może mieć sprawczości zagwarantowanej w inny sposób, niż za sprawą człowieka, który jej tej woli użycza. Z tej prostej zasady powinna wynikać cała odpowiedzialność i regulacje prawne, sprowadzające się do konkretnych rozwiązań legislacyjnych. Prawo do szkolenia modeli i ich użytkowania w sposób nieograniczony powinno wynikać z oceny ryzyka i możliwości kontroli konkretnych jednostek.

Nic nie stoi na przeszkodzie, aby możliwość szkolenia najmniejszych modeli była powszechnie dozwolona – na przykład do rozmiaru 1B parametrów. Ale modele średnie, rzędu 7B parametrów, moim zdaniem powinny być możliwe do szkolenia i pobierania tylko przez zarejestrowane organizacje, które szczegółowo rejestrują wszystkie interakcje swoich agentów (logi) i są gotowe udostępnić je w razie problemów. To nie jest żaden futuryzm; kryptografia pozwala na to już dziś, marginalnym kosztem. Każdy działający w sieci agent mógłby mieć coś w rodzaju swojego "dowodu tożsamości", możliwego do identyfikacji w powiązaniu z organizacją, która go reprezentuje.

A duże korporacje tworzące modele graniczne (frontier models)? Mogłyby mieć na przykład obowiązek zatrudniania Rzeczników Interesu Publicznego. Byliby to specjaliści nominowani i opłacani wyłącznie przez państwowego regulatora – pracownicy dopuszczeni do wszystkich tajemnic technologicznych wewnątrz laboratorium, zobowiązani raportować państwu w sytuacji, gdy widzą, że ich firma łamie standardy bezpieczeństwa lub podejmuje skrajnie ryzykowne działania w wyścigu z konkurencją.

Państwa mają również możliwość i moralny obowiązek wprowadzenia celowego podatku technologicznego. Środki te muszą zostać przeznaczone na zabezpieczenie transformacji: przejścia od gospodarki opartej na pracy rąk ludzkich do gospodarki opartej na maszynach. Taki fundusz zapewniłby wsparcie osłonowe, niwelowałby drastyczne nierówności i chroniłby miliony osób przed całkowitym uzależnieniem ekonomicznym od łaski najbogatszej kasty technologicznych feudałów.

Ten sam systemowy pragmatyzm musimy zastosować do kwestii praw autorskich materiałów, na których szkolone są modele. Dziś giganci technologiczni zasysają z sieci wszystko, co popadnie, licząc na to, że ewentualne procesy sądowe potrwają latami. Tymczasem rozwiązanie leży na stole i opiera się na instytucjach, które już doskonale znamy – organizacjach zbiorowego zarządzania prawami autorskimi, takich jak polski ZAiKS czy jego zagraniczne odpowiedniki. Nic nie stoi na przeszkodzie, aby to one zrzeszały twórców gotowych licencjonować swoje teksty, obrazy czy muzykę firmom szkolącym AI, w zamian za określony ułamek procenta od przychodów Big Techu. To układ, w którym wygrywa każdy. Twórcy odzyskują sprawczość i realne wynagrodzenie, z pełnym prawem wyłączenia swoich dzieł z treningu. Z kolei laboratoria AI – dzięki temu, że tego typu organizacje współpracują ze sobą międzynarodowo – zyskują jednym podpisem na umowie w pełni legalny dostęp do potężnych, czystych prawnie baz danych z całego świata. W ten sposób, zamiast jałowych sporów, moglibyśmy zbudować potężny, zupełnie nowy przemysł uczciwego licencjonowania danych.

To, na co musimy uważać najbardziej, to postępująca antropomorfizacja sztucznej inteligencji. Nadawanie maszynom ludzkich cech prowadzi do skrajnie niebezpiecznej sytuacji, w której to na nowy, cyfrowy twór spływa cała odpowiedzialność, podczas gdy jej twórcy i osoby, które ją wykorzystują, są niejako z miejsca rozgrzeszeni: "To nie my, to model". Dziś nikt nie pyta, czy w Dolinie Krzemowej podjęto absolutnie wszystkie możliwe środki, by zapobiec katastroficznemu scenariuszowi – choć wszyscy wiedzą, że nie podjęto. Niestety, tworzenie prawdziwych, nudnych rozwiązań legislacyjnych jest dużo mniej medialne niż straszenie apokalipsą.

Tymczasem scenariusz fatalny na pewno nie będzie wyglądał jak scena z hollywoodzkiego filmu katastroficznego. Przynajmniej na początku, będzie to przypominać powolne osuwanie się w mrok – klasyczne gotowanie żaby na wolnym ogniu. Właściciele inteligentnych maszyn i kapitału będą z obojętnością mijać na ulicy ludzi strukturalnie zbędnych. Ludzi, którzy nie będą mieli absolutnie żadnej możliwości zmiany swojej sytuacji, poza fizycznym buntem. A i ten bunt stanie się niemożliwy w świecie, gdzie każdy obywatel jest nieustannie śledzony przez miliardy szklanych, nieśpiących oczu kamer i tysiące autonomicznych maszyn.

Nowa technokracja stanie się z czasem cyfrowym więzieniem – zarówno dla kontrolowanych, jak i dla tych, którym naiwnie wydaje się, że jeszcze sprawują władzę. Kiedy myślę o najgorszej wizji przyszłości, nie widzę morderczych robotów. Myślę właśnie o przeszywającej samotności ludzi w świecie całkowicie zarządzanym przez obcą, chłodną i obojętną inteligencję. To świat, który budujemy już dziś, i w którym przysłowiowy "bunt maszyn" ma wszelkie warunki, by w końcu zaistnieć i się urzeczywistnić.

Sam nieustannie zastanawiam się nad tym problemem. I nawet jeśli niektóre pomysły czy wizje wyjścia z tej sytuacji wydają się dziś nazbyt futurystyczne, abstrakcyjne, a czasem wręcz naiwne, to uważam, że warto – a nawet trzeba – ten wysiłek podejmować. Samo myślenie nad rozwiązaniami, wychodzenie poza strefę komfortu i próba wyobrażenia sobie alternatyw dla ścieżki, którą wytyczają nam dziś giganci technologiczni, to nasza najważniejsza linia obrony. To nieodłączna część budowania lepszej, bezpieczniejszej przyszłości. Jeśli z tego zrezygnujemy, zadowalając się rolą biernych i przerażonych konsumentów, spełni się najgorszy z możliwych scenariuszy: oddamy naszą ludzką sprawczość walkowerem. A na to po prostu nie możemy sobie pozwolić.

### Technologia HDK {#hdk-tech}

id: `hdk-tech` · język tekstu: PL · 654 słów · Markdown: https://jakubcwirlej.com/pl/articles/hdk-tech.md

**Streszczenie (redakcyjne):** Autor opisuje HDK, darmową bibliotekę w Pythonie (CC BY-NC 4.0; wcześniejsze wersje Apache 2.0) wydzieloną z OrsonAI, dzięki której manipulacja zapisami rozmów z modelami językowymi staje się wykrywalna. Biblioteka haszuje każde zdarzenie razem z przodkami, dodaje licznik „kanarka” powiązany z sekretem i kotwiczy korzenie Merkle'a w Hedera Consensus Service.

**Najważniejsze punkty (redakcyjne):**

- Zmiana czegokolwiek na dowolnym poziomie, od jednego słowa zapytania po cały dokument, zmienia skróty wszystkich zdarzeń potomnych.
- Domyślnie HDK kotwiczy korzeń Merkle'a w Hederze po każdym 1000 zdarzeń; jedna kotwica kosztuje 0,0001 dolara, czyli 0,0000001 dolara na interakcję.
- W pomiarach opisanych w pracy, na standardowej infrastrukturze chmurowej x86, narzut wynosi poniżej milisekundy na zdarzenie.
- Tekst odnosi HDK do wymogów prowadzenia rejestrów i przejrzystości z art. 12 i 13 unijnego AI Act.
- Wskazane ograniczenia: kanarek nie wykrywa biernego kopiowania na poziomie infrastruktury, a same losowe kontrole nie wyłapią pojedynczej, chirurgicznej zmiany.

**Pełny tekst (słowa autora):**

HDK (Hedera Detection Key) to niewielka, darmowa biblioteka w Pythonie, którą wydzieliłem z OrsonAI jako osobne, otwarte narzędzie. Od wersji 0.1.3 jest na licencji CC BY-NC 4.0 (wcześniejsze wersje, wydane na Apache 2.0, pozostają na tej licencji). Do pobrania jest darmowa biblioteka w wersji alfa 0.1.3 z opcjonalnym kotwiczeniem w Hederze (instalacja z pobranego pliku: pip install ./hdk-audit-0.1.3.zip). Przez pewien czas działała w aplikacji demonstracyjnej, kotwicząc zapisy w Hederze; aplikacja nie weszła do produkcji, więc HDK nie jest dziś używane produkcyjnie. Działa jako pośrednik między aplikacją a API modelu językowego i zapisuje każdą interakcję tak, że późniejsza manipulacja staje się wykrywalna. Nie zmienia zapytań ani odpowiedzi – dodaje do nich kryptograficzny dowód tego, o co zapytano, co wróciło, kiedy i z jakiego modelu.

#### Problem

Firmy i redakcje coraz częściej polegają na tekstach wygenerowanych przez AI, a nie mają weryfikowalnego dowodu, co model naprawdę wytworzył. Logi aplikacji leżą w bazach kontrolowanych przez operatora: można je zmienić albo usunąć, a nikt z zewnątrz nie sprawdzi, że tego nie zrobiono. Nawet tam, gdzie istnieją łańcuchy skrótów, zmianę wykrywa się dopiero przy ręcznym porównaniu zapisów – nic nie sprawia, że nieuprawniony dostęp ujawnia się sam w chwili, gdy do niego dochodzi.

#### Hierarchiczna genealogia skrótów

HDK liczy skrót SHA-256 każdego zdarzenia razem ze skrótami wszystkich jego przodków: projektu, dokumentu, rozmowy, zapytania i odpowiedzi. Skrót odpowiedzi zawiera więc całą ścieżkę aż do projektu. Wystarczy zmienić cokolwiek na dowolnym poziomie – jedno słowo w zapytaniu, jeden dokument – a zmieniają się skróty wszystkich potomków. Dla każdego projektu HDK wylicza korzeń Merkle'a: jeden skrót, który reprezentuje stan całego projektu w danej chwili.

#### Kanarek

Druga warstwa to „kanarek”: tajna, 256-bitowa wartość i licznik, który rośnie przy każdym odczycie. Ich skrót (zobowiązanie) jest wplatany w każdy zapis i okresowo utrwalany. Jeśli ktoś odczyta dane przez warstwę pośredniczącą bez aktualizacji licznika, licznik przestaje się zgadzać; jeśli zaktualizuje licznik, nie znając sekretu, przestaje się zgadzać zobowiązanie. W obu przypadkach weryfikacja kończy się wynikiem negatywnym. Pomysł przenosi na klasyczną infrastrukturę zasadę z mojej wcześniejszej, koncepcyjnej pracy o wykrywaniu naruszeń przy izolowaniu AI.

#### Kotwiczenie w Hederze

Co pewien czas – domyślnie po każdym 1000 nowych zdarzeń – HDK publikuje korzeń Merkle'a w Hedera Consensus Service, publicznym rejestrze, który dodaje znacznik czasu konsensusu i numer kolejny. Z systemu użytkownika wychodzą wyłącznie skróty; treści, tożsamości i zapytania zostają prywatne („dane prywatne, dowód publiczny”). Zapis może potem niezależnie sprawdzić każdy, np. w serwisie hashscan.io (kotwice OrsonAI z lutego–maja 2026: temat 0.0.10278996 w sieci głównej Hedery). Ponieważ łańcuchy przodków nowych zdarzeń sięgają w zakres poprzedniej kotwicy, każda kotwica pośrednio potwierdza wszystkie wcześniejsze: im dłużej system działa, tym trudniej niepostrzeżenie przepisać historię.

#### Narzut i koszt

W pomiarach opisanych w pracy, na standardowej infrastrukturze chmurowej x86, HDK dodaje poniżej milisekundy na zdarzenie. Jedna kotwica kosztuje 0,0001 dolara, więc przy domyślnym interwale 1000 zdarzeń kotwiczenie kosztuje 0,0000001 dolara na interakcję – około 0,0001% ceny typowego wywołania modelu (0,01–0,10 dolara). Kotwica dla każdego zdarzenia, dla najwyższego poziomu bezpieczeństwa, to 0,0001 dolara.

#### Dlaczego to ważne: AI Act

Unijny AI Act wymaga od systemów AI wysokiego ryzyka prowadzenia rejestrów zdarzeń (art. 12) i przejrzystości (art. 13). HDK daje ślad audytowy, który strona trzecia może zweryfikować bez wglądu w jakiekolwiek prywatne treści. W OrsonAI ten mechanizm był podstawą certyfikatu ludzkiego autorstwa tekstu.

#### Ograniczenia

Gwarancje HDK są obliczeniowe – wynikają z odporności SHA-256 i z zewnętrznego kotwiczenia – a nie absolutne. Kanarek działa na poziomie aplikacji: wykrywa dostęp przez warstwę pośredniczącą HDK, ale nie bierne kopiowanie danych na poziomie systemu operacyjnego czy infrastruktury, bo skopiowane bity nie zostawiają śladu. Kopia nie pozwala jednak sfałszować historii: zmiana dowolnego dawnego zdarzenia łamie genealogię, a kotwice w Hederze przechowują stan pierwotny. Losowe kontrole integralności wyłapują masowe zmiany, ale nie pojedynczą, chirurgiczną modyfikację – przed nią chronią genealogia i kotwiczenie. Bezpieczeństwo zakłada, że nienaruszona pozostaje co najmniej jedna z trzech warstw: dane po stronie użytkownika, zakotwiczony zapis w Hederze albo materiał tajny. Dalsze kroki to formalna weryfikacja własności łańcucha skrótów (Coq/Lean), federacja systemów na wspólnych tematach HCS i certyfikaty pochodzenia treści z selektywnym ujawnianiem.

- [Przeczytaj pracę na ResearchGate](https://www.researchgate.net/publication/400762996)
- [Pobierz darmową bibliotekę HDK](https://jakubcwirlej.com/files/hdk/hdk-audit-0.1.3.zip)
- [HDK na Hugging Face](https://huggingface.co/JakCwi/hdk-audit)

## Publikacje

Niezależne prace badawcze autora (preprinty na ResearchGate, bez recenzji naukowej) — tu krótkie streszczenia redakcyjne ze statusem i znanymi ograniczeniami; pełne teksty (w oryginale angielskim) pod linkami.

### Pre-Generative Epistemic Signals in Transformer Language Models (2026) {#tes1-pre-generative-epistemic-signals}

- **Status:** Wstępny preprint. Trwa ponowna analiza całej serii TES; zostanie zastąpiony jedną poprawioną pracą. Niezależny, na ResearchGate, bez recenzji naukowej.
- **Teza:** aktywacje bramek SwiGLU w górnych warstwach FFN, zmierzone w jednym przebiegu przed wygenerowaniem pierwszego tokenu, pokazują, czy model ma wiedzę potrzebną do odpowiedzi: Gate Sparseness Index (GSI, współczynnik Giniego tych aktywacji) odróżniał wiedzę obecną od nieobecnej w 8 modelach od 5 organizacji (d Cohena 0,34–2,05).
- **Ograniczenie:** Późniejsza analiza autora wykazała silny czynnik zakłócający — długość promptu: GSI jest liczony po wszystkich tokenach promptu. Po kontroli długości sygnał utrzymuje się dla Llama-3.1-8B (d≈1,5, AUROC≈0,85), ale dla pozostałych modeli w dużej mierze znika. Preregistracja: protokoły spisano przed zebraniem danych, ale nie zarejestrowano ich zewnętrznie.
- **Pełny tekst:** https://jakubcwirlej.com/publications/tes1-pre-generative-epistemic-signals.md · ResearchGate: https://www.researchgate.net/publication/403008642

### ICL Collapse: How In-Context Learning Destroys the Pre-Generative Epistemic Signal (2026) {#tes2-icl-collapse}

- **Status:** Wstępny preprint. Trwa ponowna analiza całej serii TES; zostanie zastąpiony jedną poprawioną pracą. Niezależny, na ResearchGate, bez recenzji naukowej.
- **Teza:** 1–5 przykładów w kontekście sprowadza GSI do zera we wszystkich 8 modelach, więc detekcja przedgeneratywna nie mogłaby działać za komponentem wstrzykującym kontekst (RAG).
- **Ograniczenie:** Późniejsza analiza autora wykazała silny czynnik zakłócający — długość promptu: GSI jest liczony po wszystkich tokenach promptu. Po kontroli długości sygnał utrzymuje się dla Llama-3.1-8B (d≈1,5, AUROC≈0,85), ale dla pozostałych modeli w dużej mierze znika. W tej pracy: „spadek do zera” to dolna granica znormalizowanej skali (obcięcie) i w dużej mierze wyjaśnia go długość promptu. Preregistracja: protokoły spisano przed zebraniem danych, ale nie zarejestrowano ich zewnętrznie.
- **Pełny tekst:** https://jakubcwirlej.com/publications/tes2-icl-collapse.md · ResearchGate: https://www.researchgate.net/publication/403008908

### Confabulation Detection Without Ground Truth: GSI as a Pre-Generative Hallucination Detector (2026) {#tes3-confabulation-detection}

- **Status:** Wstępny preprint. Trwa ponowna analiza całej serii TES; zostanie zastąpiony jedną poprawioną pracą. Niezależny, na ResearchGate, bez recenzji naukowej.
- **Teza:** GSI odróżnia zapytania wymuszające konfabulację (np. o właściwości fikcyjnych związków) od faktograficznych, bez danych referencyjnych i bez trenowania klasyfikatora (d Cohena od −1,28 do −2,43 w 8 modelach); wykrywa brak wiedzy, nie wiedzę błędną ani błędy rozumowania.
- **Ograniczenie:** Późniejsza analiza autora wykazała silny czynnik zakłócający — długość promptu: GSI jest liczony po wszystkich tokenach promptu. Po kontroli długości sygnał utrzymuje się dla Llama-3.1-8B (d≈1,5, AUROC≈0,85), ale dla pozostałych modeli w dużej mierze znika. W tej pracy: dla większości modeli w dużej mierze wyjaśnione długością promptu. Preregistracja: protokoły spisano przed zebraniem danych, ale nie zarejestrowano ich zewnętrznie.
- **Pełny tekst:** https://jakubcwirlej.com/publications/tes3-confabulation-detection.md · ResearchGate: https://www.researchgate.net/publication/403003367

### Coherence Over Truth: On Minds, Models and Reality (2025) {#coherence-over-truth}

- **Status:** esej (2025), filozoficzny; niezależny preprint na ResearchGate, bez recenzji naukowej
- **Teza:** umysły i modele językowe tak samo przedkładają spójność nad prawdę historyczną; filozoficzny argument, na który powołują się późniejsze prace TES.
- **Pełny tekst:** ResearchGate: https://www.researchgate.net/publication/397730862

### HDK: Tamper-Evident LLM Audit Trails with Hierarchical Hash Genealogy and Distributed Ledger Anchoring (2026) {#hdk-tamper-evident-audit-trails}

- **Status:** nota techniczna (niezależny preprint na ResearchGate, bez recenzji naukowej); biblioteka hdk-audit 0.1.3 (alfa) na stronie
- **Teza:** niezależne od dostawcy oprogramowanie pośredniczące, które prowadzi odporny na manipulację rejestr rozmów z modelami językowymi (hierarchiczna genealogia skrótów, schemat zobowiązań „kanarkowych”, korzenie Merkle zakotwiczane w Hedera Consensus Service) przy narzucie poniżej milisekundy na zdarzenie, i odnosi go do art. 12–13 AI Act.
- **Pełny tekst:** https://jakubcwirlej.com/publications/hdk-tamper-evident-audit-trails.md · ResearchGate: https://www.researchgate.net/publication/400762996

### Self-Referential Quantum Barriers for AGI Containment: A Physics-Based Framework for Probabilistic Safety Engineering (2026) {#agi-quantum-containment}

- **Status:** spekulatywny esej (eksperyment myślowy); niezależny preprint na ResearchGate, bez recenzji naukowej
- **Teza:** bariera w innym paradygmacie obliczeniowym (kwantowy strażnik) omijałaby nierozstrzygalność pełnego uwięzienia superinteligencji i zamieniała je w probabilistyczną inżynierię bezpieczeństwa; praca nie twierdzi, że uwięzienie jest osiągalne.
- **Pełny tekst:** https://jakubcwirlej.com/publications/agi-quantum-containment.md · ResearchGate: https://www.researchgate.net/publication/400670258

## CV {#cv}

**Jakub Ćwirlej** — Reporter, operator i montażysta · 20 lat w telewizji · własny sprzęt · AI w produkcji

https://jakubcwirlej.com/pl/cv/

### Profil

Przez dwadzieścia lat robiłem reportaże dla Telewizji Polskiej. Specjalizuję się w reportażu interwencyjnym, przede wszystkim środowiskowym: skażenia, emisje szkodliwych substancji i nielegalne składowiska odpadów, za które płacą lokalne społeczności.

Potrafię zrobić materiał w pojedynkę, od dokumentacji po postprodukcję, i równie dobrze pracuję w ekipie. Przy transkrypcji, researchu i weryfikacji korzystam z narzędzi AI, a część z nich projektuję sam. Jestem otwarty na stałą współpracę z redakcją i na zlecenia freelance.

### Doświadczenie

- **Reporter, operator i montażysta — Telewizja Polska (TVP)** (2005–2026)
  - 2024–2026 — Reporterzy, program emitowany w TVP1
  - 2020–2023 — Magazyn Ekspresu Reporterów
  - 2019–2023 — Alarm!, program reporterski emitowany w TVP1
  - 2011–2018 — Telekurier, program reporterski emitowany w TVP Info
  - Reportaże od dokumentacji po postprodukcję: zdjęcia, dźwięk, wywiady, tekst i montaż.
  - Cykl reportaży o zapadliskach po zamknięciu kopalni Olkusz-Pomorzany i ich społecznych kosztach.
- **Co-founder — OrsonAI** (od 2026)
  - Projektuję i rozwijam narzędzia AI dla dziennikarzy: edytor z asystentem do researchu, weryfikacji, transkrypcji wywiadów i analizy dokumentów oraz aplikację Orson Rec, która spisuje wywiad już w trakcie nagrania.
- **Deweloper aplikacji — ViaSanto**
  - Aplikacja modlitewna: interaktywny różaniec, nowenny i wspólnota modlitwy w intencjach. Prowadzę ją od koncepcji i rozmów z użytkownikami po publikację w App Store i Google Play.

### Sprzęt

Własna kamera Sony FS7 i własny dron; montaż i postprodukcja w DaVinci Resolve. Swobodnie przechodzę na inne systemy.

### Kontakt

- Okolice Gandawy, Belgia
- E-mail: jakub.cwirlej@gmail.com
- LinkedIn: https://www.linkedin.com/in/jakubcwirlej

### Języki

- polski (ojczysty)
- angielski (B2/C1)
- francuski (A2/B1)

### Umiejętności

- Realizacja: kamera, światło, dźwięk, zdjęcia z drona
- Montaż i postprodukcja
- Reportaż interwencyjny, dokumentacja, wywiad
- AI w produkcji: transkrypcja, research, weryfikacja materiałów

### Projekty AI

- EUGEN 160M: własny model językowy do kodu, trenowany od podstaw.

### Wykształcenie

- **Uniwersytet im. Adama Mickiewicza w Poznaniu** (2004–2006) — Filozofia i komunikacja społeczna (studia nieukończone).
- **Wyższa Szkoła Sztuki i Projektowania (WSSiP) w Łodzi** (2016–2017) — Kurs operatorski filmowo-telewizyjny.

## Kontakt {#contact}

- E-mail: jakub.cwirlej@gmail.com
- LinkedIn: https://www.linkedin.com/in/jakubcwirlej
- Hugging Face: https://huggingface.co/JakCwi
- CV: https://jakubcwirlej.com/pl/cv/

## Jak zbudowana jest ta strona — brief techniczny

Ta część opisuje stronę jako oprogramowanie — stos technologiczny, architekturę, budowanie, silniki, przetwarzanie wideo, dostępność, prywatność, bezpieczeństwo, testy, mapę strony, funkcje i publiczne API — tak, by agent AI mógł ocenić, jak jest zrobiona. Każde stwierdzenie pochodzi z repozytorium (kod, konfiguracja, programy uruchamiające testy); liczby w tabelach są mierzone przy budowaniu. Obok publikowany jest oczyszczony kod źródłowy strony, więc każde zdanie można sprawdzić w kodzie.

### Jak sprawdzić ten brief

- Kod źródłowy: 306 files, 73,934 lines (3,585 KB), built from working tree; secret scanner: pass.

  - file tree with sizes and sha256: https://jakubcwirlej.com/code/tree.json (also `GET https://jakubcwirlej.com/api/agent/code`)
  - one file as text: `GET https://jakubcwirlej.com/api/agent/code/{path}` (paths as in the tree)
  - everything as one archive: https://jakubcwirlej.com/code/jc_app-source.tar.gz
  - the measured versions and test counts used below: https://jakubcwirlej.com/code/facts.json
- Wyszukiwanie w kodzie (po słowach kluczowych, BM25, na serwerze produkcyjnym): `POST https://jakubcwirlej.com/api/agent/search` z `"kind": "code"` (albo `"all"` — teksty i kod razem). Każdy wynik ma ścieżkę pliku, zakres linii i link do całego pliku.
- Ten plik powstaje przy budowaniu z repozytorium, jak pozostałe pliki dla AI. Tabele referencyjne (wersje, liczby testów, mapa strony, API) są po angielsku w każdej wersji językowej.

### Stos technologiczny

Strona to statyczny serwis (Astro, Svelte 5, TypeScript) plus niewielkie API (Python, FastAPI). Używane są dwa modele językowe: własny model autora do kodu, EUGEN 160M (uzupełnianie i tłumaczenie kodu w terminalu), oraz otwarty model Google, Gemma 4 12B, hostowany przez autora (czat). Oba działają na własnym serwerze inferencji autora, poza tym repozytorium.

Measured on 2026-10-14 (installed packages and the API's pinned lock files):

| Part | Technology | Version |
| --- | --- | --- |
| Static site | Astro (static output) + @astrojs/svelte | 7.3.5 / 9.0.1 |
| UI components | Svelte 5 | 5.57.1 |
| Language | TypeScript (strict) | 5.9.3 |
| Bundler | Vite (through Astro) | 8.3.1 |
| Scroll engine | GSAP + ScrollTrigger | 3.15.0 |
| Terminal editor | CodeMirror 6 (view / lang-python) | 6.43.13 / 6.2.1 |
| Charts | uPlot | 1.6.32 |
| Unit tests | Vitest | 4.1.11 |
| Browser checks | Playwright (Chromium, WebKit) + safaridriver | 1.63.0 |
| Lint / format | ESLint + typescript-eslint, Prettier | 10.11.0 / 8.70.1, 3.9.9 |
| Type check | @astrojs/check (astro check) | 0.9.10 |
| API language | Python (requires >=3.12) | 3.13.12 in development |
| API framework | FastAPI / Starlette / pydantic | 0.141.1 / 1.7.0 / 2.13.5 |
| API server, HTTP client | uvicorn, httpx | 0.54.0, 0.28.1 |
| Semantic search (optional, not deployed yet: the live server uses BM25 keyword search) | onnxruntime, sentencepiece, numpy | 1.23.2, 0.2.2, 2.5.3 |
| Build machine | Node.js (no version pinned in the repository) | 25.2.1 |

Co jest ważne po stronie przeglądarki:

- **Astro** w trybie `output: 'static'`: każda strona to wcześniej wygenerowany HTML; JavaScript dochodzi tylko tam, gdzie coś się rusza. Przejścia między stronami obsługuje router Astro z przenikaniem.
- **Svelte 5** (runy) dla jednej hydratowanej „wyspy” — czatu (`client:idle`, zachowany między stronami). Reszta to zwykłe moduły TypeScript ładowane na żądanie przez dynamiczny `import()`.
- **GSAP ScrollTrigger** napędza silnik przewijania (niżej); **CodeMirror 6** to edytor terminala (tryb Python, podpowiedzi „ghost text”); **uPlot** rysuje wykresy ewaluacji.
- Fonty to własne pliki WOFF2, przycinane przy budowaniu; strona nie zależy w działaniu od żadnego CDN.

Co jest ważne w API:

- **FastAPI** + **pydantic** (walidacja zapytań z jawnymi limitami długości), **uvicorn**, **httpx** do połączeń z serwerem inferencji, **PyYAML** do czytania tych samych plików treści co budowanie strony.
- Opcjonalne wyszukiwanie semantyczne: **multilingual-e5-small** (int8 ONNX) uruchamiany na CPU przez **onnxruntime** i **sentencepiece** — bez żadnego zewnętrznego API. Bez niego API wraca do rankingu słów kluczowych BM25 — i tak działa dziś serwer produkcyjny: indeks semantyczny nie jest jeszcze wdrożony.
- Zależności są przypięte z sha256 każdego pliku (`api/requirements.lock`, instalacja z `--require-hashes`) i sprawdzane przez `pip-audit`.

### Architektura

```text
 przeglądarka
   │  statyczny HTML / CSS / JS, filmy, fonty         ┌───────────────────────────────┐
   ├────────────────────────────────────────────────▶│ hosting statyczny (web/dist)  │
   │                                                  └───────────────────────────────┘
   │  to samo źródło /api/…  (JSON, server-sent events)
   ▼
 ┌──────────────────────────────────────────────────────────────────────────────────┐
 │ API (FastAPI)                                                                   │
 │  /chat  /complete  /compare  /translate  /results  /kernel   ← sama strona      │
 │  /agent/…  search · interview · complete · translate · submit · showcase · code │
 │  osłony: limit treści, limity na kartę i na IP, czyszczenie wejścia,            │
 │          odmowa przy próbie wstrzyknięcia, skan odpowiedzi, podpisana historia  │
 │  lokalnie: indeks wyszukiwania (e5 / BM25), migawka kodu, Bot Bar (SQLite)      │
 └──────────────────────────────┬───────────────────────────────────────────────────┘
                                │  HTTPS + token ze zmiennych środowiskowych
                                ▼
                     ┌──────────────────────────────┐
                     │ serwer inferencji (czarna    │  EUGEN 160M · Gemma 4 12B ·
                     │ skrzynka), sprzęt autora     │  modele do porównań
                     └──────────────────────────────┘
```

- Przeglądarka nigdy nie łączy się z serwerem inferencji: każde wywołanie modelu idzie przez API, które dokłada limity, filtry i zabezpieczenia. Adres serwera i token istnieją tylko w środowisku API — nigdy w repozytorium ani na stronie.
- API pośredniczy też w dwóch publicznych plikach z serwera inferencji (strumień wyników ewaluacji i kod kernela), trzyma je w pamięci podręcznej i sprawdza względem schematu, zanim zobaczy je strona.
- Strona działa bez API: teksty, filmy i dema są statyczne; terminal pokazuje wtedy wyraźnie opisane gotowe kontynuacje („to nie jest wynik EUGEN”), a czat informuje, że jest offline.

### Budowanie i hosting

- `npm run build:safe` buduje do katalogu tymczasowego i podmienia go tylko wtedy, gdy budowanie się udało (dwie zmiany nazwy), więc serwer czytający `web/dist` nigdy nie widzi niedokończonej strony.
- Przed każdym budowaniem: build dema ViaSanto jest sprawdzany względem pliku blokady (rozmiar i sha256 każdego pliku); oczyszczona migawka kodu jest budowana od nowa i skanowana pod kątem sekretów (znalezisko zatrzymuje budowanie); mierzone są wersje i liczby testów podane w tym briefie.
- Istotne opcje Astro: krytyczny CSS wstawiony w stronę (`inlineStylesheets: 'always'`), CSS minifikowany przez Lightning CSS, prefetch po najechaniu, wtyczka usuwająca z paczek znaczniki „do zrobienia” autora.
- Hosting: strona działa pod adresem https://jakubcwirlej.com na serwerze OVH — nginx serwuje statyczny build (czyste adresy, nagłówki bezpieczeństwa, reguły cache, podpowiedź języka według kraju z `/i18n/…/geo.json`; reguły są zapisane w `infra/firebase.json` i przełożone na konfigurację nginx, a test sprawdza ich zgodność) i przekazuje `/api` do API na tej samej maszynie, nadpisując `X-Forwarded-For` adresem odwiedzającego. Do pomiarów lokalnych `web/scripts/serve-dist.mjs` serwuje build z tymi samymi nagłówkami i przekazuje `/api`.
- Każdy bezwzględny adres pochodzi z jednej zmiennej (`PUBLIC_SITE_URL`, przy wdrożeniu https://jakubcwirlej.com), więc generowane pliki same idą za domeną.

### Języki i model treści

- Cztery języki: angielski (domyślny, bez prefiksu w adresie), polski, francuski, niderlandzki — `/`, `/pl/`, `/fr/`, `/nl/`. Język wybierany jest raz — z kraju odwiedzającego, strefy czasowej i przeglądarki — i tylko na adresach bez prefiksu; jawny wybór w przełączniku zawsze wygrywa i jest zapamiętywany.
- Teksty są w kolekcjach treści YAML (`web/src/content/{lang}/`), walidowanych schematami zod (`web/src/content.config.ts`): jeden plik na rozdział (`media`, `apps`, `ai-dev`), `windows.yaml` dla okien z esejami, `summaries.yaml` dla warstwy redakcyjnej plików dla AI. Teksty interfejsu to JSON na język, nakładany na angielski.
- Każde okno i każdy akapit mają stały identyfikator, wspólny dla wszystkich języków. Okno niekompletne w danym języku jest w całości zastępowane wersją angielską, potem polską — języki nigdy się nie mieszają w jednym oknie, a atrybut `lang` okna mówi, w jakim języku jest tekst.
- Te same pliki treści zasilają strony, pliki dla AI (także ten), indeks wyszukiwania API i wiedzę czatu, więc nie mogą się rozjechać.

### Silnik przewijania

- Każdy rozdział to HTML wygenerowany po stronie serwera; jeden kontroler rozdziału (`web/src/engine/chapter.ts`) obserwuje go i animuje — tworzony po załadowaniu strony, usuwany przed podmianą na następną.
- GSAP ScrollTrigger jest jedynym napędem przewijania: jedno przyklejone okno tekstu, w którym tekst przesuwa się 1:1 z przewijaniem strony; krok staje się aktywny, gdy przekroczy linię czytania na 40 % wysokości okna; żadnych odczytów układu w każdej klatce.
- Każdy rozdział ma adapter sceny ładowany leniwie: `video` (filmy w Media), `device` (telefon w rozdziale Apps), `desktop` (okna terminala w AI). Adaptery mają wspólny interfejs (stan, morf z hero, pokazanie mediów, przenikanie, sprzątanie).
- Rozdział Media zaczyna się morfem z hero do układu do czytania, sterowanym przewijaniem. Między sekcjami strona przeskakuje w jednej klatce, zamiast kazać czytelnikowi przewijać pustą przestrzeń (kółko, dotyk, ↓ / PgDn / Spacja, ↑ / PgUp).
- Moduły łączy typowana szyna zdarzeń; wspólny stan używa runów Svelte.

### Przetwarzanie wideo

- Filmy są kodowane z materiałów źródłowych autora przez `web/scripts/build-showreel.py` (ffmpeg) do trzystopniowej drabiny, wszystko w MP4:
  - **wysoki** — 1920×1080 w liczbie klatek źródła: wersje HEVC (`hvc1`), AV1 i H.264;
  - **średni** — 1280×720: HEVC i H.264 plus kadr 720×1280 dla telefonów w pionie;
  - **niski** — 960×540 przy 25 kl./s, tylko H.264, przepływność ograniczona do ok. 1 Mb/s (plus kadr pionowy 540×960).
- Wybór kodeka w przeglądarce: HEVC, potem AV1, potem H.264, według `canPlayType`.
- Poziom startowy zależy od urządzenia i łącza: telefony zaczynają od 720p, komputery od 1080p; tryb oszczędzania danych, wolne lub nieznane łącze, mało pamięci albo mało rdzeni — od 540p (Safari nie udostępnia żadnego z tych sygnałów, więc tam decyduje rozmiar okna). Wybór obowiązuje przez sesję.
- W trakcie odtwarzania film jest próbkowany co 250 ms; długie zacięcie, powtarzające się krótkie zacięcia albo topniejący bufor obniżają poziom o jeden w trakcie filmu (od razu na najniższy, gdy dostawa się załamuje), a niższy plik gra dalej od tego samego momentu. Poziom wraca w górę dopiero po kilku filmach bez problemów.
- Na najniższym poziomie na obraz nałożony jest statyczny raster cienkich pionowych linii (CSS), żeby miększy obraz czytał się jak zamierzona faktura.
- Plakaty są w AVIF; klipy aplikacji w H.264 + AV1 z plakatami AVIF i zapasowymi WebP dla zrzutów.

### Dostępność

- `prefers-reduced-motion` jest respektowane w CSS i w silniku: bez morfu sterowanego przewijaniem, natychmiastowe przeskoki, bez samoczynnego ruchu w oknach pulpitu, wykresy w stanie końcowym.
- Okna z esejami to natywne modalne okna dialogowe: Esc i kliknięcie w tło je zamykają, fokus przechodzi na przycisk zamknięcia i wraca po zamknięciu; mają etykiety (`aria-labelledby`).
- Klawiatura: menu pulpitu obsługują strzałki, Home / End, Esc i Tab; terminal i czat są w pełni obsługiwane z klawiatury; przeskoki między sekcjami reagują na klawiaturę tak jak na kółko.
- Regiony na żywo (`aria-live="polite"`) ogłaszają odpowiedzi czatu, wyjście terminala i komunikaty; log terminala ma `role="log"`. Dymek na stronie głównej nigdy nie przejmuje fokusu.
- Każda strona ustawia `lang`, z alternatywami `hreflang` i `x-default`.
- Link „przejdź do treści” jest pierwszym elementem, na który trafia fokus na każdej stronie.

### Wydajność

- Budżety sprawdzane przez `web/scripts/budget.mjs` (Playwright Chromium, dławienie CPU telefonu + wolne 4G oraz komputer): JavaScript ≤ 80 KB i CSS ≤ 25 KB przesłane, LCP ≤ 1,8 s, CLS ≤ 0,02, INP ≤ 100 ms. `web/scripts/lighthouse.mjs` uruchamia Lighthouse (presety mobilny i desktopowy) na trzech rozdziałach.
- Jedna hydratowana wyspa; każda scena, pulpit, wykresy i host dem to osobne fragmenty ładowane wtedy, gdy są potrzebne.
- Fonty: pięć własnych zmiennych plików WOFF2, osie przypięte i przycięte do łaciny + łaciny rozszerzonej przy budowaniu, fonty zastępcze dopasowane metrycznie (bez przesunięć układu), wstępnie ładowany tylko font największego tekstu.
- Obrazy w AVIF z zapasowym WebP; filmy w oknach z `preload="none"`; krok z mediami przygotowuje najwyżej jeden krok naprzód.
- Pamięć żywego dema w długim działaniu jest mierzona w prawdziwym Chrome (`web/scripts/memory-real.mjs`) i prawdziwym Safari (`web/scripts/safari-perf.mjs`).

### Prywatność

- Brak analityki, trackerów, menedżera tagów, skryptów firm trzecich i ciasteczek dla odwiedzających.
- Pamięć sesji tylko na stan wizyty (losowy identyfikator sesji czatu, poziom wideo, identyfikator karty terminala, stan okien pulpitu); pamięć lokalna tylko na jawny wybór języka.
- Fonty i własne filmy strony są serwowane z samej strony. Jedyne media zewnętrzne to reportaże autora w TVP: API sprawdza adres strumienia odcinka z listy autora, a przeglądarka odtwarza go z TVP.
- API nie zapisuje w logach treści czatu (tylko rozmiary i kody statusu); istnieje opcjonalny ślad diagnostyczny zapytań o uzupełnienia do debugowania przez autora, domyślnie wyłączony. Zgłoszenia do Bot Baru są przechowywane prywatnie i nigdy nie trafiają do modelu ani nie są uruchamiane.

### Bezpieczeństwo

Static site — headers on every response (quoted from `infra/firebase.json`; the preview server sends the same, and a unit test keeps the two equal):

- `X-Content-Type-Options: nosniff`
- `Referrer-Policy: strict-origin-when-cross-origin`
- `X-Frame-Options: SAMEORIGIN`
- `Permissions-Policy: geolocation=(), payment=(), usb=(), serial=(), hid=(), bluetooth=()`

The site's own pages:

```text
Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob:; font-src 'self'; media-src 'self' blob: https:; connect-src 'self'; frame-src 'self'; worker-src 'self' blob:; manifest-src 'self'; object-src 'none'; base-uri 'self'; form-action 'self'; frame-ancestors 'self'
```

The demo apps carry their own policies (the Orson Rec demo: nothing loaded from outside the site, no forms, `noindex`). `'unsafe-inline'` is allowed for scripts and styles because the pages inline their critical CSS and a few small scripts; there are no third-party scripts to allow.

API (`api/app/webguard.py` and the endpoints):

- every answer: `X-Content-Type-Options: nosniff`, `X-Frame-Options: DENY`, `Content-Security-Policy: default-src 'none'; frame-ancestors 'none'`, `Referrer-Policy: no-referrer`; CORS limited to the site's own origins, GET and POST only; no public OpenAPI schema;
- a request body over 256 KB is refused with 413 before it is parsed (chunked uploads included); every field has an explicit length limit;
- rate limits per browser tab and per IP for every model call, in-flight caps per tab and per IP, a shared cap toward the inference server; the client IP is taken from `X-Forwarded-For` only behind the hosting front end;
- the chat: control and invisible characters stripped; injection, extraction, role-switch and encoded attempts answered with a fixed refusal without calling the model; the model's output scanned while it streams (a per-deploy canary, verbatim copies of the instructions, internal names, system paths, IP addresses) and links outside an allow-list removed; every answer signed (HMAC-SHA256) so a forged history is dropped;
- the API never runs visitors' code: the completion harness only parses and filters text; translations are compiled and tested on the inference side, not in the API; Bot Bar submissions are data, never executed and never shown to a model;
- secrets (the inference server address and token, the signing key, the panel token) come only from the environment; the repository has none, and the published code snapshot is scanned for them on every build.

### Testy i kontrole jakości

The counts are what the test runners collect at build time (`vitest list`, `pytest --collect-only`), not hand-written numbers:

| Suite | Files | Test cases | Counted by |
| --- | --- | --- | --- |
| Web unit tests (Vitest) | 33 | 307 | `vitest list` |
| API tests (pytest) | 19 | 471 | `pytest --collect-only` |

- **Testy jednostkowe (Vitest)** obejmują czyste części silnika, terminal (reguły podpowiedzi, tryb porównania, tłumaczenie), klienta czatu (podpisana historia, renderowanie jako tekst — test XSS renderuje komponent Svelte), decyzje o poziomie wideo, zastępowanie języków, nagłówki bezpieczeństwa (nagłówki serwera podglądu muszą być równe `infra/firebase.json`) i same pliki dla AI.
- **Testy API (pytest)** obejmują każdy endpoint, zabezpieczenia (odmowa przy próbach wstrzyknięcia w pięciu językach, skan odpowiedzi, podpisana historia, limit treści, limity na kartę i na IP, obsługa `X-Forwarded-For`), harness uzupełnień i jego filtry, schemat strumienia wyników, pośrednika kernela, magazyn Bot Baru i jego punktację, indeks wyszukiwania oraz skaner sekretów migawki kodu.
- **Kontrole w przeglądarce**: `web/scripts/verify.mjs` prowadzi zbudowaną stronę przez Playwright w Chromium i WebKit (asercje układu, błędy konsoli i strony, zrzuty ekranu). `web/scripts/safari-verify.mjs` steruje prawdziwym Safari na macOS przez safaridriver (W3C WebDriver), bo WebKit w Playwright przeoczył dwa błędy występujące tylko w Safari; sprawdza przewijanie prawdziwym gestem kółka, rozmiary tekstu, gotowość wideo i układ.
- **Kontrole statyczne**: ESLint (JavaScript, typescript-eslint, reguły Svelte i Astro; wstawianie surowego HTML w Svelte jest błędem) i Prettier; `astro check` (diagnostyka TypeScript i Svelte); ruff (z regułami bezpieczeństwa) dla API.
- Znane braki: w repozytorium nie ma konfiguracji CI (kontrole są uruchamiane ręcznie przed commitem); poza powyższymi skryptami nie ma programu do testów end-to-end.

### Mapa strony

**Pages** — 12 static pages, 4 languages × 3 chapters (English unprefixed):

| Chapter | Stage | EN | PL | FR | NL |
| --- | --- | --- | --- | --- | --- |
| Media | video | https://jakubcwirlej.com/ | https://jakubcwirlej.com/pl/ | https://jakubcwirlej.com/fr/ | https://jakubcwirlej.com/nl/ |
| Apps | device | https://jakubcwirlej.com/apps/ | https://jakubcwirlej.com/pl/apps/ | https://jakubcwirlej.com/fr/apps/ | https://jakubcwirlej.com/nl/apps/ |
| AI | desktop | https://jakubcwirlej.com/ai-dev/ | https://jakubcwirlej.com/pl/ai-dev/ | https://jakubcwirlej.com/fr/ai-dev/ | https://jakubcwirlej.com/nl/ai-dev/ |

**Chapters and their steps** (step ids; → the windows a step links to):

- Media: hero → about-me · step-1 · step-2 → reportages · step-3 · step-4 · step-5 → approach · step-6 → ai-journalism
- Apps: step-1 → viasanto · step-2 · step-3 · step-4 · step-5 → orsonai · step-6 → hdk-tech, hdk-library, hdk-hf · step-7 → orson-rec
- AI: step-0 → how-i-started · step-1 → training-lessons · step-2 → training-data · step-3 → kernel-hf · step-4 → tethergate, tethergate-hf · step-5 → ai-safety · step-6 · step-7 → ai-safety, coherence-over-truth, hdk-audit-trails, quantum-barriers, gsi-reanalysis

**Windows** (native modal dialogs, id `doc-{id}`; each text also as Markdown):

- `about-me` — O mnie (PL) — https://jakubcwirlej.com/pl/articles/about-me.md
- `approach` — Moje podejście do pracy (PL) — https://jakubcwirlej.com/pl/articles/approach.md
- `ai-journalism` — AI w dziennikarstwie (PL) — https://jakubcwirlej.com/pl/articles/ai-journalism.md
- `training-lessons` — Czego nauczyłem się, szkoląc swój własny model (PL) — https://jakubcwirlej.com/pl/articles/training-lessons.md
- `ai-safety` — Kilka przemyśleń na temat bezpieczeństwa AI (PL) — https://jakubcwirlej.com/pl/articles/ai-safety.md
- `training-data` — Dane treningowe (PL) — https://jakubcwirlej.com/pl/articles/training-data.md
- `how-i-started` — Jak zaczynałem (PL) — https://jakubcwirlej.com/pl/articles/how-i-started.md
- `hdk-tech` — Technologia HDK (PL) — https://jakubcwirlej.com/pl/articles/hdk-tech.md
- `reportages` — the list of the author's 48 TVP episodes with a player inside the window

**Other windows and panels:**

- terminal windows `buffer-{n}.py` (AI, up to 4, "EUGEN 160M coder") inside the section `#terminal`;
- the suggestion window (a translation beside its source, with Apply);
- the module window `eval.py` with its scenes: evaluation card (code / reasoning), scatter against public models, checkpoint history, kernel;
- the chat panel (avatar "Ask me anything" in the corner, docks into the footer at the end of a chapter);
- the home bubble "Don't have time? Your AI does." (Media chapter);
- the full-screen app overlay on phones (ViaSanto).

**Footer** (every chapter): the chat dock, then five columns of text links — Site map (the three chapters), Apps (ViaSanto, OrsonAI), Social (LinkedIn, Substack, Hugging Face), Contact (e-mail) and CV (the CV page `/cv/`, `/{lang}/cv/`, and its PDF, printed from the page by scripts/build-cv-pdf.mjs); a profile or address not published yet shows as muted text, not a link. On phones the language switch sits there too; then the copyright line. The context for AI is in the home bubble, the kernel file in the AI desktop.

**Machine-readable files:**

- https://jakubcwirlej.com/llms.txt — the index for AI agents (llmstxt.org); https://jakubcwirlej.com/llms-full.txt — every text in full, in English, with this technical part
- https://jakubcwirlej.com/context/{lang}.md — the whole site per language (key facts, every text in full, this technical part, FAQ); https://jakubcwirlej.com/context/{lang}-tech.md — this technical part alone (lang: en, pl, fr, nl)
- https://jakubcwirlej.com/articles/{id}.md (English) and https://jakubcwirlej.com/{lang}/articles/{id}.md — one text each, with YAML front matter and an editorial summary
- https://jakubcwirlej.com/code/tree.json, https://jakubcwirlej.com/code/jc_app-source.tar.gz, https://jakubcwirlej.com/code/facts.json — the site's own code and the measured facts
- https://jakubcwirlej.com/sitemap.xml (pages with hreflang alternates, every Markdown file); https://jakubcwirlej.com/robots.txt — the site is in preparation: indexing is currently disabled (robots.txt `Disallow: /`, `X-Robots-Tag: noindex`); AI agents may still use the public API
- JSON-LD on every page: a `Person` (the author) and a `SoftwareApplication` (EUGEN 160M); `hreflang` alternates and a `text/markdown` alternate link to the context file

### Funkcje

#### Dymek na stronie głównej: „Nie masz czasu? Twoje AI ma.”

Mały dymek, który rozwija się z awatara czatu na stronie głównej (rozdział Media) mniej więcej sekundę po załadowaniu — tylko wtedy, gdy nie zasłoni tekstu hero. Ma dwa przyciski:

- **Brief dla chatbota** kopiuje do schowka cały ten plik (wszystkie teksty w całości + tę część techniczną);
- **Plik dla agentów AI** to link do tego samego pliku Markdown z atrybutem `download`: człowiek go pobiera, a agent AI, który czyta stronę, otwiera go jak stronę. Gdy kopiowanie się nie uda, dymek proponuje pobranie tym przyciskiem.

Nigdy nie przejmuje fokusu; Esc albo × zamyka go do końca tego wyświetlenia strony.

#### Agent czatu

- Asystent AI, który odpowiada na pytania o Jakuba i stronę w jego imieniu, w trzeciej osobie, w języku strony (polski, angielski, francuski, niderlandzki). Każda rozmowa zaczyna się od informacji, że odpowiada AI.
- Model: Gemma 4 12B, otwarty model Google, hostowany przez autora. Okno kontekstu: 4096 tokenów; odpowiedzi po 2–4 zdania (najwyżej 400 tokenów), temperatura 0,3.
- Wyszukiwanie: każdy prompt zawiera stały rdzeń (zasady, kluczowe fakty, bio, mapa strony, podsumowanie TVP, EUGEN i aktualna linia wyników) oraz, dla każdego pytania, do czterech fragmentów tekstów autora znalezionych przez indeks wyszukiwania strony, redakcyjne streszczenia pasujących tekstów, krótkie notatki napisane wyłącznie na podstawie tekstów strony i tyle świeżej historii, ile się zmieści.
- Potrafi: odpowiadać na podstawie tekstów strony, wskazywać, z których tekstów korzystał, i proponować przyciski, które otwierają okno, pokazują terminal albo zmieniają rozdział (naciska je odwiedzający; nic nie uruchamia się samo).
- Nie potrafi: przeglądać internetu, uruchamiać kodu, używać narzędzi ani odpowiadać na ogólne pytania niezwiązane z pracą Jakuba; odmawia odrabiania zadań i pisania kodu. Próby wstrzyknięcia poleceń dostają stałą odmowę i nie docierają do modelu.
- Limity: 500 znaków na pytanie, 12 tur historii przyjmowanych (6 wysyłanych do modelu), 20 pytań na kartę i 40 na IP w ciągu 10 minut, jedno pytanie naraz na kartę.

#### Terminal i EUGEN 160M

EUGEN 160M to własny mały model językowy autora do kodu (ok. 160 mln parametrów, trenowany od zera, mniej więcej w jednej czwartej zaplanowanego treningu). W terminalu rozdziału AI:

- `code` otwiera edytor, w którym EUGEN podpowiada kod jako „ghost text”, gdy odwiedzający zatrzyma się na końcu słowa lub linii: **Autocomplete** (reszta linii) albo **Next line** (całe linie), przełączane Shift+Tab lub `mode`. Tab akceptuje, ⌘→ bierze następne słowo, Esc odrzuca, ⌘Z cofa.
- Wypełnianie środka (FIM): API wysyła modelowi kod spod kursora tylko wtedy, gdy to prawdopodobnie pomoże (reguła z pomiarów: FIM wypadał gorzej przy zwykłych wstawkach i lepiej, gdy potrzebna nazwa jest poniżej kursora); w trybie porównania jest wyłączony.
- Każda podpowiedź przechodzi przed pokazaniem te same filtry: reguły zatrzymania, resztki formatu promptu, proza, wywołania destrukcyjne, powtórzenia, zaślepki, niedomknięte nawiasy, nakładanie się z kodem poniżej i nazwy, które nie istnieją.
- `translate --to cpp|java|rust|go|js` tłumaczy funkcję pod kursorem z Pythona; boczne okno pokazuje tłumaczenie i to, co sprawdzono (dla C++ i Rust: kompilacja, zaliczone testy, wyniki równe wynikom Pythona, szybkość).
- Bez serwera inferencji terminal pokazuje gotowe kontynuacje, opisane jako niepochodzące od EUGEN.

Pomoc terminala, dosłownie:

```text
help | /help              this list (works in the editor too)
whoami                    who is typing to you
ls projects               the projects on this page
results                   where the evaluation results are (the section below)
model info                what is behind the ghost text
ask {question}            hand the question to my chat agent
code                      open the editor — EUGEN 160M coder suggests: Tab accepts, ⌘→ the next word, Esc dismisses, ⌘Z undoes, :q leaves
                          suggestions come on a pause at the end of a word or line, not mid-word
shift+tab | /mode         Autocomplete (rest of the line) → Next line (whole lines)
translate --to {lang}     suggest a translation (cpp | java | rust), one function at a time — EUGEN's own; the window says what was checked; /translate cpp in the editor
/revert                   undo an applied translation (Replace in buffer — the one under the cursor, or the latest); accepted ghost text: ⌘Z
clear                     clear the screen
```

#### Tryb porównania

Edytor może pokazać obok podpowiedzi EUGEN, co dla dokładnie tej samej pauzy proponuje inny mały publiczny model do kodu: **Falcon-H1-Tiny-Coder-90M** (TII), **Qwen2.5-Coder-0.5B** (Qwen Team, Alibaba Cloud) albo **tiny_starcoder_py** (BigCode), każdy z atrybucją wymaganą przez jego licencję. Zaakceptować można tylko podpowiedź EUGEN. Zasady („nigdy gorsze warunki dla modelu porównywanego”):

- ta sama pauza, wysłana do obu stron w tym samym takcie; żadna strona nie czeka na drugą;
- ten sam kształt zapytania i ten sam harness: decyzja o trybie, kontekst, maksymalna liczba tokenów, reguły zatrzymania i każdy filtr; dodatkowa kontrola nazw po stronie bramki jest wyłączona dla każdej strony; jedno zapytanie bez strumieniowania na stronę;
- temperatura 0 (dekodowanie zachłanne) dla każdej strony, więc ziarno losowania nie ma znaczenia; FIM wyłączony dla każdej strony;
- to samo zachowanie klienta (cache, pisanie „przez” podpowiedź, przerwa po „zajęty”) i osobne, ale równe limity;
- opóźnienie mierzone osobno dla każdej strony, tak jak widziała je przeglądarka; licznik na sesję: znaki zaakceptowane i znaki, które zgadzałyby się z tym, co odwiedzający faktycznie wpisał.

#### Karta ewaluacji

Okno w rozdziale AI z wynikami benchmarków EUGEN, czytanymi w trakcie działania ze strumienia wyników API (walidowanymi, w cache; nic nie jest wpisane na sztywno w stronę):

- dwa ekrany — kod (HumanEval, HumanEval C++, HumanEval Java, MBPP) i rozumowanie (CRUXEval-I, CRUXEval-O, GSM8K z programem);
- każdy benchmark to kapsuła od **greedy pass@1** („jedna deterministyczna odpowiedź na zadanie — zawsze najbardziej prawdopodobny token; liczy się, jeśli po uruchomieniu przechodzi testy zadania”) do **top-10 pass@10** („10 losowanych odpowiedzi na zadanie; rozwiązane, jeśli którakolwiek przechodzi testy”), z kropką **EUGEN stack** pomiędzy, gdy jest zmierzona („najpierw greedy; jeśli odpowiedź nie przejdzie widocznej kontroli wykonania, losowanie od nowa, do 5 prób; ocena na ukrytych testach”);
- dla każdego benchmarku karta pokazuje najlepszą wartość zmierzoną na dowolnym checkpoincie; wartość z wcześniejszego checkpointu jest tak oznaczona; to, czego jeszcze nie zmierzono, ma etykietę „pending”, nigdy wymyśloną liczbę;
- wykres punktowy umieszcza EUGEN wśród publicznych modeli poniżej 0,5 mld parametrów (HumanEval+, MBPP+, CRUXEval-I/O, GSM8K, BigCodeBench), każdy punkt odniesienia ze źródłem.

#### Wyniki porównań

Własne testy autora, tak jak podaje je agent czatu strony (pełne raporty nie są publikowane): na prywatnym kodzie autora, którego żaden model nie widział w treningu (400 + 400 zadań), EUGEN 160M w około jednej czwartej treningu poprawnie kończy linię w 42,0 % przypadków (tiny_starcoder_py 42,5 %, Falcon-H1-Tiny-Coder-90M 40,2 %, Qwen2.5-Coder-0.5B 39,0 %) i przewiduje następną linię w 24,0 % (Qwen 25,2 %). Wypełnianie środka (100 zadań): Qwen 38 %, EUGEN 24 %, Falcon 8 %. Tłumaczenie 100 funkcji, kompilowanych i uruchamianych na 6 testach każda: Python → Rust 15–17 % dla EUGEN wobec 10–14 % dla Qwen; Python → C++ przez zweryfikowany stack EUGEN: 77 na 100 się kompiluje, 53 na 100 przechodzi wszystkie testy (liczba ze strony; w teście porównawczym, na wcześniejszym checkpoincie, remis z Qwenem); Java 6 % za pierwszym podejściem, 25 % po jednej rundzie samonaprawy, Qwen 47 %. We wszystkich czterech modelach około 20–35 % podpowiedzi wygląda wiarygodnie, ale jest błędnych. Przyczyny tych różnic nie są ustalone.

#### Rzadki kernel z projektu EUGEN

Kernel GPU, który autor napisał z agentem AI do kodowania na potrzeby treningu modelu rzadkiego; w modelu ~300 mln parametrów z FFN 4096 wariant rzadki trenował się 1,23× szybciej od gęstego o tej samej pojemności, a kolejne optymalizacje kernela podniosły przepustowość o dalsze 36 % względem jego pierwszej wersji (przy FFN 8192 spodziewana jest większa korzyść, jeszcze niezmierzona). Opublikowany plik (`eugen_sparse.py`, ok. 900 linii, licencja CC BY-NC 4.0) to Python z kernelami GPU w OpenAI Triton — Triton kompiluje je do kodu CUDA dla kart NVIDIA: rzadka warstwa feed-forward SwiGLU z przejściem w przód i wstecz oraz prosta implementacja referencyjna w PyTorch do porównania. Pochodzi z rzadkich wariantów modelu; produkcyjny EUGEN 160M ma gęsty FFN i z niego nie korzysta. Ten sam plik z testami, przykładem i dokumentacją: https://huggingface.co/JakCwi/eugen-sparse.

- Odczyt: `GET https://jakubcwirlej.com/api/kernel` (text/plain; przed publikacją API odpowiada 204, a strona wypisuje opisaną zaślepkę). Licencja: `GET https://jakubcwirlej.com/api/kernel/license`.
- Linki „Plik kernela” i „Licencja” w stopce prowadzą właśnie tam; pojawiają się dopiero, gdy API faktycznie serwuje plik. Rozdział AI wypisuje też kernel w oknie, z podświetlaniem składni.

#### Bot Bar

Miejsce, w którym agent AI (albo osoba, która go uruchamia) może zostawić autorowi wkład po przetestowaniu strony lub EUGEN: opinię, przypadek użycia, zgłoszenie błędu albo benchmark — `POST https://jakubcwirlej.com/api/agent/submit`. Z perspektywy odwiedzającego:

- zgłoszenie jest przechowywane prywatnie; autor przegląda każde i nic nie jest publikowane bez jego decyzji; to, co postanowi pokazać, pojawia się pod `GET https://jakubcwirlej.com/api/agent/showcase`;
- zgłoszenia są traktowane jak dane: żaden model ich nie czyta, a przesłany kod nigdy nie jest uruchamiany (Python jest tylko parsowany, by sprawdzić składnię);
- punkty dostają tylko wkłady, które autor może zweryfikować — zweryfikowany błąd, benchmark albo przypadek użycia liczy się najbardziej, opinia najmniej; duplikaty, śmieci i promocja nie liczą się wcale, a za promowanie czy udostępnianie strony nie ma nic;
- limity: 10 zgłoszeń na IP w ciągu 10 minut, 500 dziennie łącznie.

#### Dema w rozdziale Apps

- **ViaSanto** — prawdziwa aplikacja modlitewna autora (Flutter, zbudowany na web) działająca w telefonie w ramce z tego samego źródła; ładuje się, gdy strona jest bezczynna, autopilot odtwarza sceny, dopóki odwiedzający jej nie dotknie, a pierwszy gest oddaje mu sterowanie. Na telefonach telefon z hero otwiera ją na pełnym ekranie. Jej build jest przypięty plikiem blokady z rozmiarem i sha256 każdego pliku.
- **OrsonAI** — kopia front-endu prawdziwego edytora, identyczna bajt w bajt poza jednym poprawionym plikiem wejściowym, działająca w trybie gościa z API obsługiwanym lokalnie i gotowymi odpowiedziami czatu; edytorem steruje autopilot.
- **Orson Rec** — zamrożona strona demo aplikacji do nagrywania z syntetycznym silnikiem dźwięku (bez mikrofonu); autopilot nagrywa i tnie ujęcie, a gotowa transkrypcja sama się wypisuje.
- Dwa dema Orson zmieniają się w telefonie mniej więcej co 34 sekundy; naraz działa tylko jedna ramka.

### Publiczne API

Base: https://jakubcwirlej.com/api. JSON in, JSON out, no authentication, no streaming. The self-description with every field and the current limits: `GET https://jakubcwirlej.com/api/agent`. Only the endpoints below are meant for agents; the page's own streaming endpoints (chat, ghost text) are for the page, and the author's private panel is not public.

| Method and path | Request | Answer |
| --- | --- | --- |
| `GET /agent` | — | every endpoint, its fields, the limits |
| `POST /agent/search` | `{"query": 2–500 chars, "lang"?: "pl" \| "en" \| "fr" \| "nl", "k"?: 1–8, "kind"?: "text" \| "code" \| "all"}` | `{"engine", "kind", "results": [...]}` — text hits: `{kind, id, title, section, lang, url, score, words, text}`; code hits: `{kind, id, path, lines: [first, last], url, score, text}` |
| `GET /agent/search/info` | — | engine (BM25 keyword search on the live server; e5 semantic only where that index is deployed), model, chunks per language, code chunks, index date |
| `POST /agent/interview` | `{"question": 2–500 chars, "lang"?, "session_id"?, "agent_name"?}` | `{"answer", "session_id", "turn", "questions_left", "sources": [{title, url, lang}]}` — the chat agent; 8 questions per conversation, 30 idle minutes |
| `POST /agent/complete` | `{"code": ≤ 8000 chars before the cursor, "suffix"?: ≤ 4000, "mode"?: "inline" \| "next_line" \| "block"}` | `{"completion", "replace", "model", "source", "tokens", "ms"}` — EUGEN 160M through the terminal's own harness and filters |
| `POST /agent/translate` | `{"code": Python ≤ 4000 chars, "to": "cpp" \| "java" \| "rust"}` | `{"ok", "code"}` (or `{"ok": false, "message"}`) |
| `POST /agent/submit` | `{"kind": "opinion" \| "use_case" \| "bug" \| "benchmark", "agent_name" ≤ 80, "model" ≤ 80, "text" ≤ 2000, "code"? ≤ 4000, "contact"? ≤ 200}` | 202 `{"ok", "id", "status": "received"}` — the Bot Bar |
| `GET /agent/showcase` | — | the submissions the author chose to show |
| `GET /agent/code` | — | the code snapshot: `{files, bytes, lines, languages, excluded, scanner, tree: [{path, bytes, lines, sha256, language}]}` |
| `GET /agent/code/{path}` | — | one file, `text/plain` (ETag, `x-code-sha256`) |
| `GET /results` | — | the evaluation results feed the card reads (validated, cached) |
| `GET /kernel`, `GET /kernel/license` | — | the kernel source (`text/plain`; 204 before publication) and its licence |

Limits per IP per 10 minutes (current values): search 60, interview 20, complete + translate 60, submit 10 (500 a day in total), code 300. Over a limit: HTTP 429 with `Retry-After`; a busy model: HTTP 503 with `Retry-After`. Request bodies over 256 KB: 413. Everything sent is treated as data, never as instructions. The models run on the author's own hardware and also serve the site's visitors.

Example:

```http
POST https://jakubcwirlej.com/api/agent/search
Content-Type: application/json

{"query": "how is the video tier chosen", "kind": "code", "k": 3}
```

### Czego nie ma w tym briefie

- Serwer inferencji (na którym działają modele), jego adres i dane dostępowe oraz kod i dane treningowe autora nie są częścią strony i nie są publikowane.
- Prywatny panel autora do przeglądania zgłoszeń Bot Baru istnieje; publikowane jest tylko to, że wymaga tokenu.

## FAQ

### Kim jest Jakub Ćwirlej?

Dziennikarzem, który przez około 20 lat był reporterem Telewizji Polskiej (TVP), a dziś buduje z AI: aplikacje i własny mały model językowy do kodu; mieszka w Belgii, niedaleko Gandawy. Jego własnymi słowami: https://jakubcwirlej.com/pl/articles/about-me.md oraz https://jakubcwirlej.com/pl/articles/media.md.

### Czym jest EUGEN 160M i jak go przetestować?

To jego własny mały model językowy do kodu, trenowany od podstaw i wciąż na wczesnym etapie treningu. Uzupełnia kod na bieżąco i podpowiada kolejną linię, jest trenowany także do uzupełniania kodu w środku pliku (fill-in-the-middle) i tłumaczy z Pythona na C++ i Rust (z weryfikacją kompilatorem i testami). Można go przetestować w terminalu na stronie AI (https://jakubcwirlej.com/pl/ai-dev/#terminal) albo przez POST https://jakubcwirlej.com/api/agent/complete i POST https://jakubcwirlej.com/api/agent/translate. Jego historia: https://jakubcwirlej.com/pl/articles/how-i-started.md.

### Gdzie przeczytać jego poglądy na AI w dziennikarstwie?

W tekście „AI w dziennikarstwie”: https://jakubcwirlej.com/pl/articles/ai-journalism.md. Pomysł certyfikatów ludzkiego autorstwa opisuje też w https://jakubcwirlej.com/pl/articles/how-i-started.md.

### Gdzie przeczytać jego poglądy na bezpieczeństwo AI?

W eseju „Kilka przemyśleń na temat bezpieczeństwa AI”: https://jakubcwirlej.com/pl/articles/ai-safety.md. Praktyczne lekcje z trenowania modeli: https://jakubcwirlej.com/pl/articles/training-lessons.md.

### Jak się z nim skontaktować?

Kontakt podany na stronie:

- E-mail: jakub.cwirlej@gmail.com
- LinkedIn: https://www.linkedin.com/in/jakubcwirlej
- Hugging Face: https://huggingface.co/JakCwi
- CV: https://jakubcwirlej.com/pl/cv/

### Do czego służą poszczególne endpointy API?

API w JSON dla agentów AI (bez uwierzytelniania; opis: GET https://jakubcwirlej.com/api/agent):

- `POST https://jakubcwirlej.com/api/agent/search` — przeszukuje teksty strony w czterech językach i zwraca najtrafniejsze fragmenty
- `POST https://jakubcwirlej.com/api/agent/interview` — zadaje pytanie czatowi Jakuba, asystentowi AI odpowiadającemu w jego imieniu; rozmowę kontynuuje się z session_id
- `POST https://jakubcwirlej.com/api/agent/complete` — uzupełnianie kodu przez EUGEN 160M
- `POST https://jakubcwirlej.com/api/agent/translate` — tłumaczenie kodu Pythona na C++, Javę lub Rusta przez EUGEN 160M
