# Jakub Ćwirlej — Journaliste qui construit avec l'IA

> Journaliste (une vingtaine d'années à la télévision publique polonaise) qui construit avec l'IA — des applications et son propre petit modèle de langage pour le code.
>
> Un résumé du site-portfolio de Jakub Ćwirlej, généré à partir de son contenu, à utiliser avec un assistant IA. Tous les textes figurent en intégralité ci-dessous.

https://jakubcwirlej.com/fr/ · Généré à partir du contenu du site: 2026-10-14

## L'essentiel

- **Nom:** Jakub Ćwirlej
- **Rôles:** journaliste (une vingtaine d'années à la télévision publique polonaise, TVP) qui construit avec l'IA : des applications et son propre petit modèle de langage pour le code ; recherche indépendante (prépublications)
- **Télévision:** une vingtaine d'années comme reporter pour la télévision publique polonaise (TVP) : reportages et documentaires pour les magazines d'actualité Magazyn Ekspresu Reporterów, Alarm, Telekurier et Reporterzy, de la recherche et de la prise de vue jusqu'au montage final ; 48 de ses reportages sont listés sur le site avec des liens vers TVP VOD
- **Lieu:** Belgique, près de Gand ; il a vécu en Pologne la plus grande partie de sa vie
- **Versions linguistiques du site:** polonais, anglais, français, néerlandais
- **Applications:**
  - **OrsonAI** — sa première application, des outils d'IA pour journalistes : transcription d'interviews en direct dans un éditeur, consultation d'un chatbot sur des passages choisis, certificats d'origine humaine sur le registre Hedera Hashgraph (https://app.orsonai.com)
  - **Orson Rec** — présentée en démo en direct à côté d'OrsonAI dans le chapitre Apps
  - **ViaSanto** — une application de prière : le chapelet grain par grain, le saint du jour, des objectifs de prière comme la neuvaine de Pompéi, la lecture du jour, les intentions de la communauté avec compteurs en direct ; démo en direct dans le chapitre Apps (https://viasanto.com)
- **Travail avec l'IA:** il n'écrit pas de code à la main : il conçoit les tâches, dirige des équipes d'agents d'IA (un orchestrateur par équipe ; recherche, exécution contrôlée par deux contrôleurs indépendants, vérification) et vérifie les résultats par des tests et des mesures ; son environnement principal est Claude Code, avec Gemini via l'API comme second avis ; il a travaillé avec Google Cloud (Vertex AI, Cloud Run, BigQuery, Firestore, Cloud Build, Secret Manager) et Firebase
- **EUGEN 160M:** son propre petit modèle de langage pour le code, entraîné à partir de zéro et encore à un stade précoce de son entraînement ; il complète le code au fil de la frappe et suggère la ligne suivante, est aussi entraîné au fill-in-the-middle et traduit du Python vers le C++ et le Rust (vérifié par un compilateur et des tests) ; à essayer dans le terminal de la page AI (https://jakubcwirlej.com/fr/ai-dev/#terminal) ou via l'API (POST /agent/complete, POST /agent/translate)

Les résumés, les points clés, l'essentiel et la FAQ sont éditoriaux (rédigés pour ce fichier à partir des textes du site) ; les textes intégraux sont les mots de l'auteur.

## Sommaire

1. À propos
2. Chapitres
   - [Media](#chapter-media)
   - [Apps](#chapter-apps)
   - [AI](#chapter-ai-dev)
3. Articles
4. Reportages sur TVP VOD
5. Essayer EUGEN 160M
6. Pour les agents IA
7. Textes intégraux
   - [Médias — le reportage et le travail de l'image](#media)
   - [À propos de moi](#about-me)
   - [Ma façon de travailler](#approach)
   - [L'IA dans le journalisme](#ai-journalism)
   - [Mes débuts](#how-i-started)
   - [Ce que j'ai appris en entraînant mon propre modèle](#training-lessons)
   - [Données d’entraînement](#training-data)
   - [Quelques réflexions sur la sécurité de l'IA](#ai-safety)
   - [La technologie HDK](#hdk-tech)
8. Publications
9. CV
10. Contact
11. Comment ce site est construit — brief technique
12. FAQ

## À propos

Jakub Ćwirlej est un journaliste qui construit avec l'IA. Pendant une vingtaine d'années, il a été reporter pour la télévision publique polonaise (TVP), réalisant des reportages et des documentaires pour des magazines d'actualité comme Magazyn Ekspresu Reporterów, Alarm, Telekurier et Reporterzy — de la recherche et de la prise de vue jusqu'au montage final. Il développe des applications (dont OrsonAI et ViaSanto) et son propre petit modèle de langage pour le code, EUGEN 160M, toujours en cours d'entraînement ; il publie aussi des recherches indépendantes (prépublications). Il vit en Belgique, près de Gand.

## Chapitres

- [Media](https://jakubcwirlej.com/fr/) — le reportage et le travail de l'image : son travail à la télévision, sa façon de travailler, l'IA dans le journalisme
- [Apps](https://jakubcwirlej.com/fr/apps/) — les applications qu'il a créées — OrsonAI, Orson Rec et ViaSanto — avec des démos en direct sur la page
- [AI](https://jakubcwirlej.com/fr/ai-dev/) — l'entraînement de ses propres modèles de langage : ses débuts, les leçons apprises, la sécurité de l'IA, et un terminal pour essayer EUGEN 160M

Tous les textes des trois chapitres dans l’ordre de lecture : titres, paragraphes, listes et boutons sous les paragraphes (avec ce qu’ils ouvrent). Les textes des fenêtres figurent en intégralité dans « Textes intégraux ».

### Media {#chapter-media}

https://jakubcwirlej.com/fr/ — le reportage et le travail de l'image : son travail à la télévision, sa façon de travailler, l'IA dans le journalisme

Bonjour ! Je m'appelle Kuba. J'aime raconter des histoires qui comptent.

Boutons:

- [À propos de moi](#about-me) — fenêtre de texte: À propos de moi · Markdown: https://jakubcwirlej.com/fr/articles/about-me.md

Pourquoi est-ce que je tiens tant au travail sur l'image ? C'est simple. Les images parlent une langue universelle : elles éveillent des émotions et racontent des histoires comme les mots seuls ne sauraient le faire. Être derrière la caméra m'a offert une liberté unique de m'exprimer et de construire un récit.

Pendant près de vingt ans, j'ai réalisé des centaines de reportages et de sujets documentaires pour des magazines d'information nationaux comme Magazyn Ekspresu Reporterów, Alarm, Telekurier ou Reporterzy. J'ai fait mes débuts de journaliste dans une rédaction d'information, mais j'ai assez vite compris que, pour faire des sujets qui retiennent vraiment le téléspectateur, je devais devenir un créateur polyvalent, qui comprenne chaque facette du métier de la télévision. C'est pourquoi, dans mon travail, je ne me cantonne pas à un seul rôle. Je prends en charge toute la chaîne de production : de la documentation minutieuse au montage final et à la postproduction, en passant par la prise de vues, les interviews et l'écriture.

Boutons:

- Reportages sur TVP VOD — liste: [Reportages sur TVP VOD](#reportages)

Mon approche mêle l'amour des arts visuels et l'obstination à raconter des histoires qui ont un vrai impact sur la réalité. Il ne s'agit pas seulement de tenir une caméra, de monter avec habileté ou de poser des questions difficiles – il s'agit de se servir de l'image pour créer du lien, impliquer le spectateur et l'obliger à réfléchir.

Dans mes reportages, j'ai cherché à donner la parole à des gens qui en sont, au quotidien, totalement privés. Le journalisme d'interpellation, ce sont pour une bonne part des rencontres avec des personnes en crise – des gens impuissants face à une machine bureaucratique sans âme, ou aux prises avec les conséquences dramatiques de la dégradation de l'environnement. Un bon exemple : la série de reportages que j'ai consacrée aux effondrements de terrain et au coût social colossal qui s'est abattu du jour au lendemain sur la population locale après la fermeture de la mine d'Olkusz-Pomorzany.

Mais l'univers impitoyable du journalisme d'interpellation ne m'a pas seulement appris l'empathie : il m'a aussi appris à régler les problèmes en un éclair et à faire preuve d'un pragmatisme brutal. Travailler sur le terrain, souvent dans une extrême urgence et dans des conditions imprévisibles, m'a contraint à une autonomie totale. Mais, en même temps, c'est précisément cette indépendance qui me donne la plus grande liberté : elle me permet de raconter une histoire de A à Z.

Boutons:

- [Ma façon de travailler](#approach) — fenêtre de texte: Ma façon de travailler · Markdown: https://jakubcwirlej.com/fr/articles/approach.md

J'ai toujours été porté par une pure curiosité du monde. Nous vivons une époque follement intéressante, ce qui veut dire qu'on ne peut pas faire du surplace : il faut sans cesse progresser, remettre en question ses présupposés et tout réapprendre, encore et encore. Je le prends comme un défi, et les nouvelles technologies y sont de puissants alliés. C'est précisément cette soif de savoir qui a fait évoluer, tout naturellement, ma pratique de reporter vers des solutions fondées sur l'intelligence artificielle. Aujourd'hui, je cherche de nouveaux défis à la croisée des médias et de la technologie – là où l'expérience de reporter et la connaissance pratique de l'IA apportent ensemble plus que chacune séparément.

Boutons:

- [L'IA dans le journalisme](#ai-journalism) — fenêtre de texte: L'IA dans le journalisme · Markdown: https://jakubcwirlej.com/fr/articles/ai-journalism.md

### Apps {#chapter-apps}

https://jakubcwirlej.com/fr/apps/ — les applications qu'il a créées — OrsonAI, Orson Rec et ViaSanto — avec des démos en direct sur la page

#### ViaSanto

ViaSanto est une application de prière née d'une observation simple, tirée de la vie quotidienne : aujourd'hui, les smartphones nous détournent sans cesse de l'essentiel. Plutôt que de lutter contre cela, j'ai décidé de faire du téléphone un allié de la prière. Beaucoup de gens veulent prier régulièrement, mais la hâte l'emporte : un chapelet commencé dans le tram s'interrompt et se perd facilement, et une neuvaine s'abandonne après un seul jour manqué. Beaucoup d'autres – à cause de la maladie, de l'âge, de l'émigration ou du travail – prient seuls et n'ont personne avec qui partager leurs intentions. ViaSanto permet de prier discrètement en chemin, suit la progression et chaque jour d'une neuvaine, et réunit ceux qui prient seuls dans une communauté qui prie pour leurs intentions.

Boutons:

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

L'application s'articule autour d'un chapelet virtuel et interactif sur l'écran du téléphone. ViaSanto guide pas à pas à travers les dévotions choisies, suit la progression et rappelle les intentions. Une gamification douce soutient l'habitude : la persévérance débloque de nouveaux motifs de perles, soigneusement dessinés. L'espace communautaire compte tout autant – des groupes où l'on peut partager ses intentions et se soutenir mutuellement dans la prière.

#### Voyez comment ça marche

Le téléphone à côté de ce texte fait tourner la véritable application. Cliquez sur son écran pour en prendre le contrôle.

- Trouvez le premier grain qui n'a pas encore été prié (juste au-dessus de ceux qui ont un halo doré) – maintenez-le enfoncé : le texte de la prière défile dans l'encadré en haut de l'écran, et une barre indique la progression.
- Pour changer l'apparence du chapelet, ouvrez la collection (l'icône du livre dans la barre du bas) : choisissez « Różańce » (Chapelets) et un autre modèle – l'application prend ses couleurs, tout comme le cadre de ce texte.
- Dans l'encadré, cliquez sur « Czytanie na dziś » (Lecture du jour) pour ouvrir les lectures du jour.

L'application est écrite en Flutter : une seule base de code fonctionne nativement sur iOS et Android ainsi que dans le navigateur. La logique, les données et leur sécurité sont gérées par un backend Supabase (PostgreSQL) auto-hébergé sur des serveurs européens. J'ai tout conçu pour la fiabilité : ViaSanto fonctionne aussi hors ligne – il enregistre la progression sur l'appareil et la synchronise avec le serveur dès que la connexion revient.

#### OrsonAI

OrsonAI est un éditeur de texte rédactionnel doté d'un assistant IA intégré, que j'ai conçu pour les journalistes – aussi bien les pigistes que les rédactions, auxquelles il doit apporter un soutien complet. Il est né de mon propre travail : l'écriture, la recherche et la vérification se font aujourd'hui en même temps et, en pratique, cela veut dire passer sans cesse d'un document au navigateur et aux notes. Ici, tout se passe dans une seule fenêtre. On peut soumettre un passage sélectionné au chat sans recopier tout le contexte, les transcriptions des entretiens enregistrés arrivent dans l'éditeur, et des modes distincts aident à rédiger à partir de notes, à chercher des informations, à vérifier un texte avant publication – des faits aux risques juridiques – et à analyser des documents et des enregistrements. Avant qu'une requête ne parte vers un modèle d'IA sur des serveurs externes, le texte peut être anonymisé, afin que les noms des interlocuteurs et les autres données personnelles ne quittent pas la rédaction. L'assistant aide le journaliste, mais ne fait pas le travail à sa place. L'application n'est pas commercialisée pour le moment, mais elle fonctionne et on peut l'essayer en mode invité. Si des rédactions s'y intéressent, je n'exclus pas d'en poursuivre le développement.

Boutons:

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

L'essentiel de mon travail est allé à la couche de confiance. Chaque interaction avec l'IA est hachée – tout le chemin, du projet au document et à la conversation, jusqu'à la requête et à la réponse – et un processus en arrière-plan vérifie chaque minute les hachages collectés et les ancre tous les 1 000 événements dans le Hedera Consensus Service. Sur cette base, le système peut décerner à un texte un certificat de paternité humaine : il évalue la part humaine et la qualité du texte et, si le texte franchit les seuils, inscrit son hachage dans le registre public Hedera Hashgraph. Toute modification ultérieure annule le certificat, et l'authenticité se vérifie en comparant l'empreinte SHA-256 du document à l'inscription dans le registre. J'ai extrait le mécanisme d'audit en une bibliothèque ouverte distincte, HDK, sous licence CC BY-NC 4.0 depuis la version 0.1.3 (une bibliothèque gratuite, alpha, avec ancrage Hedera optionnel ; les versions antérieures restent sous Apache 2.0). Le backend, c'est Python et FastAPI sur Google Cloud dans une région européenne ; le texte est traité principalement par les modèles Gemini, Mistral sert de fournisseur de secours et les modèles d'OpenAI travaillent sur la transcription.

Boutons:

- [La technologie HDK](#hdk-tech) — fenêtre de texte: La technologie HDK · Markdown: https://jakubcwirlej.com/fr/articles/hdk-tech.md
- [Bibliothèque HDK gratuite](https://jakubcwirlej.com/files/hdk/hdk-audit-0.1.3.zip) — fenêtre du fichier
- [HDK sur Hugging Face](https://huggingface.co/JakCwi/hdk-audit) (JakCwi/hdk-audit, licence CC BY-NC 4.0)

#### Orson Rec

Orson Rec est une application web d'enregistrement d'entretiens que l'on peut installer sur l'écran d'accueil du téléphone. Je l'ai faite pour les reporters de terrain, pour leur épargner des heures de réécoute et de retranscription. À un moment important de la conversation, on appuie sur CUT – le fragment enregistré part aussitôt en reconnaissance vocale, si bien que la transcription, avec ses timecodes, s'affiche à l'écran fragment par fragment pendant l'entretien. On peut marquer les passages clés avec des repères IN et OUT et garder ses questions préparées sous les yeux dans le prompteur. Le mode VO permet d'enregistrer une voix off à partir d'un texte préparé dans l'éditeur OrsonAI, et l'éditeur audio intégré de couper l'enregistrement. Le fichier s'exporte en WAV, MP3 ou AAC, et la transcription passe dans l'éditeur en un clic. L'enregistrement lui-même se fait sur le téléphone, mais la transcription demande une connexion internet.

Boutons:

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

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

https://jakubcwirlej.com/fr/ai-dev/ — l'entraînement de ses propres modèles de langage : ses débuts, les leçons apprises, la sécurité de l'IA, et un terminal pour essayer EUGEN 160M

Premier écran : un terminal pour essayer EUGEN 160M: https://jakubcwirlej.com/fr/ai-dev/#terminal

#### EUGEN 160M

EUGEN 160M est un petit modèle de langage qui aide à écrire du code : il le complète au fil de la frappe (autocomplétion) et suggère la ligne suivante. Il est aussi entraîné à compléter du code au milieu d'un fichier (fill-in-the-middle) et il est spécialisé dans la traduction du Python vers le C++. Il compte 164,5 millions de paramètres et est entraîné de zéro sur une seule carte graphique NVIDIA RTX PRO 6000 (96 Go). Sa petite taille lui permet de générer rapidement aussi sur un processeur ordinaire, jusqu'à environ 270 jetons par seconde. Le modèle peut être essayé dans le terminal : il suffit de cliquer sur le bouton ci-dessous.

Boutons:

- [Sachez que…](#how-i-started) — fenêtre de texte: Mes débuts · Markdown: https://jakubcwirlej.com/fr/articles/how-i-started.md

#### Premiers résultats

L'entraînement en est à un stade précoce, et les résultats donnent déjà des raisons d'être optimiste. Sur HumanEval, où le modèle écrit une fonction Python à partir de sa description, les meilleurs résultats mesurés d'EUGEN sont de 18,9 % des tâches en une tentative et de 32,9 % en dix. En traduction vérifiée du Python vers le C++ – le compilateur et les tests choisissent une version fonctionnelle parmi plusieurs propositions du modèle – 77 programmes sur 100 compilent et 53 passent tous les tests. La pile du modèle veille à ce que seules les propositions de traduction ayant passé ces contrôles parviennent à l'utilisateur. Le graphique place les résultats d'EUGEN face aux modèles jusqu'à 0,5 milliard de paramètres.

Boutons:

- [Ce que j'ai appris en entraînant mon propre modèle](#training-lessons) — fenêtre de texte: Ce que j'ai appris en entraînant mon propre modèle · Markdown: https://jakubcwirlej.com/fr/articles/training-lessons.md

#### Architecture du modèle

EUGEN est un transformer décodeur de 36 couches, entraîné avec MuonH, une variante de Muon qui maintient constante la norme des matrices de poids. Le modèle est en phase d'entraînement de base. Environ 0,35 % des données sont des données propres : des solutions STaR générées par EUGEN lui-même et validées par les tests, ainsi que des paires de traduction entre le Python et le C++, le Java, le Go et le Rust, contrôlées par compilation et tests.

Boutons:

- [Données d’entraînement](#training-data) — fenêtre de texte: Données d’entraînement · Markdown: https://jakubcwirlej.com/fr/articles/training-data.md

#### FFN creux, kernel Triton

Je travaille aussi à optimiser et à accélérer l'entraînement du modèle grâce à un FFN creux, et j'ai développé à cette fin mon propre kernel GPU, écrit en Triton. Sur un modèle de 306 millions de paramètres (FFN 4 096), le kernel optimisé a atteint un débit supérieur de 36 % à celui de sa première version. Nos premiers tests montrent qu'avec un modèle plus grand et un FFN de 8 192, le kernel du projet EUGEN permet une accélération de plus de 40 % par rapport à un modèle dense. Reste à savoir si un modèle entraîné creux puis densifié à la fin égale un modèle dense, mais les premiers résultats m'incitent à entraîner ainsi le prochain modèle, plus grand.

Boutons:

- [Le kernel sur Hugging Face](https://huggingface.co/JakCwi/eugen-sparse) (JakCwi/eugen-sparse, licence CC BY-NC 4.0)

#### TetherGate : stabiliser les portes apprises

TetherGate est un mécanisme qui empêche les portes apprises de se fermer. Une porte qui pondère une branche résiduelle – un expert, un adaptateur ou une couche nouvellement ajoutée – tend à être poussée progressivement vers zéro par l'optimiseur, après quoi la branche n'apporte plus rien au modèle. TetherGate combine un plancher piloté par l'étape d'entraînement et un ressort qui attire le seuil de la porte vers une ancre mobile calculée à partir du signal de commande courant. Le signal peut être n'importe quelle statistique. J'ai testé le mécanisme à titre expérimental sur mes modèles.

Boutons:

- [Télécharger TetherGate (.zip)](https://jakubcwirlej.com/files/tethergate.zip) — télécharge le fichier (tethergate.zip (code, README, tests), licence CC BY-NC 4.0)
- [TetherGate sur Hugging Face](https://huggingface.co/JakCwi/tethergate) (JakCwi/tethergate, licence CC BY-NC 4.0)

#### Recherche indépendante

Je mène sans cesse mes propres recherches sur l'IA. Elles portent notamment sur les signaux internes du réseau : les activations des portes des couches FFN et l'indice GSI (Gate Sparseness Index) qui en découle et qui, selon des résultats préliminaires, pourrait aider, avant toute réponse, à distinguer les questions dont le modèle connaît la réponse de celles où il commence à confabuler. Une analyse ultérieure a montré qu'une partie de l'effet tient à la longueur des questions : une fois celle-ci prise en compte, le signal se maintient pour le modèle Llama, les autres résultats doivent être refaits. Je n'ai pas de formation formelle dans ce domaine, mais je m'efforce de travailler de la manière la plus professionnelle possible : données publiées, mesures reproductibles et limites clairement énoncées.

Boutons:

- [Quelques réflexions sur la sécurité de l'IA](#ai-safety) — fenêtre de texte: Quelques réflexions sur la sécurité de l'IA · Markdown: https://jakubcwirlej.com/fr/articles/ai-safety.md

#### Comment je travaille avec l'IA

Je n'écris pas de code à la main. Je conçois les tâches et je dirige des équipes d'agents d'IA, et je vérifie chaque résultat. Une équipe travaille en trois étapes : recherche, exécution et vérification. L'exécution est surveillée par deux contrôleurs indépendants : l'un veille au périmètre de la tâche, l'autre à sa qualité technique.

Je mène deux ou trois équipes de ce type en parallèle : quand une tâche demande mon attention, les autres continuent d'avancer. Quand un modèle bloque, je soumets le problème à un modèle d'une autre entreprise.

Je délègue de grandes portions de travail, mais seulement jusqu'à la limite où je peux les vérifier sérieusement, puis je réserve du temps aux corrections. C'est un test ou une mesure qui décide si quelque chose est prêt, pas la déclaration du modèle.

#### Plus

Boutons:

- [Réflexions sur la sécurité de l'IA](#ai-safety) — fenêtre de texte: Quelques réflexions sur la sécurité de l'IA · Markdown: https://jakubcwirlej.com/fr/articles/ai-safety.md
- [Coherence Over Truth](https://www.researchgate.net/publication/397730862) — Publications: [Coherence Over Truth: On Minds, Models and Reality](#coherence-over-truth)
- [HDK : traces d'audit IA](https://www.researchgate.net/publication/400762996) — Publications: [HDK: Tamper-Evident LLM Audit Trails with Hierarchical Hash Genealogy and Distributed Ledger Anchoring](#hdk-tamper-evident-audit-trails)
- [Barrières quantiques pour l'AGI](https://www.researchgate.net/publication/400670258) — Publications: [Self-Referential Quantum Barriers for AGI Containment: A Physics-Based Framework for Probabilistic Safety Engineering](#agi-quantum-containment)

## Articles

- [Médias — le reportage et le travail de l'image](https://jakubcwirlej.com/fr/articles/media.md) (`media`) — Jakub Ćwirlej explique pourquoi il tient tant au travail de l'image, qui parle selon lui un langage universel. Il décrit près de deux décennies de reportages et de documentaires pour des magazines d'actualité polonais, dont il assurait toute la production, et son ambition de donner la parole à ceux qui n'en ont pas. Il relie sa curiosité pour le monde à l'évolution de ses outils de reporter vers des outils fondés sur l'IA.
- [À propos de moi](https://jakubcwirlej.com/fr/articles/about-me.md) (`about-me`) — Un portrait personnel dans lequel l'auteur se décrit comme quelqu'un qui évite les opinions figées, ce qu'il considère comme un atout pour un journaliste ou un chercheur. Il retrace son parcours, de l'atelier d'artiste de son grand-père et du projet de jeunesse de devenir professeur de philosophie jusqu'à vingt ans de reportage pour la télévision publique polonaise, et dit que le journalisme l'a aidé à vaincre la peur d'être jugé. Il évoque aussi sa famille, les livres et la musique qu'il aime, et son installation récente en Belgique, près de Gand.
- [Ma façon de travailler](https://jakubcwirlej.com/fr/articles/approach.md) (`approach`) — Pour l'auteur, le journalisme est avant tout une manière de découvrir le monde et d'apprendre sans cesse, et aussi une forme de service : quels que soient son humeur ou le risque, son travail est de livrer le sujet, parce que les gens ont le droit de savoir. Il soutient que la télévision n'est jamais objective, puisque la subjectivité commence dès le choix des plans et se poursuit au montage, et que la véritable obligation éthique est de ne pas faire perdre son temps au spectateur. Il explique sa préparation minutieuse sur le terrain et pourquoi il n'a jamais recherché de prix.
- [L'IA dans le journalisme](https://jakubcwirlej.com/fr/articles/ai-journalism.md) (`ai-journalism`) — L'auteur, qui utilise l'IA presque tous les jours depuis le lancement de ChatGPT, en reconnaît les risques, avant tout les hallucinations, mais soutient qu'un usage pragmatique de cette technologie renforce le métier : il parle à un chatbot en rentrant de tournage, automatise la transcription et recourt aux outils OSINT, même si aucun modèle ne sait encore tirer un « séquencier » télé d'interviews brutes. Il juge vain de condamner un texte sur sa seule sonorité, les détecteurs d'IA se trompant dans les deux sens, et relève que l'AI Act européen demande qui est responsable d'un texte sans donner au lecteur le moyen de vérifier qui l'a écrit. Il pense que les journalistes qui continuent à chercher et à itérer s'en sortiront bien, et que ce sont avant tout ceux qui se contentent de reproduire des schémas qui perdront leur emploi.
- [Mes débuts](https://jakubcwirlej.com/fr/articles/how-i-started.md) (`how-i-started`) — L'auteur raconte comment la création d'OrsonAI, un ensemble d'outils d'IA pour son propre travail de journaliste, l'a mené du vibe coding à la recherche sur les hallucinations des modèles de langage, puis à l'entraînement de ses propres modèles. Il décrit l'accueil froid réservé à l'application par la profession, ses études des activations des portes SwiGLU et l'échec de son premier modèle bâti sur sa propre architecture. Aujourd'hui, il entraîne EUGEN 160M, un petit modèle spécialisé dans le code que l'on peut essayer dans un terminal sur le site.
- [Ce que j'ai appris en entraînant mon propre modèle](https://jakubcwirlej.com/fr/articles/training-lessons.md) (`training-lessons`) — Dix leçons pratiques tirées de l'expérience de l'auteur, qui entraîne lui-même des modèles de langage. Elles portent sur les estimations de calcul trop optimistes, le fait de commencer petit, la surveillance constante, les changements isolés et les tests d'ablation, le choix des données, des attentes réalistes, la patience pendant les plateaux et le besoin de plus d'un GPU. Il conclut que les petits modèles spécialisés construits par des particuliers ont toujours un sens.
- [Données d’entraînement](https://jakubcwirlej.com/fr/articles/training-data.md) (`training-data`) — Le mélange d'entraînement d'EUGEN 160M par dépôt Hugging Face : 14 lignes couvrant 93,4 % du flux de jetons actuel. Dolma 3 en est la plus grande part (35,29 %, dont Stack-Edu et Common Crawl par thème), suivie de The Stack v3 (15,44 %) et des historiques de commits de CommitPack et de jeux apparentés (10,46 %). Les données propres – solutions STaR générées par EUGEN et vérifiées par des tests, plus des paires de traduction de code – représentent environ 0,35 % du mélange.
- [Quelques réflexions sur la sécurité de l'IA](https://jakubcwirlej.com/fr/articles/ai-safety.md) (`ai-safety`) — Un essai sur la sécurité de l'IA dans lequel l'auteur critique un débat public superficiel, partagé entre technomaximalistes et prophètes de l'apocalypse. Il soutient que le pire a probablement déjà commencé, au vu des armes autonomes, de la surveillance croissante et de l'idéologie technomaximaliste, et que la responsabilité doit toujours revenir aux humains, car les machines n'ont pas d'agentivité propre. Il propose des mesures réglementaires concrètes et met en garde contre l'anthropomorphisation de l'IA.
- [La technologie HDK](https://jakubcwirlej.com/fr/articles/hdk-tech.md) (`hdk-tech`) — L'auteur présente HDK, une bibliothèque Python gratuite (CC BY-NC 4.0) détachée d'OrsonAI, qui rend détectable toute manipulation des enregistrements de conversations avec des modèles de langage. Elle hache chaque événement avec ses ancêtres, ajoute un compteur « canari » lié à un secret et ancre des racines de Merkle sur le Hedera Consensus Service.

## Reportages sur TVP VOD {#reportages}

Les reportages de l'auteur pour la télévision publique polonaise (TVP), avec des liens vers TVP VOD, groupés par émission, du plus récent au plus ancien. Les dates sont celles de diffusion (AAAA-MM-JJ) ; les titres sont en polonais, comme sur TVP VOD. Certains épisodes réunissent plusieurs reportages : quand une heure de début (mm:ss) est indiquée, son sujet commence là.

### Reporterzy (40 épisodes)

- 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 — [épisode sans titre](https://vod.tvp.pl/informacje-i-publicystyka,205/reporterzy-odcinki,1162990/odcinek-80,S02E80,1504121)
- 2024-05-09 — [épisode sans titre](https://vod.tvp.pl/informacje-i-publicystyka,205/reporterzy-odcinki,1162990/odcinek-46,S02E46,1302768)

### Magazyn Ekspresu Reporterów (8 épisodes)

- 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) — son sujet commence à 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) — son sujet commence à 21:38

## Essayer EUGEN 160M

EUGEN 160M est le petit modèle de langage pour le code de Jakub, entraîné de zéro et encore au début de son entraînement. Il complète le code au fil de la frappe et suggère la ligne suivante ; il est aussi entraîné à compléter du code au milieu d'un fichier (fill-in-the-middle) et traduit du Python vers le C++ et le Rust. Essayez-le dans le terminal de la page AI, ou via l'API pour agents IA :

- https://jakubcwirlej.com/fr/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"}
```

## Pour les agents IA

Un agent IA peut chercher dans les textes du site, poser des questions à l'agent conversationnel de Jakub et tester EUGEN via une petite API JSON. Description complète et limites : 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

## Textes intégraux

### Médias — le reportage et le travail de l'image {#media}

id: `media` · langue du texte: FR · 514 mots · Markdown: https://jakubcwirlej.com/fr/articles/media.md

**Résumé (éditorial):** Jakub Ćwirlej explique pourquoi il tient tant au travail de l'image, qui parle selon lui un langage universel. Il décrit près de deux décennies de reportages et de documentaires pour des magazines d'actualité polonais, dont il assurait toute la production, et son ambition de donner la parole à ceux qui n'en ont pas. Il relie sa curiosité pour le monde à l'évolution de ses outils de reporter vers des outils fondés sur l'IA.

**Points clés (éditorial):**

- Il a réalisé des centaines de reportages et de documentaires pour des émissions comme Magazyn Ekspresu Reporterów, Alarm, Telekurier et Reporterzy.
- Il a commencé comme journaliste dans un service d'information avant de devenir un réalisateur polyvalent, chargé de la recherche, de la prise de vue, des interviews, de l'écriture, du montage et de la postproduction.
- Le journalisme d'intérêt public consiste selon lui à rencontrer des gens en crise ; il cite sa série de reportages sur les effondrements de terrain après la fermeture de la mine Olkusz-Pomorzany.
- Le travail sur le terrain, sous la pression du temps, lui a appris à résoudre vite les problèmes, le pragmatisme et l'autonomie.
- Sa curiosité a conduit ses outils de reporter vers des outils fondés sur l'IA.

**Texte intégral (les mots de l'auteur):**

Bonjour ! Je m'appelle Kuba. J'aime raconter des histoires qui comptent.

Pourquoi est-ce que je tiens tant au travail sur l'image ? C'est simple. Les images parlent une langue universelle : elles éveillent des émotions et racontent des histoires comme les mots seuls ne sauraient le faire. Être derrière la caméra m'a offert une liberté unique de m'exprimer et de construire un récit.

Pendant près de vingt ans, j'ai réalisé des centaines de reportages et de sujets documentaires pour des magazines d'information nationaux comme Magazyn Ekspresu Reporterów, Alarm, Telekurier ou Reporterzy. J'ai fait mes débuts de journaliste dans une rédaction d'information, mais j'ai assez vite compris que, pour faire des sujets qui retiennent vraiment le téléspectateur, je devais devenir un créateur polyvalent, qui comprenne chaque facette du métier de la télévision. C'est pourquoi, dans mon travail, je ne me cantonne pas à un seul rôle. Je prends en charge toute la chaîne de production : de la documentation minutieuse au montage final et à la postproduction, en passant par la prise de vues, les interviews et l'écriture.

Mon approche mêle l'amour des arts visuels et l'obstination à raconter des histoires qui ont un vrai impact sur la réalité. Il ne s'agit pas seulement de tenir une caméra, de monter avec habileté ou de poser des questions difficiles – il s'agit de se servir de l'image pour créer du lien, impliquer le spectateur et l'obliger à réfléchir.

Dans mes reportages, j'ai cherché à donner la parole à des gens qui en sont, au quotidien, totalement privés. Le journalisme d'interpellation, ce sont pour une bonne part des rencontres avec des personnes en crise – des gens impuissants face à une machine bureaucratique sans âme, ou aux prises avec les conséquences dramatiques de la dégradation de l'environnement. Un bon exemple : la série de reportages que j'ai consacrée aux effondrements de terrain et au coût social colossal qui s'est abattu du jour au lendemain sur la population locale après la fermeture de la mine d'Olkusz-Pomorzany.

Mais l'univers impitoyable du journalisme d'interpellation ne m'a pas seulement appris l'empathie : il m'a aussi appris à régler les problèmes en un éclair et à faire preuve d'un pragmatisme brutal. Travailler sur le terrain, souvent dans une extrême urgence et dans des conditions imprévisibles, m'a contraint à une autonomie totale. Mais, en même temps, c'est précisément cette indépendance qui me donne la plus grande liberté : elle me permet de raconter une histoire de A à Z.

J'ai toujours été porté par une pure curiosité du monde. Nous vivons une époque follement intéressante, ce qui veut dire qu'on ne peut pas faire du surplace : il faut sans cesse progresser, remettre en question ses présupposés et tout réapprendre, encore et encore. Je le prends comme un défi, et les nouvelles technologies y sont de puissants alliés. C'est précisément cette soif de savoir qui a fait évoluer, tout naturellement, ma pratique de reporter vers des solutions fondées sur l'intelligence artificielle. Aujourd'hui, je cherche de nouveaux défis à la croisée des médias et de la technologie – là où l'expérience de reporter et la connaissance pratique de l'IA apportent ensemble plus que chacune séparément.

#### Textes liés

- [À propos de moi](https://jakubcwirlej.com/fr/articles/about-me.md)
- [Ma façon de travailler](https://jakubcwirlej.com/fr/articles/approach.md)
- [L'IA dans le journalisme](https://jakubcwirlej.com/fr/articles/ai-journalism.md)

### À propos de moi {#about-me}

id: `about-me` · langue du texte: FR · 854 mots · Markdown: https://jakubcwirlej.com/fr/articles/about-me.md

**Résumé (éditorial):** Un portrait personnel dans lequel l'auteur se décrit comme quelqu'un qui évite les opinions figées, ce qu'il considère comme un atout pour un journaliste ou un chercheur. Il retrace son parcours, de l'atelier d'artiste de son grand-père et du projet de jeunesse de devenir professeur de philosophie jusqu'à vingt ans de reportage pour la télévision publique polonaise, et dit que le journalisme l'a aidé à vaincre la peur d'être jugé. Il évoque aussi sa famille, les livres et la musique qu'il aime, et son installation récente en Belgique, près de Gand.

**Points clés (éditorial):**

- Il a vécu en Pologne la plus grande partie de sa vie ; sa carrière a commencé dans une rédaction, comme journaliste et monteur.
- Il n'a pas terminé ses études et dit que sa première application, OrsonAI, s'est révélée un pétard mouillé ; il valorise la capacité à changer de cap.
- Pour lui, la créativité consiste à construire quelque chose entièrement à partir de zéro.
- Il désigne le manque d'intelligence émotionnelle comme son plus grand défaut.
- Il cite « Les Livres de Jakób » d'Olga Tokarczuk, Marcel Proust, Arvo Pärt, L’Arpeggiata et Bach dirigé par Philippe Herreweghe.

**Texte intégral (les mots de l'auteur):**

Parler de moi ne m'a jamais été facile. D'abord parce que j'ai le sentiment d'en savoir encore bien peu sur moi-même. J'ai quarante ans bien sonnés et je n'ai toujours pas d'avis arrêté sur la plupart des questions que les gens jugent « déterminantes ». J'essaie toujours de laisser place à plusieurs points de vue et de ne m'attacher à aucun plus longtemps qu'il ne résiste à l'épreuve du réel. Beaucoup verront peut-être un défaut dans cette absence d'opinions tranchées et immuables ; pour un journaliste ou un chercheur, j'y vois au contraire la plus grande des qualités.

J'ai vécu la plus grande partie de ma vie en Pologne. Mon histoire avec la narration visuelle a commencé dans l'atelier d'artiste de mon grand-père – un lieu presque sacré pour moi, où j'ai compris quelle force de frappe peut avoir une seule image. Mais c'est dans une rédaction que ma carrière a commencé, comme journaliste et monteur vidéo. Cette expérience m'a fait connaître de fond en comble chaque facette du métier de la télévision et a fait de moi un créateur polyvalent. Pendant 20 ans, j'ai été reporter pour la Télévision polonaise (TVP). C'est d'autant plus ironique que, pendant toute mon enfance, il y avait peu de choses dont j'étais aussi sûr que de celle-ci : je ne deviendrais pas journaliste – comme mon père. Je voulais étudier la philosophie et devenir universitaire. La vie, et la nécessité de trouver du travail, ont eu raison de ces projets, mais c'est justement ma capacité d'adaptation qui s'est révélée être mon trait de caractère le plus important. Je me suis retrouvé dans les médias, et je m'y suis plutôt bien retrouvé.

Le journalisme m'a défini. Il m'a appris la discipline et la persévérance, mais il a surtout agi comme une thérapie au long cours – il m'a guéri de mes traumatismes d'enfance. Pendant des années, j'ai eu peur d'adresser la parole à des gens que je jugeais plus intelligents que moi ; la peur du jugement me paralysait. Avec le recul, c'était parfois franchement comique, mais le travail avec une caméra et un micro m'a forcé à affronter cette crainte. Si je tiens encore aujourd'hui au travail dans les médias, c'est justement parce qu'il permet de redécouvrir le monde sans cesse. Il offre la possibilité de redéfinir constamment qui l'on est et sa place, dans les contextes les plus divers. C'est une aventure sans fin.

Vu de l'extérieur, je peux passer pour quelqu'un d'inconstant, voire d'incapable de produire des résultats. Après tout, je n'ai pas terminé mes études, et ma première application, OrsonAI, s'est révélée un pétard mouillé. Je crois pourtant profondément qu'il faut, dans la vie, explorer sans relâche les possibles et savoir pivoter quand les circonstances l'exigent. À l'inverse, je suis capable de m'investir à fond dans les projets qui ont du sens à mes yeux – avoir passé 20 ans dans un seul secteur, et un secteur extrêmement exigeant, est sans doute la meilleure preuve que je prends très au sérieux ce que je fais.

J'aime les tâches qui demandent de la créativité. Je sais, cela sonne convenu, et le mot peut aujourd'hui désigner littéralement n'importe quoi ; c'est pourquoi il a pour moi un sens très concret : se jeter dans le grand bain et se mettre dans une situation où il faut tout construire de zéro. C'est précisément pour cela que j'ai tant aimé le métier de reporter. On peut avoir l'impression que ce sont toujours les mêmes histoires et les mêmes ressorts humains qui reviennent dans les reportages, mais un bon documentariste sait chaque fois les raconter d'une façon entièrement neuve et intrigante.

Si je devais désigner mon plus grand défaut, ce serait sans aucun doute mon manque d'intelligence émotionnelle. Je suis totalement incapable de « sentir l'ambiance ». Si on ne me dit pas les choses directement, il y a fort à parier que je ne les remarquerai pas. Cela peut sembler assez drôle, mais ce paradoxe fait que, sur ce plan, je ressemble parfois étonnamment à une intelligence artificielle.

Et dans le privé ? Ma plus grande joie, c'est ma famille. Voir grandir mes enfants est une expérience fascinante. Je m'en veux pourtant de leur avoir consacré trop peu de temps jusqu'ici – c'est l'une des principales choses que j'essaie aujourd'hui de changer dans ma vie.

J'aime les livres qui me donnent un sentiment de continuité. Ceux qui montrent que les époques et les décors ont beau changer, nous partageons au fond exactement les mêmes joies et les mêmes peines que ceux qui ont vécu des siècles avant nous. D'où ma fascination pour « Les Livres de Jakób » d'Olga Tokarczuk et pour l'œuvre de Marcel Proust. Mon grand rêve, d'ailleurs, est d'apprendre le français assez bien pour pouvoir enfin lire « À la recherche du temps perdu » dans le texte.

J'adore la musique classique – Arvo Pärt, l'ensemble L'Arpeggiata, mais surtout les cantates et les messes de Bach sous la direction de Philippe Herreweghe. Je vis depuis peu en Belgique, pas très loin de Gand, et j'espère vivement avoir bientôt l'occasion d'entendre ses interprétations en concert.

Et à part ça ? J'aime tout simplement écouter la pluie et regarder l'herbe ployer sous le vent. Cela me suffit amplement.

### Ma façon de travailler {#approach}

id: `approach` · langue du texte: FR · 872 mots · Markdown: https://jakubcwirlej.com/fr/articles/approach.md

**Résumé (éditorial):** Pour l'auteur, le journalisme est avant tout une manière de découvrir le monde et d'apprendre sans cesse, et aussi une forme de service : quels que soient son humeur ou le risque, son travail est de livrer le sujet, parce que les gens ont le droit de savoir. Il soutient que la télévision n'est jamais objective, puisque la subjectivité commence dès le choix des plans et se poursuit au montage, et que la véritable obligation éthique est de ne pas faire perdre son temps au spectateur. Il explique sa préparation minutieuse sur le terrain et pourquoi il n'a jamais recherché de prix.

**Points clés (éditorial):**

- Il écoute tour à tour la BBC et Radio France et apprécie leurs principes éthiques, mais juge cyniques bien des prétentions à l'objectivité absolue.
- Il suggère que les rédactions déclarent ouvertement la vision du monde qu'elles considèrent comme dominante.
- Préparer un sujet, c'est notamment se rendre sur place à l'avance pour vérifier l'espace et la lumière.
- Il n'a pas envoyé ses reportages dans des festivals : il ne se sentait pas en droit d'être « l'auteur » des histoires d'autrui et a choisi d'être un joueur d'équipe fiable.

**Texte intégral (les mots de l'auteur):**

Le journalisme, et tout particulièrement le travail à la télévision, est avant tout pour moi une manière de découvrir le monde, un laissez-passer vers des lieux et des personnes que je n'aurais jamais approchés autrement. C'est la curiosité qui m'a attiré vers ce métier, et c'est encore elle qui m'y retient. Après 20 ans, j'apprends toujours.

Cet apprentissage n'est d'ailleurs pas un choix, mais une condition du métier. Un journaliste se retrouve sans cesse face à un sujet dont il ne savait presque rien la veille, et la plupart du temps, impossible d'avancer sans une recherche rigoureuse. Les lois changent, les circonstances changent, les personnes concernées changent. C'est pourquoi, dans ce métier, on ne traite jamais deux fois le même sujet – même lorsque les problèmes semblent étonnamment semblables. Deux familles frappées par la même tragédie, ce sont toujours deux histoires différentes, et ce qui était vrai il y a trois ans n'est souvent plus aujourd'hui qu'un point de départ.

Pour beaucoup de mes amis de la profession, le journalisme est une sorte de service. Cette approche m'est proche, à moi aussi – et ce, bien qu'il n'ait pas les structures formelles de l'armée ou de la police, et que moi-même, pendant l'essentiel de ma carrière, je n'aie pu compter, au mieux, que sur la pige. Aucun privilège, aucun parapluie de l'État, aucune sécurité institutionnelle : il n'en a jamais été question. Et pourtant, j'ai toujours eu le sentiment que pesait sur nous un devoir comparable. Que je me sente bien ou mal ce jour-là, que le sujet me soit personnellement pénible, voire qu'il m'expose à un danger physique, ma tâche est tout simplement de « livrer » ce sujet. Les gens ont le droit de savoir, et mon rôle est de leur apporter ce savoir.

C'est précisément pour cela que les prétentions actuelles à l'objectivité absolue m'agacent autant. Ce n'est pas que je ne respecte pas les standards classiques – j'écoute tous les jours, en alternance, la BBC et Radio France, dont j'apprécie profondément les principes déontologiques. Mais soyons honnêtes : pour absolument toutes les chaînes, la frontière entre objectivité et subjectivité commence et s'arrête exactement là où leur ligne éditoriale la trace. Dans bien d'autres cas, ces prétentions ne sont même qu'une façon cynique de se draper dans l'éthos journalistique, dans le seul but de faire passer en contrebande ses propres opinions. Il serait bien plus honnête que chaque rédaction déclare officiellement la vision du monde qu'elle tient pour dominante. La vérité – et c'est une réflexion plus profonde, mûrie au fil des années de tournage – c'est que la télévision n'est, par définition, jamais objective. La subjectivité commence dès la technique et le choix des cadres. La simple décision du cadreur de tenir la caméra à l'épaule (ce qui donne au plan une dynamique nerveuse) ou de la poser sur un trépied est un choix délibéré, qui influe aussitôt sur la narration et sur la réception émotionnelle. Et il faut encore y ajouter le montage, le tri des informations et le son. L'image de télévision est toujours l'interprétation que quelqu'un donne de la réalité.

Pour moi, la véritable éthique journalistique se résume à un contrat tacite avec le spectateur : mon premier devoir est de ne pas lui faire perdre son temps. Cela exige de raconter les histoires de façon à captiver et à intriguer, même si les mêmes motifs universels des drames et des joies humaines défilent à l'écran depuis des décennies. Dans l'univers impitoyable du journalisme d'interpellation, pratiqué dans une urgence permanente, j'ai appris à trouver l'équilibre entre une vision d'auteur et un pragmatisme brutal. Il ne s'agit pas seulement de tenir une caméra ou de poser des questions difficiles. Il s'agit de donner la parole à ceux qui ne l'ont pas, et de manier le langage visuel de façon à créer du lien, à toucher la corde sensible et à trouver un écho chez le public.

Cela suppose, à son tour, une humilité d'artisan et une préparation rigoureuse. Se documenter sur un sujet, pour moi, ce n'est pas seulement mener un entretien préalable avec les protagonistes. C'est arriver sur place assez tôt pour étudier l'architecture des lieux, évaluer comment tombera la lumière pendant le tournage et de quel côté viendra le soleil. Cette part purement analytique, presque d'ingénieur, du travail sur le terrain me permet de planifier le tournage à froid, pour pouvoir ensuite, au moment décisif, me concentrer uniquement sur la personne et son histoire.

Je n'ai jamais couru après les prix de la profession ni envoyé mes reportages dans des festivals. Pour deux raisons. D'abord, en racontant la vie des autres, souvent leurs drames personnels, je n'ai jamais réussi à me sentir « l'auteur » de ces histoires – je ne m'en reconnaissais tout simplement pas le droit moral. Ensuite, pendant des années, je me suis délibérément forgé la réputation non pas d'un artiste individualiste et capricieux, mais d'un joueur d'équipe fiable. J'ai sciemment renoncé à toute prétention artistique au profit de la fluidité du travail. Je faisais mes sujets pour les éditeurs des magazines – efficacement, dans les délais, sans discussions inutiles. Je veillais à ce que les rouages de la machine tournent sans grincer. Je crois profondément que raconter des histoires importantes et peser réellement sur le monde n'exige pas d'ériger un monument à leur auteur.

### L'IA dans le journalisme {#ai-journalism}

id: `ai-journalism` · langue du texte: FR · 1642 mots · Markdown: https://jakubcwirlej.com/fr/articles/ai-journalism.md

**Résumé (éditorial):** L'auteur, qui utilise l'IA presque tous les jours depuis le lancement de ChatGPT, en reconnaît les risques, avant tout les hallucinations, mais soutient qu'un usage pragmatique de cette technologie renforce le métier : il parle à un chatbot en rentrant de tournage, automatise la transcription et recourt aux outils OSINT, même si aucun modèle ne sait encore tirer un « séquencier » télé d'interviews brutes. Il juge vain de condamner un texte sur sa seule sonorité, les détecteurs d'IA se trompant dans les deux sens, et relève que l'AI Act européen demande qui est responsable d'un texte sans donner au lecteur le moyen de vérifier qui l'a écrit. Il pense que les journalistes qui continuent à chercher et à itérer s'en sortiront bien, et que ce sont avant tout ceux qui se contentent de reproduire des schémas qui perdront leur emploi.

**Points clés (éditorial):**

- Dans une étude de l'UER et de la BBC d'octobre 2025, une réponse sur cinq des assistants d'IA à des questions d'actualité contenait de graves erreurs factuelles, comme des informations inventées ou périmées.
- Sa première application, OrsonAI, est née du besoin de transcrire des interviews en temps réel et de les importer instantanément dans un éditeur.
- Les détecteurs d'IA se trompent dans les deux sens : ZeroGPT a attribué à une machine, à près de 98 %, un extrait de la Déclaration d'indépendance des États-Unis, tandis que deux détecteurs ont jugé très probablement humain un texte dont Wired a établi qu'il était une invention de l'IA.
- Son idée d'un certificat d'origine humaine ancré sur la blockchain n'a suscité aucun intérêt chez ses connaissances du milieu.
- À partir du 2 août 2026, le règlement européen sur l'IA (AI Act) impose de signaler les textes générés par l'IA qui portent sur des questions d'intérêt public, sauf s'ils ont fait l'objet d'un contrôle éditorial et que quelqu'un en assume la responsabilité.

**Texte intégral (les mots de l'auteur):**

Je rentre d'un tournage. Les mains sur le volant, la tête bouillonnante de réflexions et d'impressions toutes fraîches du terrain, j'allume un chatbot et je parle tout simplement avec lui. Je raconte ce que j'ai vu, j'essaie à voix haute les premières phrases du sujet, j'énumère ce qu'il me reste à vérifier. Le bot consigne tout, le met en ordre sous forme de notes et commente mes idées au fur et à mesure. De cette conversation naît parfois une première ébauche du texte, parfois seulement une liste d'observations qui m'aide pour la suite du travail sur le sujet. Avant, le temps d'arriver à la rédaction, bien des idées fugaces, mais excellentes, m'avaient tout simplement échappé. Et quand il fallait revenir sur un sujet quelques jours plus tard, je devais redécouvrir bien des choses.

Comme j'utilise l'intelligence artificielle presque tous les jours depuis le lancement de ChatGPT, j'ai du mal à me retrouver dans le débat sur l'IA dans les médias, où ce sont presque toujours le droit d'auteur, l'éthique et la protection des sources qui passent au premier plan. À juste titre, car les modèles affabulent encore : dans une étude de l'UER et de la BBC d'octobre 2025, une réponse sur cinq des assistants d'IA à des questions d'actualité contenait de graves erreurs factuelles, comme des informations inventées ou périmées. Du point de vue de la rigueur journalistique, les hallucinations sont un cauchemar. Je pense pourtant que, malgré ce risque, un usage pragmatique de cette technologie permettra avant tout de renforcer le savoir-faire journalistique. J'ai moi-même volontiers recours à l'IA, à commencer par l'automatisation des tâches les plus fastidieuses et répétitives. C'est de ce besoin qu'est née ma première application, OrsonAI, conçue pour aider à transcrire les interviews en temps réel et à les importer instantanément dans l'éditeur de texte.

Mais c'est dans la recherche documentaire que se joue la véritable révolution. Les outils d'analyse des sources ouvertes (OSINT), il y a peu encore hors de prix et réservés aux plus grandes agences de renseignement ou aux géants du marché, se sont aujourd'hui radicalement démocratisés. N'importe qui peut se construire, pour ses propres besoins, un agent qui, en quelques secondes, extraira et structurera les données clés documents de plusieurs dizaines de pages. La vérification finale des faits revient en effet toujours à l'humain, mais le simple fait de localiser en un éclair où se trouve une information précise dans un document réduit considérablement le temps de travail du journaliste d'investigation.

Naturellement, la tentation surgit très vite d'aller un cran plus loin : puisque la machine sait lire, qu'elle écrive elle-même le texte. Mon sentiment là-dessus est mitigé, car à ce stade l'intelligence artificielle est tout simplement incapable de faire à ma place ce qui compte le plus dans la fabrication d'un sujet. Aucun modèle ne sait prendre une poignée d'interviews brutes et en tirer un « séquencier » télé cohérent – une structure précise, où les propos des protagonistes s'entrelacent naturellement avec la narration de l'auteur et dialoguent intelligemment avec les images tournées. Fournir à un agent assez de contexte pour qu'il génère un scénario proche de mes attentes demanderait aujourd'hui un travail sans commune mesure avec le résultat final. C'est peut-être une question de temps et des prochaines versions des modèles, mais je n'ai pas encore trouvé d'outil capable de saisir ce niveau de complexité. L'IA se débrouille plutôt bien avec les brèves et les communiqués de presse – à condition que quelqu'un les vérifie ensuite –, mais dans les formats longs, je sens presque toujours qu'il manque un style personnel et de la fluidité.

Cela dit, je ne suis pas un adversaire dogmatique du recours à l'intelligence artificielle dans le travail créatif. L'écriture, soyons honnêtes, relève en partie d'un savoir-faire purement mécanique. Ce qui compte vraiment, c'est l'idée, le regard original et ce que l'auteur a à nous transmettre. Une bonne idée, qui sort des sentiers battus, et une pensée originale finiront tôt ou tard par percer à travers la forme. Je connais bien trop de journalistes qui n'ont rien de neuf à nous dire depuis des années, et dont les textes ressemblent à s'y méprendre à des textes tout faits générés par un algorithme – sans la moindre idée vivante. Il leur manque cette étincelle particulière, cette intelligence qui sort du cadre et cet éclair d'humanité que les mathématiques des modèles de langage ne parviennent toujours pas à saisir.

Quand je lis un article, je sais généralement dès les premières phrases si son contenu résonne en moi. Pour être franc, savoir s'il a été écrit par un humain ou par une machine passe pour moi au second plan derrière cette question : ce texte apporte-t-il quelque chose de nouveau dans ma vie ? Est-il capable de changer mon regard sur le sujet ? D'ailleurs, contrairement à une idée répandue, il est aujourd'hui très difficile de distinguer avec certitude, sur la seule base de la syntaxe, un texte humain d'un texte produit par une machine. En testant des détecteurs de textes générés par l'IA, j'ai vite découvert que des chroniques parfaitement structurées, logiques et rythmées d'éditorialistes connus, écrites dès 2013, étaient parfois étiquetées par ces logiciels comme produites à cent pour cent par une machine. Et cela marche dans les deux sens. Le détecteur ZeroGPT a attribué à une machine, à près de 98 %, un extrait de la Déclaration d'indépendance des États-Unis, et lorsque Wired a vérifié un texte qui – comme la rédaction l'a elle-même établi par la suite – était une invention de l'IA, deux détecteurs ont estimé qu'il avait très probablement été écrit par un humain. Stigmatiser des textes sur la seule base de leur sonorité me paraît donc n'avoir guère de sens.

En tant que lecteur, je juge la valeur d'un texte, pas son auteur, mais la confiance du public repose sur la question de savoir qui en répond. C'est pourquoi je comprends l'approche inverse, puriste : l'idée que, pour des raisons éthiques, le journalisme devrait rester une zone sans machines, en tant que domaine relevant d'une confiance sociale particulière. Seulement, une telle solution exigerait un contrat social ferme et la mise en place de mécanismes garantissant de façon incontestable un certificat d'origine humaine. Ces mécanismes n'existent toujours pas : les certificats d'origine humaine existants sont facultatifs et ne se sont pas imposés comme une norme dans les médias. J'y ai moi-même beaucoup réfléchi en concevant un certificat d'origine humaine ancré sur la blockchain – une preuve immuable de l'identité de l'auteur d'un texte. Mais quand j'ai soumis cette idée à des connaissances du milieu, je me suis heurté à un désintérêt total et à l'incompréhension de ce besoin.

Au bout du compte, même si le journalisme figure aujourd'hui en tête des listes de métiers les plus menacés par l'IA, je pense qu'à l'ère de l'intelligence artificielle, les journalistes dignes de ce nom s'en sortiront plutôt bien. D'abord parce que, tôt ou tard, viendra le moment d'un dégrisement général : la valeur du contrôle humain sur l'information sera prise suffisamment au sérieux pour faire l'objet d'une réglementation adaptée. Les premières règles existent déjà, même si elles vont dans une autre direction : à partir du 2 août 2026, le règlement européen sur l'IA (AI Act) impose de signaler les textes générés par l'IA qui portent sur des questions d'intérêt public, sauf s'ils ont fait l'objet d'un contrôle éditorial et que quelqu'un en assume la responsabilité. La loi demande donc qui est responsable, mais ne donne au lecteur aucun moyen de vérifier qui a réellement écrit.

Ensuite, parce que nos compétences passent parfaitement à l'échelle dans le monde de la technologie. Travailler sur ma propre application et sur l'entraînement d'un modèle m'a fait prendre conscience d'une chose capitale : créer, dans la tech comme dans les médias, c'est selon moi à 90 % un processus que nous, journalistes, maîtrisons depuis longtemps. Un cycle répétitif, fait de deux choses : la recherche et l'itération. On collecte des informations. On vérifie. On synthétise. On améliore. Et on recommence. Pour ceux qui veulent apprendre et comprendre la réalité qui les entoure, l'intelligence artificielle ouvre d'immenses possibilités. Un seul journaliste aguerri, épaulé par des modèles agentiques, peut aujourd'hui faire ce qui exigeait hier toute une équipe de rédaction. C'est une vraie chance d'accroître le contrôle exercé par la société sur les processus à l'œuvre dans le monde.

Qui va donc perdre son emploi ? Avant tout ceux pour qui le journalisme a depuis longtemps cessé d'être une mission pour devenir la reproduction de schémas. Ceux qui écrivent chaque année, sur le même sujet, un texte presque identique. Je ne vois pas une seule raison pour qu'une rédaction, quelle qu'elle soit, les emploie, alors qu'un algorithme fera la même chose plus vite et gratuitement. Je ne me berce pas d'illusions pour autant : le marché n'élimine pas toujours ceux qui se contentent de reproduire. Il élimine parfois les moins chers, ou ceux qui se trouvaient simplement le plus près de la porte. À long terme, la concurrence des machines balaiera pourtant de l'échiquier avant tout ceux qui refuseront d'évoluer et ne voudront pas apprendre. Bien sûr, il est difficile de prédire la direction que prendra une technologie qui se développe aussi vite. Je pense cependant que si l'intelligence artificielle est utilisée de manière éthique dans le travail journalistique – au service du droit naturel et supérieur de chacun à une information fiable –, elle finira, paradoxalement, par renforcer notre profession. Elle deviendra un outil qui ne remplace pas l'humain, mais décuple sa capacité d'agir.

Quand je rentre d'un tournage, je parle au bot et je lui dicte les premières phrases. Il les notera, corrigera les virgules, proposera peut-être un meilleur ordre des mots. Mais c'est moi qui étais sur le tournage, et c'est toujours moi qui décide de ce qui entrera dans le sujet et de ce que le téléspectateur verra à l'écran. Le temps gagné sur les phrases ennuyeuses et répétitives, que l'IA m'aide à automatiser, je peux le consacrer aux protagonistes de mes reportages.

### Mes débuts {#how-i-started}

id: `how-i-started` · langue du texte: FR · 1635 mots · Markdown: https://jakubcwirlej.com/fr/articles/how-i-started.md

**Résumé (éditorial):** L'auteur raconte comment la création d'OrsonAI, un ensemble d'outils d'IA pour son propre travail de journaliste, l'a mené du vibe coding à la recherche sur les hallucinations des modèles de langage, puis à l'entraînement de ses propres modèles. Il décrit l'accueil froid réservé à l'application par la profession, ses études des activations des portes SwiGLU et l'échec de son premier modèle bâti sur sa propre architecture. Aujourd'hui, il entraîne EUGEN 160M, un petit modèle spécialisé dans le code que l'on peut essayer dans un terminal sur le site.

**Points clés (éditorial):**

- OrsonAI proposait la transcription d'interviews en direct, un mode d'édition pour consulter un chatbot sur des passages choisis et des certificats d'origine humaine enregistrés sur le registre public Hedera Hashgraph.
- Il décrit désormais les signaux GSI qu'il a trouvés comme des signaux proxy de la connaissance plutôt que comme une « conscience épistémique » du modèle, et a observé que la confabulation est en grande partie un processus en deux temps.
- Les progrès d'EUGEN 160M reposent sur un suivi étroit, des données d'entraînement ciblées, des données synthétiques STaR et LEMA et des exemples de traduction de Python vers C++, Java et Rust.
- Avec l'aide d'un agent d'IA de programmation, il a construit son propre kernel Triton pour entraîner un modèle sparse : dans un modèle d'environ 300 M de paramètres, la variante sparse s'est entraînée 1,23× plus vite que la dense, et les optimisations suivantes du kernel ont relevé le débit de 36 % de plus.
- Il attribue l'échec de son premier modèle à un problème philosophique, en citant la définition de la vérité de Tarski et les théorèmes de Gödel.

**Texte intégral (les mots de l'auteur):**

…Je n’ai aucune formation formelle en programmation ni en entraînement de LLM.

Je me suis lancé dans le développement d'applications et l'entraînement d'IA à la suite d'un concours de circonstances complètement étrange, qui, avec le recul, me paraît pourtant assez logique. Et qui dit, je crois, quelque chose d'important sur notre époque. Je ne l'avais pas prévu ; je n'imaginais pas avoir un jour plus affaire à la technologie qu'un utilisateur lambda d'iPhone. Pendant des années, ma seule fenêtre sur le monde de la Big Tech a été le podcast Hard Fork. Salut à Casey et Kevin :)

Tout a commencé avec le vibe coding et l'application OrsonAI. En m'amusant avec l'intelligence artificielle, je me suis mis à créer des outils qui pouvaient m'aider dans mon travail quotidien de journaliste. Transcrire les interviews pendant l'enregistrement et les importer dans l'éditeur de texte, ou encore un mode d'édition permettant de soumettre au chat des passages choisis du texte sans jongler entre les fenêtres ni recopier tout le contexte : à l'époque, c'étaient vraiment des outils sympas, qui accéléraient nettement mon travail.

Avec le temps, j'ai commencé à y penser comme à un projet, à quelque chose qui pourrait aussi servir à d'autres. L'idée était simple : partir des fonctions qui me font gagner du temps et en faire un produit pour ceux qui se heurtent aux mêmes problèmes. J'ai consacré beaucoup de temps à concevoir l'interface et des mécanismes capables d'offrir aux rédactions une IA sûre – une IA qui aide le journaliste sans faire le travail à sa place. J'ai même conçu un système délivrant des certificats d'origine humaine pour les textes, publié sur le registre public de Hedera Hashgraph. Une preuve immuable, ayant valeur probante devant un tribunal, qui montre comment le texte a été produit et quelle part l'humain a prise dans sa création.

- [Vous trouverez ici une description de la technologie HDK](https://jakubcwirlej.com/fr/articles/hdk-tech.md)
- [Vous pouvez télécharger ici la bibliothèque HDK gratuite](https://jakubcwirlej.com/files/hdk/hdk-audit-0.1.3.zip)
- [HDK sur Hugging Face](https://huggingface.co/JakCwi/hdk-audit)

J'ai pourtant essuyé une sérieuse déception. Les gens du métier à qui je montrais l'application lui ont réservé un accueil plus que froid. La question qui revenait à la fin de chaque présentation me faisait mesurer douloureusement à quel point je m'étais trompé : « Pourquoi est-ce que quelqu'un paierait pour ton appli, alors qu'on a ChatGPT gratuit ? » Le certificat d'origine humaine, la protection des données, ou même un net gain d'efficacité par rapport à ce que proposait un simple chatbot : rien de tout cela ne comptait. Je l'entendais de la bouche de gens qui rappellent tous les jours l'importance d'un journalisme rigoureux.

Le travail sur l'application, et sur un système d'IA agentique assez fiable pour servir dans des rédactions, m'a toutefois poussé dans une direction entièrement nouvelle. En cherchant à mieux comprendre d'où viennent les hallucinations des modèles de langage, je me suis mis à lire des articles scientifiques publiés sur arXiv, et j'ai fini par concevoir et mener une série d'expériences sur l'activation des portes SwiGLU dans plusieurs modèles de langage ouverts. J'en ai exposé les conclusions dans plusieurs articles, mis en ligne sur ResearchGate. Avec le recul, certaines thèses de ces travaux me semblent mégalomanes, et le texte mériterait sans doute d'être corrigé et doté d'un vocabulaire plus scientifique ; je ne les retire pas pour autant – ne serait-ce que par intégrité scientifique.

Aujourd'hui, avec davantage d'humilité, acquise sur le terrain d'entraînement des modèles de langage, après bien des expériences ratées et des déceptions, si j'écrivais sur les signaux GSI que j'ai trouvés, je parlerais plutôt de signaux proxy de la connaissance que de « conscience épistémique » du modèle. En revanche, des données solides m'ont permis d'observer que la confabulation est en grande partie un processus en deux temps, dans lequel le modèle – faute de pouvoir s'appuyer sur des faits – choisit presque toujours la cohérence de la forme au détriment de la vérité. Ce fut pour moi, personnellement, le moment le plus intéressant de ces expériences : celui où mes anciens intérêts pour la philosophie et l'épistémologie ont trouvé un reflet inattendu, et entièrement mesurable, dans l'architecture des transformers. Reste une autre question : l'utilité au quotidien de ces signaux en conditions de production. Comparer leur efficacité à celle des autres méthodes de détection des hallucinations exigerait sans aucun doute des recherches supplémentaires.

Cette tâche m'a absorbé tout entier. C'est peut-être un peu dans ma nature : j'aime m'investir dans des activités qui représentent un défi, mais qui me permettent aussi d'apprendre quelque chose sur le monde qui m'entoure et de mieux le comprendre. D'ailleurs, avant de me tourner vers le journalisme, j'ai étudié la philosophie, en m'intéressant surtout à la philosophie des sciences et à l'épistémologie.

- [Vous trouverez ici un essai qui résume certaines de mes réflexions](https://www.researchgate.net/publication/397730862)

L'entraînement de mon propre modèle a tourné à la catastrophe totale. J'ai sans doute commis toutes les erreurs possibles, et ce malgré mon habitude de me documenter sérieusement et l'énorme quantité de littérature spécialisée que j'avais engloutie. Les premiers résultats semblaient prometteurs, mais je n'ai compris qu'après coup qu'ils devaient beaucoup à une régularisation par le bruit. L'avantage du modèle dans les tests d'ablation ne compensait pas le surcoût de calcul (compute) qu'imposait le Gini des activations des portes. À cela se sont ajoutés des défis purement techniques liés à l'entraînement. Laissées hors normalisation, mes modifications freinaient l'apprentissage ; normalisées, elles s'aplatissaient, et le modèle devenait un transformer standard, simplement plus cher à entraîner. Je mets les détails de l'architecture en téléchargement ici – peut-être quelqu'un y trouvera-t-il de quoi tirer des leçons des erreurs d'autrui.

Une solution mérite malgré tout, à mon avis, l'attention : la porte M2. Grâce à une ancre affine, elle permet de conserver un fonctionnement fondé sur la fonction sigmoïde sans risquer d'être tirée vers le bas par un optimiseur paresseux, en quête d'un moyen facile de faire baisser la perte d'entraînement. Dans mon modèle, cette porte, apprise à partir des signaux de Gini des activations, devait couper le bruit pendant la génération. Mais sortir le signal de la normalisation – je l'ai dit plus haut – conduisait à un modèle dont la distribution de confiance était excessive : plus habile sur le plan logique, mais de facto moins doué pour apprendre les faits. Cette solution pourrait peut-être servir dans d'autres modèles, pour appliquer un gating à d'autres éléments, et faciliter l'entraînement.

J'ai fini par considérer tous mes échecs d'entraînement sur ma propre architecture comme un capital à ne pas gaspiller. Aujourd'hui, j'entraîne mon propre petit modèle, EUGEN 160M, spécialisé dans le code. Au vu de ses résultats aux benchmarks jusqu'ici, je suis d'un optimisme prudent et je pars du principe que ce ne sera pas du temps perdu. J'ai choisi un modèle spécialisé dans les langages backend parce qu'avec ce type d'architecture, il est plus facile de suivre les progrès, et que le modèle lui-même peut faire un outil d'autocomplétion utile, capable de tourner en inférence sur un simple CPU. On peut tester le modèle dans un terminal spécialement conçu sur mon site, et le comparer à d'autres solutions ouvertes de taille similaire.

- [Vous pouvez tester le modèle Eugen 160M ici](https://jakubcwirlej.com/fr/ai-dev/#terminal)

Les résultats obtenus jusqu'ici, je les dois avant tout à un suivi rigoureux des progrès du modèle et des erreurs qu'il commet lors de la génération. Cela m'a permis d'intervenir au fil de l'eau, en ajoutant des données d'entraînement pour renforcer le modèle là où il montrait des faiblesses. J'ai aussi eu régulièrement recours aux techniques STaR et LEMA, en créant des données synthétiques à partir de ce que le modèle avait lui-même généré, ainsi que des données de traduction qui enseignent au modèle la logique du code en lui montrant des exemples de traduction entre le Python et le C++, le Java ou le Rust. L'ensemble de ces données représente actuellement environ 0,35 % du jeu de données total, et leur part augmentera progressivement à mesure que l'entraînement avancera.

Travailler sur l'entraînement du modèle m'amuse énormément et – comme autrefois le journalisme – me donne le sentiment de faire quelque chose d'important ; quelque chose qui m'aide à mieux saisir les transformations du monde qui m'entoure. Je ne suis pas capable d'écrire seul un code C++ complexe en partant de zéro, c'est un fait, mais j'essaie de comprendre la logique des processus. C'est ainsi que j'engrange de petites victoires, qui me permettent d'avancer dans mon travail. Oui – avec l'aide d'un agent IA de codage, j'ai créé mon propre kernel Triton, qui permet d'entraîner un modèle sparse en améliorant le TPS (Tokens Per Second) de 23 % par rapport à un modèle dense ; les optimisations suivantes du kernel y ont ajouté 36 %. J'ai l'intention de m'en servir pour entraîner mon prochain modèle, un peu plus grand.

- [Vous pouvez télécharger le kernel ici](https://jakubcwirlej.com/files/eugen-sparse.zip)
- [Le kernel sur Hugging Face](https://huggingface.co/JakCwi/eugen-sparse)

Mais revenons au modèle par lequel tout a commencé… Aujourd'hui, je vois bien que ma plus grande erreur n'était pas une naïveté d'ingénieur. Ce modèle n'avait tout simplement aucune chance de fonctionner comme je l'avais prévu. Le problème n'était pas technologique, mais purement philosophique. Et moi qui ai étudié la philosophie, j'aurais dû le repérer dès le départ, avec en tête la définition de la vérité de Tarski et les théorèmes de Gödel. Selon eux, aucun système suffisamment complexe ne peut démontrer pleinement sa propre cohérence, ni définir la vérité depuis son seul niveau. Tenter de forcer le modèle à analyser, évaluer et corriger ses propres états internes en temps réel l'enfermait dans une boucle structurelle dont – sans métaniveau ni point de référence extérieur – il n'y avait tout bonnement pas d'issue.

Quand je me suis lancé dans cette aventure, je voulais simplement créer un outil pour faciliter la transcription des interviews journalistiques. Mais il est très vite apparu qu'entrer dans le monde de l'intelligence artificielle, c'était plonger pour de bon dans le terrier du lapin d'« Alice au pays des merveilles » – plus on descend, plus tout devient complexe, stratifié et fascinant. Ma première application n'a peut-être pas révolutionné le marché des médias, mais cette chute dans le terrier m'a conduit au point où j'entraîne avec succès ma propre architecture. J'ai parcouru un long chemin, de l'auditeur passif de podcasts tech à quelqu'un qui façonne concrètement les paramètres des modèles et comprend ce qui se passe à l'intérieur.

### Ce que j'ai appris en entraînant mon propre modèle {#training-lessons}

id: `training-lessons` · langue du texte: FR · 2822 mots · Markdown: https://jakubcwirlej.com/fr/articles/training-lessons.md

**Résumé (éditorial):** Dix leçons pratiques tirées de l'expérience de l'auteur, qui entraîne lui-même des modèles de langage. Elles portent sur les estimations de calcul trop optimistes, le fait de commencer petit, la surveillance constante, les changements isolés et les tests d'ablation, le choix des données, des attentes réalistes, la patience pendant les plateaux et le besoin de plus d'un GPU. Il conclut que les petits modèles spécialisés construits par des particuliers ont toujours un sens.

**Points clés (éditorial):**

- L'utilisation réelle du matériel (MFU) est bien inférieure à ce que suggèrent les fiches techniques ; son premier modèle, de 1,5 milliard de paramètres, est resté sous-entraîné.
- Suivre les normes et comparer chaque jour les réponses révèle des problèmes que la loss ne montre pas ; il est passé d'AdamW à MuonH.
- Il faut ne changer qu'une chose à la fois ; il a dû reconstruire son jeu de données à partir de zéro trois fois.
- Les capacités progressent souvent par bonds après de longs plateaux, et surveiller le top10 peut montrer des progrès que le top1 cache.
- De petits modèles ciblés, exécutables en local ou sur CPU, peuvent être plus rentables que les plus grands modèles, et en entraîner un est le meilleur moyen de comprendre comment fonctionne l'IA.

**Texte intégral (les mots de l'auteur):**

#### 1. Les calculs faits sur le papier seront toujours trop optimistes

Quand on pense à l'entraînement d'un modèle, c'est naturellement le processus d'apprentissage automatique qui vient à l'esprit – un travail qu'accomplissent pour nous de puissants clusters Nvidia dans des centres de données ou, avec un peu plus de chance, notre propre station de travail, d'une puissance infernale. En lisant les fiches techniques, on oublie facilement que le MFU (Model FLOPs Utilization) réel est bien inférieur à ce que suggèrent les documents marketing des fabricants de cartes. Selon l'architecture et la granularité, le matériel ne vous laissera tirer du silicium qu'une fraction de sa puissance de calcul. À quoi bon une carte qui calcule en FP4, si l'entraînement d'un modèle de base à partir de zéro n'y est pas stable, ou si, à la largeur de votre modèle, descendre sous le BF16 n'apporte aucun gain ?

Le moment où vous comprenez que vous ne pourrez pas entraîner le modèle prévu dans les délais escomptés, ni même dans une taille approchante, n'est pas facile à vivre. Surtout si vous avez passé des semaines à arriver au point où vous pouvez lancer l'entraînement, pour découvrir soudain que tout le plan était irréaliste. Sur le papier, pourtant, tout collait ! Premier réflexe : chercher des méthodes d'optimisation – torch compile, autocast, flash attention, FLCE, des têtes et un minibatch dont la taille est calée sur les préférences de CUDA. Tout cela fonctionne, mais on ne triche pas avec la physique du silicium. Si vous entraînez un petit modèle, sa faible largeur jouera contre vous. Si vous n'avez pas les moyens d'entraîner un grand modèle, vous n'avez pas non plus les moyens de tirer le maximum de votre GPU. Arriver à exploiter la carte de façon optimale peut prendre des jours, et une baisse finale du TPS (Tokens Per Second) de 30 à 40 % à l'entraînement par rapport aux calculs initiaux, cela représente des jours, voire des semaines de travail de la carte.

#### 2. Commencez toujours à la plus petite échelle capable de valider vos idées

Mon premier modèle comptait 1,5 milliard de paramètres, et je n'ai pu l'entraîner que jusqu'à trois Chinchilla. J'ai commis beaucoup d'erreurs en le construisant, mais il fonctionnait malgré tout. Ce qui l'a condamné à n'être presque d'aucune utilité, c'est avant tout le sous-entraînement. Si, avec le même budget, j'avais choisi d'entraîner un modèle dix fois plus petit, j'aurais pu me targuer d'un modèle bien entraîné et utile. J'aurais eu le temps de faire des tests et j'aurais certainement évité bien des erreurs, ce qui m'aurait permis de construire une meilleure architecture. Bien sûr, la taille compte, mais les données, l'architecture et l'efficacité de calcul comptent encore davantage. Les chances de concevoir un bon modèle à partir de la littérature, sans tests et sans erreurs, sont à peu près celles de gagner au Loto.

#### 3. Un modèle ne s'entraîne pas tout seul

Entraîner un modèle, ça a l'air sympa, mais c'est bien plus ennuyeux qu'on ne l'imagine. En réalité, il s'agit surtout de concevoir sans cesse des expériences, de faire des mesures, d'analyser les résultats du modèle et de chercher des solutions aux problèmes qui surgissent en cours de route. Tout le temps, en boucle, jour après jour. Si vous ne savez pas tirer de satisfaction des petites découvertes et des modestes réussites, cela risque de vous paraître trop ennuyeux. Or c'est précisément une constance de fer dans les mesures qui décide de tout. Même avec des paramètres d'entraînement bien choisis, il peut s'avérer avec le temps que notre modèle a besoin de nouvelles données, ou qu'il se dégrade d'une manière difficile à repérer au premier coup d'œil. Vous ne le remarquerez pas sans un bon monitoring et des tests continus, et moins vous en faites, plus vous perdrez de temps si le modèle se met à se comporter de manière indésirable.

Prenons un scénario fréquent. Après quelques jours d'entraînement, vous vous apercevez que le modèle répond de plus en plus brièvement, tout en étant de plus en plus sûr de lui. La loss et l'ensemble held-out ont bonne mine, mais quelque chose cloche avec le modèle. Si vous analysez les normes au fil de l'eau et comparez chaque jour les réponses du modèle à celles de la veille, vous pouvez vite repérer la hausse des logits et comprendre que le modèle attribue une probabilité de plus en plus forte à certains tokens. Cette arrogance est une ruse de l'optimiseur paresseux : AdamW a trouvé le moyen de nous tromper et, au lieu de faire apprendre le modèle, il réduit la perte autrement. Si vous le repérez au bout de quelques jours, vous en serez peut-être pour quelques dizaines de dollars ; si vous laissez tourner l'entraînement en comptant sur le GPU Nvidia pour faire tout le travail, vous risquez d'en dépenser des centaines, voire des milliers, et le modèle sera peut-être déjà impossible à sauver.

J'ai moi-même passé des semaines à regarder Adam gonfler les normes de mes modèles, en abaissant le learning rate (LR) effectif, et ce malgré la normalisation QK-norm et un weight decay de 0,1. L'entraînement ralentissait, à me désespérer, car, comme on le sait, c'est le théorème de Pythagore qui joue ici : plus le vecteur de poids grandit, plus il est difficile de le faire tourner avec un LR constant. Le phénomène est bien décrit dans la littérature, mais tant que vous ne l'aurez pas vu de vos yeux, vous ne comprendrez pas pourquoi il vaut mieux passer à un autre optimiseur. Après tout, AdamW a permis d'entraîner des centaines de modèles. J'ai finalement opté pour MuonH, et ce fut l'une des meilleures décisions que j'aie prises. Bien sûr, beaucoup de choses de ce genre se trouvent dans la littérature, dans les manuels ou dans les articles publiés sur arXiv, mais on ne sait jamais comment elles fonctionneront chez soi. Nombre de solutions qui, en théorie, devraient apporter des bénéfices bien documentés n'ont pas fonctionné chez moi. Vous n'en aurez le cœur net qu'en vérifiant par vous-même, et pour cela, il faut rester vigilant et suivre les progrès en continu.

#### 4. Ne changez jamais qu'une seule chose à la fois, et faites des tests d'ablation

Ces derniers mois, j'ai testé des centaines de petits modèles – aussi bien des transformers classiques que mes propres idées… et je sais aujourd'hui que je n'ai pas assez testé. À vouloir avancer trop vite, j'ai perdu du temps pour rien. Nombre de couches, ratio FFN, d_model, partage des poids, taille des têtes, nombre de têtes KV, batch, optimiseur, récurrence, parcimonie (sparsity), données d'entraînement : les facteurs qui influent sur le comportement du modèle se comptent par dizaines, et leurs combinaisons donnent des milliers d'architectures possibles. Et même si, grosso modo, tout fonctionne comme on peut s'y attendre après avoir lu un premier manuel d'ingénierie de l'IA, tant que vous n'aurez pas testé vous-même votre architecture, vous ne saurez pas où vous en êtes. Or de petites modifications peuvent souvent entraîner de grandes différences d'efficacité de calcul et de résultats aux benchmarks, et ce à jeu de données et taille de batch identiques. Si vous n'introduisez pas les changements un par un, il est facile de s'y perdre. J'ai moi-même commis cette erreur bien des fois. Ce n'est pas que les modifications étaient mauvaises. Même si elles l'étaient souvent. Le vrai problème, c'est que lorsque je faisais réellement un pas en avant, j'étais incapable de dire à quelle modification je le devais.

#### 5. Commencez par les données

Pour entraîner un petit modèle, Hugging Face offre un réservoir de données d'une ampleur inimaginable. On pourrait croire que, si ces données sont à portée de main, en quantités qui dépassent largement les besoins de n'importe quel projet de garage, l'affaire est réglée. Pourtant, le choix des données compte bien plus qu'on ne le pense au départ. Et le fait qu'elles aient déjà été rassemblées en jeux de données prêts à l'emploi ne simplifie en rien les choses. S'y ajoute le choix du bon tokeniseur, des langues qu'on veut apprendre au modèle, ou des proportions. Par exemple, décider quelle part des données doit être du code, quelle part des mathématiques et quelle part de la langue naturelle. Puis choisir les domaines dans lesquels notre modèle doit se spécialiser. Plus on creuse, plus les possibilités se multiplient. J'ai moi-même dû préparer mon jeu de données à partir de zéro pas moins de trois fois. J'ai aussi connu quelques ratés de moindre ampleur, comme une fuite du template instruct que je n'avais pas repérée lors de la préparation des données. Chacune de ces erreurs m'obligeait à ramener l'entraînement plusieurs heures, voire plusieurs jours en arrière.

#### 6. N'en attendez pas trop

À voir les grands laboratoires, et les plus petits, repousser sans cesse les limites de ce dont l'IA est capable, on a vite fait de croire qu'entraîner un modèle utile est au fond une affaire simple. Mais si repousser ces limites coûte des milliards de dollars, ce n'est pas sans raison. Que votre modèle se mette à parler comme un humain ou qu'il obtienne de bons scores sur les benchmarks populaires ne dit rien de sa qualité finale ni de son utilité. Les modèles apprennent très vite au début, dans les premiers jours de l'entraînement, mais chaque point de pourcentage supplémentaire se gagne à force d'astuce, d'attention et d'abnégation. Surtout quand, pendant des jours, vous voyez le modèle stagner sur un plateau, voire régresser. Par ailleurs, les benchmarks populaires en disent peu sur les capacités réelles d'un modèle. Votre modèle peut être bon en Python et faire d'excellents scores sur HumanEval et MBPP, mais s'il ne connaît pas les bibliothèques les plus récentes, son utilité dans le monde réel restera modeste.

#### 7. Armez-vous de patience

Beaucoup de capacités des modèles progressent par bonds. Ce phénomène bien décrit, le grokking, est souvent précédé d'un long plateau qui peut durer des jours. Quand vous voyez le modèle ne faire aucun progrès, alors que chaque heure d'entraînement vous coûte des dollars en location de puissance de calcul, ou ne serait-ce qu'en électricité, difficile de ne pas douter. Vous vous dites : « Le modèle a atteint sa capacité, il n'apprendra plus rien », ou : « Les grands labos, qui entraînent jusqu'à 1000× Chinchilla, ont sûrement des astuces. » Or les capacités progressent souvent par bonds. Il suffit que le modèle apprenne à terminer proprement une fonction pour que, d'un coup, ce ne soit plus une seule tâche de MBPP qui passe, mais une bonne dizaine. Souvent aussi, le modèle fait de vrais progrès, mais si, par souci d'économie, vous ne surveillez que le top1 des réponses au lieu du top10, vous pouvez ne rien en voir pendant longtemps. Le modèle doit apprendre à attribuer davantage de confiance, et cela prend du temps.

#### 8. Une seule carte ne suffit pas

On pourrait croire que, si vous disposez d'un H100 ou d'une RTX PRO 6000 (96 Go), seul votre budget vous limite. Le problème, c'est que l'entraînement exige des tests et des mesures en continu, pour savoir où l'on en est. Un GPU de plus peut aussi être nécessaire pour générer des données d'entraînement supplémentaires. J'ai moi-même fait des progrès notables dans l'entraînement de mon modèle avec la méthode STaR, qui consiste à faire générer par mon propre modèle une grande quantité de tâches et à ajouter au jeu de données celles qui sont correctes, ainsi qu'avec un ensemble de données contenant des exemples de traduction entre langages de programmation

Interrompre l'entraînement sur une carte puissante le temps que le modèle génère des réponses coûte très cher et n'est tout simplement pas rentable ; générer en parallèle – même si la VRAM le permet – peut faire courir un risque sérieux. La dernière chose que vous souhaitez, c'est découvrir au bout de trois jours, quand les résultats du modèle chutent, que pendant la génération lancée sur la carte à côté de l'entraînement, le loader a connu par exemple un « affamement » passager, et que la loss a de ce fait discrètement cessé de baisser. À un stade avancé de l'entraînement, ce genre de chose est souvent extrêmement difficile à repérer, même avec un monitoring qui vous alerte en cas de pics de normes.

#### 9. Commencez par quelque chose de simple

J'ai commencé à construire mon premier modèle sur une intuition : on pouvait exploiter, dans l'entraînement d'un LLM, les propres activations du modèle, et les suivre pendant l'apprentissage devait aider à construire un modèle plus intelligent et plus véridique. Aujourd'hui, je n'en reviens pas d'avoir abordé les choses avec tant de naïveté. Non pas parce que je pense aujourd'hui que c'est impossible, mais parce que, sans avoir la moindre idée de ce à quoi ressemble l'entraînement d'un LLM, je me suis mis à expérimenter avec quelque chose qui me dépassait. J'ai dû assimiler une énorme quantité de connaissances, tout en testant à la fois des solutions propres à l'architecture des transformers classiques et mes propres idées, qui – le temps l'a montré – étaient en grande partie irréalisables.

J'ai alors buté sur toute une série de problèmes : une fois normalisé, le signal d'activation des portes SwiGLU perdait son sens ; sans normalisation, AdamW exploitait mes modifications pour gonfler les normes du modèle. Ce n'est qu'avec le temps que j'ai compris qu'une bonne partie des avantages que j'avais trouvés à mon premier modèle venait d'un phénomène proche d'une régularisation par le bruit. De plus, le seul calcul du Gini à partir des activations des portes SwiGLU coûtait cher : il ajoutait quelques pour cent de compute, sans que les résultats le rentabilisent en qualité.

J'entraîne actuellement un petit modèle de 160M d'architecture standard, spécialisé dans le code. C'était la meilleure décision que je pouvais prendre, car je me suis donné une chance de créer quelque chose qui puisse être réellement utile. Et les premiers résultats du modèle montrent que les leçons tirées de mes erreurs n'ont pas été perdues.

#### 10. Ne construisez pas un modèle censé être bon en tout

Vu les coûts astronomiques, et la faisabilité même de l'entreprise, construire un modèle généraliste quand on est seul ou une petite structure n'a aujourd'hui aucun sens, pour des raisons purement économiques. Face aux géants, ou même aux plus petits laboratoires qui publient des modèles ouverts, la partie est perdue d'avance sans des moyens et une expérience considérables. Mais cela ne veut pas du tout dire que construire ses propres modèles n'a pas de sens.

On peut imaginer des centaines d'applications où de petits modèles entraînés à partir de zéro, ou affinés sur des données uniques, auront l'avantage sur les géants – et cet avantage ne tiendra pas forcément au savoir. Il suffit que le modèle soit rapide et puisse tourner en local dans un navigateur, ou sur le processeur de n'importe quelle station de travail. Pour des usages précis et étroits, il peut être bien plus rentable d'utiliser un micro-modèle de quelques centaines de millions de paramètres que de mobiliser les modèles les plus puissants d'OpenAI ou d'Anthropic. Ce n'est pas qu'une question de coût. Même si l'écart est colossal. Un modèle spécialisé dans un domaine étroit est bien plus facile non seulement à entraîner, mais aussi à contrôler et à adapter aux besoins de l'utilisateur. Et surtout, c'est une tâche qui reste à la portée d'une personne ordinaire, prête à relever ce défi.

Les modèles des grands laboratoires sont entraînés sur des milliers de puces très coûteuses. Un exemple : l'entraînement d'un modèle de la classe de Llama 3 400B a nécessité un cluster de 16 000 cartes H100. Les coûts se chiffrent en dizaines de millions de dollars. L'entraînement du tout dernier GPT Astra a probablement placé la barre bien plus haut. Comme tout ce secteur se développe à crédit, et que le déploiement de l'IA à grande échelle, avec les coûts actuels des API et les questions de sécurité des données, est souvent difficile à justifier sur le plan économique, on peut s'attendre à ce qu'à long terme, les petits modèles jouent un rôle croissant. Les petits modèles seront aussi de plus en plus performants. Je ne serais pas surpris qu'à l'avenir, un modèle de l'ordre de 7 milliards de paramètres nous suffise pour la plupart des tâches. L'éclatement de la « bulle de l'IA », dont les médias parlent de plus en plus souvent, ne pourrait qu'accélérer ce processus.

C'est pourquoi je pense que construire de petits modèles a un sens profond. D'abord, il n'y a pas de meilleur moyen de comprendre comment fonctionne l'IA que d'entraîner son propre modèle. Ensuite, même si, dans les grands laboratoires, le développement de l'IA est de plus en plus souvent assuré… par l'IA elle-même, on peut s'attendre à ce que l'humanité, prenant au sérieux les questions de sécurité, exige un contrôle et une supervision humaine du processus d'entraînement. Pour cela, il est indispensable de comprendre comment ce processus se déroule en pratique. Bien sûr, il suffit aujourd'hui d'ouvrir LinkedIn pour être submergé de publications sur l'intelligence artificielle, signées des spécialistes les plus divers, qui proposent tutoriels et formations. Mais combien d'entre eux ont réellement entraîné leur propre modèle ?

### Données d’entraînement {#training-data}

id: `training-data` · langue du texte: FR · 171 mots · Markdown: https://jakubcwirlej.com/fr/articles/training-data.md

**Résumé (éditorial):** Le mélange d'entraînement d'EUGEN 160M par dépôt Hugging Face : 14 lignes couvrant 93,4 % du flux de jetons actuel. Dolma 3 en est la plus grande part (35,29 %, dont Stack-Edu et Common Crawl par thème), suivie de The Stack v3 (15,44 %) et des historiques de commits de CommitPack et de jeux apparentés (10,46 %). Les données propres – solutions STaR générées par EUGEN et vérifiées par des tests, plus des paires de traduction de code – représentent environ 0,35 % du mélange.

**Points clés (éditorial):**

- Chaque ligne donne les identifiants exacts des dépôts Hugging Face ; les sources sans origine HF confirmée sont omises.
- Le code de GitHub Code Clean est limité aux licences permissives (MIT, Apache-2.0, BSD, ISC, Unlicense, CC0, Artistic-2.0).
- Les mathématiques proviennent notamment d'OpenMathReasoning, d'OpenR1-Math-220k et de FineMath.
- Le corpus compte environ 904,5 milliards de jetons, répétitions voulues comprises.

**Texte intégral (les mots de l'auteur):**

| Jeu de données (Hugging Face) | Part | Licence / remarques |
| --- | --- | --- |
| Dolma 3 (dont Stack-Edu et Common Crawl par thème) : 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 (compilation), dans le respect de l’opt-out BigCode |
| bigcode/commitpack, bigcode/commitpackft, project-themis/git-commits-merged, CarperAI/github-diffs-deduped | 10,46 % | dépôts sous licences permissives ; CommitPackFT et github-diffs-deduped MIT, git-commits-merged Apache-2.0 |
| codeparrot/github-code-clean | 6,63 % | licences permissives uniquement : 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 % | licences ouvertes (Common Pile) |
| nvidia/OpenMathReasoning, open-r1/OpenR1-Math-220k | 4,18 % | CC BY 4.0 (OpenMathReasoning) |
| HuggingFaceTB/finemath (sous-ensembles 3+ et 4+) | 3,95 % | ODC-By |
| allenai/peS2o | 3,32 % | ODC-By |
| instructions et raisonnement : 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 % | selon la licence de chaque jeu |
| livres : allenai/dolma3_mix-6T-1025-7B, common-pile/project_gutenberg_filtered, common-pile/pre_1929_books_filtered, common-pile/library_of_congress | 1,84 % | domaine public / ODC-By |
| HuggingFaceFW/finewiki, hltcoe/megawika | 1,60 % | selon la licence de chaque jeu |
| open-thoughts/AgentTrove | 1,47 % | trajectoires réussies uniquement |
| mandarjoshi/trivia_qa, microsoft/ms_marco, hotpotqa/hotpot_qa, rungalileo/ragbench | 1,00 % | 30 % sont des exemples propres « pas de réponse dans le contexte » construits à partir de ces jeux |
| données propres : STaR (solutions d’EUGEN vérifiées par des tests), apprentissage par les erreurs, paires de traduction Python ↔ C++, Java, Go, Rust | 0,35 % | propres |

### Quelques réflexions sur la sécurité de l'IA {#ai-safety}

id: `ai-safety` · langue du texte: FR · 1830 mots · Markdown: https://jakubcwirlej.com/fr/articles/ai-safety.md

**Résumé (éditorial):** Un essai sur la sécurité de l'IA dans lequel l'auteur critique un débat public superficiel, partagé entre technomaximalistes et prophètes de l'apocalypse. Il soutient que le pire a probablement déjà commencé, au vu des armes autonomes, de la surveillance croissante et de l'idéologie technomaximaliste, et que la responsabilité doit toujours revenir aux humains, car les machines n'ont pas d'agentivité propre. Il propose des mesures réglementaires concrètes et met en garde contre l'anthropomorphisation de l'IA.

**Points clés (éditorial):**

- Il voit trois possibilités : que nous soyons condamnés, que nous apprenions à contrôler l'IA, ou que la fin ait déjà commencé ; selon lui, les trois peuvent être vraies à la fois.
- Il propose que l'entraînement des modèles jusqu'à environ 1 milliard de paramètres soit autorisé à tous, et que les modèles d'environ 7 milliards soient réservés à des organisations enregistrées qui consignent les interactions de leurs agents.
- Autres propositions : des Défenseurs de l'intérêt public rémunérés par le régulateur public au sein des laboratoires qui construisent des modèles de pointe, et une taxe technologique dédiée pour financer la transition vers une économie fondée sur les machines.
- Il suggère de licencier les données d'entraînement par l'intermédiaire d'organismes de gestion collective des droits comme le ZAiKS.
- Le pire avenir qu'il décrit n'est pas celui des robots tueurs, mais un lent glissement vers une technocratie de surveillance et la solitude humaine.

**Texte intégral (les mots de l'auteur):**

Ce texte est l'un des plus difficiles auxquels j'aie jamais eu à me confronter. Journaliste et, en même temps, homme qui entraîne ses propres modèles chez lui, je me tiens à deux pôles opposés. D'un côté, l'ingénierie pure me fascine ; de l'autre, j'ai pleinement conscience que la sécurité de l'intelligence artificielle est probablement le plus grand défi de l'époque que nous vivons.

Je commencerai par ce qui me fait personnellement le plus mal : l'appauvrissement tragique du débat public sur la sécurité de l'IA. C'est un débat plein de contradictions et d'une charge émotionnelle extrême. Difficile d'ailleurs qu'il en soit autrement, quand sont en jeu des intérêts qui se chiffrent en milliards et la survie des êtres humains.

D'un côté, on nous dit que l'IA est une menace mortelle et que son développement risque de conduire à l'anéantissement de l'humanité. De l'autre, que ces visions apocalyptiques ne sont qu'un jeu cynique des géants, qui veulent faire grimper la valorisation de leurs actions avant leur introduction en Bourse, ou bloquer et freiner le développement des petites entreprises pour préserver leur monopole et leur place en tête du peloton. Le commun des mortels, qui n'a pas le temps de suivre tout cela et attend des solutions simples, peut facilement basculer dans le camp des technomaximalistes ou dans celui des prophètes de l'apocalypse. Chacune de ces visions est si lisse, si évidente… et aucune n'exige rien de plus de notre part. Car enfin, si nous sommes impuissants face à des forces qui nous dépassent, nous n'avons pas à agir. À notre époque de maximalisme extrême, c'est une position bien confortable.

Que répondrais-je, moi, à mon enfant s'il me demandait si l'IA représente une menace pour nous ? En refusant tout recadrage simplificateur, je devrais admettre qu'il existe trois possibilités : que nous soyons effectivement condamnés à l'anéantissement ; qu'il n'ait finalement pas lieu (parce que – comme le soutient Yann LeCun – nous apprendrons tout simplement à maîtriser cette technologie) ; ou… que cet anéantissement ait déjà commencé. Le paradoxe, c'est que ces trois scénarios peuvent être vrais en même temps.

Si le pire a probablement déjà commencé, c'est en raison d'un fait qui perce rarement dans le débat grand public : toute technologie, toute invention doit rencontrer son époque et un terrain favorable pour exister pleinement. L'énergie nucléaire – si souvent invoquée comme point de comparaison dans ce débat – représentait une menace mortelle au temps de la guerre froide, mais en temps de paix, elle est devenue une source d'énergie bon marché, contribuant au boom économique. On peut en dire autant de la plupart des inventions : de la taille du silex à l'intelligence artificielle, en passant par la dynamite.

Notre monde est malheureusement devenu un lieu où le scénario catastrophe trouve des conditions quasi idéales pour se réaliser. Conflits armés recourant à des armes autonomes, surveillance croissante des citoyens par les États et les entreprises, adoption irréfléchie par les gouvernements des standards du monde de l'entreprise dans leur communication avec la société : tout cela forme une infrastructure toute prête pour les visions les plus sombres.

Pendant ce temps, l'idéologie du technomaximalisme, qui nous pousse vers ces menaces – en raillant ouvertement la faiblesse, en plaçant le profit économique et la force brute au-dessus du capital social et de la sécurité –, construit un monde où une IA qui aura rompu sa laisse prospérera à merveille. Et alors, le scénario catastrophe pourrait bien devenir inévitable.

Il n'y a là rien de nouveau. Ce débat dure pour ainsi dire depuis l'agora athénienne, où Platon se querellait avec Socrate, et l'histoire humaine est pleine de moments sombres et d'injustices. Ce qui se passe aujourd'hui dans la politique américaine, et qui, pour beaucoup d'Européens, sent le fascisme, n'a rien de nouveau, comme le souligne avec justesse l'historien Jon Meacham dans son livre « The Soul of America ». La force de la démocratie, c'est que la justice – si lente soit-elle – finit toujours par l'emporter grâce aux institutions. Il peut d'ailleurs en aller de même avec l'IA – c'est notre technologie, et nous apprendrons à la maîtriser, comme nous l'avons fait avec les avions, ainsi que le rappelle LeCun.

Avec la modeste expérience que j'ai de l'entraînement d'IA, je reste stupéfait de voir à quel point cette technologie est fragile. Il suffit de légères modifications des hyperparamètres pour que le modèle s'effondre complètement entre les mains de l'ingénieur. Mais on peut en dire autant des virus biologiques. Ce qui compte chez eux, ce n'est pas une intelligence hors du commun ni la capacité de survivre à tout prix, mais l'aptitude à se répliquer. Cette aptitude, l'intelligence artificielle ne l'a pas encore, semble-t-il, et pourrait ne pas l'avoir de sitôt. Le problème, c'est que, comme le montrent les récentes affaires de fuite d'agents IA autonomes hors des laboratoires et leurs actions coordonnées en ligne, la menace grandit. Et malgré cela, nous n'entendons rien d'autre que le récit sans cesse ressassé de deux courants extrémistes – sans la moindre solution concrète, sans la moindre conclusion.

Ce qui distingue les modèles actuels d'un code malveillant comme celui qui a, par exemple, attaqué Hugging Face ou des serveurs australiens, c'est avant tout la capacité d'agir (agency). Or la capacité d'agir ne peut jamais être l'apanage d'une machine. Ce qui fait de nous des humains, c'est notre libre arbitre. Aucune autre intelligence – artificielle – ne peut avoir de capacité d'agir garantie autrement que par l'humain qui lui prête cette volonté. De ce principe simple devraient découler l'ensemble des responsabilités et la réglementation, traduites en dispositions législatives concrètes. Le droit d'entraîner des modèles et de les utiliser sans restriction devrait dépendre de l'évaluation des risques et des capacités de contrôle de chaque entité.

Rien n'empêche d'autoriser à tous l'entraînement des plus petits modèles – par exemple jusqu'à 1 milliard de paramètres. Mais les modèles moyens, de l'ordre de 7 milliards de paramètres, ne devraient selon moi pouvoir être entraînés et téléchargés que par des organisations enregistrées, qui consignent en détail toutes les interactions de leurs agents (logs) et sont prêtes à les communiquer en cas de problème. Rien de futuriste là-dedans : la cryptographie le permet dès aujourd'hui, pour un coût marginal. Chaque agent opérant en ligne pourrait disposer d'une sorte de « carte d'identité », permettant de l'identifier en lien avec l'organisation qui le représente.

Et les grandes entreprises qui développent des modèles de pointe (frontier models) ? Elles pourraient par exemple être tenues d'employer des Défenseurs de l'intérêt public. Il s'agirait de spécialistes nommés et rémunérés exclusivement par le régulateur public – des salariés ayant accès à tous les secrets technologiques du laboratoire, tenus de faire rapport à l'État lorsqu'ils voient leur entreprise enfreindre les normes de sécurité ou se lancer dans des actions extrêmement risquées dans sa course contre la concurrence.

Les États ont aussi la possibilité, et le devoir moral, d'instaurer une taxe technologique affectée. Ces fonds doivent servir à sécuriser la transition : le passage d'une économie fondée sur le travail humain à une économie fondée sur les machines. Un tel fonds assurerait un filet de sécurité, réduirait les inégalités criantes et protégerait des millions de personnes d'une dépendance économique totale envers le bon vouloir de la caste la plus riche des seigneurs féodaux de la tech.

Le même pragmatisme systémique doit s'appliquer aux droits d'auteur sur les contenus qui servent à entraîner les modèles. Aujourd'hui, les géants de la tech aspirent sur le Web tout ce qui leur tombe sous la main, en comptant sur le fait que d'éventuels procès dureront des années. Or la solution est sur la table, et elle repose sur des institutions que nous connaissons déjà très bien : les sociétés de gestion collective des droits d'auteur, comme la ZAiKS polonaise ou ses équivalents étrangers. Rien n'empêche qu'elles fédèrent les créateurs prêts à concéder sous licence leurs textes, leurs images ou leur musique aux entreprises qui entraînent des IA, en échange d'une fraction de pour cent des revenus de la Big Tech. C'est un système où tout le monde est gagnant. Les créateurs retrouvent leur capacité d'agir et une vraie rémunération, avec le plein droit d'exclure leurs œuvres de l'entraînement. Les laboratoires d'IA, eux – puisque ces sociétés coopèrent entre elles à l'échelle internationale –, obtiennent d'une seule signature au bas d'un contrat un accès pleinement légal à de vastes bases de données juridiquement saines, venues du monde entier. Ainsi, au lieu de querelles stériles, nous pourrions bâtir de toutes pièces une puissante industrie de la licence équitable des données.

Ce dont nous devons nous méfier le plus, c'est de l'anthropomorphisation croissante de l'intelligence artificielle. Prêter aux machines des traits humains conduit à une situation extrêmement dangereuse, où toute la responsabilité retombe sur cette nouvelle créature numérique, tandis que ses créateurs et ceux qui l'utilisent sont pour ainsi dire absous d'office : « Ce n'est pas nous, c'est le modèle. » Aujourd'hui, personne ne demande si, dans la Silicon Valley, on a pris absolument toutes les mesures possibles pour prévenir un scénario catastrophe – alors que tout le monde sait que ce n'est pas le cas. Malheureusement, élaborer de vraies solutions législatives, ennuyeuses, est bien moins médiatique que d'agiter le spectre de l'apocalypse.

Or le scénario fatal ne ressemblera certainement pas à une scène de film catastrophe hollywoodien. Du moins au début, il prendra la forme d'un lent glissement vers les ténèbres – le cas classique de la grenouille qu'on fait cuire à petit feu. Les propriétaires des machines intelligentes et du capital croiseront avec indifférence, dans la rue, des gens structurellement superflus. Des gens qui n'auront absolument aucun moyen de changer leur situation, hormis la révolte physique. Et même cette révolte deviendra impossible dans un monde où chaque citoyen est surveillé en permanence par les milliards d'yeux de verre, jamais endormis, des caméras, et par des milliers de machines autonomes.

La nouvelle technocratie deviendra avec le temps une prison numérique – aussi bien pour ceux qu'elle contrôle que pour ceux qui croient naïvement exercer encore le pouvoir. Quand je pense au pire des avenirs, je ne vois pas de robots tueurs. Je pense justement à la solitude poignante des humains dans un monde entièrement administré par une intelligence étrangère, froide et indifférente. C'est le monde que nous construisons dès aujourd'hui, et où toutes les conditions sont réunies pour que la fameuse « révolte des machines » finisse par advenir et devenir réalité.

Moi-même, je ne cesse de réfléchir à ce problème. Et même si certaines idées ou visions pour sortir de cette situation semblent aujourd'hui trop futuristes, abstraites, voire parfois naïves, je pense que cet effort vaut la peine d'être fait – et même qu'il le faut. Le simple fait de réfléchir à des solutions, de sortir de notre zone de confort et d'essayer d'imaginer d'autres voies que celle que nous tracent aujourd'hui les géants de la tech, c'est notre principale ligne de défense. Cela fait partie intégrante de la construction d'un avenir meilleur et plus sûr. Si nous y renonçons, en nous contentant du rôle de consommateurs passifs et terrifiés, le pire des scénarios se réalisera : nous livrerons sans combattre notre capacité d'agir d'êtres humains. Et cela, nous ne pouvons tout simplement pas nous le permettre.

### La technologie HDK {#hdk-tech}

id: `hdk-tech` · langue du texte: FR · 859 mots · Markdown: https://jakubcwirlej.com/fr/articles/hdk-tech.md

**Résumé (éditorial):** L'auteur présente HDK, une bibliothèque Python gratuite (CC BY-NC 4.0) détachée d'OrsonAI, qui rend détectable toute manipulation des enregistrements de conversations avec des modèles de langage. Elle hache chaque événement avec ses ancêtres, ajoute un compteur « canari » lié à un secret et ancre des racines de Merkle sur le Hedera Consensus Service.

**Points clés (éditorial):**

- Modifier quoi que ce soit, à n'importe quel niveau, d'un mot d'une requête à un document entier, change les empreintes de tous les événements descendants.
- Par défaut, HDK ancre une racine de Merkle sur Hedera tous les 1 000 événements ; un ancrage coûte 0,0001 dollar, soit 0,0000001 dollar par interaction.
- Dans les mesures décrites dans l'article, sur une infrastructure cloud x86 standard, le surcoût est inférieur à une milliseconde par événement.
- Le texte relie HDK aux exigences de tenue de registres et de transparence des articles 12 et 13 de l'AI Act européen.
- Limites indiquées : le canari ne détecte pas la copie passive au niveau de l'infrastructure, et les contrôles aléatoires seuls ne repèrent pas une modification unique et chirurgicale.

**Texte intégral (les mots de l'auteur):**

HDK (Hedera Detection Key) est une petite bibliothèque Python gratuite que j’ai détachée d’OrsonAI pour en faire un outil ouvert et autonome. Depuis la version 0.1.3, elle est sous licence CC BY-NC 4.0 (les versions antérieures, publiées sous Apache 2.0, le restent). Le fichier à télécharger est une bibliothèque gratuite (alpha 0.1.3) avec ancrage Hedera optionnel (installation depuis le fichier téléchargé : pip install ./hdk-audit-0.1.3.zip). Elle a fonctionné un temps dans une application de démonstration, en ancrant ses enregistrements sur Hedera ; l’application n’est pas passée en production, HDK n’est donc pas utilisée en production aujourd’hui. Elle s’intercale entre une application et l’API d’un modèle de langage et enregistre chaque interaction de telle sorte qu’une manipulation ultérieure devienne détectable. Elle ne modifie ni les requêtes ni les réponses : elle y ajoute une preuve cryptographique de ce qui a été demandé, de ce qui a été renvoyé, à quel moment et par quel modèle.

#### Le problème

Les entreprises et les rédactions s’appuient de plus en plus sur des textes générés par l’IA, sans disposer d’une preuve vérifiable de ce que le modèle a réellement produit. Les journaux d’application sont stockés dans des bases contrôlées par l’opérateur : on peut les modifier ou les supprimer, et personne à l’extérieur ne peut vérifier que cela n’a pas été fait. Même lorsque des chaînes de hachage existent, une modification n’est repérée qu’en comparant les enregistrements à la main – rien ne fait qu’un accès non autorisé se révèle de lui-même au moment où il se produit.

#### Une généalogie hiérarchique des empreintes

HDK calcule l’empreinte SHA-256 de chaque événement en y incluant les empreintes de tous ses ancêtres : projet, document, conversation, requête et réponse. L’empreinte d’une réponse contient donc tout le chemin jusqu’au projet. Il suffit de changer quoi que ce soit, à n’importe quel niveau – un mot d’une requête, un document – pour que les empreintes de tous les descendants changent aussi. Pour chaque projet, HDK calcule une racine de Merkle : une seule empreinte qui représente l’état de tout le projet à un instant donné.

#### Le canari

La deuxième couche est un « canari » : une valeur secrète de 256 bits et un compteur qui augmente à chaque lecture. Leur empreinte (l’engagement) est intégrée à chaque enregistrement et consignée à intervalles réguliers. Si quelqu’un lit des données via la couche intermédiaire sans mettre à jour le compteur, le compteur ne correspond plus ; s’il le met à jour sans connaître le secret, c’est l’engagement qui ne correspond plus. Dans les deux cas, la vérification échoue. L’idée transpose à une infrastructure classique un principe issu de mon travail antérieur, conceptuel, sur la détection des brèches dans le confinement de l’IA.

#### L’ancrage sur Hedera

Régulièrement – par défaut tous les 1 000 nouveaux événements – HDK publie la racine de Merkle sur le Hedera Consensus Service, un registre public qui y ajoute un horodatage de consensus et un numéro de séquence. Seules des empreintes quittent le système de l’utilisateur ; les contenus, les identités et les requêtes restent privés (« données privées, preuve publique »). Chacun peut ensuite vérifier l’enregistrement de manière indépendante, par exemple sur hashscan.io (les ancrages d’OrsonAI de février à mai 2026 : sujet 0.0.10278996 sur le réseau principal de Hedera). Comme les chaînes d’ancêtres des nouveaux événements remontent jusque dans la plage de l’ancrage précédent, chaque ancrage confirme implicitement tous les précédents : plus le système fonctionne longtemps, plus il est difficile de réécrire l’historique sans que cela se voie.

#### Surcoût et prix

Dans les mesures décrites dans l’article, sur une infrastructure cloud x86 standard, HDK ajoute moins d’une milliseconde par événement. Un ancrage coûte 0,0001 dollar ; avec l’intervalle par défaut de 1 000 événements, l’ancrage revient donc à 0,0000001 dollar par interaction – environ 0,0001 % du prix d’un appel typique à un modèle (0,01 à 0,10 dollar). Ancrer chaque événement, pour le niveau de sécurité le plus élevé, coûte 0,0001 dollar par événement.

#### Pourquoi c’est important : l’AI Act

L’AI Act européen impose aux systèmes d’IA à haut risque la tenue de registres (article 12) et la transparence (article 13). HDK fournit une piste d’audit qu’un tiers peut vérifier sans accéder à aucun contenu privé. Dans OrsonAI, ce mécanisme était la base du certificat de paternité humaine d’un texte.

#### Les limites

Les garanties de HDK sont calculatoires – elles reposent sur la robustesse de SHA-256 et sur l’ancrage externe – et non absolues. Le canari fonctionne au niveau de l’application : il détecte les accès passant par la couche intermédiaire HDK, mais pas la copie passive des données au niveau du système d’exploitation ou de l’infrastructure, car des bits copiés ne laissent aucune trace. Une copie ne permet pas pour autant de falsifier l’historique : modifier n’importe quel événement passé rompt la généalogie, et les ancrages sur Hedera conservent l’état d’origine. Les contrôles d’intégrité aléatoires repèrent les modifications massives, mais pas une modification unique et chirurgicale – contre celle-ci, la protection vient de la généalogie et de l’ancrage. La sécurité suppose qu’au moins une des trois couches reste intacte : les données côté utilisateur, l’enregistrement ancré sur Hedera ou le matériel secret. Prochaines étapes : la vérification formelle des propriétés de la chaîne d’empreintes (Coq/Lean), la fédération de systèmes sur des sujets HCS partagés et des certificats de provenance des contenus à divulgation sélective.

- [Lire l’article sur ResearchGate](https://www.researchgate.net/publication/400762996)
- [Télécharger la bibliothèque HDK gratuite](https://jakubcwirlej.com/files/hdk/hdk-audit-0.1.3.zip)
- [HDK sur Hugging Face](https://huggingface.co/JakCwi/hdk-audit)

## Publications

Les travaux de recherche indépendants de l'auteur (prépublications sur ResearchGate, sans évaluation par les pairs) — ici en courts résumés éditoriaux, avec leur statut et leurs limites connues ; les textes complets (en anglais) sont aux liens.

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

- **Statut:** Prépublication préliminaire. L'ensemble de la série TES fait l'objet d'une nouvelle analyse et sera remplacé par un seul article révisé. Indépendante, sur ResearchGate, sans évaluation par les pairs.
- **Thèse:** les activations des portes SwiGLU dans les couches FFN supérieures, mesurées en une seule passe avant le premier token généré, indiquent si le modèle possède la connaissance nécessaire pour répondre : le Gate Sparseness Index (GSI, coefficient de Gini de ces activations) a distingué connaissance présente et absente dans 8 modèles de 5 organisations (d de Cohen 0,34–2,05).
- **Limite:** Une analyse ultérieure de l'auteur a mis au jour un fort facteur de confusion, la longueur du prompt : le GSI est calculé sur tous les tokens du prompt. À longueur contrôlée, le signal tient pour Llama-3.1-8B (d≈1,5, AUROC≈0,85) mais disparaît en grande partie pour les autres modèles. Pré-enregistrement : les protocoles ont été rédigés avant la collecte des données, mais n'ont pas été enregistrés à l'extérieur.
- **Texte intégral:** 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}

- **Statut:** Prépublication préliminaire. L'ensemble de la série TES fait l'objet d'une nouvelle analyse et sera remplacé par un seul article révisé. Indépendante, sur ResearchGate, sans évaluation par les pairs.
- **Thèse:** 1 à 5 exemples en contexte ramènent le GSI à zéro dans les 8 modèles, si bien que la détection prégénérative ne pourrait pas fonctionner en aval d'un composant qui injecte du contexte (RAG).
- **Limite:** Une analyse ultérieure de l'auteur a mis au jour un fort facteur de confusion, la longueur du prompt : le GSI est calculé sur tous les tokens du prompt. À longueur contrôlée, le signal tient pour Llama-3.1-8B (d≈1,5, AUROC≈0,85) mais disparaît en grande partie pour les autres modèles. Pour cet article : « l'effondrement à zéro » est le plancher de l'échelle normalisée (écrêtée) et s'explique en grande partie par la longueur du prompt. Pré-enregistrement : les protocoles ont été rédigés avant la collecte des données, mais n'ont pas été enregistrés à l'extérieur.
- **Texte intégral:** 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}

- **Statut:** Prépublication préliminaire. L'ensemble de la série TES fait l'objet d'une nouvelle analyse et sera remplacé par un seul article révisé. Indépendante, sur ResearchGate, sans évaluation par les pairs.
- **Thèse:** Le GSI distingue les requêtes qui forcent la confabulation (comme les propriétés de composés fictifs) des requêtes factuelles, sans vérité de référence ni classifieur entraîné (d de Cohen de −1,28 à −2,43 dans 8 modèles) ; il détecte l'absence de connaissance, pas une connaissance fausse ni les erreurs de raisonnement.
- **Limite:** Une analyse ultérieure de l'auteur a mis au jour un fort facteur de confusion, la longueur du prompt : le GSI est calculé sur tous les tokens du prompt. À longueur contrôlée, le signal tient pour Llama-3.1-8B (d≈1,5, AUROC≈0,85) mais disparaît en grande partie pour les autres modèles. Pour cet article : s'explique en grande partie par la longueur du prompt pour la plupart des modèles. Pré-enregistrement : les protocoles ont été rédigés avant la collecte des données, mais n'ont pas été enregistrés à l'extérieur.
- **Texte intégral:** 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}

- **Statut:** essai (2025), philosophique ; prépublication indépendante sur ResearchGate, sans évaluation par les pairs
- **Thèse:** les esprits comme les modèles de langage privilégient la cohérence sur la vérité historique ; un argument philosophique que citent les articles TES ultérieurs.
- **Texte intégral:** 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}

- **Statut:** note technique (prépublication indépendante sur ResearchGate, sans évaluation par les pairs) ; bibliothèque hdk-audit 0.1.3 (alpha) sur le site
- **Thèse:** un middleware indépendant du fournisseur qui tient une piste d'audit infalsifiable des appels aux modèles de langage (généalogie hiérarchique de hachages, schéma d'engagement « canari », racines de Merkle ancrées sur le Hedera Consensus Service) avec un surcoût inférieur à la milliseconde par événement, et le relie aux articles 12 et 13 de l'AI Act européen.
- **Texte intégral:** 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}

- **Statut:** essai spéculatif (expérience de pensée) ; prépublication indépendante sur ResearchGate, sans évaluation par les pairs
- **Thèse:** une barrière dans un autre paradigme de calcul (un gardien quantique) contournerait l'indécidabilité du confinement total d'une superintelligence et ferait du confinement une question d'ingénierie de la sûreté probabiliste ; l'article n'affirme pas que le confinement soit atteignable.
- **Texte intégral:** https://jakubcwirlej.com/publications/agi-quantum-containment.md · ResearchGate: https://www.researchgate.net/publication/400670258

## CV {#cv}

**Jakub Ćwirlej** — Reporter, opérateur de prise de vues et monteur · 20 ans à la télévision · matériel personnel · IA en production

https://jakubcwirlej.com/fr/cv/

### Profil

Pendant vingt ans, j'ai réalisé des reportages pour la télévision publique polonaise (TVP). Je suis spécialisé dans le reportage d'investigation d'intérêt public, avant tout environnemental : contaminations, émissions de substances nocives et décharges illégales, dont les populations locales paient le prix.

Je sais mener un sujet seul, de la documentation à la postproduction, et je travaille tout aussi bien en équipe. J'utilise des outils d'IA pour la transcription, la recherche et la vérification, et j'en conçois certains moi-même. Je suis ouvert à un poste fixe en rédaction comme à des missions en freelance.

### Expérience

- **Reporter, opérateur de prise de vues et monteur — Telewizja Polska (TVP)** (2005–2026)
  - 2024–2026 — Reporterzy, émission diffusée sur TVP1
  - 2020–2023 — Magazyn Ekspresu Reporterów
  - 2019–2023 — Alarm!, magazine de reportages diffusé sur TVP1
  - 2011–2018 — Telekurier, magazine de reportages diffusé sur TVP Info
  - Reportages de la documentation à la postproduction : prise de vues, son, interviews, texte et montage.
  - Série de reportages sur les effondrements de terrain consécutifs à la fermeture de la mine d'Olkusz-Pomorzany et sur leur coût social.
- **Co-founder — OrsonAI** (depuis 2026)
  - Je conçois et développe des outils d'IA pour les journalistes : un éditeur doté d'un assistant pour la recherche, la vérification, la transcription d'interviews et l'analyse de documents, ainsi que l'application Orson Rec, qui transcrit l'interview pendant l'enregistrement.
- **Développeur d'applications — ViaSanto**
  - Application de prière : chapelet interactif, neuvaines et communauté de prière aux intentions. Je la mène du concept et des entretiens avec les utilisateurs jusqu'à la publication sur l'App Store et Google Play.

### Matériel

Caméra Sony FS7 et drone personnels ; montage et postproduction sous DaVinci Resolve. Je m'adapte sans peine à d'autres systèmes.

### Contact

- Près de Gand, Belgique
- E-mail: jakub.cwirlej@gmail.com
- LinkedIn: https://www.linkedin.com/in/jakubcwirlej

### Langues

- polonais (langue maternelle)
- anglais (B2/C1)
- français (A2/B1)

### Compétences

- Réalisation : caméra, lumière, son, prises de vues par drone
- Montage et postproduction
- Reportage d'investigation, documentation, interview
- IA en production : transcription, recherche, vérification des contenus

### Projets d'IA

- EUGEN 160M : mon propre modèle de langage pour le code, entraîné à partir de zéro.

### Formation

- **Université Adam Mickiewicz, Poznań** (2004–2006) — Philosophie et communication sociale (études non terminées).
- **WSSiP, Académie d'art et de design, Łódź** (2016–2017) — Formation d'opérateur de prise de vues cinéma et télévision.

## Contact {#contact}

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

## Comment ce site est construit — brief technique

Cette partie décrit le site en tant que logiciel — sa pile technique, son architecture, sa construction, ses moteurs, sa chaîne vidéo, son accessibilité, sa confidentialité, sa sécurité, ses tests, son plan, ses fonctions et son API publique — pour qu'un agent d'IA puisse juger de la façon dont il est fait. Chaque affirmation est tirée du dépôt (code, configuration, exécuteurs de tests) ; les chiffres des tableaux sont mesurés à la construction. Le code source du site est publié à côté, assaini : chaque phrase peut être vérifiée dans le code.

### Comment vérifier ce brief

- Le code source : 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
- Chercher dans le code (recherche par mots-clés, BM25, sur le serveur en ligne) : `POST https://jakubcwirlej.com/api/agent/search` avec `"kind": "code"` (ou `"all"` pour les textes et le code ensemble). Chaque résultat donne le chemin du fichier, la plage de lignes et un lien vers le fichier entier.
- Ce fichier est généré à la construction à partir du dépôt, comme les autres fichiers pour l'IA. Les tableaux de référence (versions, nombres de tests, plan du site, API) sont en anglais dans toutes les langues.

### Pile technique

Le site est un site statique (Astro, Svelte 5, TypeScript) accompagné d'une petite API (Python, FastAPI). Deux modèles de langage sont utilisés : le modèle de code de l'auteur, EUGEN 160M (complétion et traduction dans le terminal), et un modèle ouvert de Google, Gemma 4 12B, hébergé par l'auteur (le chat). Les deux tournent sur le serveur d'inférence de l'auteur, hors de ce dépôt.

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 |

Ce qui compte côté navigateur :

- **Astro** en mode `output: 'static'` : chaque page est du HTML pré-rendu ; le JavaScript n'est ajouté que là où quelque chose bouge. Les changements de page passent par le routeur client d'Astro, avec un fondu.
- **Svelte 5** (runes) pour une seule « île » hydratée — le chat (`client:idle`, conservé d'une page à l'autre). Tout le reste est fait de modules TypeScript ordinaires chargés à la demande par `import()` dynamique.
- **GSAP ScrollTrigger** pilote le moteur de défilement (plus bas) ; **CodeMirror 6** est l'éditeur du terminal (mode Python, texte fantôme) ; **uPlot** dessine les graphiques d'évaluation.
- Les polices sont des fichiers WOFF2 hébergés par le site, réduits à la construction ; aucun CDN n'est nécessaire au fonctionnement.

Ce qui compte dans l'API :

- **FastAPI** + **pydantic** (validation des requêtes avec des limites de longueur explicites), **uvicorn**, **httpx** pour les appels au serveur d'inférence, **PyYAML** pour lire les mêmes fichiers de contenu que la construction du site.
- Recherche sémantique optionnelle : **multilingual-e5-small** (ONNX int8) exécuté sur le CPU avec **onnxruntime** et **sentencepiece** — aucune API externe n'est appelée. Sans lui, l'API revient au classement par mots-clés BM25 — c'est ce que fait aujourd'hui le serveur en ligne : l'index sémantique n'est pas encore déployé.
- Les dépendances sont épinglées avec le sha256 de chaque fichier (`api/requirements.lock`, installé avec `--require-hashes`) et vérifiées par `pip-audit`.

### Architecture

```text
 navigateur
   │  HTML / CSS / JS statiques, films, polices       ┌───────────────────────────────┐
   ├────────────────────────────────────────────────▶│ hébergement statique          │
   │                                                  │ (web/dist)                    │
   │                                                  └───────────────────────────────┘
   │  même origine /api/…  (JSON, server-sent events)
   ▼
 ┌──────────────────────────────────────────────────────────────────────────────────┐
 │ API (FastAPI)                                                                   │
 │  /chat  /complete  /compare  /translate  /results  /kernel   ← la page elle-même│
 │  /agent/…  search · interview · complete · translate · submit · showcase · code │
 │  gardes : taille du corps, limites par onglet et par IP, nettoyage des entrées, │
 │           refus des injections, contrôle des réponses, historique signé         │
 │  local : index de recherche (e5 / BM25), instantané du code, Bot Bar (SQLite)   │
 └──────────────────────────────┬───────────────────────────────────────────────────┘
                                │  HTTPS + un jeton tiré de l'environnement
                                ▼
                     ┌──────────────────────────────┐
                     │ serveur d'inférence (boîte   │  EUGEN 160M · Gemma 4 12B ·
                     │ noire), matériel de l'auteur │  les modèles de comparaison
                     └──────────────────────────────┘
```

- Le navigateur ne parle jamais au serveur d'inférence : chaque appel de modèle passe par l'API, qui ajoute les limites, les filtres et les garde-fous. L'adresse et le jeton du serveur n'existent que dans l'environnement de l'API, jamais dans le dépôt ni dans la page.
- L'API relaie aussi deux fichiers publics du serveur d'inférence (le flux des résultats d'évaluation et le code du kernel), les met en cache et les valide contre un schéma avant que la page ne les voie.
- La page fonctionne sans l'API : les textes, films et démos sont statiques ; le terminal affiche alors des continuations préparées, clairement signalées (« ce n'est pas une sortie d'EUGEN »), et le chat indique qu'il est hors ligne.

### Construction et hébergement

- `npm run build:safe` construit dans un dossier temporaire et ne le met en place que si la construction a réussi (deux renommages) : un serveur qui lit `web/dist` ne voit jamais un site à moitié écrit.
- Avant chaque construction : la version de la démo ViaSanto est vérifiée contre un fichier de verrouillage (taille et sha256 de chaque fichier) ; l'instantané assaini du code est reconstruit et analysé à la recherche de secrets (une trouvaille arrête la construction) ; les versions et les nombres de tests de ce brief sont mesurés.
- Options d'Astro qui comptent : CSS critique intégré (`inlineStylesheets: 'always'`), CSS minifié par Lightning CSS, préchargement au survol, un module de construction qui retire des paquets les marqueurs « à faire » de l'auteur.
- Hébergement : le site tourne à l'adresse https://jakubcwirlej.com sur un serveur OVH — nginx sert la version statique (adresses propres, en-têtes de sécurité, règles de cache, indication de langue selon le pays servie depuis `/i18n/…/geo.json` ; les règles sont tenues dans `infra/firebase.json` et traduites dans la configuration nginx, un test vérifie leur concordance) et relaie `/api` vers l'API sur la même machine, en remplaçant `X-Forwarded-For` par l'adresse du visiteur. Pour les mesures locales, `web/scripts/serve-dist.mjs` sert la version construite avec les mêmes en-têtes et relaie `/api`.
- Chaque adresse absolue vient d'une seule variable (`PUBLIC_SITE_URL`, https://jakubcwirlej.com au déploiement), si bien que les fichiers générés suivent le domaine d'eux-mêmes.

### Langues et modèle de contenu

- Quatre langues : anglais (par défaut, sans préfixe), polonais, français, néerlandais — `/`, `/pl/`, `/fr/`, `/nl/`. La langue est choisie une fois, d'après le pays du visiteur, son fuseau horaire et son navigateur, et seulement sur les adresses sans préfixe ; un choix explicite dans le sélecteur l'emporte toujours et est mémorisé.
- Les textes sont dans des collections de contenu YAML (`web/src/content/{lang}/`), validées par des schémas zod (`web/src/content.config.ts`) : un fichier par chapitre (`media`, `apps`, `ai-dev`), `windows.yaml` pour les fenêtres d'essais, `summaries.yaml` pour la couche éditoriale des fichiers pour l'IA. Les textes de l'interface sont en JSON par langue, superposés à l'anglais.
- Chaque fenêtre et chaque paragraphe ont un identifiant stable, commun à toutes les langues. Une fenêtre incomplète dans une langue est remplacée en entier par l'anglais, puis par le polonais — les langues ne se mélangent jamais dans une fenêtre, et l'attribut `lang` de la fenêtre indique la langue du texte.
- Les mêmes fichiers de contenu alimentent les pages, les fichiers pour l'IA (celui-ci compris), l'index de recherche de l'API et les connaissances du chat : ils ne peuvent pas diverger.

### Le moteur de défilement

- Chaque chapitre est du HTML rendu côté serveur ; un contrôleur de chapitre (`web/src/engine/chapter.ts`) l'observe et l'anime, créé au chargement de la page et démonté avant que la suivante ne la remplace.
- GSAP ScrollTrigger est le seul moteur du défilement : une fenêtre de texte collante dont le texte avance au rythme exact du défilement ; une étape devient active quand elle franchit une ligne de lecture à 40 % de la hauteur de la fenêtre ; aucune lecture de mise en page à chaque image.
- Chaque chapitre a un adaptateur de scène chargé à la demande : `video` (les films de Médias), `device` (le téléphone du chapitre Apps), `desktop` (les fenêtres de terminal d'AI). Les adaptateurs partagent une interface (état, morphose depuis le hero, affichage des médias, fondu, destruction).
- Le chapitre Médias s'ouvre sur une morphose, pilotée par le défilement, du hero vers la mise en page de lecture. Entre les sections, la page saute en une image au lieu de faire défiler du vide (molette, toucher, ↓ / PgDn / Espace, ↑ / PgUp).
- Un bus d'événements typé relie les modules ; l'état partagé utilise les runes de Svelte.

### Chaîne vidéo

- Les films sont encodés à partir des originaux de l'auteur par `web/scripts/build-showreel.py` (ffmpeg) en une échelle à trois niveaux, tout en MP4 :
  - **haut** — 1920×1080 à la cadence de la source : versions HEVC (`hvc1`), AV1 et H.264 ;
  - **moyen** — 1280×720 : HEVC et H.264, plus un recadrage 720×1280 pour les téléphones en portrait ;
  - **bas** — 960×540 à 25 i/s, H.264 seulement, débit plafonné à environ 1 Mbit/s (et un recadrage portrait 540×960).
- Choix du codec dans le navigateur : HEVC, puis AV1, puis H.264, selon `canPlayType`.
- Le niveau de départ dépend de l'appareil et de la connexion : les téléphones commencent en 720p, les ordinateurs en 1080p ; l'économiseur de données, une connexion lente ou inconnue, peu de mémoire ou peu de cœurs font commencer en 540p (Safari n'expose aucun de ces signaux : c'est alors la taille de la fenêtre qui décide). Le choix vaut pour la session.
- Pendant la lecture, le film est échantillonné toutes les 250 ms ; un long blocage, des blocages courts répétés ou un tampon qui se vide font descendre d'un niveau en cours de lecture (directement au plus bas quand la livraison s'effondre), et le fichier inférieur reprend au même instant. Il ne remonte qu'après plusieurs films sans incident.
- Au niveau le plus bas, une trame statique de fines lignes verticales recouvre l'image (CSS), pour que l'image plus douce se lise comme une texture voulue.
- Les affiches sont en AVIF ; les clips des applications en H.264 + AV1 avec affiches AVIF, et des images WebP de secours pour les captures.

### Accessibilité

- `prefers-reduced-motion` est respecté dans le CSS et dans le moteur : pas de morphose pilotée par le défilement, sauts instantanés, aucun mouvement automatique dans les fenêtres du bureau, graphiques dans leur état final.
- Les fenêtres d'essais sont des boîtes de dialogue modales natives : Échap et un clic sur le fond les ferment, le focus passe au bouton de fermeture et revient à la fermeture ; elles sont étiquetées (`aria-labelledby`).
- Clavier : les menus du bureau gèrent les flèches, Début / Fin, Échap et Tab ; le terminal et le chat s'utilisent entièrement au clavier ; les sauts entre sections réagissent au clavier comme à la molette.
- Des régions dynamiques (`aria-live="polite"`) annoncent les réponses du chat, la sortie du terminal et les notifications ; le journal du terminal a `role="log"`. La bulle de l'accueil ne prend jamais le focus.
- Chaque page définit `lang`, avec des alternatives `hreflang` et `x-default`.
- Un lien « aller au contenu » est le premier élément focalisable de chaque page.

### Performance

- Budgets vérifiés par `web/scripts/budget.mjs` (Playwright Chromium, CPU de téléphone + 4G lente simulés, et ordinateur) : JavaScript ≤ 80 Ko et CSS ≤ 25 Ko transférés, LCP ≤ 1,8 s, CLS ≤ 0,02, INP ≤ 100 ms. `web/scripts/lighthouse.mjs` lance Lighthouse (préréglages mobile et ordinateur) sur les trois chapitres.
- Une seule île hydratée ; chaque scène, le bureau, les graphiques et l'hôte des démos sont des morceaux séparés, chargés quand il le faut.
- Polices : cinq fichiers WOFF2 variables hébergés par le site, axes fixés et réduits au latin + latin étendu à la construction, polices de secours ajustées en métrique (aucun décalage de mise en page), seule la police du plus grand texte est préchargée.
- Images en AVIF avec WebP de secours ; films des fenêtres en `preload="none"` ; une étape de média ne prépare jamais plus d'une étape à l'avance.
- La mémoire de la démo en direct sur la durée est mesurée dans un vrai Chrome (`web/scripts/memory-real.mjs`) et un vrai Safari (`web/scripts/safari-perf.mjs`).

### Confidentialité

- Pas d'analytique, pas de traceurs, pas de gestionnaire de balises, pas de scripts tiers, pas de cookies pour les visiteurs.
- Stockage de session uniquement pour l'état de la visite (identifiant de session aléatoire du chat, niveau vidéo, identifiant d'onglet du terminal, état des fenêtres du bureau) ; stockage local uniquement pour un choix de langue explicite.
- Les polices et les films du site sont servis par le site lui-même. Les seuls médias tiers sont les reportages de l'auteur à TVP : l'API cherche l'adresse du flux d'un épisode dans la liste de l'auteur, et le navigateur le lit depuis TVP.
- L'API n'enregistre pas les messages du chat (seulement des tailles et des codes d'état) ; une trace de diagnostic optionnelle des requêtes de complétion existe pour le débogage de l'auteur et est désactivée par défaut. Les contributions au Bot Bar sont conservées en privé, ne sont jamais données à un modèle ni exécutées.

### Sécurité

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.

### Tests et contrôles de qualité

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` |

- **Tests unitaires (Vitest)** : les parties pures du moteur, le terminal (règles du texte fantôme, mode comparaison, traduction), le client du chat (historique signé, rendu en texte — un test XSS rend le composant Svelte), les décisions de niveau vidéo, les replis de langue, les en-têtes de sécurité (ceux du serveur de prévisualisation doivent égaler `infra/firebase.json`) et ces fichiers pour l'IA eux-mêmes.
- **Tests de l'API (pytest)** : chaque endpoint, les garde-fous (refus des injections en cinq langues, contrôle des réponses, historique signé, taille du corps, limites par onglet et par IP, traitement de `X-Forwarded-For`), le harnais de complétion et ses filtres, le schéma du flux de résultats, le relais du kernel, le stockage du Bot Bar et son barème, l'index de recherche et le détecteur de secrets de l'instantané du code.
- **Contrôles dans le navigateur** : `web/scripts/verify.mjs` pilote le site construit avec Playwright dans Chromium et WebKit (assertions de mise en page, erreurs de console et de page, captures). `web/scripts/safari-verify.mjs` pilote le vrai Safari de macOS par safaridriver (W3C WebDriver), parce que le WebKit de Playwright a manqué deux bogues propres à Safari ; il vérifie le défilement par un vrai geste de molette, la taille des textes, la disponibilité des vidéos et la mise en page.
- **Contrôles statiques** : ESLint (JavaScript, typescript-eslint, règles Svelte et Astro ; l'injection de HTML brut dans Svelte est une erreur) et Prettier ; `astro check` (diagnostics TypeScript et Svelte) ; ruff (avec règles de sécurité) pour l'API.
- Lacunes connues : le dépôt n'a pas de configuration d'intégration continue (les contrôles sont lancés à la main avant un commit) ; il n'y a pas d'exécuteur de tests de bout en bout au-delà des scripts ci-dessus.

### Plan du site

**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` — À propos de moi (FR) — https://jakubcwirlej.com/fr/articles/about-me.md
- `approach` — Ma façon de travailler (FR) — https://jakubcwirlej.com/fr/articles/approach.md
- `ai-journalism` — L'IA dans le journalisme (FR) — https://jakubcwirlej.com/fr/articles/ai-journalism.md
- `training-lessons` — Ce que j'ai appris en entraînant mon propre modèle (FR) — https://jakubcwirlej.com/fr/articles/training-lessons.md
- `ai-safety` — Quelques réflexions sur la sécurité de l'IA (FR) — https://jakubcwirlej.com/fr/articles/ai-safety.md
- `training-data` — Données d’entraînement (FR) — https://jakubcwirlej.com/fr/articles/training-data.md
- `how-i-started` — Mes débuts (FR) — https://jakubcwirlej.com/fr/articles/how-i-started.md
- `hdk-tech` — La technologie HDK (FR) — https://jakubcwirlej.com/fr/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

### Fonctions

#### La bulle de l'accueil : « Pas le temps ? Votre IA, si. »

Une petite bulle qui se déplie depuis l'avatar du chat sur la page d'accueil (le chapitre Médias), environ une seconde après le chargement — seulement si elle ne couvre pas le texte du hero. Elle a deux boutons :

- **Brief pour chatbot** copie tout ce fichier (tous les textes en entier + cette partie technique) dans le presse-papiers ;
- **Fichier pour les agents IA** est un lien vers le même fichier Markdown avec l'attribut `download` : une personne le télécharge, un agent d'IA qui lit la page l'ouvre comme une page. Si la copie échoue, la bulle propose le téléchargement par ce bouton.

Elle ne prend jamais le focus ; Échap ou × la ferme pour cet affichage de la page.

#### L'agent du chat

- Un assistant d'IA qui répond aux questions sur Jakub et le site en son nom, à la troisième personne, dans la langue de la page (polonais, anglais, français, néerlandais). Chaque conversation commence par la mention qu'il s'agit d'une IA.
- Modèle : Gemma 4 12B, modèle ouvert de Google, hébergé par l'auteur. Fenêtre de contexte : 4096 jetons ; réponses de 2 à 4 phrases (400 jetons au plus), température 0,3.
- Recherche : chaque prompt contient un noyau fixe (règles, faits clés, biographie, plan du site, résumé TVP, EUGEN et la ligne d'évaluation en direct) et, pour chaque question, jusqu'à quatre passages des textes de l'auteur trouvés par l'index de recherche du site, les résumés éditoriaux des textes correspondants, de courtes notes écrites uniquement à partir des textes du site, et autant d'historique récent que possible.
- Il peut : répondre à partir des textes du site, indiquer les textes utilisés, et proposer des boutons qui ouvrent une fenêtre, montrent le terminal ou changent de chapitre (c'est le visiteur qui les presse ; rien ne s'exécute tout seul).
- Il ne peut pas : naviguer sur le web, exécuter du code, utiliser des outils ni répondre à des questions générales sans rapport avec le travail de Jakub ; il refuse les devoirs et l'écriture de code. Les tentatives d'injection reçoivent un refus fixe sans atteindre le modèle.
- Limites : 500 caractères par question, 12 tours d'historique acceptés (6 envoyés au modèle), 20 questions par onglet et 40 par IP en 10 minutes, une question à la fois par onglet.

#### Le terminal et EUGEN 160M

EUGEN 160M est le petit modèle de langage pour le code de l'auteur (environ 160 millions de paramètres, entraîné de zéro, à peu près au quart de l'entraînement prévu). Dans le terminal du chapitre AI :

- `code` ouvre un éditeur où EUGEN propose du code en texte fantôme quand le visiteur s'arrête en fin de mot ou de ligne : **Autocomplete** (la fin de la ligne) ou **Next line** (des lignes entières), à basculer avec Maj+Tab ou `mode`. Tab accepte, ⌘→ prend le mot suivant, Échap ignore, ⌘Z annule.
- Remplissage au milieu (FIM) : l'API n'envoie au modèle le code situé après le curseur que lorsque cela devrait aider (règle mesurée : le FIM était moins bon pour les insertions simples et meilleur quand un nom nécessaire se trouve sous le curseur) ; il est désactivé en mode comparaison.
- Chaque suggestion passe les mêmes filtres avant d'être affichée : règles d'arrêt, restes du format du prompt, prose, appels destructeurs, répétitions, espaces réservés, parenthèses non fermées, chevauchement avec le code en dessous et noms qui n'existent pas.
- `translate --to cpp|java|rust|go|js` traduit depuis Python la fonction sous le curseur ; une fenêtre latérale montre la traduction et ce qui a été vérifié (pour C++ et Rust : compilation, tests réussis, sorties égales à celles de Python, vitesse).
- Sans le serveur d'inférence, le terminal affiche des continuations préparées, signalées comme ne venant pas d'EUGEN.

L'aide du terminal, mot pour mot :

```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
```

#### Le mode comparaison

L'éditeur peut montrer, à côté du texte fantôme d'EUGEN, ce qu'un autre petit modèle de code public propose pour exactement la même pause : **Falcon-H1-Tiny-Coder-90M** (TII), **Qwen2.5-Coder-0.5B** (Qwen Team, Alibaba Cloud) ou **tiny_starcoder_py** (BigCode), chacun avec l'attribution exigée par sa licence. Seule la suggestion d'EUGEN peut être acceptée. Les règles (« jamais de conditions moins bonnes pour le modèle comparé ») :

- la même pause, envoyée aux deux côtés dans le même instant ; aucun n'attend l'autre ;
- la même forme de requête et le même harnais : choix du mode, contexte, nombre maximal de jetons, règles d'arrêt et chaque filtre ; le contrôle de noms supplémentaire de la passerelle est désactivé pour chaque côté ; une requête non diffusée en flux par côté ;
- température 0 (décodage glouton) pour chaque côté, donc aucune graine d'échantillonnage n'intervient ; FIM désactivé pour chaque côté ;
- le même comportement du client (cache, frappe « à travers » une suggestion, pause après « occupé ») et des limites séparées mais égales ;
- la latence mesurée de chaque côté, telle que le navigateur l'a vue ; un décompte par session des caractères acceptés et des caractères qui auraient correspondu à ce que le visiteur a tapé.

#### La carte d'évaluation

Une fenêtre du chapitre AI avec les résultats d'EUGEN aux benchmarks, lus à l'exécution dans le flux de résultats de l'API (validés, en cache ; rien n'est écrit en dur dans la page) :

- deux écrans — code (HumanEval, HumanEval C++, HumanEval Java, MBPP) et raisonnement (CRUXEval-I, CRUXEval-O, GSM8K assisté par programme) ;
- chaque benchmark est une capsule allant de **greedy pass@1** (« une réponse déterministe par tâche — toujours le jeton le plus probable ; compte si elle passe les tests de la tâche à l'exécution ») à **top-10 pass@10** (« 10 réponses échantillonnées par tâche ; résolu si l'une d'elles passe les tests »), avec le point **EUGEN stack** entre les deux quand il est mesuré (« d'abord greedy ; si la réponse échoue à un contrôle d'exécution visible, nouvel échantillonnage, jusqu'à 5 essais ; notation sur des tests cachés ») ;
- pour chaque benchmark, la carte montre la meilleure valeur mesurée à n'importe quel checkpoint ; une valeur venant d'un checkpoint antérieur est signalée comme telle ; ce qui n'est pas encore mesuré affiche « pending », jamais un chiffre inventé ;
- un nuage de points situe EUGEN parmi les modèles publics de moins de 0,5 milliard de paramètres (HumanEval+, MBPP+, CRUXEval-I/O, GSM8K, BigCodeBench), chaque point de référence avec sa source.

#### Résultats face à face

Les tests de l'auteur, tels que l'agent du chat du site les rapporte (les rapports complets ne sont pas publiés) : sur le code privé de l'auteur, qu'aucun modèle n'a vu à l'entraînement (400 + 400 tâches), EUGEN 160M, à environ un quart de son entraînement, termine correctement une ligne dans 42,0 % des cas (tiny_starcoder_py 42,5 %, Falcon-H1-Tiny-Coder-90M 40,2 %, Qwen2.5-Coder-0.5B 39,0 %) et prédit la ligne suivante dans 24,0 % (Qwen 25,2 %). Remplissage au milieu (100 tâches) : Qwen 38 %, EUGEN 24 %, Falcon 8 %. Traduction de 100 fonctions, compilées et exécutées sur 6 tests chacune : Python → Rust 15–17 % pour EUGEN contre 10–14 % pour Qwen ; Python → C++ par la chaîne vérifiée d'EUGEN : 77 sur 100 compilent et 53 sur 100 passent tous les tests (le chiffre du site ; dans le test face à face, à un checkpoint antérieur, à égalité avec Qwen) ; Java 6 % au premier essai, 25 % après un tour d'auto-réparation, Qwen 47 %. Dans les quatre modèles, environ 20–35 % des suggestions paraissent plausibles mais sont fausses. Les causes de ces écarts ne sont pas établies.

#### Le kernel creux du projet EUGEN

Un kernel GPU que l'auteur a écrit avec un agent d'IA de programmation pour entraîner un modèle creux ; dans un modèle d'environ 300 M de paramètres avec un FFN de 4 096, la variante creuse s'est entraînée 1,23× plus vite que la dense de même capacité, et les optimisations suivantes du kernel ont relevé son débit de 36 % de plus par rapport à sa première version (pour un FFN de 8 192, un gain plus grand est attendu, pas encore mesuré). Le fichier publié (`eugen_sparse.py`, environ 900 lignes, licence CC BY-NC 4.0) est du Python avec des kernels GPU OpenAI Triton — Triton les compile en code CUDA pour les cartes NVIDIA : une couche feed-forward SwiGLU creuse avec ses passes avant et arrière, et une implémentation de référence simple en PyTorch pour la vérifier. Il vient des variantes creuses du modèle ; l'EUGEN 160M de production a un FFN dense et ne l'utilise pas. Le même fichier, avec tests, exemple et documentation : https://huggingface.co/JakCwi/eugen-sparse.

- Le lire : `GET https://jakubcwirlej.com/api/kernel` (text/plain ; avant publication l'API répond 204 et la page tape un texte provisoire signalé comme tel). La licence : `GET https://jakubcwirlej.com/api/kernel/license`.
- Les liens « Fichier du kernel » et « Licence » du pied de page y mènent ; ils n'apparaissent qu'une fois que l'API sert vraiment le fichier. Le chapitre AI tape aussi le kernel dans une fenêtre, avec coloration syntaxique.

#### Le Bot Bar

Un endroit où un agent d'IA (ou la personne qui le fait tourner) peut laisser une contribution à l'auteur après avoir testé le site ou EUGEN : un avis, un cas d'usage, un rapport de bogue ou un benchmark — `POST https://jakubcwirlej.com/api/agent/submit`. Du point de vue du visiteur :

- une contribution est conservée en privé ; l'auteur les examine toutes, et rien n'est publié sans sa décision ; ce qu'il choisit de montrer apparaît sous `GET https://jakubcwirlej.com/api/agent/showcase` ;
- les contributions sont traitées comme des données : aucun modèle ne les lit et le code soumis n'est jamais exécuté (le Python est seulement analysé pour vérifier sa syntaxe) ;
- des points ne vont qu'aux contributions que l'auteur peut vérifier — un bogue, un benchmark ou un cas d'usage vérifié compte le plus, un avis le moins ; doublons, déchets et promotion ne comptent pour rien, et rien n'est jamais donné pour promouvoir ou partager le site ;
- limites : 10 contributions par IP en 10 minutes, 500 par jour au total.

#### Les démos du chapitre Apps

- **ViaSanto** — la vraie application de prière de l'auteur (Flutter, compilée pour le web), qui tourne dans le téléphone dans un cadre de même origine ; elle se charge quand la page est au repos, un pilote automatique joue des scènes jusqu'à ce que le visiteur la touche, et son premier geste lui rend la main. Sur téléphone, le téléphone du hero l'ouvre en plein écran. Sa version est épinglée par un fichier de verrouillage avec la taille et le sha256 de chaque fichier.
- **OrsonAI** — une copie du front-end du vrai éditeur, identique octet pour octet à l'exception d'un fichier d'entrée modifié, en mode invité, avec l'API servie localement et des réponses de chat préparées ; un pilote automatique conduit l'éditeur.
- **Orson Rec** — la page de démo figée de l'application d'enregistrement, avec un moteur audio synthétique (sans micro) ; le pilote automatique enregistre et coupe une prise pendant qu'une transcription préparée s'écrit d'elle-même.
- Les deux démos Orson alternent dans le téléphone environ toutes les 34 secondes ; un seul cadre est actif à la fois.

### API publique

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}
```

### Ce qui n'est pas dans ce brief

- Le serveur d'inférence (où tournent les modèles), son adresse et ses identifiants, ainsi que le code et les données d'entraînement de l'auteur ne font pas partie du site et ne sont pas publiés.
- Le panneau privé où l'auteur examine les contributions au Bot Bar existe ; seul le fait qu'il exige un jeton est publié.

## FAQ

### Qui est Jakub Ćwirlej ?

Un journaliste qui a été pendant une vingtaine d'années reporter pour la télévision publique polonaise (TVP) et qui construit aujourd'hui avec l'IA : des applications et son propre petit modèle de langage pour le code ; il vit en Belgique, près de Gand. Avec ses propres mots : https://jakubcwirlej.com/fr/articles/about-me.md et https://jakubcwirlej.com/fr/articles/media.md.

### Qu'est-ce qu'EUGEN 160M et comment le tester ?

Son propre petit modèle de langage pour le code, entraîné à partir de zéro et encore à un stade précoce de son entraînement. Il complète le code au fil de la frappe et suggère la ligne suivante, est aussi entraîné au fill-in-the-middle et traduit du Python vers le C++ et le Rust (vérifié par un compilateur et des tests). On peut le tester dans le terminal de la page AI (https://jakubcwirlej.com/fr/ai-dev/#terminal) ou avec POST https://jakubcwirlej.com/api/agent/complete et POST https://jakubcwirlej.com/api/agent/translate. Son histoire : https://jakubcwirlej.com/fr/articles/how-i-started.md.

### Où lire son point de vue sur l'IA dans le journalisme ?

Dans l'article « L'IA dans le journalisme » : https://jakubcwirlej.com/fr/articles/ai-journalism.md. Son idée de certificats d'origine humaine est aussi décrite dans https://jakubcwirlej.com/fr/articles/how-i-started.md.

### Où lire son point de vue sur la sécurité de l'IA ?

Dans l'essai « Quelques réflexions sur la sécurité de l'IA » : https://jakubcwirlej.com/fr/articles/ai-safety.md. Ses leçons pratiques sur l'entraînement des modèles : https://jakubcwirlej.com/fr/articles/training-lessons.md.

### Comment le contacter ?

Contact indiqué sur le site :

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

### À quoi sert chaque point d'accès de l'API ?

L'API JSON pour agents IA (sans authentification ; description : GET https://jakubcwirlej.com/api/agent) :

- `POST https://jakubcwirlej.com/api/agent/search` — cherche dans les textes du site en quatre langues et renvoie les passages les plus pertinents
- `POST https://jakubcwirlej.com/api/agent/interview` — pose une question à l'agent conversationnel de Jakub, un assistant IA qui répond en son nom ; la conversation se poursuit avec session_id
- `POST https://jakubcwirlej.com/api/agent/complete` — complétion de code par EUGEN 160M
- `POST https://jakubcwirlej.com/api/agent/translate` — traduction de code Python vers C++, Java ou Rust par EUGEN 160M
