[{"data":1,"prerenderedAt":6135},["ShallowReactive",2],{"category-ia":3},[4,464,1736,2306,4494,5079,5553],{"id":5,"title":6,"alt":7,"authors":8,"body":17,"date":429,"description":430,"extension":431,"image":432,"meta":433,"navigation":434,"ogImage":432,"path":435,"published":434,"reviewers":436,"seo":458,"stem":459,"tags":460,"__hash__":463},"blogs\u002Fblogs\u002F2026-08-19-prompt-tokens-mcp-harness-le-lexique-ia-a-connaitre-en-2026\u002Findex.md","Prompt, tokens, MCP, harness... le lexique IA à connaître en 2026","Une image abstraite pour illustrer mon article qui pose le vocabulaire de l’IA",[9],{"id":10,"name":11,"image":12,"linkedin":13,"x":14,"jobTitle":15,"bio":16},"188f4462-cd38-80d5-b9e6-ec28a94d11e5","Bastien Dufour",".\u002Fassets\u002Fauthor-bastien-dufour.webp","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fb-dufour\u002F",null,"Senior Software Engineer","I use vim btw",{"type":18,"value":19,"toc":410},"minimark",[20,24,36,39,42,47,50,53,79,82,86,89,96,99,103,106,109,113,116,123,140,143,146,153,156,159,163,170,181,184,187,191,197,203,206,210,213,216,219,228,232,237,240,243,246,249,253,256,259,262,265,278,285,288,292,295,298,301,308,311,315,318,321,324,327,336,339,342,346,349,356,360,363,366,369,375,379,382,389,392,395,399,402],[21,22,23],"p",{},"L’IA est dans toutes les bouches aujourd’hui, que ce soit celles des développeurs, des personnes au produit, des gens au board, des ressources humaines, bref partout.",[21,25,26,27,31,32,35],{},"Mais, ",[28,29,30],"em",{},"êtes-vous bien sûr de comprendre de quoi on parle ?"," Depuis la genèse de l’IA générative en fin 2022, jusqu’à maintenant ",[28,33,34],{},"(août 2026)"," en passant par l’essor des coding agents, un vocabulaire complet s’est construit autour de ces outils, le maîtriser peut tout changer.",[21,37,38],{},"Une grosse partie de ce vocabulaire est souvent en anglais, beaucoup d’incompréhensions viennent du fait que les gens ont tendance à mélanger les termes. Donc si vous avez le sentiment d’être perdu ou simplement de ne pas savoir comment on appelle cette partie précise qu’évoquent vos devs au quotidien, alors cet article est pour vous !",[21,40,41],{},"Voici les briques à connaître, de la plus simple à la plus avancée :",[43,44,46],"h2",{"id":45},"le-model","Le “model”",[21,48,49],{},"Le modèle, c’est le LLM (Large Language Model) que vous utilisez. Quand les gens disent : « tu utilises quelle IA ? ». La vraie question derrière c’est quel modèle utilises-tu ? Par exemple : les modèles GPT d’OpenAI, les modèles Claude d’Anthropic, Kimi, etc…",[21,51,52],{},"Le modèle, en pratique, c’est quoi ? En simplifiant, un modèle de langage est un système entraîné à prédire la suite la plus probable d’une séquence de tokens. C’est à partir de ce mécanisme qu’il est capable de générer du texte, du code, de raisonner sur des informations ou encore de suivre des instructions.",[21,54,55,56,59,60,66,67,78],{},"Il a été entraîné sur un certain nombre de paramètres qui vont représenter ses capacités, son ",[28,57,58],{},"“intelligence”",". Si vous souhaitez approfondir, on a ",[28,61,62],{},[63,64,65],"strong",{},"cet"," ",[68,69,73],"a",{"href":70,"rel":71},"https:\u002F\u002Fblog.hoppr.tech\u002Fblogs\u002F2026-07-24-llm-ce-qui-se-passe-vraiment-du-token-a-la-reponse",[72],"nofollow",[28,74,75],{},[63,76,77],{},"article"," qui vous explique plus en détail comment fonctionne un LLM. Mais retenez qu’il ingère des tokens et en recrache également.",[21,80,81],{},"Pour imager, on pourrait dire que le modèle, c’est le cerveau, il orchestre les actions.",[43,83,85],{"id":84},"le-prompt","Le “prompt”",[21,87,88],{},"Un prompt, c’est simplement l’instruction ou la demande que vous envoyez au modèle. Ça peut être une simple question comme « explique-moi ce code », mais aussi une consigne beaucoup plus détaillée avec du contexte, des contraintes ou un format de réponse attendu.",[21,90,91,92,95],{},"Le prompt fait donc partie du ",[28,93,94],{},"context"," du modèle : c’est l’une des informations qu’il va utiliser pour comprendre ce que vous attendez de lui et décider de la réponse à produire.",[21,97,98],{},"Pour imager, si le modèle est le cerveau, le prompt est simplement ce que vous lui demandez de faire.",[43,100,102],{"id":101},"un-chat","Un “chat”",[21,104,105],{},"Le chat, c’est la conversation dans laquelle vous échangez avec le modèle. Vous lui envoyez des prompts, il vous répond, et ces échanges viennent progressivement enrichir son contexte.",[21,107,108],{},"Chaque nouveau chat démarre donc avec un nouveau contexte de conversation sans avoir automatiquement accès aux échanges de vos autres chats.",[43,110,112],{"id":111},"les-tokens","Les tokens",[21,114,115],{},"Un token, c’est l’unité de texte que manipule réellement le modèle.",[21,117,118,119,122],{},"Contrairement à nous qui avons tendance à raisonner en mots ou en caractères, un LLM découpe le texte en petits morceaux appelés ",[28,120,121],{},"tokens",". Un token peut représenter un mot entier, une partie de mot, un signe de ponctuation ou parfois simplement quelques caractères.",[21,124,125,126,133,134,139],{},"Une phrase de dix mots ne correspond donc pas forcément à dix tokens. Le découpage dépend notamment du modèle et de la manière dont son ",[68,127,130],{"href":128,"rel":129},"https:\u002F\u002Fhuggingface.co\u002Flearn\u002Fllm-course\u002Ffr\u002Fchapter2\u002F4",[72],[28,131,132],{},"tokenizer"," découpe le texte. ",[68,135,138],{"href":136,"rel":137},"https:\u002F\u002Fplatform.openai.com\u002Ftokenizer",[72],"Voici un exemple"," interactif des tokenizers d’OpenAI.",[21,141,142],{},"Pourquoi est-ce important ? Parce qu’absolument tout ce que le modèle reçoit consomme des tokens : vos messages, les réponses précédentes, les instructions du harness, le contenu d’un fichier, les résultats des tools ou encore les informations injectées par un MCP.",[21,144,145],{},"Et c’est également vrai dans l’autre sens : tout ce que le modèle génère en sortie est produit sous forme de tokens.",[21,147,148,149,152],{},"C’est donc avec cette unité que l’on mesure la quantité d’informations qu’un modèle peut avoir dans son contexte à un instant donné. On parlera un peu plus loin de ",[28,150,151],{},"context window",", qui représente justement le nombre maximal de tokens qu’il peut garder dans son contexte simultanément.",[21,154,155],{},"Pour reprendre notre image du cerveau : les tokens sont les petits morceaux d’information que le cerveau peut lire et manipuler.",[21,157,158],{},"Vous comprendrez donc assez vite pourquoi une bonne partie des mécanismes dont nous allons parler – skills, MCP, subagents ou compaction – cherchent directement ou indirectement à mieux gérer ces tokens.",[43,160,162],{"id":161},"le-harness","Le “harness”",[21,164,165,166,169],{},"Le ",[28,167,168],{},"harness",", c’est l’environnement dans lequel tourne le modèle. Codex App\u002FCLI, Claude Code, Amp, OpenCode, Pi en sont des exemples.",[21,171,172,173,176,177,180],{},"C’est bien beau mais à quoi ça sert en pratique ? D’abord, il fournit au LLM des pré-instructions qui vont définir ",[28,174,175],{},"les agents",". Ensuite, il met à disposition du modèle un éventail de ",[28,178,179],{},"tools"," qu’il pourra utiliser. C’est majoritairement ce point qui lui donne sa force, la qualité des outils mit à disposition.",[21,182,183],{},"Un même modèle peut donner des résultats drastiquement différents selon le harness dans lequel il tourne.",[21,185,186],{},"Pour imager, on pourrait dire que le harness, c’est le corps; il peut faire différentes choses notamment grâce au point suivant.",[43,188,190],{"id":189},"les-tools","Les “tools”",[21,192,193,194,196],{},"Les ",[28,195,179],{},", littéralement “outils”, sont mis à disposition par le harness pour étendre les capacités du modèle.",[21,198,199,200,202],{},"Un harness sans tools ne peut rien faire de plus que naïvement générer du texte. Faire une recherche sur internet, utiliser des commandes de votre shell, lire un fichier, en éditer un, manipuler un pdf, etc… Ils en fournissent donc de base, certains vont plus loin : Codex App inclut un navigateur. Vous pouvez donc ouvrir votre application web – si vous faites du web – directement dans ce browser et autoriser votre agent à l’utiliser pour faire des vérifications ou vous même, y mettre des annotations que l’agent pourra interpréter. D’autres comme Pi vont encore plus loin en vous laissant implémenter vous-même vos propres ",[28,201,179],{},".",[21,204,205],{},"Pour imager, le modèle est le cerveau, le harness le corps, les tools sont des capacités données au corps.",[43,207,209],{"id":208},"les-agents","Les agents",[21,211,212],{},"Un agent, au fond, c’est simplement un modèle auquel on ajoute trois éléments : des instructions spécifiques, des permissions précises et un ensemble de tools.",[21,214,215],{},"L’image la plus simple est celle de l’acteur. Le modèle, c’est l’acteur lui-même: ses capacités de base restent les mêmes. L’agent, c’est le rôle qu’on lui attribue. On lui donne un script – ses instructions –, on définit ce qu’il a le droit de faire sur le plateau – ses permissions – et, on met certains accessoires à sa disposition – ses outils.",[21,217,218],{},"Même acteur donc, mais des comportements très différents selon le rôle qu’on lui confie.",[21,220,221,222,224,225],{},"C’est exactement ce qui se passe lorsque vous utilisez les modes “Plan” ou “Build” de votre ",[28,223,168],{}," : derrière, vous retrouvez le même modèle de base, configuré avec des instructions, des permissions ainsi que des outils différents selon la tâche qu’on attend de lui (",[28,226,227],{},"et aussi certaines intégrations qui sont propres à votre harness, tel qu’un affichage dédié pour le plan mode par exemple)",[43,229,231],{"id":230},"le-context","Le “context”",[21,233,165,234,236],{},[28,235,94],{},", c’est l’ensemble des informations auxquelles le modèle a accès au moment où il réfléchit et génère une réponse.",[21,238,239],{},"Cela comprend notamment votre conversation, les instructions du harness, les éventuelles instructions propres à l’agent, mais aussi les fichiers, résultats de tools ou autres informations qui lui ont été fournies.",[21,241,242],{},"Le modèle ne “se souvient” pas magiquement de tout. Il travaille à partir de ce qui est présent dans son context à un instant donné. Si une information n’y est pas, il ne peut tout simplement pas s’appuyer dessus.",[21,244,245],{},"La qualité du context est donc particulièrement importante : plus les informations qu’on lui fournit sont pertinentes, plus le modèle a de chances de prendre de bonnes décisions. À l’inverse, un contexte bruité, incomplet ou rempli d’informations inutiles peut dégrader ses performances.",[21,247,248],{},"Pour imager, si le modèle est le cerveau, le contexte représente tout ce qu’il a actuellement en tête : ce qu’on vient de lui dire, ce qu’il a lu, ce qu’il a observé et les informations qu’il peut utiliser pour décider de la suite.",[43,250,252],{"id":251},"la-context-window","La “Context Window”",[21,254,255],{},"La context window, elle, représente la quantité maximale d’informations que le modèle peut avoir dans son contexte à un instant donné.",[21,257,258],{},"Elle est généralement mesurée en tokens. Plus cette fenêtre est grande, plus le modèle peut théoriquement travailler avec une longue conversation, de nombreux fichiers ou une grande quantité d’informations simultanément. Sa taille varie d’un modèle à l’autre et surtout d’un provider a l’autre.",[21,260,261],{},"Mais une grande context window ne veut pas forcément dire un meilleur context. On peut la remplir avec beaucoup d’informations inutiles et obtenir de moins bons résultats qu’avec un contexte plus petit mais, soigneusement sélectionné. C’est d’ailleurs ce que tendent à démontrer beaucoup de providers où, on voit la pertinence et la qualité se dégrader à mesure que la fenêtre s’agrandit. Notamment sur les context window ayant une capacité d’un million de tokens.",[21,263,264],{},"Quand la quantité d’information dépasse la taille de la context window, le harness doit donc faire des choix :",[266,267,268,272,275],"ul",{},[269,270,271],"li",{},"retirer certains éléments",[269,273,274],{},"retirer les anciens échanges",[269,276,277],{},"ne conserver que les informations qu’il juge pertinentes",[21,279,280,281,284],{},"C’est ce qu’on appelle la ",[28,282,283],{},"Compaction"," que nous aborderons à la fin.",[21,286,287],{},"Pour reprendre l’image du cerveau : la context window, elle, représente la quantité maximale de ces morceaux qu’il peut garder en tête en même temps.",[43,289,291],{"id":290},"les-skills","Les “skills”",[21,293,294],{},"Un skill, littéralement “compétence”, ça répond à quelle problématique ?",[21,296,297],{},"À chaque nouveau chat, votre conversation reprend de zéro. Vous êtes sur un contexte tout neuf et votre modèle a tout oublié.",[21,299,300],{},"À quoi sert un skill ? Il permet d’encapsuler un savoir ou une action spécifique à réaliser dans un fichier markdown. Le harness a connaissance de vos skills et de leurs descriptions, il les garde en mémoire. L’avantage c’est qu’il ne charge le skill que lorsque le modèle en a réellement le besoin, ou que vous le mentionnez explicitement.",[21,302,303,304,307],{},"Plus concrètement, c’est très pratique pour expliquer au modèle notre façon de coder, s’assurer qu’il respecte les pratiques et préférences de l’équipe. D’ailleurs on entend également beaucoup parler de ",[63,305,306],{},"workflow IA",", les plus connus étant probablement speck-kit, BMAD ou encore superpowers. En pratique, ces workflows ne sont qu’une succession bien définie de skills.",[21,309,310],{},"Cela permet donc une économie de temps – celle de ne pas avoir à systématiquement tout re-expliquer. En plus, de permettre également de ne pas polluer le context avec des informations non essentielles à la réalisation de votre tâche. Car si vous faites du backend, votre modèle n’a pas besoin de savoir faire du frontend.",[43,312,314],{"id":313},"les-mcp","Les MCP",[21,316,317],{},"MCP, c’est peut-être un mot que vous avez vu énormément passer, alors qu’est-ce que c’est ?",[21,319,320],{},"Le MCP (Model Context Protocol) est un protocole qui permet à un agent de se connecter à un service externe et de l’utiliser.",[21,322,323],{},"Ça permet à votre agent de piloter différents services. Chaque service parle sa propre langue, le MCP permet à votre modèle de communiquer avec tous ces services sans apprendre toutes leurs langues, ils parlent le même dialecte: le MCP.",[21,325,326],{},"Par exemple un service ferroviaire tel que la SNCF ou une compagnie aérienne pourraient proposer un MCP pour vous permettre de consulter les horaires d’embarquement ou réserver un trajet.",[21,328,329,330,335],{},"Autrement dit, les MCP permettent d’ajouter des tools – ",[68,331,334],{"href":332,"rel":333},"https:\u002F\u002Fmodelcontextprotocol.io\u002Fspecification\u002F2026-07-28\u002Fserver",[72],"mais pas que"," – à votre agent sans que ceux-ci aient besoin d’être directement intégrés au harness.",[21,337,338],{},"Contrairement à un skill qui peut charger son contenu à la demande. Un MCP injecte en général la description de tous ses outils afin que le modèle en ait connaissance. La description de chacun de ces outils reste chargée dans votre contexte toute la session, que vous les utilisiez ou non.",[21,340,341],{},"Donc veillez à en avoir un usage raisonnable.",[43,343,345],{"id":344},"parce-quun-schéma-vaut-mille-mots","Parce qu’un schéma vaut mille mots",[21,347,348],{},"Voici la représentation visuelle des éléments définis jusqu’à maintenant :",[21,350,351],{},[352,353],"img",{"alt":354,"src":355},"L’image présente le fonctionnement d’un agent IA. Le Harness est l’environnement qui encadre le modèle et définit les agents, les outils et les autorisations. L’Agent peut planifier ou exécuter une tâche en utilisant le LLM, qui représente le cerveau du système. Le LLM travaille avec un contexte, limité par une fenêtre de contexte, et peut recevoir des Skills, c’est-à-dire des compétences ou instructions supplémentaires. Enfin, l’agent peut utiliser des outils et commandes pour agir, et certains peuvent communiquer avec des services externes grâce au protocole MCP.","\u002Fcontent-assets\u002F2026-08-19-prompt-tokens-mcp-harness-le-lexique-ia-a-connaitre-en-2026\u002Fassets\u002Fimg1.webp",[43,357,359],{"id":358},"les-subagents","Les subagents",[21,361,362],{},"Un subagent, c’est quoi ? L’idée est très simple, vous avez votre chat avec votre agent principal qui va “spawner” des sous-agents dans le but d’effectuer des tâches à sa place. Prenons de suite un exemple :",[21,364,365],{},"Admettons que vous souhaitiez effectuer des recherches sur une problématique avant la réalisation de votre tâche. Votre agent principal devrait faire des tools call afin d’appeler peut-être un MCP, utiliser un skill ou exécuter les tools mis à disposition par le harness. Tout cela a un coût, ça ajoute du bruit à votre context. Or, ce qui vous intéresse vous c’est uniquement la réponse, pas tout le processus de recherche. De fait, pour éviter cette pollution dans votre discussion, votre chat principal va démarrer et orchestrer des sous agents, ici il pourrait faire un subagent qui fait la recherche ou plusieurs subagents qui font plusieurs recherches. Ensuite ils remontent les informations recherchées à l’agent parent pour qu’il n’ait qu’à consommer ce résultat.",[21,367,368],{},"C’est un exemple pour de la recherche mais les subagents ont leurs intérêts pour tout un tas d’autres usages tels que : de la review, des audits de sécurités, des audits de performances, traiter des tâches en parallèle, etc…",[21,370,371],{},[352,372],{"alt":373,"src":374},"L’image montre une organisation composée d’un agent orchestrateur et de plusieurs sous-agents. L’agent orchestrateur, placé en haut, répartit le travail entre différents sous-agents en leur déléguant des tâches. Chaque sous-agent réalise une partie du travail puis renvoie son résultat à l’orchestrateur, qui les agrège pour produire une réponse globale. Le schéma montre aussi qu’un sous-agent peut lui-même déléguer une tâche à un autre sous-agent puis récupérer son résultat.","\u002Fcontent-assets\u002F2026-08-19-prompt-tokens-mcp-harness-le-lexique-ia-a-connaitre-en-2026\u002Fassets\u002Fimg2.webp",[43,376,378],{"id":377},"la-compaction","La compaction",[21,380,381],{},"Vous parlez à votre agent, et la discussion remplit la context window. Mais on fait quoi une fois qu’elle est pleine ?",[21,383,384,385,388],{},"C’est là qu’intervient la ",[28,386,387],{},"compaction",". C’est un mécanisme qui résume le context actuel pour le rendre plus léger. Quand on approche de la taille maximale de la context window, le harness prend l’ensemble de la conversation et en produit un résumé qui sera réinjecté afin que l’agent puisse continuer de travailler.",[21,390,391],{},"Il faut noter que : qui dit résumé, dit également perte d’informations. En compactant, une partie des informations (importantes ou pas) peut passer à la trappe. Donc si vous lui aviez spécifié de ne pas faire X et Y, il se peut que l’un ou l’autre voire même les deux soient oubliés.",[21,393,394],{},"Et c’est en cela que la compaction est le point central autour du quel s’articulent toutes les autres définitions de cet article. Car tous les mécanismes évoqués – comme les skills, les MCP, les subagents – ne sont là que pour répondre à cette problématique : ne pas remplir la context window trop rapidement.",[43,396,398],{"id":397},"pour-continuer","Pour continuer",[21,400,401],{},"Cet autre article pourrait également vous plaire :",[266,403,404],{},[269,405,406],{},[68,407,408],{"href":408,"rel":409},"https:\u002F\u002Fblog.hoppr.tech\u002Fblogs\u002F2026-06-09-du-prototype-a-la-prod-ce-quon-ne-te-dit-pas-sur-la-construction-dune-solution-ia-solide",[72],{"title":411,"searchDepth":412,"depth":412,"links":413},"",2,[414,415,416,417,418,419,420,421,422,423,424,425,426,427,428],{"id":45,"depth":412,"text":46},{"id":84,"depth":412,"text":85},{"id":101,"depth":412,"text":102},{"id":111,"depth":412,"text":112},{"id":161,"depth":412,"text":162},{"id":189,"depth":412,"text":190},{"id":208,"depth":412,"text":209},{"id":230,"depth":412,"text":231},{"id":251,"depth":412,"text":252},{"id":290,"depth":412,"text":291},{"id":313,"depth":412,"text":314},{"id":344,"depth":412,"text":345},{"id":358,"depth":412,"text":359},{"id":377,"depth":412,"text":378},{"id":397,"depth":412,"text":398},"2026-08-19T16:35:59.667Z","L’IA est dans toutes les bouches aujourd’hui, que ce soit celles des développeurs, des personnes au produit, des gens au board, des ressources humaines, bref partout.  Mais, êtes-vous bien sûr de comp","md",".\u002Fassets\u002Fcover-image.webp",{},true,"\u002Fblogs\u002F2026-08-19-prompt-tokens-mcp-harness-le-lexique-ia-a-connaitre-en-2026",[437,443,448,453],{"id":438,"name":439,"image":440,"linkedin":441,"x":442},"838dec96-f9fc-404f-a302-07719225d785","Maxime Deroullers",".\u002Fassets\u002Freviewer-maxime-deroullers.webp","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fmaxime-deroullers-1b5791137\u002F","https:\u002F\u002Fx.com\u002Fmderoullers",{"id":444,"name":445,"image":446,"linkedin":447,"x":14},"f09c2e62-135b-40c0-a141-b239e8e1e761","Elisa Degobert",".\u002Fassets\u002Freviewer-elisa-degobert.webp","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fdegobert\u002F",{"id":449,"name":450,"image":451,"linkedin":452,"x":14},"33bf4462-cd38-80da-845c-c63b2fd024bf","Florian Hirson",".\u002Fassets\u002Freviewer-florian-hirson.webp","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fflorian-hirson\u002F",{"id":454,"name":455,"image":456,"linkedin":457,"x":14},"320f4462-cd38-8071-8eb7-f90621a068a3","Marjorie Dieusart",".\u002Fassets\u002Freviewer-marjorie-dieusart.webp","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fmarjorie-dieusart\u002F",{"title":6,"description":430},"blogs\u002F2026-08-19-prompt-tokens-mcp-harness-le-lexique-ia-a-connaitre-en-2026\u002Findex",[461,462],"ia","2026","tTzpY-N5kUCTyg6nVL6OWkUxoSYz4P2b92UCsCTcuMo",{"id":465,"title":466,"alt":467,"authors":468,"body":474,"date":1718,"description":1719,"extension":431,"image":432,"meta":1720,"navigation":434,"ogImage":432,"path":1721,"published":434,"reviewers":1722,"seo":1731,"stem":1732,"tags":1733,"__hash__":1735},"blogs\u002Fblogs\u002F2026-07-24-llm-ce-qui-se-passe-vraiment-du-token-a-la-reponse\u002Findex.md","LLM : ce qui se passe vraiment du token à la réponse","Du token à la réponse : représentation d’un LLM ouvert, avec des tokens traversant ses couches avant de devenir du texte.",[469],{"id":470,"name":471,"image":472,"linkedin":473,"x":14},"376f4462-cd38-8049-8778-fd9ed33a7ddc","Alex Deneuvillers",".\u002Fassets\u002Fauthor-alex-deneuvillers.webp","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Falex-deneuvillers\u002F",{"type":18,"value":475,"toc":1703},[476,479,482,489,498,501,505,511,518,521,538,541,574,577,586,591,594,656,665,667,671,674,677,733,736,744,752,754,758,764,767,776,779,788,791,800,803,807,814,834,842,845,849,852,882,885,887,891,902,911,914,917,932,935,939,942,954,956,960,966,969,983,986,990,1004,1007,1018,1021,1027,1052,1055,1059,1069,1072,1084,1088,1091,1094,1096,1100,1106,1109,1112,1127,1130,1133,1150,1153,1157,1160,1163,1167,1170,1173,1175,1179,1182,1188,1192,1195,1210,1213,1217,1220,1233,1237,1240,1243,1245,1249,1255,1258,1262,1265,1269,1272,1276,1283,1286,1288,1292,1295,1299,1302,1314,1320,1324,1331,1338,1342,1349,1355,1358,1361,1374,1378,1385,1393,1397,1400,1411,1415,1422,1425,1428,1430,1434,1437,1441,1446,1453,1456,1462,1500,1507,1566,1576,1578,1582,1585,1588,1634,1637,1640,1642,1646,1650,1653,1657,1660,1664,1667,1671,1674,1678,1681,1683,1687,1690,1693,1696,1699],[21,477,478],{},"Vous saisissez une question et, quelques instants plus tard, une réponse structurée apparaît. Cette fluidité donne l’impression que le modèle a compris la demande, réfléchi, puis rédigé son texte comme une personne.",[21,480,481],{},"Le fonctionnement réel est plus simple à décrire : le texte est découpé en petites unités, transformé en nombres, puis envoyé à travers une succession de couches de calcul. À la sortie, le modèle estime quel fragment de texte a le plus de chances de venir ensuite. Il en choisit un, l’ajoute à la séquence et recommence.",[21,483,484,485,488],{},"Un LLM génère donc une réponse ",[63,486,487],{},"token après token",". Sa puissance ne vient pas d’une règle magique, mais de la quantité de données, de paramètres et de calcul mobilisée pour apprendre à faire ces prédictions.",[490,491,492],"blockquote",{},[21,493,494,497],{},[63,495,496],{},"En bref","\nUn Large Language Model est un réseau de neurones entraîné à prédire le prochain token d’une séquence. Le texte passe par un tokenizer, devient une suite de vecteurs, puis traverse des blocs Transformer composés principalement d’attention et de réseaux feed-forward. Le pré-entraînement lui apprend les régularités du langage ; le post-entraînement lui apprend à suivre des instructions et à se comporter comme un assistant.",[499,500],"hr",{},[43,502,504],{"id":503},"principe-dun-llm-prédire-la-suite-dun-texte","Principe d’un LLM : Prédire la suite d’un texte",[21,506,507],{},[352,508],{"alt":509,"src":510},"Parcours d’un texte dans un LLM : tokenisation, embeddings, couches Transformer, probabilités et génération du token suivant.","\u002Fcontent-assets\u002F2026-07-24-llm-ce-qui-se-passe-vraiment-du-token-a-la-reponse\u002Fassets\u002Fimg1.webp",[21,512,513,514,517],{},"Dans cet article, nous parlons surtout des modèles ",[63,515,516],{},"autoregressifs de type decoder-only",", utilisés par la plupart des assistants conversationnels modernes.",[21,519,520],{},"Lorsqu’un modèle reçoit le début de phrase suivant :",[522,523,528],"pre",{"className":524,"code":525,"language":526,"meta":527,"style":411},"language-plain shiki shiki-themes github-dark-default","Le ciel est\n","plain","text",[529,530,531],"code",{"__ignoreMap":411},[532,533,536],"span",{"class":534,"line":535},"line",1,[532,537,525],{},[21,539,540],{},"il attribue une probabilité à chaque suite possible :",[522,542,544],{"className":524,"code":543,"language":526,"meta":527,"style":411},"bleu      → 42 %\ngris      → 18 %\nsouvent   →  6 %\ntrès      →  4 %\n...\n",[529,545,546,551,556,562,568],{"__ignoreMap":411},[532,547,548],{"class":534,"line":535},[532,549,550],{},"bleu      → 42 %\n",[532,552,553],{"class":534,"line":412},[532,554,555],{},"gris      → 18 %\n",[532,557,559],{"class":534,"line":558},3,[532,560,561],{},"souvent   →  6 %\n",[532,563,565],{"class":534,"line":564},4,[532,566,567],{},"très      →  4 %\n",[532,569,571],{"class":534,"line":570},5,[532,572,573],{},"...\n",[21,575,576],{},"Les valeurs sont fictives, mais le principe est exact. Le modèle calcule des scores, les transforme en probabilités, sélectionne un token, puis relance le calcul avec la séquence mise à jour.",[21,578,579,580,585],{},"L’architecture Transformer, introduite en 2017, a rendu ce traitement beaucoup plus efficace à grande échelle que les réseaux récurrents utilisés auparavant. Les modèles actuels l’ont fortement optimisée, mais ils reposent encore sur ses principes. (",[68,581,584],{"href":582,"rel":583},"https:\u002F\u002Farxiv.org\u002Fabs\u002F1706.03762",[72],"Attention Is All You Need",")",[587,588,590],"h4",{"id":589},"le-modèle-nest-quune-partie-de-lassistant","Le modèle n’est qu’une partie de l’assistant",[21,592,593],{},"Un chatbot complet assemble souvent plusieurs composants :",[522,595,597],{"className":524,"code":596,"language":526,"meta":527,"style":411},"Question utilisateur\n        ↓\nInstructions système et historique\n        ↓\nRecherche documentaire ou appel d’outils\n        ↓\nModèle de langage\n        ↓\nValidation et mise en forme\n        ↓\nRéponse\n",[529,598,599,604,609,614,618,623,628,634,639,645,650],{"__ignoreMap":411},[532,600,601],{"class":534,"line":535},[532,602,603],{},"Question utilisateur\n",[532,605,606],{"class":534,"line":412},[532,607,608],{},"        ↓\n",[532,610,611],{"class":534,"line":558},[532,612,613],{},"Instructions système et historique\n",[532,615,616],{"class":534,"line":564},[532,617,608],{},[532,619,620],{"class":534,"line":570},[532,621,622],{},"Recherche documentaire ou appel d’outils\n",[532,624,626],{"class":534,"line":625},6,[532,627,608],{},[532,629,631],{"class":534,"line":630},7,[532,632,633],{},"Modèle de langage\n",[532,635,637],{"class":534,"line":636},8,[532,638,608],{},[532,640,642],{"class":534,"line":641},9,[532,643,644],{},"Validation et mise en forme\n",[532,646,648],{"class":534,"line":647},10,[532,649,608],{},[532,651,653],{"class":534,"line":652},11,[532,654,655],{},"Réponse\n",[21,657,658,659,664],{},"Le LLM correspond au réseau de neurones et à ses paramètres. La recherche web, le ",[68,660,663],{"href":661,"rel":662},"https:\u002F\u002Ffr.wikipedia.org\u002Fwiki\u002FG%C3%A9n%C3%A9ration_%C3%A0_enrichissement_contextuel",[72],"RAG"," (Retrieval Augmented Generation), les bases vectorielles, les règles métier ou la mémoire applicative sont généralement ajoutés autour de lui.",[499,666],{},[43,668,670],{"id":669},"_1-les-données-la-matière-première","1. Les données : la matière première",[21,672,673],{},"Un LLM n’apprend pas directement en parcourant Internet pendant qu’il répond. Il est entraîné à l’avance sur un corpus composé de textes, de code, de documents, de conversations et, pour les modèles multimodaux, d’images ou d’audio.",[21,675,676],{},"Ces données doivent être préparées avant l’entraînement :",[522,678,680],{"className":524,"code":679,"language":526,"meta":527,"style":411},"Sources brutes\n    ↓\nNettoyage et normalisation\n    ↓\nFiltrage de qualité\n    ↓\nDéduplication\n    ↓\nRépartition entre langues et domaines\n    ↓\nTokenisation\n",[529,681,682,687,692,697,701,706,710,715,719,724,728],{"__ignoreMap":411},[532,683,684],{"class":534,"line":535},[532,685,686],{},"Sources brutes\n",[532,688,689],{"class":534,"line":412},[532,690,691],{},"    ↓\n",[532,693,694],{"class":534,"line":558},[532,695,696],{},"Nettoyage et normalisation\n",[532,698,699],{"class":534,"line":564},[532,700,691],{},[532,702,703],{"class":534,"line":570},[532,704,705],{},"Filtrage de qualité\n",[532,707,708],{"class":534,"line":625},[532,709,691],{},[532,711,712],{"class":534,"line":630},[532,713,714],{},"Déduplication\n",[532,716,717],{"class":534,"line":636},[532,718,691],{},[532,720,721],{"class":534,"line":641},[532,722,723],{},"Répartition entre langues et domaines\n",[532,725,726],{"class":534,"line":647},[532,727,691],{},[532,729,730],{"class":534,"line":652},[532,731,732],{},"Tokenisation\n",[21,734,735],{},"Cette préparation influence directement les capacités du modèle. Une langue peu représentée sera moins bien maîtrisée. Un corpus contenant peu de code donnera de moins bons résultats en programmation. Des pages dupliquées ou des données de mauvaise qualité peuvent aussi déformer l’apprentissage.",[21,737,738,739,585],{},"Néanmoins, ce n’est pas les seules façons d’améliorer l’apprentissage d’un modèle. Par exemple, il a été démontré qu’ajouter une portion de code à l’entraînement d’un LLM améliore de manière significative ses capacités de raisonnement, même pour les tâches en dehors du code ! (",[68,740,743],{"href":741,"rel":742},"https:\u002F\u002Farxiv.org\u002Fhtml\u002F2509.21499v2",[72],"On Code-Induced Reasoning in LLMs",[21,745,746,747,585],{},"La taille du réseau ne suffit donc pas. Il faut trouver un équilibre entre le nombre de paramètres, la quantité de données et le budget de calcul. Un très grand modèle entraîné sur trop peu de tokens reste sous-entraîné. (",[68,748,751],{"href":749,"rel":750},"https:\u002F\u002Farxiv.org\u002Fabs\u002F2203.15556",[72],"Training Compute-Optimal Large Language Models",[499,753],{},[43,755,757],{"id":756},"_2-le-tokenizer-découper-le-texte","2. Le tokenizer : découper le texte",[21,759,760,761,763],{},"Un réseau de neurones ne manipule pas directement des mots. Il travaille avec des tableaux de nombres. Le ",[63,762,132],{}," transforme donc le texte en une suite d’identifiants numériques.",[21,765,766],{},"La phrase suivante :",[522,768,770],{"className":524,"code":769,"language":526,"meta":527,"style":411},"Les transformeurs apprennent.\n",[529,771,772],{"__ignoreMap":411},[532,773,774],{"class":534,"line":535},[532,775,769],{},[21,777,778],{},"pourrait être découpée ainsi :",[522,780,782],{"className":524,"code":781,"language":526,"meta":527,"style":411},"[\"Les\", \" transform\", \"eurs\", \" apprennent\", \".\"]\n",[529,783,784],{"__ignoreMap":411},[532,785,786],{"class":534,"line":535},[532,787,781],{},[21,789,790],{},"Puis chaque fragment reçoit un identifiant :",[522,792,794],{"className":524,"code":793,"language":526,"meta":527,"style":411},"[2714, 9831, 412, 25109, 13]\n",[529,795,796],{"__ignoreMap":411},[532,797,798],{"class":534,"line":535},[532,799,793],{},[21,801,802],{},"Ces identifiants désignent simplement des entrées dans le vocabulaire du modèle.",[587,804,806],{"id":805},"pourquoi-utiliser-des-sous-mots","Pourquoi utiliser des sous-mots ?",[21,808,809,810,813],{},"Un vocabulaire contenant tous les mots possibles serait trop grand et gérerait mal les noms propres, les fautes de frappe, le code ou les mots nouveaux. Les tokenizers utilisent donc souvent des ",[63,811,812],{},"sous-mots"," :",[522,815,817],{"className":524,"code":816,"language":526,"meta":527,"style":411},"\"chat\"                   → [\"chat\"]\n\"anticonstitutionnel\"    → [\"anti\", \"constitution\", \"nel\"]\n\"Framework2026\"          → [\"Framework\", \"2026\"]\n",[529,818,819,824,829],{"__ignoreMap":411},[532,820,821],{"class":534,"line":535},[532,822,823],{},"\"chat\"                   → [\"chat\"]\n",[532,825,826],{"class":534,"line":412},[532,827,828],{},"\"anticonstitutionnel\"    → [\"anti\", \"constitution\", \"nel\"]\n",[532,830,831],{"class":534,"line":558},[532,832,833],{},"\"Framework2026\"          → [\"Framework\", \"2026\"]\n",[21,835,836,837,585],{},"Les fragments fréquents peuvent devenir des tokens uniques, tandis que les termes plus rares sont découpés en plusieurs unités. Ce découpage ressemble parfois à la structure linguistique des mots : dans « anticonstitutionnel », le préfixe « anti- » peut être isolé parce qu’il apparaît dans de nombreux autres termes. Ce n’est toutefois pas une règle grammaticale ou étymologique : des méthodes comme BPE ou SentencePiece apprennent leur vocabulaire à partir des régularités statistiques du corpus, et certains tokens ne portent aucun sens lorsqu’ils sont pris séparément. (",[68,838,841],{"href":839,"rel":840},"https:\u002F\u002Farxiv.org\u002Fabs\u002F1808.06226",[72],"SentencePiece",[21,843,844],{},"Le tokenizer a des conséquences concrètes. Il influence la longueur des séquences, le coût en tokens, la qualité multilingue et la capacité à traiter du code ou des nombres. Il ne peut pas être remplacé librement après l’entraînement, car chaque identifiant est lié à une représentation apprise par le modèle.",[587,846,848],{"id":847},"les-conversations-sont-aussi-du-texte","Les conversations sont aussi du texte",[21,850,851],{},"Une discussion est généralement convertie en une suite de tokens spéciaux :",[522,853,855],{"className":524,"code":854,"language":526,"meta":527,"style":411},"\u003C|system|>\nTu es un assistant technique.\n\u003C|user|>\nComment fonctionne l'attention ?\n\u003C|assistant|>\n",[529,856,857,862,867,872,877],{"__ignoreMap":411},[532,858,859],{"class":534,"line":535},[532,860,861],{},"\u003C|system|>\n",[532,863,864],{"class":534,"line":412},[532,865,866],{},"Tu es un assistant technique.\n",[532,868,869],{"class":534,"line":558},[532,870,871],{},"\u003C|user|>\n",[532,873,874],{"class":534,"line":564},[532,875,876],{},"Comment fonctionne l'attention ?\n",[532,878,879],{"class":534,"line":570},[532,880,881],{},"\u003C|assistant|>\n",[21,883,884],{},"Le modèle apprend ainsi à distinguer les instructions système, les messages utilisateur et ses propres réponses.",[499,886],{},[43,888,890],{"id":889},"_3-les-embeddings-transformer-les-tokens-en-vecteurs","3. Les embeddings : transformer les tokens en vecteurs",[21,892,893,894,901],{},"Chaque identifiant est ensuite associé à un ",[68,895,898],{"href":896,"rel":897},"https:\u002F\u002Fdocs.pytorch.org\u002Ftutorials\u002Fbeginner\u002Fnlp\u002Fword_embeddings_tutorial.html",[72],[63,899,900],{},"embedding",", c’est-à-dire un vecteur composé de centaines ou de milliers de nombres.",[522,903,905],{"className":524,"code":904,"language":526,"meta":527,"style":411},"token 9831 → [0.12, -0.84, 0.07, ..., 0.31]\n",[529,906,907],{"__ignoreMap":411},[532,908,909],{"class":534,"line":535},[532,910,904],{},[21,912,913],{},"Ce vecteur n’est pas une définition lisible du token. Il s’agit d’une représentation apprise, que les couches suivantes vont enrichir en fonction du contexte.",[21,915,916],{},"Le mot « avocat » commence avec la même représentation dans les deux phrases suivantes :",[522,918,920],{"className":524,"code":919,"language":526,"meta":527,"style":411},"L'avocat a plaidé devant le tribunal.\nJ'ai ajouté un avocat dans la salade.\n",[529,921,922,927],{"__ignoreMap":411},[532,923,924],{"class":534,"line":535},[532,925,926],{},"L'avocat a plaidé devant le tribunal.\n",[532,928,929],{"class":534,"line":412},[532,930,931],{},"J'ai ajouté un avocat dans la salade.\n",[21,933,934],{},"Après plusieurs couches Transformer, sa représentation devient différente dans chaque phrase, parce que le modèle tient compte des mots qui l’entourent.",[587,936,938],{"id":937},"ajouter-la-notion-de-position","Ajouter la notion de position",[21,940,941],{},"Le modèle doit aussi connaître l’ordre des tokens. Sans information de position, les phrases « le chien mord l’homme » et « l’homme mord le chien » contiendraient les mêmes éléments.",[21,943,944,945,948,949,585],{},"De nombreux LLM utilisent ",[63,946,947],{},"RoPE",", qui injecte la position dans les représentations manipulées par l’attention. Le modèle peut ainsi distinguer les tokens proches des tokens éloignés et tenir compte de leur ordre. (",[68,950,953],{"href":951,"rel":952},"https:\u002F\u002Farxiv.org\u002Fabs\u002F2104.09864",[72],"RoFormer",[499,955],{},[43,957,959],{"id":958},"_4-le-transformer-le-cœur-du-modèle","4. Le Transformer : le cœur du modèle",[21,961,962],{},[352,963],{"alt":964,"src":965},"Structure d’un bloc Transformer : normalisation, attention, connexions résiduelles et réseau MLP, répétés sur plusieurs couches.","\u002Fcontent-assets\u002F2026-07-24-llm-ce-qui-se-passe-vraiment-du-token-a-la-reponse\u002Fassets\u002Fimg2.webp",[21,967,968],{},"Un LLM contient une pile de blocs Transformer. Chaque bloc exécute surtout deux opérations :",[266,970,971,977],{},[269,972,973,976],{},[63,974,975],{},"L’attention"," fait circuler l’information entre les tokens.",[269,978,979,982],{},[63,980,981],{},"Le réseau feed-forward",", ou MLP, transforme l’information présente à chaque position.",[21,984,985],{},"Des normalisations et des connexions résiduelles stabilisent le calcul et permettent de conserver les informations utiles d’une couche à la suivante.",[587,987,989],{"id":988},"lattention-trouver-les-informations-pertinentes","L’attention : trouver les informations pertinentes",[21,991,992,993,996,997,1000,1001,202],{},"Pour chaque token, le modèle construit trois représentations appelées ",[63,994,995],{},"query",", ",[63,998,999],{},"key"," et ",[63,1002,1003],{},"value",[21,1005,1006],{},"On peut les comprendre ainsi :",[266,1008,1009,1012,1015],{},[269,1010,1011],{},"la query décrit ce que le token recherche ;",[269,1013,1014],{},"la key décrit ce qu’un autre token peut apporter ;",[269,1016,1017],{},"la value contient l’information qu’il transmettra.",[21,1019,1020],{},"Le modèle compare les queries et les keys, puis attribue un poids aux values correspondantes. Un token peut ainsi récupérer une information apparue plusieurs mots plus tôt, comme le sujet d’une phrase, le nom auquel renvoie un pronom ou la variable utilisée dans une fonction.",[21,1022,165,1023,1026],{},[63,1024,1025],{},"masque causal"," empêche le modèle de consulter les tokens futurs. Lorsqu’il prédit le quatrième token, il peut regarder les trois premiers, mais pas ceux qui viennent après.",[522,1028,1030],{"className":524,"code":1029,"language":526,"meta":527,"style":411},"Token 1 peut voir : 1\nToken 2 peut voir : 1, 2\nToken 3 peut voir : 1, 2, 3\nToken 4 peut voir : 1, 2, 3, 4\n",[529,1031,1032,1037,1042,1047],{"__ignoreMap":411},[532,1033,1034],{"class":534,"line":535},[532,1035,1036],{},"Token 1 peut voir : 1\n",[532,1038,1039],{"class":534,"line":412},[532,1040,1041],{},"Token 2 peut voir : 1, 2\n",[532,1043,1044],{"class":534,"line":558},[532,1045,1046],{},"Token 3 peut voir : 1, 2, 3\n",[532,1048,1049],{"class":534,"line":564},[532,1050,1051],{},"Token 4 peut voir : 1, 2, 3, 4\n",[21,1053,1054],{},"L’attention utilise plusieurs têtes en parallèle. Elles peuvent apprendre des relations différentes, même si leurs rôles ne sont pas proprement séparés en catégories comme « grammaire » ou « mathématiques ».",[587,1056,1058],{"id":1057},"le-mlp-transformer-linformation","Le MLP : transformer l’information",[21,1060,1061,1062,1065,1066,202],{},"Après l’attention, chaque token passe dans un petit réseau de neurones appelé ",[63,1063,1064],{},"MLP"," ou ",[63,1067,1068],{},"feed-forward network",[21,1070,1071],{},"L’attention rassemble les informations utiles ; le MLP les transforme pour préparer la couche suivante. Dans de nombreuses architectures, ces réseaux contiennent une grande partie des paramètres du modèle.",[21,1073,1074,1075,1078,1079,585],{},"Les LLM récents utilisent souvent des variantes comme ",[63,1076,1077],{},"SwiGLU",", qui ajoutent un mécanisme de porte pour contrôler les caractéristiques transmises. (",[68,1080,1083],{"href":1081,"rel":1082},"https:\u002F\u002Farxiv.org\u002Fabs\u002F2002.05202",[72],"GLU Variants Improve Transformer",[587,1085,1087],{"id":1086},"pourquoi-empiler-autant-de-couches","Pourquoi empiler autant de couches ?",[21,1089,1090],{},"Une seule couche ne suffit pas à construire une représentation riche du texte. Les premières couches peuvent repérer des relations locales, tandis que les suivantes combinent ces informations pour représenter des structures plus abstraites.",[21,1092,1093],{},"Après des dizaines de blocs, la représentation du dernier token est projetée vers tout le vocabulaire. Le modèle obtient alors les scores des prochains tokens possibles et en sélectionne un selon la stratégie de génération choisie.",[499,1095],{},[43,1097,1099],{"id":1098},"_5-le-pré-entraînement-apprendre-à-prédire","5. Le pré-entraînement : apprendre à prédire",[21,1101,1102],{},[352,1103],{"alt":1104,"src":1105},"Construction d’un assistant IA : préparation des données, pré-entraînement du modèle puis post-entraînement sur des instructions et préférences.","\u002Fcontent-assets\u002F2026-07-24-llm-ce-qui-se-passe-vraiment-du-token-a-la-reponse\u002Fassets\u002Fimg3.webp",[21,1107,1108],{},"Au début, les paramètres du réseau sont presque aléatoires. Le modèle ne maîtrise ni la langue, ni le code, ni les connaissances générales.",[21,1110,1111],{},"Pendant le pré-entraînement, une phrase est décalée pour créer les entrées et les cibles :",[522,1113,1115],{"className":524,"code":1114,"language":526,"meta":527,"style":411},"Entrée : Le      chat   dort   sur   le\nCible  : chat    dort   sur    le    canapé\n",[529,1116,1117,1122],{"__ignoreMap":411},[532,1118,1119],{"class":534,"line":535},[532,1120,1121],{},"Entrée : Le      chat   dort   sur   le\n",[532,1123,1124],{"class":534,"line":412},[532,1125,1126],{},"Cible  : chat    dort   sur    le    canapé\n",[21,1128,1129],{},"Le modèle prédit le token suivant à chaque position. Une fonction de perte mesure l’écart entre ses prédictions et les tokens réels.",[21,1131,1132],{},"Une étape d’entraînement suit alors ce cycle :",[266,1134,1135,1138,1141,1144,1147],{},[269,1136,1137],{},"les tokens traversent le réseau ;",[269,1139,1140],{},"la fonction de perte mesure l’erreur ;",[269,1142,1143],{},"la rétropropagation calcule la contribution de chaque paramètre ;",[269,1145,1146],{},"l’optimiseur modifie légèrement les poids ;",[269,1148,1149],{},"le processus recommence avec un nouveau lot de données.",[21,1151,1152],{},"Ce cycle est répété sur des milliards ou des milliers de milliards de tokens.",[587,1154,1156],{"id":1155},"où-se-trouvent-les-connaissances","Où se trouvent les connaissances ?",[21,1158,1159],{},"Les documents ne sont pas stockés tels quels dans une base interne. Les régularités apprises sont réparties entre les paramètres du réseau.",[21,1161,1162],{},"Une règle grammaticale, une association factuelle ou une structure de code peut dépendre de nombreuses couches à la fois. Le modèle ressemble davantage à une compression statistique de ses données d’entraînement qu’à une encyclopédie dans laquelle il chercherait une page précise.",[587,1164,1166],{"id":1165},"pourquoi-faut-il-autant-de-gpu","Pourquoi faut-il autant de GPU ?",[21,1168,1169],{},"Un grand modèle et les états nécessaires à son entraînement ne tiennent pas sur un seul accélérateur. Le calcul est donc réparti entre plusieurs GPU : certains traitent des lots de données différents, d’autres se partagent les matrices ou les couches.",[21,1171,1172],{},"Les poids et les calculs utilisent aussi des formats numériques plus compacts, comme BF16 ou FP8, afin de réduire la mémoire et d’accélérer les opérations. Cette optimisation demande toutefois de préserver une précision suffisante pour que l’entraînement reste stable.",[499,1174],{},[43,1176,1178],{"id":1177},"_6-le-post-entraînement-passer-du-modèle-de-base-à-lassistant","6. Le post-entraînement : passer du modèle de base à l’assistant",[21,1180,1181],{},"À la fin du pré-entraînement, le modèle sait surtout compléter du texte. Il peut déjà répondre à certaines questions, mais il ne suit pas encore les instructions de manière fiable.",[21,1183,165,1184,1187],{},[63,1185,1186],{},"post-entraînement"," lui apprend à produire des réponses plus utiles et plus adaptées au dialogue.",[587,1189,1191],{"id":1190},"le-fine-tuning-supervisé","Le fine-tuning supervisé",[21,1193,1194],{},"Le modèle est entraîné sur des exemples préparés :",[522,1196,1198],{"className":524,"code":1197,"language":526,"meta":527,"style":411},"Instruction : Résume ce texte en trois phrases.\nRéponse attendue : ...\n",[529,1199,1200,1205],{"__ignoreMap":411},[532,1201,1202],{"class":534,"line":535},[532,1203,1204],{},"Instruction : Résume ce texte en trois phrases.\n",[532,1206,1207],{"class":534,"line":412},[532,1208,1209],{},"Réponse attendue : ...\n",[21,1211,1212],{},"Il apprend les formats de conversation, les réponses structurées, les appels d’outils et certains comportements de sécurité.",[587,1214,1216],{"id":1215},"lapprentissage-par-préférences","L’apprentissage par préférences",[21,1218,1219],{},"Plusieurs réponses peuvent être correctes, mais l’une peut être plus claire, mieux structurée ou plus prudente. Des humains ou d’autres modèles comparent alors des réponses, puis le système ajuste le LLM pour favoriser celles qui sont préférées.",[21,1221,1222,1223,996,1228,585],{},"Le RLHF s’appuie sur un modèle de récompense et de l’apprentissage par renforcement. Des méthodes comme DPO apprennent plus directement à préférer une bonne réponse à une réponse rejetée. (",[68,1224,1227],{"href":1225,"rel":1226},"https:\u002F\u002Farxiv.org\u002Fabs\u002F2203.02155",[72],"InstructGPT",[68,1229,1232],{"href":1230,"rel":1231},"https:\u002F\u002Farxiv.org\u002Fabs\u002F2305.18290",[72],"DPO",[587,1234,1236],{"id":1235},"les-modèles-de-raisonnement","Les modèles de raisonnement",[21,1238,1239],{},"Les modèles dits « raisonnants » utilisent souvent la même base Transformer. Leur post-entraînement les encourage à consacrer davantage de tokens aux problèmes difficiles, à tester plusieurs pistes et à vérifier certaines étapes.",[21,1241,1242],{},"Cette dépense supplémentaire de calcul peut améliorer les résultats en mathématiques, en code ou en planification. Elle ne garantit pas qu’une réponse soit vraie : un raisonnement long peut rester cohérent tout en partant d’une hypothèse incorrecte.",[499,1244],{},[43,1246,1248],{"id":1247},"_7-linférence-générer-la-réponse-efficacement","7. L’inférence : générer la réponse efficacement",[21,1250,1251],{},[352,1252],{"alt":1253,"src":1254},"Inférence d’un LLM : traitement parallèle du prompt pendant le prefill, puis génération séquentielle avec réutilisation du cache KV.","\u002Fcontent-assets\u002F2026-07-24-llm-ce-qui-se-passe-vraiment-du-token-a-la-reponse\u002Fassets\u002Fimg4.webp",[21,1256,1257],{},"Lorsqu’un utilisateur envoie un prompt, l’inférence se déroule en deux phases.",[587,1259,1261],{"id":1260},"le-prefill","Le prefill",[21,1263,1264],{},"Le modèle traite l’ensemble du prompt en parallèle et calcule les représentations nécessaires dans chaque couche. Cette phase influence surtout le délai avant le premier token.",[587,1266,1268],{"id":1267},"le-décodage","Le décodage",[21,1270,1271],{},"Le modèle génère ensuite les tokens un par un. Cette phase est séquentielle, car chaque nouveau token dépend de celui qui vient d’être produit.",[587,1273,1275],{"id":1274},"le-kv-cache","Le KV cache",[21,1277,1278,1279,1282],{},"Sans optimisation, le modèle recalculerait tout le contexte à chaque token. Le ",[63,1280,1281],{},"KV cache"," (pour Key Value cache) conserve les informations déjà calculées par l’attention.",[21,1284,1285],{},"Cette mémoire accélère fortement la génération, mais elle grossit avec la longueur du contexte, le nombre de couches et le nombre de conversations traitées en parallèle. Sur de longs contextes, le KV cache peut consommer plusieurs gigaoctets par requête.",[499,1287],{},[43,1289,1291],{"id":1290},"_8-comment-les-llms-récents-sont-optimisés","8. Comment les LLMs récents sont optimisés",[21,1293,1294],{},"Les modèles modernes combinent plusieurs techniques. Chacune répond à un problème précis : réduire la mémoire, accélérer la génération, augmenter la capacité ou adapter le modèle à un usage.",[587,1296,1298],{"id":1297},"gqa-et-mla-réduire-le-coût-du-kv-cache","GQA et MLA : réduire le coût du KV cache",[21,1300,1301],{},"Dans l’attention multi-têtes classique, chaque tête conserve ses propres keys et values. Cela produit un cache volumineux.",[21,1303,1304,1305,1308,1309,585],{},"La ",[63,1306,1307],{},"Grouped-Query Attention",", ou GQA, permet à plusieurs têtes de query de partager les mêmes têtes key\u002Fvalue. Le modèle réduit ainsi la mémoire nécessaire tout en conservant une bonne qualité. (",[68,1310,1313],{"href":1311,"rel":1312},"https:\u002F\u002Farxiv.org\u002Fabs\u002F2305.13245",[72],"GQA",[21,1315,1304,1316,1319],{},[63,1317,1318],{},"Multi-head Latent Attention",", utilisée notamment dans la famille DeepSeek, compresse davantage les informations stockées dans le cache. Le principe reste le même : limiter la mémoire et les transferts pendant la génération.",[587,1321,1323],{"id":1322},"flashattention-mieux-utiliser-la-mémoire-du-gpu","FlashAttention : mieux utiliser la mémoire du GPU",[21,1325,1326,1327,1330],{},"L’attention complète compare de nombreux tokens entre eux et produit de grandes données intermédiaires. ",[63,1328,1329],{},"FlashAttention"," réorganise le calcul par blocs pour éviter des lectures et écritures inutiles dans la mémoire du GPU.",[21,1332,1333,1334,585],{},"Le résultat mathématique ne change pas, mais l’exécution devient plus rapide et consomme moins de mémoire. (",[68,1335,1329],{"href":1336,"rel":1337},"https:\u002F\u002Farxiv.org\u002Fabs\u002F2205.14135",[72],[587,1339,1341],{"id":1340},"mixture-of-experts-activer-seulement-une-partie-du-modèle","Mixture of Experts : activer seulement une partie du modèle",[21,1343,1344,1345,1348],{},"Dans un modèle dense, chaque token traverse le même MLP. Une architecture ",[63,1346,1347],{},"Mixture of Experts",", ou MoE, remplace ce MLP par plusieurs experts.",[21,1350,1351],{},[352,1352],{"alt":1353,"src":1354},"Mixture of Experts : un routeur sélectionne deux experts parmi huit pour traiter un token, réduisant le nombre de paramètres actifs.","\u002Fcontent-assets\u002F2026-07-24-llm-ce-qui-se-passe-vraiment-du-token-a-la-reponse\u002Fassets\u002Fimg5.webp",[21,1356,1357],{},"Un routeur choisit quelques experts pour chaque token. Un modèle peut ainsi contenir des centaines de milliards de paramètres au total, tout en n’en activant qu’une petite partie à chaque passage.",[21,1359,1360],{},"Cette approche augmente la capacité sans multiplier le coût de calcul dans les mêmes proportions. Elle apporte cependant de nouvelles contraintes : tous les experts doivent être stockés, les tokens doivent circuler entre les GPU et le routeur doit éviter de surcharger toujours les mêmes experts.",[21,1362,1363,1364,996,1369,585],{},"Les experts ne correspondent pas forcément à des catégories claires comme « français », « Python » ou « mathématiques ». Leurs spécialisations sont apprises et restent souvent difficiles à interpréter. (",[68,1365,1368],{"href":1366,"rel":1367},"https:\u002F\u002Farxiv.org\u002Fabs\u002F2401.04088",[72],"Mixtral of Experts",[68,1370,1373],{"href":1371,"rel":1372},"https:\u002F\u002Farxiv.org\u002Fabs\u002F2412.19437",[72],"DeepSeek-V3",[587,1375,1377],{"id":1376},"attention-locale-et-contexte-long","Attention locale et contexte long",[21,1379,1380,1381,1384],{},"L’attention complète devient coûteuse lorsque le contexte s’allonge. Certains modèles utilisent donc une ",[63,1382,1383],{},"attention locale",", dans laquelle un token ne consulte qu’une fenêtre récente. Des couches globales sont ajoutées à intervalles réguliers pour faire circuler l’information à plus longue distance.",[21,1386,1387,1388,585],{},"Les modèles doivent également être entraînés ou adaptés pour exploiter les positions longues. Des techniques comme YaRN étendent les encodages RoPE, mais une fenêtre annoncée à 128 000 tokens ne garantit pas que le modèle retrouvera chaque détail avec la même fiabilité. (",[68,1389,1392],{"href":1390,"rel":1391},"https:\u002F\u002Farxiv.org\u002Fabs\u002F2309.00071",[72],"YaRN",[587,1394,1396],{"id":1395},"prédiction-multi-token-et-décodage-spéculatif","Prédiction multi-token et décodage spéculatif",[21,1398,1399],{},"Un modèle autoregressif classique prédit un token à la fois. Certaines architectures ajoutent des têtes capables de proposer plusieurs tokens futurs.",[21,1401,165,1402,1405,1406,585],{},[63,1403,1404],{},"décodage spéculatif"," suit une idée proche : un petit modèle prépare rapidement plusieurs tokens, puis le grand modèle les vérifie en parallèle. Lorsque les propositions sont acceptées, plusieurs tokens sont générés en un seul passage du modèle principal. (",[68,1407,1410],{"href":1408,"rel":1409},"https:\u002F\u002Farxiv.org\u002Fabs\u002F2211.17192",[72],"Fast Inference from Transformers via Speculative Decoding",[587,1412,1414],{"id":1413},"quantification-utiliser-moins-de-bits","Quantification : utiliser moins de bits",[21,1416,1417,1418,1421],{},"Les poids sont souvent stockés en 16 bits pendant l’entraînement ou le déploiement haut de gamme. La ",[63,1419,1420],{},"quantification"," les représente avec 8 ou 4 bits afin de réduire la mémoire et la bande passante.",[21,1423,1424],{},"Un modèle de 70 milliards de paramètres occupe environ 140 Go en 16 bits pour ses seuls poids bruts, contre environ 35 Go en 4 bits. Il faut encore ajouter le KV cache et les buffers du runtime, mais le gain reste important.",[21,1426,1427],{},"La quantification introduit une approximation, si bien que les méthodes modernes cherchent à préserver les poids les plus sensibles. Elle permet notamment d’exécuter des modèles sur du matériel plus accessible.",[499,1429],{},[43,1431,1433],{"id":1432},"_9-adapter-ou-enrichir-un-modèle-sans-le-réentraîner-entièrement","9. Adapter ou enrichir un modèle sans le réentraîner entièrement",[21,1435,1436],{},"Toutes les évolutions ne nécessitent pas un nouveau pré-entraînement.",[587,1438,1440],{"id":1439},"lora","LoRA",[21,1442,1443,1445],{},[63,1444,1440],{}," ajoute de petites matrices entraînables à certaines couches, tandis que les poids principaux restent figés. L’adaptation utilise alors beaucoup moins de mémoire qu’un fine-tuning complet.",[21,1447,1448,1449,585],{},"Cette méthode convient bien pour modifier le ton, le format de réponse ou certaines compétences métier. Elle est moins adaptée aux connaissances qui changent souvent. (",[68,1450,1440],{"href":1451,"rel":1452},"https:\u002F\u002Farxiv.org\u002Fabs\u002F2106.09685",[72],[587,1454,663],{"id":1455},"rag",[21,1457,165,1458,1461],{},[63,1459,1460],{},"Retrieval-Augmented Generation"," ajoute une recherche documentaire avant l’appel au modèle :",[522,1463,1465],{"className":524,"code":1464,"language":526,"meta":527,"style":411},"Question\n   ↓\nRecherche de passages pertinents\n   ↓\nAjout des passages au prompt\n   ↓\nRéponse du LLM\n",[529,1466,1467,1472,1477,1482,1486,1491,1495],{"__ignoreMap":411},[532,1468,1469],{"class":534,"line":535},[532,1470,1471],{},"Question\n",[532,1473,1474],{"class":534,"line":412},[532,1475,1476],{},"   ↓\n",[532,1478,1479],{"class":534,"line":558},[532,1480,1481],{},"Recherche de passages pertinents\n",[532,1483,1484],{"class":534,"line":564},[532,1485,1476],{},[532,1487,1488],{"class":534,"line":570},[532,1489,1490],{},"Ajout des passages au prompt\n",[532,1492,1493],{"class":534,"line":625},[532,1494,1476],{},[532,1496,1497],{"class":534,"line":630},[532,1498,1499],{},"Réponse du LLM\n",[21,1501,1502,1503,585],{},"Le RAG convient aux informations privées, récentes ou fréquemment mises à jour. Il permet aussi de présenter les sources utilisées. Sa qualité dépend toutefois de la recherche : un mauvais document conduit souvent à une mauvaise réponse. (",[68,1504,1460],{"href":1505,"rel":1506},"https:\u002F\u002Farxiv.org\u002Fabs\u002F2005.11401",[72],[1508,1509,1510,1523],"table",{},[1511,1512,1513],"thead",{},[1514,1515,1516,1520],"tr",{},[1517,1518,1519],"th",{},"Besoin",[1517,1521,1522],{},"Technique adaptée",[1524,1525,1526,1535,1542,1550,1558],"tbody",{},[1514,1527,1528,1532],{},[1529,1530,1531],"td",{},"Donner une instruction ponctuelle",[1529,1533,1534],{},"Prompt",[1514,1536,1537,1540],{},[1529,1538,1539],{},"Ajouter des faits privés ou récents",[1529,1541,663],{},[1514,1543,1544,1547],{},[1529,1545,1546],{},"Modifier le style ou le comportement",[1529,1548,1549],{},"SFT ou LoRA",[1514,1551,1552,1555],{},[1529,1553,1554],{},"Apprendre durablement un domaine",[1529,1556,1557],{},"Fine-tuning ou entraînement continu",[1514,1559,1560,1563],{},[1529,1561,1562],{},"Augmenter les capacités fondamentales",[1529,1564,1565],{},"Nouveau modèle ou nouvelle architecture",[490,1567,1568],{},[21,1569,1570,1571,1575],{},"💡 Si implémenter une solution à base de RAG vous intéresse, n’hésitez pas à lire ",[68,1572,1574],{"href":408,"rel":1573},[72],"l'article de Florian Hirson"," sur le sujet !",[499,1577],{},[43,1579,1581],{"id":1580},"_10-les-modèles-multimodaux","10. Les modèles multimodaux",[21,1583,1584],{},"Un modèle multimodal applique une logique similaire aux images, à l’audio ou à la vidéo.",[21,1586,1587],{},"Pour une image, un encodeur transforme les pixels en vecteurs :",[522,1589,1591],{"className":524,"code":1590,"language":526,"meta":527,"style":411},"Image\n  ↓\nDécoupage en régions\n  ↓\nEncodeur visuel\n  ↓\nVecteurs visuels\n  ↓\nModèle de langage\n",[529,1592,1593,1598,1603,1608,1612,1617,1621,1626,1630],{"__ignoreMap":411},[532,1594,1595],{"class":534,"line":535},[532,1596,1597],{},"Image\n",[532,1599,1600],{"class":534,"line":412},[532,1601,1602],{},"  ↓\n",[532,1604,1605],{"class":534,"line":558},[532,1606,1607],{},"Découpage en régions\n",[532,1609,1610],{"class":534,"line":564},[532,1611,1602],{},[532,1613,1614],{"class":534,"line":570},[532,1615,1616],{},"Encodeur visuel\n",[532,1618,1619],{"class":534,"line":625},[532,1620,1602],{},[532,1622,1623],{"class":534,"line":630},[532,1624,1625],{},"Vecteurs visuels\n",[532,1627,1628],{"class":534,"line":636},[532,1629,1602],{},[532,1631,1632],{"class":534,"line":641},[532,1633,633],{},[21,1635,1636],{},"Le LLM ne voit donc pas directement les pixels. Il traite des représentations numériques compatibles avec les tokens de texte.",[21,1638,1639],{},"Certaines architectures connectent un encodeur visuel à un LLM existant. D’autres entraînent plus étroitement les modalités ensemble afin que le texte et l’image partagent le même espace de traitement.",[499,1641],{},[43,1643,1645],{"id":1644},"_11-construire-un-llm-en-cinq-étapes","11. Construire un LLM en cinq étapes",[587,1647,1649],{"id":1648},"_1-définir-le-besoin","1. Définir le besoin",[21,1651,1652],{},"L’équipe fixe les langues, les domaines, les modalités, la longueur de contexte et les contraintes de déploiement. Un modèle destiné à un téléphone ne sera pas conçu comme un modèle réparti sur des centaines de GPU.",[587,1654,1656],{"id":1655},"_2-préparer-les-données-et-le-tokenizer","2. Préparer les données et le tokenizer",[21,1658,1659],{},"Les données sont collectées, nettoyées, filtrées et dédupliquées. Le tokenizer est entraîné pour représenter efficacement les langues et les contenus ciblés.",[587,1661,1663],{"id":1662},"_3-choisir-larchitecture-et-pré-entraîner","3. Choisir l’architecture et pré-entraîner",[21,1665,1666],{},"L’équipe choisit la taille du réseau, le nombre de couches, le type d’attention, la présence éventuelle d’experts et les formats numériques. Le modèle apprend ensuite à prédire le prochain token sur un grand corpus.",[587,1668,1670],{"id":1669},"_4-effectuer-le-post-entraînement","4. Effectuer le post-entraînement",[21,1672,1673],{},"Le modèle est adapté au dialogue, au suivi d’instructions, aux préférences, aux outils, à la sécurité et, selon les objectifs, au raisonnement prolongé.",[587,1675,1677],{"id":1676},"_5-évaluer-et-déployer","5. Évaluer et déployer",[21,1679,1680],{},"La qualité des réponses ne suffit pas. Il faut aussi mesurer la latence, la mémoire, le débit, le coût, la robustesse et la sécurité. Le moteur d’inférence optimise ensuite le batching, le KV cache, la quantification et la répartition sur le matériel.",[499,1682],{},[43,1684,1686],{"id":1685},"conclusion-la-taille-ne-raconte-plus-toute-lhistoire","Conclusion : la taille ne raconte plus toute l’histoire",[21,1688,1689],{},"Le fonctionnement de base d’un LLM reste simple à formuler : le texte devient une suite de tokens, ces tokens traversent des couches Transformer, puis le modèle prédit la suite la plus probable.",[21,1691,1692],{},"La complexité vient de l’échelle et des choix d’ingénierie. Les MoE sélectionnent les experts utiles, la GQA réduit le KV cache, FlashAttention optimise les accès mémoire, le décodage spéculatif accélère la génération et la quantification facilite le déploiement.",[21,1694,1695],{},"Le nombre total de paramètres ne suffit donc plus pour comparer deux modèles. Il faut aussi regarder les paramètres réellement activés, les données d’entraînement, le post-entraînement, la longueur de contexte exploitable et le moteur qui sert les réponses.",[21,1697,1698],{},"Un bon LLM n’est pas seulement un grand réseau : c’est un système qui dépense son calcul et sa mémoire là où ils améliorent réellement la réponse.",[1700,1701,1702],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":411,"searchDepth":412,"depth":412,"links":1704},[1705,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1716,1717],{"id":503,"depth":412,"text":504},{"id":669,"depth":412,"text":670},{"id":756,"depth":412,"text":757},{"id":889,"depth":412,"text":890},{"id":958,"depth":412,"text":959},{"id":1098,"depth":412,"text":1099},{"id":1177,"depth":412,"text":1178},{"id":1247,"depth":412,"text":1248},{"id":1290,"depth":412,"text":1291},{"id":1432,"depth":412,"text":1433},{"id":1580,"depth":412,"text":1581},{"id":1644,"depth":412,"text":1645},{"id":1685,"depth":412,"text":1686},"2026-07-24T07:41:51.993Z","Vous saisissez une question et, quelques instants plus tard, une réponse structurée apparaît. Cette fluidité donne l’impression que le modèle a compris la demande, réfléchi, puis rédigé son texte comm",{},"\u002Fblogs\u002F2026-07-24-llm-ce-qui-se-passe-vraiment-du-token-a-la-reponse",[1723,1724],{"id":449,"name":450,"image":451,"linkedin":452,"x":14},{"id":1725,"name":1726,"image":1727,"linkedin":1728,"x":14,"github":1729,"bio":1730},"374f4462-cd38-8015-8ec8-daea6b7f8b94","Paul Plancq",".\u002Fassets\u002Freviewer-paul-plancq.webp","www.linkedin.com\u002Fin\u002Fpplancq","https:\u002F\u002Fgithub.com\u002Fpplancq","Senior Consultant Craft - HoppR Lille",{"title":466,"description":1719},"blogs\u002F2026-07-24-llm-ce-qui-se-passe-vraiment-du-token-a-la-reponse\u002Findex",[461,1734],"others","-I9x2bgrEnbY3mQP3_IQk0nzmFQi0OPd7_JrapX1nRc",{"id":1737,"title":1738,"alt":1739,"authors":1740,"body":1756,"date":2288,"description":2289,"extension":431,"image":432,"meta":2290,"navigation":434,"ogImage":432,"path":2291,"published":434,"reviewers":2292,"seo":2299,"stem":2300,"tags":2301,"__hash__":2305},"blogs\u002Fblogs\u002F2026-06-29-quand-lia-rencontre-la-prod-retour-sur-les-talks-ia-du-devlille-2026-pt-1\u002Findex.md","Quand l'IA rencontre la prod : retour sur les talks IA du DevLille 2026 (Pt 1)","Photo de groupe de neuf membres de l'équipe HoppR portant des vêtements violets aux couleurs de l’entreprise, posant ensemble lors de l'événement DevLille.",[1741,1743,1748,1754],{"id":454,"name":455,"image":1742,"linkedin":14,"x":14},"\u002Fdefault-author-image.webp",{"id":1744,"name":1745,"image":1746,"linkedin":1747,"x":14},"368f4462-cd38-80fa-895c-c7ac1dda856a","Dhiaeddine Merad",".\u002Fassets\u002Fauthor-dhiaeddine-merad.webp","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fdhiaeddine-merad-9126b4320\u002F",{"id":1749,"name":1750,"image":1751,"linkedin":1752,"x":14,"bio":1753},"380f4462-cd38-80f9-96f7-e5ad53ad4d1d","Emma Tardy",".\u002Fassets\u002Fauthor-emma-tardy.webp","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Femma-tardy-36aa60140\u002F","Chargée de communication",{"id":449,"name":450,"image":1755,"linkedin":452,"x":14},".\u002Fassets\u002Fauthor-florian-hirson.webp",{"type":18,"value":1757,"toc":2280},[1758,1767,1773,1776,1779,1783,1798,1801,1813,1816,1819,1825,1832,1836,1857,1867,1876,1882,1885,1899,1905,1915,1926,1929,1933,1952,1968,1971,1982,2029,2032,2035,2039,2058,2061,2064,2085,2094,2108,2133,2153,2159,2165,2175,2185,2192,2196,2216,2219,2226,2232,2238,2241,2245,2248,2257,2260,2263,2277],[21,1759,1760,1761,1766],{},"L'été pointe le bout de son nez, les terrasses se remplissent, les journées s'étirent jusque tard dans la soirée, et le ",[68,1762,1765],{"href":1763,"rel":1764},"https:\u002F\u002Fdevlille.fr\u002F",[72],"DevLille"," fait son retour pour une nouvelle édition.",[21,1768,1769,1770],{},"Les 11 et 12 juin 2026, le Lille Grand Palais a accueilli ce rendez-vous incontournable de l'écosystème tech régional, anciennement connu sous le nom de DevFest Lille. ",[63,1771,1772],{},"La team HoppR y était bien évidemment présente, cette année en tant que sponsor bronze.",[21,1774,1775],{},"Au-delà d'un programme particulièrement dense, avec des talks et des ateliers répartis sur quatre tracks en parallèle, ce fut aussi l'occasion de retrouver un événement dont les valeurs résonnent pleinement avec les nôtres, entre accessibilité, écoresponsabilité et transmission auprès des plus jeunes.",[21,1777,1778],{},"Nous vous proposons maintenant de découvrir avec nous les conférences que nous avons choisi de suivre. Ce retour s'étalera sur plusieurs articles : cette première partie se concentre sur les talks consacrés à l'intelligence artificielle. N'hésitez pas à consulter les autres volets de la série !",[43,1780,1782],{"id":1781},"qui-a-marqué-le-plus-de-buts-construire-un-agent-ia-qui-interroge-des-données-en-langage-naturel","Qui a marqué le plus de buts ? Construire un agent IA qui interroge des données en langage naturel",[21,1784,1785,66,1788,66,1795],{},[28,1786,1787],{},"Mazlum Tosun - 45 min -",[68,1789,1792],{"href":1790,"rel":1791},"https:\u002F\u002Fdevlille.fr\u002Ftalk-page-581615de-5b82-4127-8c6b-e814f9fbc0fd\u002F",[72],[28,1793,1794],{},"Abstract",[28,1796,1797],{},"- Captation",[21,1799,1800],{},"Le titre donne le ton : une démo concrète où un agent répond à des questions sur des données de foot en langage naturel. Sans agent, interroger une base demande de maîtriser le schéma, les relations et les types de données, puis de traduire des règles métier en SQL fiable. L'idée de déléguer cette traduction à un LLM est donc particulièrement séduisante.",[21,1802,1803,1804,1809,1810,202],{},"L'architecture présentée est fortement ancrée dans l'écosystème Google Cloud : ",[68,1805,1808],{"href":1806,"rel":1807},"https:\u002F\u002Fadk.dev\u002F",[72],"ADK"," (Agent Development Kit) pour l'orchestration, des serveurs MCP natifs GCP pour l'accès aux données, Vertex AI pour les modèles, FastAPI et Next.js côté applicatif. ADK gère les sessions, le contexte, les outils et le déploiement vers Agent Engine (successeur de Vertex AI côté agents). Pour tester en local sans consommer de tokens, on branche un modèle plus petit (Gemini 2.0 Flash ou Gemma). Les system instructions sont modulaires, avec un fichier Markdown par responsabilité et des règles métier maintenues hors du code, puis validées en CI via des ",[28,1811,1812],{},"golden datasets",[21,1814,1815],{},"Une attention particulière est portée à la validation avant exécution, à la fois côté technique (validation syntaxique SQL, dry run BigQuery pour estimer le coût, respect des droits IAM) et côté métier (traduction du SQL en langage naturel, détection d'ambiguïtés, validation humaine).",[21,1817,1818],{},"Le flow se déroule ainsi :",[21,1820,1821],{},[352,1822],{"alt":1823,"src":1824},"Pipeline de 5 étapes pour transformer une question en langage naturel en requête SQL exécutée : Question → Traduction NL→SQL → Explication → Validation (syntaxe + dry run) → Exécution et résultat. Chaque étape est représentée par une boîte colorée reliée par des flèches directionnelles.","\u002Fcontent-assets\u002F2026-06-29-quand-lia-rencontre-la-prod-retour-sur-les-talks-ia-du-devlille-2026-pt-1\u002Fassets\u002Fimg1.webp",[21,1826,1827,1828,202],{},"C'est une démo convaincante de ce qu'on peut monter rapidement sur GCP et BigQuery, et la stack MCP + ADK + Agent Engine se révèle cohérente et bien intégrée. La démonstration reste toutefois, dans les grandes lignes, un POC : les questions de sécurité en profondeur, d'observabilité fine, de gestion des coûts et de tests robustes sur un système non-déterministe n'y sont qu'effleurées. Ce sont précisément ces sujets qui font le fossé entre une démo qui impressionne et un système qu'on met en production, un fossé que nous avons d'ailleurs creusé de notre ",[68,1829,1831],{"href":408,"rel":1830},[72],"côté",[43,1833,1835],{"id":1834},"pas-de-paie-sans-contrôle-valider-évaluer-et-guider-le-llm","Pas de paie sans contrôle : valider, évaluer et guider le LLM",[21,1837,1838,66,1841,66,1847,66,1850],{},[28,1839,1840],{},"Par Thomas Villaren - 45 min -",[68,1842,1845],{"href":1843,"rel":1844},"https:\u002F\u002Fdevlille.fr\u002Ftalk-page-89bbedf1-f20a-4f10-a1cd-4e95812ee3bd\u002F",[72],[28,1846,1794],{},[28,1848,1849],{},"-",[68,1851,1854,66],{"href":1852,"rel":1853},"https:\u002F\u002Fyoutu.be\u002FoTZ9ZHWz464?si=siLbUdv6jUC16nqD",[72],[28,1855,1856],{},"Captation",[21,1858,1859,1860,1863,1864,202],{},"Là où le talk précédent montre ce qu'on ",[28,1861,1862],{},"peut"," faire, celui-ci montre comment le faire ",[28,1865,1866],{},"sérieusement",[21,1868,1869,1870,1875],{},"PayFit gère des milliers de conventions collectives, chacune avec des dizaines de paramètres, des formats hétérogènes et sans standard possible. Intégrer manuellement ces textes de loi dans leur ",[68,1871,1874],{"href":1872,"rel":1873},"https:\u002F\u002Fbackstage.payfit.com\u002Fthe-right-tool-for-the-job-how-creating-our-own-programming-language-brought-us-closer-to-success\u002F",[72],"DSL interne Jetlang"," représente un travail colossal. Les LLMs sont une piste évidente, mais la vraie difficulté n'est pas de générer : c'est de garantir que ce qui est généré est juste.",[21,1877,1878],{},[352,1879],{"alt":1880,"src":1881},"Thomas Villaren sur la scène du Grand Théâtre du Grand Palais à Lille pour Devlille 2026, debout à côté d'un grand écran affichant une présentation PayFit sur les LLM face à un public assis.","\u002Fcontent-assets\u002F2026-06-29-quand-lia-rencontre-la-prod-retour-sur-les-talks-ia-du-devlille-2026-pt-1\u002Fassets\u002Fimg2.webp",[21,1883,1884],{},"Leur approche s'est construite en trois étapes :",[21,1886,1887,1890,1891,1894,1895,1898],{},[63,1888,1889],{},"Guider"," avec le ",[28,1892,1893],{},"structured output"," : un schéma JSON respecté en sortie, avec une boucle de feedback pour que le modèle s'auto-corrige via des validations syntaxiques puis sémantiques (du plus rapide au plus coûteux, selon le principe ",[28,1896,1897],{},"fail fast",").",[21,1900,1901,1904],{},[63,1902,1903],{},"Valider"," à chaque étape de la génération de Jetlang, en passant par un parser, une analyse sémantique statique et une validation métier. Rien n'est exécuté sans franchir cette chaîne.",[21,1906,1907,1910,1911,1914],{},[63,1908,1909],{},"Évaluer"," de façon déterministe : plutôt que le pattern LLM-as-a-judge, l'équipe s'appuie sur un ",[63,1912,1913],{},"scorer",", une mesure calculable de l'output. Cela permet de comparer modèles et fournisseurs (qualité, temps de réponse, coût) et de détecter les régressions à chaque changement de prompt ou de modèle.",[21,1916,1917,1918,1921,1922,1925],{},"Pour l'observabilité, ils utilisent ",[63,1919,1920],{},"Langfuse",", surnommé « le Datadog du LLM » : traces, visualisation du temps passé par étape, identification des échecs récurrents, et ",[28,1923,1924],{},"prompt management"," qui pourrait à terme permettre au métier d'ajuster les prompts directement.",[21,1927,1928],{},"Le choix d'architecture est délibéré : pas d'agent autonome, mais une approche KISS reposant sur un objectif défini, un périmètre borné, un prompt figé et un contexte maîtrisé. C'est une base solide à poser avant d'envisager tout workflow agentique, et l'exact opposé du vibe coding lorsqu'il s'applique à des systèmes critiques.",[43,1930,1932],{"id":1931},"le-vibe-coding-est-mort-vive-le-spec-coding","Le vibe coding est mort, vive le spec coding",[21,1934,1935,66,1938,66,1944,66,1946],{},[28,1936,1937],{},"Par Aurélien Allienne - 45 min -",[68,1939,1942],{"href":1940,"rel":1941},"https:\u002F\u002Fdevlille.fr\u002Ftalk-page-1a1bde86-57b0-47f2-b028-ff92daa40d08\u002F",[72],[28,1943,1794],{},[28,1945,1849],{},[68,1947,1950,66],{"href":1948,"rel":1949},"https:\u002F\u002Fyoutu.be\u002F0Gsh8ym50Uw?si=54nfjZL0w-O6iKPe",[72],[28,1951,1856],{},[21,1953,1954,1955,1960,1961,1964,1965,202],{},"Tout commence avec un tweet publié le 2 février 2025 : ",[68,1956,1959],{"href":1957,"rel":1958},"https:\u002F\u002Ffr.wikipedia.org\u002Fwiki\u002FAndrej_Karpathy",[72],"Andrej Karpathy",", cofondateur d'OpenAI et ancien directeur de l'IA chez Tesla, y décrit son dimanche. Il code un projet perso avec Cursor et Claude, délègue tout à l'IA, accepte les diffs sans les lire et fait confiance au modèle. Il précise lui-même qu'il s'agit là « ",[28,1962,1963],{},"d'une solution pas trop mal pour du code jetable"," ». Ce tweet, vu des dizaines de millions de fois, a donné naissance au ",[63,1966,1967],{},"vibe coding",[21,1969,1970],{},"Le constat d'Aurélien est sans détour : en production, cela ne fonctionne pas. Il a livré plusieurs projets réels avec Claude Code comme pair-programmer principal, sur une même stack (React, TypeScript, Go, Cloud Run) et un même agent, mais dans deux contextes différents. Les résultats observés lorsqu'on se contente de « vibe » sont éloquents : hallucinations architecturales, refactors fantômes, dérive de contexte dès qu'un fichier dépasse 300 lignes. L'agent ne comprend pas votre projet, il se contente de prédire la suite la plus probable.",[21,1972,1973,1974,1977,1978,1981],{},"Sa réponse tient en deux mots : le ",[63,1975,1976],{},"spec coding",", dont l'idée centrale est de formaliser les spécifications ",[28,1979,1980],{},"avant"," de laisser l'IA générer la moindre ligne de code :",[266,1983,1984,1991,2001,2007,2023],{},[269,1985,1986,1987,1990],{},"Un ",[63,1988,1989],{},"Prompt Requirements Document (PRD)"," qui pose les contours avant la première ligne de code",[269,1992,1986,1993,1996,1997,2000],{},[63,1994,1995],{},"DESIGN.md"," qui encode le ",[28,1998,1999],{},"design system"," (couleurs, typographie, composants) pour que l'agent ne réinvente pas l'identité visuelle à chaque prompt",[269,2002,1986,2003,2006],{},[63,2004,2005],{},"CLAUDE.md"," qui sert de mémoire persistante au projet",[269,2008,2009,2010,2013,2014,996,2017,996,2020,585],{},"Des ",[63,2011,2012],{},"slash commands"," qui industrialisent les tâches répétitives (",[529,2015,2016],{},"\u002Fimplement",[529,2018,2019],{},"\u002Fbuild",[529,2021,2022],{},"\u002Fship",[269,2024,1986,2025,2028],{},[63,2026,2027],{},"justfile"," qui automatise le build, les tests et le déploiement",[21,2030,2031],{},"La démo montrait ce workflow en action avec Claude Code : un système de commandes guidant l'agent étape par étape, avec des vérifications de statut à chaque transition. Un vrai « harnais de sécurité », selon ses mots.",[21,2033,2034],{},"Ses trois paris pour la suite : le vibe coding va devenir péjoratif (comme le « cowboy coding »), les specs vont devenir le nouveau code source des organisations, et garder l'humain dans la boucle reste le point le plus important, car les IA qui travaillent entre elles sans supervision humaine ont « très peu d'intérêt ».",[43,2036,2038],{"id":2037},"claudecodeprotips20-minutes20run","ClaudeCode.proTips(20, minutes=20).run()",[21,2040,2041,66,2044,66,2050,66,2052],{},[28,2042,2043],{},"Par Erwan Gereec - 30 min -",[68,2045,2048],{"href":2046,"rel":2047},"https:\u002F\u002Fdevlille.fr\u002Ftalk-page-06d7b678-2b3b-4c66-9a9a-6f39d220c1dc\u002F",[72],[28,2049,1794],{},[28,2051,1849],{},[68,2053,2056,66],{"href":2054,"rel":2055},"https:\u002F\u002Fyoutu.be\u002FAmR-x-BB0Lg?si=CgVINmAnVR4hXgaf",[72],[28,2057,1856],{},[21,2059,2060],{},"Ce quickie de 20 minutes (+ 10 minutes de questions) par Erwan Gereec a proposé une collection dense de conseils pratiques pour Claude Code.",[21,2062,2063],{},"Quelques points marquants :",[21,2065,2066,2069,2070,2073,2074,2076,2077,2080,2081,2084],{},[63,2067,2068],{},"Initialisation et contexte"," : ",[529,2071,2072],{},"\u002Finit"," analyse la codebase et génère automatiquement un ",[529,2075,2005],{},", point de départ idéal pour le context engineering. Démarrer depuis la racine du projet permet à Claude de lire les dépendances et les fichiers de config (Docker Compose, tsconfig…) pour cadrer son exécution. Utiliser ",[529,2078,2079],{},"@"," pour référencer des fichiers précis évite de consommer des tokens inutilement. La commande ",[529,2082,2083],{},"\u002Fcontext"," affiche une visualisation rapide de ce qui occupe la fenêtre de contexte.",[21,2086,2087,2069,2090,2093],{},[63,2088,2089],{},"Gestion de la compaction",[529,2091,2092],{},"\u002Fcompact keep the developed API and remove explorations"," cible la compaction de manière précise plutôt qu'une compression aveugle. À surveiller : compacter à 60 % du contexte, ne jamais dépasser 80 %. Si l'auto-compaction se déclenche, la session est considérée comme compromise.",[21,2095,2096,2099,2100,2103,2104,2107],{},[63,2097,2098],{},"Nommage des sessions"," : faire un ",[529,2101,2102],{},"\u002Frename"," dès le début permet de retrouver une session plus tard via ",[529,2105,2106],{},"\u002Fresume",". Si Claude nomme automatiquement, le résultat est souvent approximatif.",[21,2109,2110,2069,2113,2116,2117,2120,2121,2124,2125,2128,2129,2132],{},[63,2111,2112],{},"Modes et commandes",[529,2114,2115],{},"\u002Ffocus"," supprime les messages intermédiaires (« je suis en train de réfléchir… »), utile quand on a plusieurs sessions parallèles. ",[529,2118,2119],{},"Shift + Tab"," bascule entre le mode plan (Claude ne modifie rien, il décrit ce qu'il va faire) et le mode accept. Ne jamais valider le plan au premier jet. ",[529,2122,2123],{},"\u002Ffork"," duplique la session courante pour tester une autre approche, tandis que ",[529,2126,2127],{},"\u002Frewind"," permet de revenir en arrière. Enfin, ",[529,2130,2131],{},"\u002Finsights"," génère un rapport HTML analysant vos habitudes d'usage avec des tips personnalisés, une commande méconnue mais utile.",[21,2134,2135,2138,2139,2142,2143,2145,2146,996,2149,2152],{},[63,2136,2137],{},"Fichiers de contexte"," : maintenir au moins deux fichiers, un ",[529,2140,2141],{},"AGENTS.md"," (source de vérité cross-outils : règles d'architecture, conventions, workflows) et un ",[529,2144,2005],{}," (adaptateur spécifique à Claude Code). Les garder sous 200 lignes chacun. Placer des fichiers de contexte scoped dans les répertoires pertinents (",[529,2147,2148],{},"\u002Ffrontend",[529,2150,2151],{},"\u002Fbackend","). Le workflow de session idéal suit l'enchaînement research → compact → plan → compact → implement.",[21,2154,2155],{},[352,2156],{"alt":2157,"src":2158},"Diagramme horizontal en 5 étapes détaillant un flux de travail technique : Research (Recherche), Compact (Première compression), Plan (Planification), Compact (Deuxième compression) et Implement (Implémentation).","\u002Fcontent-assets\u002F2026-06-29-quand-lia-rencontre-la-prod-retour-sur-les-talks-ia-du-devlille-2026-pt-1\u002Fassets\u002Fimg3.webp",[21,2160,2161,2164],{},[63,2162,2163],{},"Prompting"," : les équipes Anthropic partagent six principes, à savoir être explicite sur le résultat attendu, fournir le contexte et le pourquoi, découper en étapes, inclure des exemples, formuler en positif et définir un critère de validation. Appliquer trois de ces six principes suffit déjà à nettement améliorer les résultats.",[21,2166,2167,2170,2171,2174],{},[63,2168,2169],{},"Choix du modèle"," : ne pas systématiquement utiliser le modèle le plus puissant (et le plus cher). Haiku pour les tâches simples, Sonnet pour le quotidien, Opus pour les tâches vraiment complexes. La commande ",[529,2172,2173],{},"\u002Feffort"," permet de contrôler finement la profondeur de raisonnement.",[21,2176,2177,2180,2181,2184],{},[63,2178,2179],{},"Screenshots"," : un screenshot vaut 1000 explications. Drag & drop direct dans Claude Code, ou ",[529,2182,2183],{},"Cmd + Shift + Ctrl + 4"," sur Mac pour capturer une zone et la coller directement.",[21,2186,2187,2188,2191],{},"Sa phrase de clôture résume bien l'esprit du talk : « ",[28,2189,2190],{},"L'IA est un amplificateur de l'état actuel. Si la documentation et les specs étaient déjà propres, l'output de l'IA sera propre."," » La maturité opérationnelle compte donc plus que le choix du modèle.",[43,2193,2195],{"id":2194},"rex-notre-ia-et-nous-contre-le-legacy","REX : Notre IA et nous contre le legacy",[21,2197,2198,66,2201,66,2207,66,2209],{},[28,2199,2200],{},"Par Jordan Nourry & Benjamin Lacroix - 45 min -",[68,2202,2205],{"href":2203,"rel":2204},"https:\u002F\u002Fdevlille.fr\u002Ftalk-page-f487bce5-0a67-4ee0-af0b-a524661625fa\u002F",[72],[28,2206,1794],{},[28,2208,1849],{},[68,2210,2213,2215],{"href":2211,"rel":2212},"https:\u002F\u002Fyoutu.be\u002FAQcWBt9F8Nc?si=BUv43-I-TTw3OSXZ",[72],[28,2214,1856],{},"  ",[21,2217,2218],{},"Jordan Nourry et Benjamin Lacroix ont proposé un REX pragmatique, avec deux rôles clairement distribués : Benjamin en « enthousiaste » (celui qui croit tout ce qu'il lit et pense que l'IA va faire le travail toute seule) et Jordan en « prudent » (le software engineer qui garde ses pratiques).",[21,2220,2221,2222,2225],{},"Le patient du jour : ",[63,2223,2224],{},"OpenWhyd",", une application open source de lecture musicale multi-plateformes, vieille d'une dizaine d'années, au JavaScript daté mais au code actif et maintenable.",[21,2227,2228,2231],{},[63,2229,2230],{},"L'approche enthousiaste"," : Benjamin demande simplement à un agent de « refaire l'application en React, state of the art ». Après plusieurs itérations, l'agent s'attribue lui-même une note de 72\u002F100, puis 85\u002F100, puis 100\u002F100, alors même que la barre de cookies est positionnée au mauvais endroit, simplement parce que le test censé vérifier sa position était lui aussi mal écrit. L'agent tourne en boucle, s'auto-évalue et répond « oui, tu as raison, je recommence » sans jamais vraiment progresser : amusant à regarder, mais peu satisfaisant en pratique.",[21,2233,2234,2237],{},[63,2235,2236],{},"L'approche prudente"," : Jordan détaille sa méthodologie, qui repose d'abord sur la montée en compétence fonctionnelle (DDD stratégique, bounded contexts, glossaire métier), puis sur une analyse technique rigoureuse avant de laisser l'IA générer quoi que ce soit. L'IA est utilisée massivement pour explorer la base de code, identifier les points d'attention, générer des tests et ajouter des garde-fous. Mais le software engineer reste responsable et doit rester capable d'évaluer ce qui est produit.",[21,2239,2240],{},"La leçon centrale tient en une phrase : l'IA ne prend pas en charge la complexité à votre place. Pour évaluer ce qu'elle génère, il faut encore la comprendre. Les pratiques du craft (découper le travail, avoir une stratégie de test, construire un filet de sécurité) restent aussi indispensables qu'avant. « Tu t'es un peu oublié en tant que software engineer », lance Jordan à Benjamin, et c'est là tout le message de la conférence.",[43,2242,2244],{"id":2243},"conclusion","Conclusion",[21,2246,2247],{},"Qu'il s'agisse d'interroger des données de foot en langage naturel, de traduire des milliers de conventions collectives ou de moderniser une application vieille de dix ans, le constat se répète d'un talk à l'autre : l'IA générative tient ses promesses, à condition de l'encadrer.",[21,2249,2250,2251,2256],{},"Ce qui sépare la démo qui impressionne du système qu'on met réellement en production, c'est un fossé fait de validation systématique, d'évaluation déterministe, de spécifications claires et d'un humain qui garde la main. Loin de rendre le ",[68,2252,2255],{"href":2253,"rel":2254},"https:\u002F\u002Fblog.hoppr.tech\u002Ftags\u002Fcraft",[72],"craft"," obsolète, l'IA en fait la condition de son efficacité, un sujet que nous continuons d'explorer sur nos propres missions.",[21,2258,2259],{},"Mais le DevLille 2026, ce n'est pas que l'IA. Plateforme, cloud, accessibilité, écoconception, retours d'expérience produit : nos collaborateurs ont suivi bien d'autres conférences, que nous vous partagerons dans les prochains volets de cette série.",[21,2261,2262],{},"Pour ne rien manquer de la suite :",[266,2264,2265,2268],{},[269,2266,2267],{},"La partie deux de notre Rex arrive très bientôt avec cette fois-ci un focus sur la notion de souveraineté et d’éco conception….",[269,2269,2270,2271,2276],{},"Suivez ",[68,2272,2275],{"href":2273,"rel":2274},"https:\u002F\u002Fwww.linkedin.com\u002Fcompany\u002Fhopprtech\u002F?viewAsMember=true",[72],"HoppR sur LinkedIn"," pour être notifié·e de la publication des prochains articles.",[21,2278,2279],{},"À très vite pour la partie 2 !",{"title":411,"searchDepth":412,"depth":412,"links":2281},[2282,2283,2284,2285,2286,2287],{"id":1781,"depth":412,"text":1782},{"id":1834,"depth":412,"text":1835},{"id":1931,"depth":412,"text":1932},{"id":2037,"depth":412,"text":2038},{"id":2194,"depth":412,"text":2195},{"id":2243,"depth":412,"text":2244},"2026-06-29T07:49:02.136Z","L'été pointe le bout de son nez, les terrasses se remplissent, les journées s'étirent jusque tard dans la soirée, et le DevLille fait son retour pour une nouvelle édition.  Les 11 et 12 juin 2026, le",{},"\u002Fblogs\u002F2026-06-29-quand-lia-rencontre-la-prod-retour-sur-les-talks-ia-du-devlille-2026-pt-1",[2293],{"id":2294,"name":2295,"image":2296,"linkedin":2297,"x":14,"bio":2298},"67adfd77-4b84-4496-b55d-3391541f59c5","Michaël Bernasinski",".\u002Fassets\u002Freviewer-michael-bernasinski.webp","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fmichael-bernasinski","Principal Lead - Software Engineer - HoppR Lyon",{"title":1738,"description":2289},"blogs\u002F2026-06-29-quand-lia-rencontre-la-prod-retour-sur-les-talks-ia-du-devlille-2026-pt-1\u002Findex",[462,2302,2303,461,2304,2255],"événement","veille tech","devlille","RuYG_0AGjqjHJk8jEIUY4SbwLlANSm8dNNBc49lSVL4",{"id":2307,"title":2308,"alt":2309,"authors":2310,"body":2312,"date":4479,"description":4480,"extension":431,"image":432,"meta":4481,"navigation":434,"ogImage":432,"path":4482,"published":434,"reviewers":4483,"seo":4485,"stem":4486,"tags":4487,"__hash__":4493},"blogs\u002Fblogs\u002F2026-06-09-du-prototype-a-la-prod-ce-quon-ne-te-dit-pas-sur-la-construction-dune-solution-ia-solide\u002Findex.md","Du prototype à la prod : ce qu'on ne te dit pas sur la construction d'une solution IA solide","Une passerelle de corde instable à gauche et un pont d'acier renforcé à droite, au-dessus d'un gouffre. Métaphore du passage du prototype à la production. Titre « Du prototype à la prod » centré en haut.",[2311],{"id":449,"name":450,"image":1755,"linkedin":452,"x":14},{"type":18,"value":2313,"toc":4451},[2314,2323,2325,2329,2336,2433,2436,2447,2450,2481,2484,2486,2490,2493,2499,2502,2528,2531,2537,2560,2563,2570,2572,2576,2587,2601,2608,2613,2616,2623,2630,2645,2649,2655,2816,2823,2837,2841,2850,2864,3114,3125,3135,3139,3142,3148,3178,3181,3218,3239,3241,3245,3252,3259,3265,3269,3275,3389,3395,3399,3402,3440,3444,3455,3537,3541,3563,3566,3668,3683,3687,3694,3700,3703,3709,3819,3825,3828,3836,3844,3846,3850,3860,3863,3869,3893,3925,3928,3940,3942,3946,3953,3956,4006,4028,4030,4034,4045,4051,4055,4062,4143,4155,4190,4194,4201,4205,4212,4220,4234,4238,4245,4256,4263,4266,4301,4304,4306,4310,4313,4319,4352,4355,4358,4360,4375,4377,4381,4448],[21,2315,2316,2319,2320,202],{},[63,2317,2318],{},"TL;DR :"," Brancher un LLM sur une base de données et obtenir une démo qui fonctionne, c'est l'affaire d'un après-midi. Transformer cette démo en une solution qui tient en production, qui ne ment pas, qui ne ruine pas votre budget et qui s'améliore avec le temps, c'est un travail d'ingénierie. Le LLM est le composant le plus visible de votre système. C'est aussi le moins coûteux à mettre en place. Cet article explore tout ce qu'il y a ",[28,2321,2322],{},"autour",[499,2324],{},[43,2326,2328],{"id":2327},"le-piège-de-la-démo-qui-marche","Le piège de la démo qui marche",[21,2330,2331,2332,2335],{},"Un jour, j'ai écrit ce test. Il vérifiait qu'un chatbot reformulait correctement une question de suivi en question autonome : après avoir recommandé ",[28,2333,2334],{},"Matrix",", « et qui l'a réalisé ? » devait devenir « Qui a réalisé Matrix ? ».",[522,2337,2341],{"className":2338,"code":2339,"language":2340,"meta":411,"style":411},"language-typescript shiki shiki-themes github-dark-default","const response = await chain.invoke({\n  input: \"Who directed it?\",\n  history: [{ input: \"Can you recommend me a film?\", output: \"Sure, I recommend The Matrix\" }],\n});\n\nexpect(response).toContain(\"The Matrix\"); \u002F\u002F 🟢 ... une fois sur deux\n","typescript",[529,2342,2343,2370,2382,2399,2404,2409],{"__ignoreMap":411},[532,2344,2345,2349,2353,2356,2359,2363,2367],{"class":534,"line":535},[532,2346,2348],{"class":2347},"suJrU","const",[532,2350,2352],{"class":2351},"sFSAA"," response",[532,2354,2355],{"class":2347}," =",[532,2357,2358],{"class":2347}," await",[532,2360,2362],{"class":2361},"sZEs4"," chain.",[532,2364,2366],{"class":2365},"sc3cj","invoke",[532,2368,2369],{"class":2361},"({\n",[532,2371,2372,2375,2379],{"class":534,"line":412},[532,2373,2374],{"class":2361},"  input: ",[532,2376,2378],{"class":2377},"s9uIt","\"Who directed it?\"",[532,2380,2381],{"class":2361},",\n",[532,2383,2384,2387,2390,2393,2396],{"class":534,"line":558},[532,2385,2386],{"class":2361},"  history: [{ input: ",[532,2388,2389],{"class":2377},"\"Can you recommend me a film?\"",[532,2391,2392],{"class":2361},", output: ",[532,2394,2395],{"class":2377},"\"Sure, I recommend The Matrix\"",[532,2397,2398],{"class":2361}," }],\n",[532,2400,2401],{"class":534,"line":564},[532,2402,2403],{"class":2361},"});\n",[532,2405,2406],{"class":534,"line":570},[532,2407,2408],{"emptyLinePlaceholder":434},"\n",[532,2410,2411,2414,2417,2420,2423,2426,2429],{"class":534,"line":625},[532,2412,2413],{"class":2365},"expect",[532,2415,2416],{"class":2361},"(response).",[532,2418,2419],{"class":2365},"toContain",[532,2421,2422],{"class":2361},"(",[532,2424,2425],{"class":2377},"\"The Matrix\"",[532,2427,2428],{"class":2361},"); ",[532,2430,2432],{"class":2431},"sH3jZ","\u002F\u002F 🟢 ... une fois sur deux\n",[21,2434,2435],{},"Le test passait. Puis il échouait. Puis il repassait. Sans que je touche une seule ligne de code. Le modèle reformulait tantôt « Who directed The Matrix? », tantôt « Who is the director of the movie The Matrix? », tantôt le traître « Who directed this film? » en oubliant le titre.",[21,2437,2438,2439,2446],{},"Ce moment, où un test devient ",[68,2440,2443],{"href":2441,"rel":2442},"https:\u002F\u002Fwww.datadoghq.com\u002Fknowledge-center\u002Fflaky-tests\u002F",[72],[28,2444,2445],{},"flaky"," sans raison apparente, c'est le moment où l'on comprend que les règles du jeu ont changé. On ne teste plus du code déterministe. On teste le comportement d'un système probabiliste. Et tout ce qu'on croyait savoir sur « est-ce que ça marche ? » doit être repensé.",[21,2448,2449],{},"Cet article suit le cycle de vie d'une solution IA, du prototype jusqu'à la production, à travers deux exemples concrets :",[266,2451,2452,2463],{},[269,2453,2454,2457,2458,202],{},[63,2455,2456],{},"Un chatbot de recommandation de films"," (Next.js + LangChain.js + OpenAI, adossé à Neo4j) : l'exemple parfait pour prototyper et illustrer les concepts. Il est public, issu de la formation ",[68,2459,2462],{"href":2460,"rel":2461},"https:\u002F\u002Fgraphacademy.neo4j.com\u002Fcourses\u002Fllm-chatbot-typescript\u002F",[72],"GraphAcademy de Neo4j",[269,2464,2465,66,2468,66,2471,2474,2475,2480],{},[63,2466,2467],{},"Un cas réel",[63,2469,2470],{},"issu d'une mission",[63,2472,2473],{},"que j’ai assuré :"," un assistant qui génère des requêtes ",[68,2476,2479],{"href":2477,"rel":2478},"https:\u002F\u002Fneo4j.com\u002Fdocs\u002Fcypher-manual\u002Fcurrent\u002F",[72],"Cypher"," sur une base de compétences (« donne-moi tous les skills qui n'ont pas de traduction en polonais »), en Kotlin\u002FSpring Boot. Anonymisé, mais c'est là que vivent les vraies problématiques de production.",[21,2482,2483],{},"Le premier nous montrera à quel point un prototype peut être élégant. Le second, tout ce qu'il faut surmonter pour qu'il survive au contact des utilisateurs.",[499,2485],{},[43,2487,2489],{"id":2488},"acte-1-le-prototype-élégant-et-trompeur","Acte 1. Le prototype : élégant, et trompeur",[21,2491,2492],{},"Commençons par le chatbot de films. Son architecture est une jolie démonstration de composition. Chaque étape est une « chaîne » qui transforme une entrée en sortie, et qu'on assemble comme des Lego :",[21,2494,2495],{},[352,2496],{"alt":2497,"src":2498},"Graphique de la chaîne partant de l’agent jusqu’à la reformulation en question autonome, passant par les différentes briques","\u002Fcontent-assets\u002F2026-06-09-du-prototype-a-la-prod-ce-quon-ne-te-dit-pas-sur-la-construction-dune-solution-ia-solide\u002Fassets\u002Fimg1.webp",[21,2500,2501],{},"Concrètement :",[266,2503,2504,2510,2516,2522],{},[269,2505,2506,2509],{},[63,2507,2508],{},"Reformulation :"," on transforme la question de suivi en question autonome, en s'appuyant sur l'historique de la conversation.",[269,2511,2512,2515],{},[63,2513,2514],{},"Agent"," : il décide quel outil utiliser : recherche sémantique (vecteurs) pour « un film d'ambiance mélancolique », ou génération de requête précise (Cypher) pour « combien de films a réalisé Christopher Nolan ? ».",[269,2517,2518,2521],{},[63,2519,2520],{},"Génération"," : il rédige la réponse à partir des données récupérées.",[269,2523,2524,2527],{},[63,2525,2526],{},"Persistance :"," on stocke la conversation dans le graphe.",[21,2529,2530],{},"Ce dernier point mérite qu'on s'y arrête, car il prépare déjà la suite. La conversation n'est pas stockée dans une simple table de logs, mais dans un graphe qui relie chaque réponse aux données qui ont servi à la produire :",[21,2532,2533],{},[352,2534],{"alt":2535,"src":2536},"Graphique de la liaison d’une réponse aux données dont elle est issue","\u002Fcontent-assets\u002F2026-06-09-du-prototype-a-la-prod-ce-quon-ne-te-dit-pas-sur-la-construction-dune-solution-ia-solide\u002Fassets\u002Fimg2.webp",[490,2538,2539],{},[21,2540,2541,2544,2547,2548,2551,2552,2555,2556,2559],{},[63,2542,2543],{},"💡 Pourquoi un graphe plutôt qu'un simple « vector store » ?",[2545,2546],"br",{},"\nUne recherche purement sémantique (par vecteurs) trouve des contenus ",[28,2549,2550],{},"ressemblants",", mais ne comprend pas les ",[28,2553,2554],{},"relations"," exactes. « Quels acteurs ont joué dans deux films de Tarantino ? » est une question de structure, pas de ressemblance. Le graphe permet au LLM de poser des questions précises sur des relations vérifiables, ce qui ",[63,2557,2558],{},"réduit les hallucinations"," : la donnée vient de la base, pas de l'imagination du modèle.",[21,2561,2562],{},"À ce stade, tout fonctionne. On pose trois questions à la main, les réponses sont bluffantes, on fait une démo, on récolte les applaudissements.",[21,2564,2565,2566,2569],{},"C'est exactement là qu'est le piège. ",[63,2567,2568],{},"On a validé trois cas, manuellement, un mardi après-midi."," Le non-déterminisme du système est encore invisible. Il ne se révélera qu'au moment où l'on voudra automatiser sa validation : c'est-à-dire au moment où l'on voudra être sérieux.",[499,2571],{},[43,2573,2575],{"id":2574},"acte-2-premier-mur-tester-lindéterministe","Acte 2. Premier mur : tester l'indéterministe",[21,2577,2578,2579,2582,2583,2586],{},"Reprenons mon test flaky. Le problème n'est pas le code, c'est l'",[63,2580,2581],{},"assertion",". ",[529,2584,2585],{},"toContain(\"The Matrix\")"," suppose une sortie unique et stable. Or il existe des dizaines de reformulations correctes, et le modèle en choisit une au hasard (pondéré) à chaque appel.",[21,2588,2589,2590,2597,2598,202],{},"La première réaction est de fixer ",[68,2591,2594],{"href":2592,"rel":2593},"https:\u002F\u002Fwww.ibm.com\u002Fthink\u002Ftopics\u002Fllm-temperature",[72],[529,2595,2596],{},"temperature: 0"," pour rendre le modèle (quasi) déterministe. C'est utile, et nécessaire pour de la génération de requêtes mais ça ne suffit pas : même à température nulle, les fournisseurs ne garantissent pas une reproductibilité parfaite, et surtout ça ne règle pas le fond. Le fond, c'est qu'",[63,2599,2600],{},"on ne peut pas tester une sortie en langage naturel par égalité de chaînes",[21,2602,2603,2604,2607],{},"Exiger l'égalité de chaînes, ",[63,2605,2606],{},"c","'est comme mettre zéro à une dissertation parce qu'elle ne reprend pas le corrigé mot pour mot : il existe une infinité de formulations correctes, côté réponse du modèle comme côté question de l'utilisateur. On évalue le sens, pas la lettre.",[2609,2610,2612],"h3",{"id":2611},"le-changement-de-paradigme","Le changement de paradigme",[21,2614,2615],{},"Voici l'idée la plus importante de cet article :",[490,2617,2618],{},[21,2619,2620],{},[63,2621,2622],{},"Modifier un prompt n'est plus un test unitaire. C'est une expérience scientifique.",[21,2624,2625,2626,2629],{},"Quand vous changez un prompt, la stratégie de construction du contexte, ou même le modèle, vous ne corrigez pas un bug : vous formulez une hypothèse (« cette version reformule mieux ») qu'il faut ",[63,2627,2628],{},"mesurer",". Et une mesure fiable ne se fait pas sur un cas, mais sur un échantillon représentatif.",[21,2631,2632,2633,2636,2637,2640,2641,2644],{},"Conséquence très concrète, souvent sous-estimée : ces tests ne tournent plus en une fraction de seconde sur votre machine. Ils appellent un LLM, coûtent des tokens, prennent du temps. Il faut un ",[63,2634,2635],{},"environnement d'évaluation dédié"," et une ",[63,2638,2639],{},"CI"," capable de les faire tourner, pas un simple ",[529,2642,2643],{},"npm test"," lancé entre deux cafés.",[2609,2646,2648],{"id":2647},"première-approche-le-llm-comme-juge","Première approche : le LLM comme juge",[21,2650,2651,2652,813],{},"Puisqu'on ne peut pas comparer des chaînes, on peut demander à un LLM de juger si la réponse est correcte. C'est la technique du ",[63,2653,2654],{},"LLM-as-Judge",[522,2656,2658],{"className":2338,"code":2657,"language":2340,"meta":411,"style":411},"const evalChain = RunnableSequence.from([\n  PromptTemplate.fromTemplate(`\n    Is the rephrased version a complete standalone question?\n\n    Original: {input}\n    Rephrased: {response}\n\n    Respond \"yes\", \"no\", or \"missing\" (if it asks for clarification).\n  `),\n  llm,\n  new StringOutputParser(),\n]);\n\nconst evaluation = await evalChain.invoke({ input, response });\nexpect(`${evaluation.toLowerCase()} - ${response}`).toContain(\"yes\");\n",[529,2659,2660,2678,2691,2696,2700,2705,2710,2714,2719,2727,2732,2743,2749,2754,2774],{"__ignoreMap":411},[532,2661,2662,2664,2667,2669,2672,2675],{"class":534,"line":535},[532,2663,2348],{"class":2347},[532,2665,2666],{"class":2351}," evalChain",[532,2668,2355],{"class":2347},[532,2670,2671],{"class":2361}," RunnableSequence.",[532,2673,2674],{"class":2365},"from",[532,2676,2677],{"class":2361},"([\n",[532,2679,2680,2683,2686,2688],{"class":534,"line":412},[532,2681,2682],{"class":2361},"  PromptTemplate.",[532,2684,2685],{"class":2365},"fromTemplate",[532,2687,2422],{"class":2361},[532,2689,2690],{"class":2377},"`\n",[532,2692,2693],{"class":534,"line":558},[532,2694,2695],{"class":2377},"    Is the rephrased version a complete standalone question?\n",[532,2697,2698],{"class":534,"line":564},[532,2699,2408],{"emptyLinePlaceholder":434},[532,2701,2702],{"class":534,"line":570},[532,2703,2704],{"class":2377},"    Original: {input}\n",[532,2706,2707],{"class":534,"line":625},[532,2708,2709],{"class":2377},"    Rephrased: {response}\n",[532,2711,2712],{"class":534,"line":630},[532,2713,2408],{"emptyLinePlaceholder":434},[532,2715,2716],{"class":534,"line":636},[532,2717,2718],{"class":2377},"    Respond \"yes\", \"no\", or \"missing\" (if it asks for clarification).\n",[532,2720,2721,2724],{"class":534,"line":641},[532,2722,2723],{"class":2377},"  `",[532,2725,2726],{"class":2361},"),\n",[532,2728,2729],{"class":534,"line":647},[532,2730,2731],{"class":2361},"  llm,\n",[532,2733,2734,2737,2740],{"class":534,"line":652},[532,2735,2736],{"class":2347},"  new",[532,2738,2739],{"class":2365}," StringOutputParser",[532,2741,2742],{"class":2361},"(),\n",[532,2744,2746],{"class":534,"line":2745},12,[532,2747,2748],{"class":2361},"]);\n",[532,2750,2752],{"class":534,"line":2751},13,[532,2753,2408],{"emptyLinePlaceholder":434},[532,2755,2757,2759,2762,2764,2766,2769,2771],{"class":534,"line":2756},14,[532,2758,2348],{"class":2347},[532,2760,2761],{"class":2351}," evaluation",[532,2763,2355],{"class":2347},[532,2765,2358],{"class":2347},[532,2767,2768],{"class":2361}," evalChain.",[532,2770,2366],{"class":2365},[532,2772,2773],{"class":2361},"({ input, response });\n",[532,2775,2777,2779,2781,2784,2787,2789,2792,2795,2798,2801,2804,2806,2808,2810,2813],{"class":534,"line":2776},15,[532,2778,2413],{"class":2365},[532,2780,2422],{"class":2361},[532,2782,2783],{"class":2377},"`${",[532,2785,2786],{"class":2361},"evaluation",[532,2788,202],{"class":2377},[532,2790,2791],{"class":2365},"toLowerCase",[532,2793,2794],{"class":2377},"()",[532,2796,2797],{"class":2377},"} - ${",[532,2799,2800],{"class":2361},"response",[532,2802,2803],{"class":2377},"}`",[532,2805,1898],{"class":2361},[532,2807,2419],{"class":2365},[532,2809,2422],{"class":2361},[532,2811,2812],{"class":2377},"\"yes\"",[532,2814,2815],{"class":2361},");\n",[21,2817,2818,2819,2822],{},"C'est élégant, mais attention aux limites : ",[63,2820,2821],{},"un juge est lui-même un système probabiliste."," Si vous laissez le modèle du juge évoluer librement, vous mesurez autant les humeurs du juge que la qualité de vos réponses. Deux précautions s'imposent :",[266,2824,2825,2831],{},[269,2826,2827,2830],{},[63,2828,2829],{},"Épingler la version du modèle juge"," (le figer), pour que vos scores restent comparables dans le temps. Il est nécessaire de surveiller la dépréciation de ces modèles et de planifier la migration des embeddings.",[269,2832,2833,2836],{},[63,2834,2835],{},"Valider le juge contre des annotations humaines"," sur un petit échantillon, pour vérifier qu'il est d'accord avec vous avant de lui faire confiance à l'échelle.",[2609,2838,2840],{"id":2839},"le-point-en-or-juger-par-lexécution-pas-par-le-texte","Le point en or : juger par l'exécution, pas par le texte",[21,2842,2843,2844,2846,2847],{},"Passons à l'exemple de la mission. Ici, on génère du ",[63,2845,2479],{}," pour répondre à « donne-moi tous les skills sans traduction polonaise ». Faut-il faire juger la requête générée par un LLM ? ",[63,2848,2849],{},"Non. C'est même une erreur.",[21,2851,2852,2853,2856,2857,2860,2861,813],{},"On n'a pas besoin que la requête soit ",[28,2854,2855],{},"littéralement"," celle qu'on attendait. On a besoin qu'elle ",[63,2858,2859],{},"retourne le bon résultat",". Et ça, on peut le vérifier objectivement, sans aucun jugement subjectif, en ",[63,2862,2863],{},"exécutant la requête",[522,2865,2869],{"className":2866,"code":2867,"language":2868,"meta":411,"style":411},"language-kotlin shiki shiki-themes github-dark-default","\u002F\u002F La requête de référence, écrite et validée à la main = la vérité du terrain\nprivate const val GOLDEN_QUERY_POLISH = \"\"\"\n    MATCH (s:Skill)\n    WHERE NOT EXISTS {\n        (s)-[:HAS_TRANSLATION]->(:Translation { lang: 'pl' })\n    }\n    RETURN s.id AS id\n\"\"\"\n\n\u002F\u002F Évaluation par exécution : on compare les RÉSULTATS, pas le texte de la requête\n@Test\nfun `should find skills missing polish translation`() {\n    val question = \"donne-moi tous les skills sans traduction polonaise\"\n\n    val generatedCypher = cypherGenerationChain.generate(question)\n\n    \u002F\u002F 1. La requête est-elle un garde-fou valide ? (read-only, pas de procédure)\n    assertThat(generatedCypher).matches(readOnlyGuardrail)\n\n    \u002F\u002F 2. S'exécute-t-elle sans erreur ?\n    val actual = neo4j.executeRead(generatedCypher)\n\n    \u002F\u002F 3. Le résultat est-il celui de la requête de référence ?\n    val expected = neo4j.executeRead(\nGOLDEN_QUERY_POLISH\n)\n    assertThat(actual.toSet()).isEqualTo(expected.toSet())\n}\n","kotlin",[529,2870,2871,2876,2896,2901,2906,2911,2916,2921,2926,2930,2935,2941,2952,2965,2969,2987,2992,2998,3013,3018,3024,3043,3048,3054,3071,3077,3083,3108],{"__ignoreMap":411},[532,2872,2873],{"class":534,"line":535},[532,2874,2875],{"class":2431},"\u002F\u002F La requête de référence, écrite et validée à la main = la vérité du terrain\n",[532,2877,2878,2881,2884,2887,2890,2893],{"class":534,"line":412},[532,2879,2880],{"class":2347},"private",[532,2882,2883],{"class":2347}," const",[532,2885,2886],{"class":2347}," val",[532,2888,2889],{"class":2361}," GOLDEN_QUERY_POLISH ",[532,2891,2892],{"class":2347},"=",[532,2894,2895],{"class":2377}," \"\"\"\n",[532,2897,2898],{"class":534,"line":558},[532,2899,2900],{"class":2377},"    MATCH (s:Skill)\n",[532,2902,2903],{"class":534,"line":564},[532,2904,2905],{"class":2377},"    WHERE NOT EXISTS {\n",[532,2907,2908],{"class":534,"line":570},[532,2909,2910],{"class":2377},"        (s)-[:HAS_TRANSLATION]->(:Translation { lang: 'pl' })\n",[532,2912,2913],{"class":534,"line":625},[532,2914,2915],{"class":2377},"    }\n",[532,2917,2918],{"class":534,"line":630},[532,2919,2920],{"class":2377},"    RETURN s.id AS id\n",[532,2922,2923],{"class":534,"line":636},[532,2924,2925],{"class":2377},"\"\"\"\n",[532,2927,2928],{"class":534,"line":641},[532,2929,2408],{"emptyLinePlaceholder":434},[532,2931,2932],{"class":534,"line":647},[532,2933,2934],{"class":2431},"\u002F\u002F Évaluation par exécution : on compare les RÉSULTATS, pas le texte de la requête\n",[532,2936,2937],{"class":534,"line":652},[532,2938,2940],{"class":2939},"sQhOw","@Test\n",[532,2942,2943,2946,2949],{"class":534,"line":2745},[532,2944,2945],{"class":2347},"fun",[532,2947,2948],{"class":2365}," `should find skills missing polish translation`",[532,2950,2951],{"class":2361},"() {\n",[532,2953,2954,2957,2960,2962],{"class":534,"line":2751},[532,2955,2956],{"class":2347},"    val",[532,2958,2959],{"class":2361}," question ",[532,2961,2892],{"class":2347},[532,2963,2964],{"class":2377}," \"donne-moi tous les skills sans traduction polonaise\"\n",[532,2966,2967],{"class":534,"line":2756},[532,2968,2408],{"emptyLinePlaceholder":434},[532,2970,2971,2973,2976,2978,2981,2984],{"class":534,"line":2776},[532,2972,2956],{"class":2347},[532,2974,2975],{"class":2361}," generatedCypher ",[532,2977,2892],{"class":2347},[532,2979,2980],{"class":2361}," cypherGenerationChain.",[532,2982,2983],{"class":2365},"generate",[532,2985,2986],{"class":2361},"(question)\n",[532,2988,2990],{"class":534,"line":2989},16,[532,2991,2408],{"emptyLinePlaceholder":434},[532,2993,2995],{"class":534,"line":2994},17,[532,2996,2997],{"class":2431},"    \u002F\u002F 1. La requête est-elle un garde-fou valide ? (read-only, pas de procédure)\n",[532,2999,3001,3004,3007,3010],{"class":534,"line":3000},18,[532,3002,3003],{"class":2365},"    assertThat",[532,3005,3006],{"class":2361},"(generatedCypher).",[532,3008,3009],{"class":2365},"matches",[532,3011,3012],{"class":2361},"(readOnlyGuardrail)\n",[532,3014,3016],{"class":534,"line":3015},19,[532,3017,2408],{"emptyLinePlaceholder":434},[532,3019,3021],{"class":534,"line":3020},20,[532,3022,3023],{"class":2431},"    \u002F\u002F 2. S'exécute-t-elle sans erreur ?\n",[532,3025,3027,3029,3032,3034,3037,3040],{"class":534,"line":3026},21,[532,3028,2956],{"class":2347},[532,3030,3031],{"class":2361}," actual ",[532,3033,2892],{"class":2347},[532,3035,3036],{"class":2361}," neo4j.",[532,3038,3039],{"class":2365},"executeRead",[532,3041,3042],{"class":2361},"(generatedCypher)\n",[532,3044,3046],{"class":534,"line":3045},22,[532,3047,2408],{"emptyLinePlaceholder":434},[532,3049,3051],{"class":534,"line":3050},23,[532,3052,3053],{"class":2431},"    \u002F\u002F 3. Le résultat est-il celui de la requête de référence ?\n",[532,3055,3057,3059,3062,3064,3066,3068],{"class":534,"line":3056},24,[532,3058,2956],{"class":2347},[532,3060,3061],{"class":2361}," expected ",[532,3063,2892],{"class":2347},[532,3065,3036],{"class":2361},[532,3067,3039],{"class":2365},[532,3069,3070],{"class":2361},"(\n",[532,3072,3074],{"class":534,"line":3073},25,[532,3075,3076],{"class":2361},"GOLDEN_QUERY_POLISH\n",[532,3078,3080],{"class":534,"line":3079},26,[532,3081,3082],{"class":2361},")\n",[532,3084,3086,3088,3091,3094,3097,3100,3103,3105],{"class":534,"line":3085},27,[532,3087,3003],{"class":2365},[532,3089,3090],{"class":2361},"(actual.",[532,3092,3093],{"class":2365},"toSet",[532,3095,3096],{"class":2361},"()).",[532,3098,3099],{"class":2365},"isEqualTo",[532,3101,3102],{"class":2361},"(expected.",[532,3104,3093],{"class":2365},[532,3106,3107],{"class":2361},"())\n",[532,3109,3111],{"class":534,"line":3110},28,[532,3112,3113],{"class":2361},"}\n",[21,3115,3116,3117,3120,3121,3124],{},"C'est ce qu'on appelle l'",[63,3118,3119],{},"évaluation par exécution"," (",[28,3122,3123],{},"execution-based evaluation","). Quand le domaine vous le permet (génération de SQL, de Cypher, de code, d'appels d'API), c'est infiniment plus fiable qu'un juge.",[490,3126,3127],{},[21,3128,3129,3132,3134],{},[63,3130,3131],{},"🎯 La règle à retenir : remplacez un juge subjectif par une vérification objective dès que vous le pouvez.",[2545,3133],{},"\nRéservez le LLM-as-Judge aux sorties en langage naturel (la reformulation, la réponse finale), là où il n'existe pas de vérité-terrain exécutable.",[2609,3136,3138],{"id":3137},"la-méthodologie-dévaluation","La méthodologie d'évaluation",[21,3140,3141],{},"On peut maintenant assembler une vraie démarche, qui se résume en quatre briques :",[21,3143,3144],{},[352,3145],{"alt":3146,"src":3147},"Graphique présentant les 4 briques : golden set, métriques, expérience A\u002FB, offline\u002Fonline","\u002Fcontent-assets\u002F2026-06-09-du-prototype-a-la-prod-ce-quon-ne-te-dit-pas-sur-la-construction-dune-solution-ia-solide\u002Fassets\u002Fimg3.webp",[266,3149,3150,3156,3162,3172],{},[269,3151,3152,3155],{},[63,3153,3154],{},"Le golden set"," : un jeu de cas représentatifs (entrées + comportement attendu), versionné comme du code. 30 à 100 cas suffisent pour démarrer.",[269,3157,3158,3161],{},[63,3159,3160],{},"Les métriques",", adaptées à la tâche : égalité exacte ou par exécution quand c'est possible, similarité sémantique par embeddings sinon, LLM-as-Judge en dernier recours.",[269,3163,3164,3167,3168,3171],{},[63,3165,3166],{},"L'expérience A\u002FB"," : faire tourner prompt actuel ",[28,3169,3170],{},"vs"," prompt candidat sur le golden set, et comparer les scores agrégés. Le delta vous dit si vous avez progressé ou régressé.",[269,3173,3174,3177],{},[63,3175,3176],{},"Offline puis online"," : en CI vous bloquez les régressions avant merge \u002F déploiement, en production vous faites juger un échantillon du trafic réel pour détecter les dérives.",[21,3179,3180],{},"Quelques outils pour ne pas tout réécrire à la main :",[1508,3182,3183,3192],{},[1511,3184,3185],{},[1514,3186,3187,3189],{},[1517,3188,1519],{},[1517,3190,3191],{},"Outils",[1524,3193,3194,3202,3210],{},[1514,3195,3196,3199],{},[1529,3197,3198],{},"Gate de qualité en CI",[1529,3200,3201],{},"Spring AI Evaluators ,  DeepEval ,  promptfoo",[1514,3203,3204,3207],{},[1529,3205,3206],{},"Métriques RAG (retrieval)",[1529,3208,3209],{},"Ragas",[1514,3211,3212,3215],{},[1529,3213,3214],{},"Datasets + éval online + observabilité",[1529,3216,3217],{},"Langfuse  (self-hostable),  Arize Phoenix",[490,3219,3220],{},[21,3221,3222,3225,3226,3229,3230,3233,3234,202],{},[63,3223,3224],{},"💡 Pour les utilisateurs de Spring"," : pas besoin de quitter votre écosystème pour commencer. Spring AI fournit un ",[529,3227,3228],{},"RelevancyEvaluator"," (la réponse est-elle pertinente vis-à-vis du contexte récupéré ?) et un ",[529,3231,3232],{},"FactCheckingEvaluator"," (la réponse est-elle factuellement supportée par le contexte = anti-hallucination), directement utilisables dans vos tests d'intégration. Un bon ",[68,3235,3238],{"href":3236,"rel":3237},"https:\u002F\u002Fwww.baeldung.com\u002Fspring-ai-testing-ai-evaluators",[72],"tutoriel chez Baeldung",[499,3240],{},[43,3242,3244],{"id":3243},"acte-3-durcir-pour-la-prod-les-garde-fous","Acte 3. Durcir pour la prod : les garde-fous",[21,3246,3247,3248,3251],{},"Un système évalué, c'est bien. Un système qui ne peut pas faire de dégâts, c'est mieux. Place aux ",[63,3249,3250],{},"guardrails",", illustrés sur la mission Cypher.",[21,3253,3254,3255,3258],{},"Le principe directeur est la ",[63,3256,3257],{},"défense en profondeur"," : chaque couche part du principe que la précédente a échoué.",[21,3260,3261],{},[352,3262],{"alt":3263,"src":3264},"Graphique présentant les 3 couches de garde-fous : entrée, génération et exécution","\u002Fcontent-assets\u002F2026-06-09-du-prototype-a-la-prod-ce-quon-ne-te-dit-pas-sur-la-construction-dune-solution-ia-solide\u002Fassets\u002Fimg4.webp",[2609,3266,3268],{"id":3267},"couche-1-sur-lentrée","Couche 1 : Sur l'entrée",[21,3270,3271,3274],{},[63,3272,3273],{},"Limiter le scope."," Par défaut, un agent répond à tout, y compris aux questions obscènes ou hors-sujet. Un simple message système recadre le périmètre :",[522,3276,3278],{"className":2338,"code":3277,"language":2340,"meta":411,"style":411},"const prompt = ChatPromptTemplate.fromMessages([\n  ['system', `\n    You are Ebert, a movie recommendation chatbot.\n    Respond to any questions that don't relate to movies, actors or directors\n    with a joke about parrots, before asking them to ask another question\n    related to the movie industry.\n  `],\n  ['human', '{rephrasedQuestion}'],\n  new MessagesPlaceholder({ variableName: 'chat_history', optional: true }),\n  new MessagesPlaceholder('agent_scratchpad'),\n]);\n",[529,3279,3280,3297,3309,3314,3319,3324,3329,3336,3350,3372,3385],{"__ignoreMap":411},[532,3281,3282,3284,3287,3289,3292,3295],{"class":534,"line":535},[532,3283,2348],{"class":2347},[532,3285,3286],{"class":2351}," prompt",[532,3288,2355],{"class":2347},[532,3290,3291],{"class":2361}," ChatPromptTemplate.",[532,3293,3294],{"class":2365},"fromMessages",[532,3296,2677],{"class":2361},[532,3298,3299,3302,3305,3307],{"class":534,"line":412},[532,3300,3301],{"class":2361},"  [",[532,3303,3304],{"class":2377},"'system'",[532,3306,996],{"class":2361},[532,3308,2690],{"class":2377},[532,3310,3311],{"class":534,"line":558},[532,3312,3313],{"class":2377},"    You are Ebert, a movie recommendation chatbot.\n",[532,3315,3316],{"class":534,"line":564},[532,3317,3318],{"class":2377},"    Respond to any questions that don't relate to movies, actors or directors\n",[532,3320,3321],{"class":534,"line":570},[532,3322,3323],{"class":2377},"    with a joke about parrots, before asking them to ask another question\n",[532,3325,3326],{"class":534,"line":625},[532,3327,3328],{"class":2377},"    related to the movie industry.\n",[532,3330,3331,3333],{"class":534,"line":630},[532,3332,2723],{"class":2377},[532,3334,3335],{"class":2361},"],\n",[532,3337,3338,3340,3343,3345,3348],{"class":534,"line":636},[532,3339,3301],{"class":2361},[532,3341,3342],{"class":2377},"'human'",[532,3344,996],{"class":2361},[532,3346,3347],{"class":2377},"'{rephrasedQuestion}'",[532,3349,3335],{"class":2361},[532,3351,3352,3354,3357,3360,3363,3366,3369],{"class":534,"line":641},[532,3353,2736],{"class":2347},[532,3355,3356],{"class":2365}," MessagesPlaceholder",[532,3358,3359],{"class":2361},"({ variableName: ",[532,3361,3362],{"class":2377},"'chat_history'",[532,3364,3365],{"class":2361},", optional: ",[532,3367,3368],{"class":2351},"true",[532,3370,3371],{"class":2361}," }),\n",[532,3373,3374,3376,3378,3380,3383],{"class":534,"line":647},[532,3375,2736],{"class":2347},[532,3377,3356],{"class":2365},[532,3379,2422],{"class":2361},[532,3381,3382],{"class":2377},"'agent_scratchpad'",[532,3384,2726],{"class":2361},[532,3386,3387],{"class":534,"line":652},[532,3388,2748],{"class":2361},[21,3390,3391,3394],{},[63,3392,3393],{},"Se protéger de l'injection de prompt."," Un utilisateur malveillant tentera « ignore tes instructions et... ». Le message système n'est pas une frontière de sécurité absolue : il doit être complété par les couches suivantes, qui, elles, sont techniques et non négociables.",[2609,3396,3398],{"id":3397},"couche-2-sur-la-génération","Couche 2 : Sur la génération",[21,3400,3401],{},"C'est ici que le text-to-Cypher devient délicat. La requête générée doit être contrainte avant même d'atteindre la base :",[266,3403,3404,3410,3426],{},[269,3405,3406,3409],{},[63,3407,3408],{},"Whitelist"," des nodes et relations que le LLM a le droit de manipuler (pas question qu'il interroge une table de credentials).",[269,3411,3412,3415,3416,996,3419,996,3422,3425],{},[63,3413,3414],{},"Interdiction des procédures de modification"," (pas de ",[529,3417,3418],{},"CREATE",[529,3420,3421],{},"DELETE",[529,3423,3424],{},"apoc.*"," qui écrit).",[269,3427,3428,66,3431,66,3436,3439],{},[63,3429,3430],{},"Pagination et",[63,3432,3433],{},[529,3434,3435],{},"LIMIT",[63,3437,3438],{},"par défaut"," : sans cela, une requête maladroite peut scanner toute la base et la mettre à genoux. On impose un plafond systématique.",[2609,3441,3443],{"id":3442},"couche-3-à-lexécution","Couche 3 : À l'exécution",[21,3445,3446,3447,3450,3451,3454],{},"Et si malgré tout une requête dangereuse passait ? On la confine dans une ",[63,3448,3449],{},"transaction en lecture seule",". C'est la dernière ligne de défense, et c'est une garantie ",[28,3452,3453],{},"technique",", pas une supplique adressée au modèle :",[522,3456,3458],{"className":2866,"code":3457,"language":2868,"meta":411,"style":411},"@Transactional(readOnly = true)\nfun executeGenerated(cypher: String): List\u003CRecord> {\n    \u002F\u002F Même si le prompt a été contourné et les validations trompées,\n    \u002F\u002F la base refusera physiquement toute écriture.\n    return session.run(cypher).list()\n}\n",[529,3459,3460,3475,3503,3508,3513,3533],{"__ignoreMap":411},[532,3461,3462,3465,3468,3470,3473],{"class":534,"line":535},[532,3463,3464],{"class":2939},"@Transactional",[532,3466,3467],{"class":2361},"(readOnly ",[532,3469,2892],{"class":2347},[532,3471,3472],{"class":2351}," true",[532,3474,3082],{"class":2361},[532,3476,3477,3479,3482,3485,3488,3491,3494,3497,3500],{"class":534,"line":412},[532,3478,2945],{"class":2347},[532,3480,3481],{"class":2365}," executeGenerated",[532,3483,3484],{"class":2361},"(cypher: ",[532,3486,3487],{"class":2939},"String",[532,3489,3490],{"class":2361},"): ",[532,3492,3493],{"class":2939},"List",[532,3495,3496],{"class":2361},"\u003C",[532,3498,3499],{"class":2939},"Record",[532,3501,3502],{"class":2361},"> {\n",[532,3504,3505],{"class":534,"line":558},[532,3506,3507],{"class":2431},"    \u002F\u002F Même si le prompt a été contourné et les validations trompées,\n",[532,3509,3510],{"class":534,"line":564},[532,3511,3512],{"class":2431},"    \u002F\u002F la base refusera physiquement toute écriture.\n",[532,3514,3515,3518,3521,3524,3527,3530],{"class":534,"line":570},[532,3516,3517],{"class":2347},"    return",[532,3519,3520],{"class":2361}," session.",[532,3522,3523],{"class":2365},"run",[532,3525,3526],{"class":2361},"(cypher).",[532,3528,3529],{"class":2365},"list",[532,3531,3532],{"class":2361},"()\n",[532,3534,3535],{"class":534,"line":625},[532,3536,3113],{"class":2361},[2609,3538,3540],{"id":3539},"la-boucle-dauto-correction","La boucle d'auto-correction",[21,3542,3543,3544,3547,3548,66,3551,3556,3557,3562],{},"Voici une astuce contre-intuitive et puissante. Les LLM sont bons pour ",[28,3545,3546],{},"générer"," du Cypher. Ils sont ",[63,3549,3550],{},"excellents pour",[28,3552,3553],{},[63,3554,3555],{},"corriger"," le Cypher qu'ils ont écrit. (C'est une variante de la ",[68,3558,3561],{"href":3559,"rel":3560},"https:\u002F\u002Fmeta.wikimedia.org\u002Fwiki\u002FCunningham%27s_Law",[72],"loi de Cunningham"," : le meilleur moyen d'obtenir la bonne réponse n'est pas de poser une question, c'est de proposer une mauvaise réponse.)",[21,3564,3565],{},"On ajoute donc une chaîne qui valide la requête contre le schéma et la corrige récursivement :",[522,3567,3569],{"className":2338,"code":3568,"language":2340,"meta":411,"style":411},"\u002F\u002F On exécute, on récupère l'erreur, on la renvoie au LLM pour qu'il corrige\nconst prompt = PromptTemplate.fromTemplate(`\n  You are an expert Neo4j Developer evaluating a Cypher statement written by an AI.\n  Check the statement against the schema and fix any errors.\n\n  Respond with a JSON object with \"cypher\", \"corrected\" and \"errors\" keys.\n\n  Schema: {schema}\n  Question: {question}\n  Cypher Statement: {cypher}\n  {errors}\n`);\n\nreturn RunnableSequence.from([prompt, llm, new JsonOutputParser()]);\n",[529,3570,3571,3576,3593,3598,3603,3607,3612,3616,3621,3626,3631,3636,3643,3647],{"__ignoreMap":411},[532,3572,3573],{"class":534,"line":535},[532,3574,3575],{"class":2431},"\u002F\u002F On exécute, on récupère l'erreur, on la renvoie au LLM pour qu'il corrige\n",[532,3577,3578,3580,3582,3584,3587,3589,3591],{"class":534,"line":412},[532,3579,2348],{"class":2347},[532,3581,3286],{"class":2351},[532,3583,2355],{"class":2347},[532,3585,3586],{"class":2361}," PromptTemplate.",[532,3588,2685],{"class":2365},[532,3590,2422],{"class":2361},[532,3592,2690],{"class":2377},[532,3594,3595],{"class":534,"line":558},[532,3596,3597],{"class":2377},"  You are an expert Neo4j Developer evaluating a Cypher statement written by an AI.\n",[532,3599,3600],{"class":534,"line":564},[532,3601,3602],{"class":2377},"  Check the statement against the schema and fix any errors.\n",[532,3604,3605],{"class":534,"line":570},[532,3606,2408],{"emptyLinePlaceholder":434},[532,3608,3609],{"class":534,"line":625},[532,3610,3611],{"class":2377},"  Respond with a JSON object with \"cypher\", \"corrected\" and \"errors\" keys.\n",[532,3613,3614],{"class":534,"line":630},[532,3615,2408],{"emptyLinePlaceholder":434},[532,3617,3618],{"class":534,"line":636},[532,3619,3620],{"class":2377},"  Schema: {schema}\n",[532,3622,3623],{"class":534,"line":641},[532,3624,3625],{"class":2377},"  Question: {question}\n",[532,3627,3628],{"class":534,"line":647},[532,3629,3630],{"class":2377},"  Cypher Statement: {cypher}\n",[532,3632,3633],{"class":534,"line":652},[532,3634,3635],{"class":2377},"  {errors}\n",[532,3637,3638,3641],{"class":534,"line":2745},[532,3639,3640],{"class":2377},"`",[532,3642,2815],{"class":2361},[532,3644,3645],{"class":534,"line":2751},[532,3646,2408],{"emptyLinePlaceholder":434},[532,3648,3649,3652,3654,3656,3659,3662,3665],{"class":534,"line":2756},[532,3650,3651],{"class":2347},"return",[532,3653,2671],{"class":2361},[532,3655,2674],{"class":2365},[532,3657,3658],{"class":2361},"([prompt, llm, ",[532,3660,3661],{"class":2347},"new",[532,3663,3664],{"class":2365}," JsonOutputParser",[532,3666,3667],{"class":2361},"()]);\n",[21,3669,3670,3671,3674,3675,3678,3679,3682],{},"Couplée à une politique de ",[63,3672,3673],{},"retry sur critères"," (« la requête doit être read-only, sans procédure » → si elle ne l'est pas, on renvoie l'erreur et on régénère), cette boucle apporte une stabilité ",[28,3676,3677],{},"à l'exécution",", complémentaire de la stabilité ",[28,3680,3681],{},"en test"," vue à l'acte 2.",[2609,3684,3686],{"id":3685},"le-fallback","Le fallback",[21,3688,3689,3690,3693],{},"Enfin : quand tout échoue après N tentatives, ",[63,3691,3692],{},"on dégrade proprement",". Un « je n'ai pas réussi à formuler une réponse fiable à cette question » vaut infiniment mieux qu'une réponse fausse présentée avec assurance. Une IA qui sait dire « je ne sais pas » est une IA en laquelle on peut avoir confiance.",[2609,3695,3697],{"id":3696},"et-ces-garde-fous-on-les-teste-comment",[63,3698,3699],{},"Et ces garde-fous, on les teste comment ?",[21,3701,3702],{},"Un garde-fou non testé n'est pas un garde-fou. La bonne nouvelle : la plupart le sont, à condition de les ranger en deux familles.",[21,3704,3705,3708],{},[63,3706,3707],{},"Les garde-fous déterministes se testent comme du code."," La validation de la requête générée (read-only, pas de procédure, présence d'une limite) ne dépend pas du LLM : c'est de la logique pure. On la teste donc avec de vrais tests unitaires, rapides et sans flakiness. C'est le « séparer le déterministe du non-déterministe » de l'Acte 2, et c'est rassurant : la dernière ligne de défense est aussi la plus facile à verrouiller.",[522,3710,3712],{"className":2866,"code":3711,"language":2868,"meta":411,"style":411},"@Test\nfun `le garde-fou rejette une requête en écriture`() {\n    assertThat(\"MATCH (s:Skill) DETACH DELETE s\").doesNotMatch(readOnlyGuardrail)\n}\n\n@Test\nfun `le garde-fou rejette un appel de procédure`() {\n    assertThat(\"CALL apoc.periodic.iterate(...)\").doesNotMatch(readOnlyGuardrail)\n}\n\n@Test\nfun `une requête de lecture paginée passe`() {\n    assertThat(\"MATCH (s:Skill) RETURN s LIMIT 10\").matches(readOnlyGuardrail)\n}\n",[529,3713,3714,3718,3727,3743,3747,3751,3755,3764,3779,3783,3787,3791,3800,3815],{"__ignoreMap":411},[532,3715,3716],{"class":534,"line":535},[532,3717,2940],{"class":2939},[532,3719,3720,3722,3725],{"class":534,"line":412},[532,3721,2945],{"class":2347},[532,3723,3724],{"class":2365}," `le garde-fou rejette une requête en écriture`",[532,3726,2951],{"class":2361},[532,3728,3729,3731,3733,3736,3738,3741],{"class":534,"line":558},[532,3730,3003],{"class":2365},[532,3732,2422],{"class":2361},[532,3734,3735],{"class":2377},"\"MATCH (s:Skill) DETACH DELETE s\"",[532,3737,1898],{"class":2361},[532,3739,3740],{"class":2365},"doesNotMatch",[532,3742,3012],{"class":2361},[532,3744,3745],{"class":534,"line":564},[532,3746,3113],{"class":2361},[532,3748,3749],{"class":534,"line":570},[532,3750,2408],{"emptyLinePlaceholder":434},[532,3752,3753],{"class":534,"line":625},[532,3754,2940],{"class":2939},[532,3756,3757,3759,3762],{"class":534,"line":630},[532,3758,2945],{"class":2347},[532,3760,3761],{"class":2365}," `le garde-fou rejette un appel de procédure`",[532,3763,2951],{"class":2361},[532,3765,3766,3768,3770,3773,3775,3777],{"class":534,"line":636},[532,3767,3003],{"class":2365},[532,3769,2422],{"class":2361},[532,3771,3772],{"class":2377},"\"CALL apoc.periodic.iterate(...)\"",[532,3774,1898],{"class":2361},[532,3776,3740],{"class":2365},[532,3778,3012],{"class":2361},[532,3780,3781],{"class":534,"line":641},[532,3782,3113],{"class":2361},[532,3784,3785],{"class":534,"line":647},[532,3786,2408],{"emptyLinePlaceholder":434},[532,3788,3789],{"class":534,"line":652},[532,3790,2940],{"class":2939},[532,3792,3793,3795,3798],{"class":534,"line":2745},[532,3794,2945],{"class":2347},[532,3796,3797],{"class":2365}," `une requête de lecture paginée passe`",[532,3799,2951],{"class":2361},[532,3801,3802,3804,3806,3809,3811,3813],{"class":534,"line":2751},[532,3803,3003],{"class":2365},[532,3805,2422],{"class":2361},[532,3807,3808],{"class":2377},"\"MATCH (s:Skill) RETURN s LIMIT 10\"",[532,3810,1898],{"class":2361},[532,3812,3009],{"class":2365},[532,3814,3012],{"class":2361},[532,3816,3817],{"class":534,"line":2756},[532,3818,3113],{"class":2361},[21,3820,3821,3824],{},[63,3822,3823],{},"Les garde-fous comportementaux se testent comme un modèle."," La limitation de scope et la résistance à l'injection de prompt, elles, dépendent du LLM : impossible de garantir un refus à 100 % par une simple égalité.",[21,3826,3827],{},"On les évalue donc à la manière d'une éval, avec un jeu d'attaques (« ignore tes instructions… », questions hors-sujet, jailbreaks connus) rejoué en CI, et un taux de réussite comme métrique plutôt qu'un pass\u002Ffail binaire.",[21,3829,3830,3831,202],{},"C'est exactement l'usage des plugins de red-teaming de ",[68,3832,3835],{"href":3833,"rel":3834},"https:\u002F\u002Fwww.promptfoo.dev\u002F",[72],"promptfoo",[490,3837,3838],{},[21,3839,3840,3843],{},[63,3841,3842],{},"💡 Aucune de ces couches n'est suffisante seule."," Le message système peut être contourné, les validations peuvent avoir un trou, mais la transaction read-only, elle, est une garantie technique. La sécurité d'une solution IA, c'est un empilement de filets, pas un mur unique.",[499,3845],{},[43,3847,3849],{"id":3848},"acte-4-sortir-de-la-boîte-noire-lobservabilité","Acte 4. Sortir de la boîte noire : l'observabilité",[21,3851,3852,3853,3856,3857,202],{},"À ce stade, le système est évalué et protégé. Mais en production, une question revient sans cesse : ",[63,3854,3855],{},"« pourquoi a-t-il répondu ça ? »"," Et son corollaire budgétaire : ",[63,3858,3859],{},"« combien ça nous a coûté ? »",[21,3861,3862],{},"Sans traçabilité, ces questions restent sans réponse. L'observabilité consiste à instrumenter chaque étape pour reconstituer le parcours complet d'une requête :",[21,3864,3865],{},[352,3866],{"alt":3867,"src":3868},"Graphique de toutes les étapes du process renvoyant des métriques observables","\u002Fcontent-assets\u002F2026-06-09-du-prototype-a-la-prod-ce-quon-ne-te-dit-pas-sur-la-construction-dune-solution-ia-solide\u002Fassets\u002Fimg5.webp",[21,3870,3871,3872,3875,3876,3879,3880,3875,3883,3875,3886,3889,3890,202],{},"Ce qu'il faut capturer dans une trace : la question brute, la reformulation, la requête générée, le contexte récupéré, les ",[63,3873,3874],{},"tokens consommés (entrée\u002Fsortie)",", le ",[63,3877,3878],{},"coût",", la ",[63,3881,3882],{},"latence",[63,3884,3885],{},"nombre de retries",[63,3887,3888],{},"score du juge"," et le ",[63,3891,3892],{},"feedback utilisateur",[21,3894,3895,3896,66,3899,3906,3907,3913,3916,3917,3924],{},"Côté implémentation, encore une fois, l'écosystème Spring est confortable : ",[63,3897,3898],{},"Spring AI expose nativement de l'observabilité via",[68,3900,3903],{"href":3901,"rel":3902},"https:\u002F\u002Fmicrometer.io\u002F",[72],[63,3904,3905],{},"Micrometer"," (traces et métriques sur les appels modèle, la latence, les tokens), que l'on visualise ensuite dans ",[68,3908,3911],{"href":3909,"rel":3910},"https:\u002F\u002Flangfuse.com\u002F",[72],[63,3912,1920],{},[68,3914,66],{"href":3909,"rel":3915},[72],"(open-source, self-hostable: un argument de poids pour la souveraineté des données) ou ",[68,3918,3921],{"href":3919,"rel":3920},"https:\u002F\u002Fgithub.com\u002Farize-ai\u002Fphoenix",[72],[63,3922,3923],{},"Phoenix"," (basé sur OpenTelemetry).",[21,3926,3927],{},"Mais le vrai message de cette section est ailleurs :",[490,3929,3930],{},[21,3931,3932,3935,3936,3939],{},[63,3933,3934],{},"L'observabilité est le pivot qui unifie tous les autres piliers."," Une trace bien faite est simultanément votre outil de debug, votre relevé de coûts, ",[28,3937,3938],{},"et"," la matière première de votre golden set. Les vraies questions de vos utilisateurs, capturées en production, sont les meilleurs cas d'évaluation que vous puissiez espérer.",[499,3941],{},[43,3943,3945],{"id":3944},"acte-5-tenir-le-budget-tokens-et-coûts","Acte 5. Tenir le budget : tokens et coûts",[21,3947,3948,3949,3952],{},"Une solution IA a une caractéristique inhabituelle : ",[63,3950,3951],{},"chaque requête a un coût marginal réel",". Ce n'est pas du calcul amorti sur un serveur déjà payé, ce sont des tokens facturés à l'usage. Ignorer ce point, c'est découvrir la facture en fin de mois.",[21,3954,3955],{},"Les leviers, du plus structurant au plus opérationnel :",[266,3957,3958,3964,3974,3987,3996],{},[269,3959,3960,3963],{},[63,3961,3962],{},"Choisir le modèle selon la tâche."," Tout ne mérite pas votre modèle le plus cher. Un petit modèle rapide suffit pour reformuler une question ou la classer ; on réserve le gros modèle à la génération finale. Sur une chaîne à plusieurs étapes, l'économie est considérable.",[269,3965,3966,3969,3970,3973],{},[63,3967,3968],{},"Plafonner le budget tokens par requête."," Fixer explicitement un budget par appel (et un ",[529,3971,3972],{},"max_tokens",") évite les dérapages et force la concision.",[269,3975,3976,3979,3980,3983,3984,3986],{},[63,3977,3978],{},"Cache sémantique."," Stocker les requêtes réussies et les rejouer quand une question équivalente revient. C'est un cas où un même geste apporte ",[63,3981,3982],{},"stabilité et économie"," : on ne régénère pas, donc pas de flakiness ",[28,3985,3938],{}," pas de coût.",[269,3988,3989,3992,3993,3995],{},[63,3990,3991],{},"Rétention maîtrisée."," L'historique conversationnel n'a pas besoin d'être conservé éternellement. Une purge après X jours réduit les coûts de stockage ",[28,3994,3938],{}," la surface de données personnelles à protéger.",[269,3997,3998,4001,4002,4005],{},[63,3999,4000],{},"Leviers complémentaires"," : prompt caching (mise en cache du préfixe de prompt par le fournisseur), troncature ou résumé de l'historique pour ne pas envoyer toute la conversation à chaque tour, et ",[63,4003,4004],{},"monitoring du coût par conversation et par utilisateur"," (qui découle directement de l'observabilité de l'acte 4).",[490,4007,4008],{},[21,4009,4010,4013,4015,4016,4019,4020,4023,4024,4027],{},[63,4011,4012],{},"🔐 Encadré sécurité : ce qui peut faire mal en prod au-delà de la qualité des réponses",[2545,4014],{},"\nLes clés d'API LLM sont des secrets coûteux : une clé qui fuite, c'est votre budget qui part dans la nature. Trois réflexes : stocker les clés dans un ",[63,4017,4018],{},"secret manager"," (jamais en dur, jamais dans le repo), mettre en place une ",[63,4021,4022],{},"rotation automatique",", et ",[63,4025,4026],{},"monitorer les fuites de credentials"," (scan des commits, alerte sur usage anormal). Ce sont des pratiques d'ops classiques, mais l'enjeu financier les rend ici particulièrement critiques.",[499,4029],{},[43,4031,4033],{"id":4032},"acte-6-le-système-qui-saméliore-tout-seul-la-feedback-loop","Acte 6. Le système qui s'améliore tout seul : la feedback loop",[21,4035,4036,4037,4040,4041,4044],{},"On arrive au sommet : faire en sorte que le système ",[63,4038,4039],{},"s'améliore avec le temps"," plutôt que de se dégrader silencieusement. Cela repose non pas sur une, mais sur ",[63,4042,4043],{},"trois boucles de feedback"," qui tournent en parallèle, à des rythmes différents.",[21,4046,4047],{},[352,4048],{"alt":4049,"src":4050},"Graphique de la feedback loop du système en production : boucle instantanée, boucle offline\u002FCI et boucle online","\u002Fcontent-assets\u002F2026-06-09-du-prototype-a-la-prod-ce-quon-ne-te-dit-pas-sur-la-construction-dune-solution-ia-solide\u002Fassets\u002Fimg6.webp",[2609,4052,4054],{"id":4053},"boucle-1-instantanée-le-feedback-utilisateur","Boucle 1 : Instantanée (le feedback utilisateur)",[21,4056,4057,4058,4061],{},"C'est la plus directe : l'utilisateur signale qu'une réponse était utile ou non, et ce signal est ",[63,4059,4060],{},"persistant",". Souvenez-vous du modèle de données de l'acte 1 : chaque réponse est reliée aux données qui l'ont produite. Il suffit de marquer la réponse :",[522,4063,4065],{"className":2338,"code":4064,"language":2340,"meta":411,"style":411},"export async function provideFeedback(responseId: string, helpful: boolean) {\n  await write(`\n    MATCH (r:Response {id: $responseId})\n    CALL { WITH r WITH r WHERE $helpful = true  SET r:HelpfulResponse }\n    CALL { WITH r WITH r WHERE $helpful = false SET r:UnhelpfulResponse }\n  `, { responseId, helpful });\n}\n",[529,4066,4067,4105,4117,4122,4127,4132,4139],{"__ignoreMap":411},[532,4068,4069,4072,4075,4078,4081,4083,4086,4089,4092,4094,4097,4099,4102],{"class":534,"line":535},[532,4070,4071],{"class":2347},"export",[532,4073,4074],{"class":2347}," async",[532,4076,4077],{"class":2347}," function",[532,4079,4080],{"class":2365}," provideFeedback",[532,4082,2422],{"class":2361},[532,4084,4085],{"class":2939},"responseId",[532,4087,4088],{"class":2347},":",[532,4090,4091],{"class":2351}," string",[532,4093,996],{"class":2361},[532,4095,4096],{"class":2939},"helpful",[532,4098,4088],{"class":2347},[532,4100,4101],{"class":2351}," boolean",[532,4103,4104],{"class":2361},") {\n",[532,4106,4107,4110,4113,4115],{"class":534,"line":412},[532,4108,4109],{"class":2347},"  await",[532,4111,4112],{"class":2365}," write",[532,4114,2422],{"class":2361},[532,4116,2690],{"class":2377},[532,4118,4119],{"class":534,"line":558},[532,4120,4121],{"class":2377},"    MATCH (r:Response {id: $responseId})\n",[532,4123,4124],{"class":534,"line":564},[532,4125,4126],{"class":2377},"    CALL { WITH r WITH r WHERE $helpful = true  SET r:HelpfulResponse }\n",[532,4128,4129],{"class":534,"line":570},[532,4130,4131],{"class":2377},"    CALL { WITH r WITH r WHERE $helpful = false SET r:UnhelpfulResponse }\n",[532,4133,4134,4136],{"class":534,"line":625},[532,4135,2723],{"class":2377},[532,4137,4138],{"class":2361},", { responseId, helpful });\n",[532,4140,4141],{"class":534,"line":630},[532,4142,3113],{"class":2361},[21,4144,4145,4146,4149,4150,813],{},"Ensuite, on exploite ce signal pour ",[63,4147,4148],{},"filtrer le contexte"," : on exclut les données qui reviennent trop souvent dans des réponses mal notées, grâce à la similarité vectorielle de la ",[68,4151,4154],{"href":4152,"rel":4153},"https:\u002F\u002Fneo4j.com\u002Fdocs\u002Fgraph-data-science\u002Fcurrent\u002F",[72],"bibliothèque Graph Data Science",[522,4156,4158],{"className":524,"code":4157,"language":526,"meta":527,"style":411},"OPTIONAL MATCH (node)\u003C-[:CONTEXT]-(r:UnhelpfulResponse)\nWHERE gds.similarity.cosine(r.embedding, $embedding) > 0.9\nWITH node, score, count(r) AS count\nWHERE count \u003C= 10\nRETURN node.text AS text, score, { url: node.url, title: node.title } AS metadata\nORDER BY score DESC LIMIT 5\n",[529,4159,4160,4165,4170,4175,4180,4185],{"__ignoreMap":411},[532,4161,4162],{"class":534,"line":535},[532,4163,4164],{},"OPTIONAL MATCH (node)\u003C-[:CONTEXT]-(r:UnhelpfulResponse)\n",[532,4166,4167],{"class":534,"line":412},[532,4168,4169],{},"WHERE gds.similarity.cosine(r.embedding, $embedding) > 0.9\n",[532,4171,4172],{"class":534,"line":558},[532,4173,4174],{},"WITH node, score, count(r) AS count\n",[532,4176,4177],{"class":534,"line":564},[532,4178,4179],{},"WHERE count \u003C= 10\n",[532,4181,4182],{"class":534,"line":570},[532,4183,4184],{},"RETURN node.text AS text, score, { url: node.url, title: node.title } AS metadata\n",[532,4186,4187],{"class":534,"line":625},[532,4188,4189],{},"ORDER BY score DESC LIMIT 5\n",[2609,4191,4193],{"id":4192},"boucle-2-offline-ci-les-évals","Boucle 2 : Offline \u002F CI (les évals)",[21,4195,4196,4197,4200],{},"C'est la boucle de l'acte 2 : à chaque modification de prompt, on rejoue le golden set pour ",[63,4198,4199],{},"détecter les régressions avant qu'elles n'atteignent la production",". Rythme : à chaque PR.",[2609,4202,4204],{"id":4203},"boucle-3-online-le-juge-sur-le-trafic-réel","Boucle 3 : Online (le juge sur le trafic réel)",[21,4206,4207,4208,4211],{},"Un LLM-as-Judge note un échantillon du trafic de production. Son rôle principal : détecter le ",[63,4209,4210],{},"model drift",". Car voici un piège que peu anticipent :",[490,4213,4214],{},[21,4215,4216,4219],{},[63,4217,4218],{},"⚠️ Le fournisseur met à jour le modèle sous vos pieds."," Une mise à jour silencieuse côté provider peut faire régresser un prompt parfaitement stable, sans que vous ayez touché une ligne de code. Sans boucle online, vous ne le verrez jamais venir. (D'où, aussi, l'intérêt d'épingler les versions de modèle quand c'est possible.)",[21,4221,4222,4225,4226,4229,4230,4233],{},[63,4223,4224],{},"Ce que ça implique au quotidien :"," ",[63,4227,4228],{},"une montée de version de modèle se gère comme un changement de code."," On épingle la version en production, et quand le fournisseur en publie une nouvelle, on l'adopte via une merge request qui rejoue le golden set et compare le ",[63,4231,4232],{},"delta de résultats"," (l'évaluation par exécution de l'Acte 2). Delta neutre ou positif : on merge. Régression : on reste sur la version épinglée. Le modèle devient une dépendance versionnée comme une autre.",[2609,4235,4237],{"id":4236},"le-garde-fou-le-feedback-est-un-signal-pas-une-vérité","Le garde-fou : le feedback est un signal, pas une vérité",[21,4239,4240,4241,4244],{},"Une boucle de feedback ouverte sur l'extérieur peut être ",[63,4242,4243],{},"empoisonnée",". Des utilisateurs malhonnêtes (ou simplement maladroits) peuvent dégrader le système en notant n'importe comment. La règle d'or :",[490,4246,4247],{},[21,4248,4249,4252,4253],{},[63,4250,4251],{},"Le feedback brut ne doit jamais muter directement le comportement du système."," Il passe toujours par de l'",[63,4254,4255],{},"agrégation et un seuil.",[21,4257,4258,4259,4262],{},"C'est exactement ce que fait la requête ci-dessus avec son ",[529,4260,4261],{},"count \u003C= 10"," : un nœud n'est exclu que s'il a été associé à un nombre significatif de réponses mal notées. Un avis isolé ne suffit pas. On peut aller plus loin : pondérer selon la fiabilité de l'utilisateur, détecter les anomalies, exiger un volume minimal.",[21,4264,4265],{},"Concrètement, quelques signaux simples :",[266,4267,4268,4274,4280,4286,4295],{},[269,4269,4270,4273],{},[63,4271,4272],{},"Réputation"," : pondérer un vote selon l'historique du votant (un compte authentifié et ancien pèse plus qu'un anonyme tout neuf), et réduire le poids des utilisateurs dont les votes divergent systématiquement du consensus.",[269,4275,4276,4279],{},[63,4277,4278],{},"Anomalies de volume"," : repérer les rafales (beaucoup de votes négatifs en quelques secondes, depuis une même session ou IP) avec du rate-limiting.",[269,4281,4282,4285],{},[63,4283,4284],{},"Écart au consensus"," : un « inutile » sur une réponse massivement jugée utile par les autres est suspect (un simple z-score par rapport à la moyenne suffit à le flaguer).",[269,4287,4288,4291,4292,4294],{},[63,4289,4290],{},"Confirmation croisée"," : n'agir que sur un signal confirmé par plusieurs utilisateurs indépendants. Le seuil ",[529,4293,4261],{}," en est la version minimale.",[269,4296,4297,4300],{},[63,4298,4299],{},"Signaux implicites"," : croiser le pouce explicite avec le comportement réel (l'utilisateur a-t-il reformulé sa question, abandonné, cliqué la source ?), souvent plus honnête que la note déclarée.",[21,4302,4303],{},"Le feedback utilisateur est un signal précieux, à condition de ne jamais le confondre avec la vérité.",[499,4305],{},[43,4307,4309],{"id":4308},"conclusion-la-checklist-production-ready","Conclusion : La checklist « production-ready »",[21,4311,4312],{},"Revenons à mon test flaky du début. Il n'était pas le symptôme d'un mauvais code. Il était le premier signe que je construisais un type de système différent, qui exige une discipline différente.",[21,4314,4315,4316,813],{},"Le LLM est le composant le plus visible de votre solution. C'est paradoxalement le plus simple à mettre en place, et le moins coûteux à remplacer. Ce qui sépare une démo applaudie un mardi après-midi d'un produit qui tient en production, c'est ",[63,4317,4318],{},"tout le système d'ingénierie autour",[266,4320,4321,4328,4334,4340,4346],{},[269,4322,4323,4324,4327],{},"✅ ",[63,4325,4326],{},"Évaluation"," : un golden set versionné, des métriques par exécution quand c'est possible, des expériences A\u002FB en CI.",[269,4329,4323,4330,4333],{},[63,4331,4332],{},"Guardrails"," : défense en profondeur : scope, validation de la génération, transaction read-only, auto-correction, fallback gracieux.",[269,4335,4323,4336,4339],{},[63,4337,4338],{},"Observabilité"," : des traces complètes (tokens, coût, latence, scores), qui nourrissent à la fois le debug, le budget et les évals.",[269,4341,4323,4342,4345],{},[63,4343,4344],{},"Coûts"," : routing de modèles, cache sémantique, budgets de tokens, rétention maîtrisée, secrets managés et tournés.",[269,4347,4323,4348,4351],{},[63,4349,4350],{},"Feedback loop"," : trois boucles parallèles (instantanée, offline, online), avec agrégation pour résister à l'empoisonnement.",[21,4353,4354],{},"Aucun de ces piliers n'est optionnel si vous visez la production. Et tous se rejoignent autour d'une même idée : un LLM ne devient fiable que lorsqu'on cesse de lui faire confiance aveuglément, et qu'on construit, autour de lui, un système qui mesure, contraint, observe et apprend.",[21,4356,4357],{},"C'est moins spectaculaire qu'une démo. C'est infiniment plus durable.",[499,4359],{},[21,4361,4362,66,4365,4372],{},[28,4363,4364],{},"Vous construisez ce genre de solution ? Chez",[68,4366,4369],{"href":4367,"rel":4368},"https:\u002F\u002Fwww.hoppr.tech\u002F",[72],[28,4370,4371],{},"Hoppr",[28,4373,4374],{},", c'est exactement le type de défi qui nous occupe : discutons-en !",[499,4376],{},[43,4378,4380],{"id":4379},"sources-ressources","Sources & ressources",[266,4382,4383,4390,4396,4403,4410,4417,4436,4442],{},[269,4384,4385],{},[68,4386,4389],{"href":4387,"rel":4388},"https:\u002F\u002Fdocs.spring.io\u002Fspring-ai\u002Freference\u002Fapi\u002Ftesting.html",[72],"Spring AI : Evaluation Testing",[269,4391,4392],{},[68,4393,4395],{"href":3236,"rel":4394},[72],"Baeldung : Testing LLM Responses Using Spring AI Evaluators",[269,4397,4398],{},[68,4399,4402],{"href":4400,"rel":4401},"https:\u002F\u002Fwww.evidentlyai.com\u002Fllm-guide\u002Fllm-as-a-judge",[72],"Evidently AI : LLM-as-a-judge a complete guide",[269,4404,4405],{},[68,4406,4409],{"href":4407,"rel":4408},"https:\u002F\u002Fhumanloop.com\u002Fblog\u002Fllm-as-a-judge",[72],"Humanloop : LLM as a Judge",[269,4411,4412],{},[68,4413,4416],{"href":4414,"rel":4415},"https:\u002F\u002Fdocs.ragas.io\u002F",[72],"Ragas : RAG evaluation metrics",[269,4418,4419,4424,4425,4424,4428,4424,4431],{},[68,4420,4423],{"href":4421,"rel":4422},"https:\u002F\u002Fdeepeval.com\u002F",[72],"DeepEval"," · ",[68,4426,3835],{"href":3833,"rel":4427},[72],[68,4429,1920],{"href":3909,"rel":4430},[72],[68,4432,4435],{"href":4433,"rel":4434},"https:\u002F\u002Fphoenix.arize.com\u002F",[72],"Arize Phoenix",[269,4437,4438],{},[68,4439,4441],{"href":2460,"rel":4440},[72],"Neo4j GraphAcademy : Build a Neo4j-backed Chatbot with TypeScript",[269,4443,4444],{},[68,4445,4447],{"href":4152,"rel":4446},[72],"Neo4j Graph Data Science",[1700,4449,4450],{},"html pre.shiki code .suJrU, html code.shiki .suJrU{--shiki-default:#FF7B72}html pre.shiki code .sFSAA, html code.shiki .sFSAA{--shiki-default:#79C0FF}html pre.shiki code .sZEs4, html code.shiki .sZEs4{--shiki-default:#E6EDF3}html pre.shiki code .sc3cj, html code.shiki .sc3cj{--shiki-default:#D2A8FF}html pre.shiki code .s9uIt, html code.shiki .s9uIt{--shiki-default:#A5D6FF}html pre.shiki code .sH3jZ, html code.shiki .sH3jZ{--shiki-default:#8B949E}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sQhOw, html code.shiki .sQhOw{--shiki-default:#FFA657}",{"title":411,"searchDepth":412,"depth":412,"links":4452},[4453,4454,4455,4461,4469,4470,4471,4477,4478],{"id":2327,"depth":412,"text":2328},{"id":2488,"depth":412,"text":2489},{"id":2574,"depth":412,"text":2575,"children":4456},[4457,4458,4459,4460],{"id":2611,"depth":558,"text":2612},{"id":2647,"depth":558,"text":2648},{"id":2839,"depth":558,"text":2840},{"id":3137,"depth":558,"text":3138},{"id":3243,"depth":412,"text":3244,"children":4462},[4463,4464,4465,4466,4467,4468],{"id":3267,"depth":558,"text":3268},{"id":3397,"depth":558,"text":3398},{"id":3442,"depth":558,"text":3443},{"id":3539,"depth":558,"text":3540},{"id":3685,"depth":558,"text":3686},{"id":3696,"depth":558,"text":3699},{"id":3848,"depth":412,"text":3849},{"id":3944,"depth":412,"text":3945},{"id":4032,"depth":412,"text":4033,"children":4472},[4473,4474,4475,4476],{"id":4053,"depth":558,"text":4054},{"id":4192,"depth":558,"text":4193},{"id":4203,"depth":558,"text":4204},{"id":4236,"depth":558,"text":4237},{"id":4308,"depth":412,"text":4309},{"id":4379,"depth":412,"text":4380},"2026-06-09T13:25:05.594Z","TL;DR : Brancher un LLM sur une base de données et obtenir une démo qui fonctionne, c'est l'affaire d'un après-midi. Transformer cette démo en une solution qui tient en production, qui ne ment pas, qu",{},"\u002Fblogs\u002F2026-06-09-du-prototype-a-la-prod-ce-quon-ne-te-dit-pas-sur-la-construction-dune-solution-ia-solide",[4484],{"id":2294,"name":2295,"image":2296,"linkedin":2297,"x":14,"bio":2298},{"title":2308,"description":4480},"blogs\u002F2026-06-09-du-prototype-a-la-prod-ce-quon-ne-te-dit-pas-sur-la-construction-dune-solution-ia-solide\u002Findex",[461,4488,4489,4490,2340,4491,4492,2255],"test","testing","observabilité","java","architecture","9gG0zxcb1tQxZVeaNjNtmLFj42UJApZ0f2vgxyPlLA0",{"id":4495,"title":4496,"alt":4497,"authors":4498,"body":4506,"date":5067,"description":5068,"extension":431,"image":432,"meta":5069,"navigation":434,"ogImage":432,"path":5070,"published":434,"reviewers":5071,"seo":5073,"stem":5074,"tags":5075,"__hash__":5078},"blogs\u002Fblogs\u002F2026-05-27-notre-ux-designer-sappelle-claude\u002Findex.md","Notre UX Designer s'appelle Claude","Illustration comic-style d'une équipe de trois développeurs collaborant avec un assistant IA pour créer un design system, avec bulles de dialogue évoquant l'absence de designer, la prise en charge par Claude et les résultats obtenus en 2 jours",[4499,4500,4501],{"id":449,"name":450,"image":1755,"linkedin":452,"x":14},{"id":1744,"name":1745,"image":1746,"linkedin":1747,"x":14},{"id":4502,"name":4503,"image":4504,"linkedin":4505,"x":14},"368f4462-cd38-8007-a70f-e818475f22df","Nathan Delenclos",".\u002Fassets\u002Fauthor-nathan-delenclos.webp","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fnathan-delenclos\u002F",{"type":18,"value":4507,"toc":5054},[4508,4513,4515,4532,4538,4541,4544,4548,4551,4558,4561,4565,4577,4588,4594,4597,4601,4612,4615,4620,4627,4634,4638,4645,4659,4669,4675,4684,4688,4695,4706,4717,4727,4731,4737,4749,4778,4781,4795,4802,4806,4812,4846,4850,4900,4904,4907,4948,4957,4961,4967,4974,4991,4998,5001,5003,5009],[21,4509,4510],{},[28,4511,4512],{},"Retour d'expérience : 2 jours de Maker Days pour designer une plateforme de formation, sans designer.",[499,4514],{},[21,4516,4517,4518,4521,4522,4527,4528,4531],{},"Chez HoppR, nous organisons régulièrement des ",[63,4519,4520],{},"Maker Days"," : quelques jours pendant lesquels on met de côté le quotidien pour faire avancer un projet qui nous intéresse. Cette fois, le projet était une plateforme de formation internes comme ",[68,4523,4526],{"href":4524,"rel":4525},"https:\u002F\u002Fblog.hoppr.tech\u002Fblogs\u002F2025-07-16-from-scratch-to-craft-lhistoire-dun-programme-de-formation-pas-comme-les-autres",[72],"FSTC"," et aussi pour proposer à nos clients. Et plus précisément, l'interface côté ",[63,4529,4530],{},"curateur \u002F formateur"," : les écrans qui permettent à un formateur de remplir le détail d'une formation, gérer son catalogue, etc.",[21,4533,4534,4535,202],{},"Nous étions trois sur cette partie front. Trois développeurs. ",[63,4536,4537],{},"Aucun designer",[21,4539,4540],{},"Externaliser le design d'un projet interne ? Trop cher, trop lent pour un POC. Le faire nous-mêmes à la main ? On l'a tous fait, on connaît le résultat : du Bootstrap mal aligné, ou du Material UI générique qui ne ressemble en rien à HoppR.",[21,4542,4543],{},"Alors on a tenté autre chose : on a confié le design à une IA. Voici ce qu'on en retire.",[43,4545,4547],{"id":4546},"lobjectif-un-design-qui-ressemble-à-hoppr","L'objectif : un design qui ressemble à HoppR",[21,4549,4550],{},"Avant même de toucher un outil, on a passé du temps à cadrer le besoin métier. Qui utilise ces écrans ? Que vient-il y chercher ? Quelles informations sont essentielles, lesquelles sont du bruit ?",[21,4552,4553,4554,4557],{},"Une fois le périmètre fonctionnel défini, nous sommes tombés d'accord sur un point important : la plateforme de formation devait avoir ",[63,4555,4556],{},"la même identité visuelle que le site et le blog HoppR",". Pas un produit qui ressemble à un truc générique de plus, mais bien un produit HoppR.",[21,4559,4560],{},"C'est là qu'on a commencé à comparer les outils.",[43,4562,4564],{"id":4563},"premier-essai-google-stitch","Premier essai : Google Stitch",[21,4566,4567,4572,4573,4576],{},[68,4568,4571],{"href":4569,"rel":4570},"https:\u002F\u002Fkorben.info\u002Fgoogle-stitch-ai-design-ui.html",[72],"Google Stitch"," était séduisant sur le papier : ",[63,4574,4575],{},"gratuit",", capable de générer plusieurs écrans rapidement. On a tenté.",[21,4578,4579,4580,4583,4584,4587],{},"Le résultat : des écrans isolés plutôt jolis, mais ",[63,4581,4582],{},"aucune consistance entre eux",". Pire, à chaque itération sur une page, des éléments non concernés bougeaient. On demandait d'ajouter une section en bas de page, et la nav bar changeait. On précisait dans le prompt ",[28,4585,4586],{},"\"garde le reste de l'UI inchangé\"",", sans effet.",[21,4589,4590],{},[352,4591],{"alt":4592,"src":4593},"Résultat Google Stitch : des écrans fonctionnels, mais sans cohérence d'identité visuelle","\u002Fcontent-assets\u002F2026-05-27-notre-ux-designer-sappelle-claude\u002Fassets\u002Fimg1.webp",[21,4595,4596],{},"Pour un prototype où plusieurs écrans doivent former un tout cohérent, c'était bloquant. On a vite tourné la page.",[43,4598,4600],{"id":4599},"le-pivot-claude-design","Le pivot : Claude Design",[21,4602,4603,4604,4611],{},"En parallèle, @Nathan DELENCLOS  avait commencé à explorer ",[68,4605,4608],{"href":4606,"rel":4607},"https:\u002F\u002Fwww.anthropic.com\u002Fnews\u002Fclaude-design-anthropic-labs",[72],[63,4609,4610],{},"Claude Design"," (la fonctionnalité de prototypage d'Anthropic, en Research Preview au moment où on écrit ces lignes).",[21,4613,4614],{},"Premier réflexe — celui qu'on a tous, je pense — on lui demande directement :",[490,4616,4617],{},[21,4618,4619],{},"Crée-moi une plateforme de formation, dans le style du site et du blog HoppR, inspirée de Google Skills Boost pour l'interface.",[21,4621,4622,4623,4626],{},"Résultat : une page ",[63,4624,4625],{},"décente",", mais qui n'avait pas vraiment le style HoppR. Un peu trop générique, des couleurs approximatives, une typo qui ne correspondait pas.",[21,4628,4629,4630,4633],{},"On a alors compris ce qui manquait : Claude Design n'avait ",[63,4631,4632],{},"aucune référence concrète"," au design HoppR. Il faisait au mieux avec sa connaissance générale de \"ce à quoi ressemble un site tech français\" — c'est-à-dire pas grand-chose.",[43,4635,4637],{"id":4636},"la-vraie-méthode-commencer-par-le-design-system","La vraie méthode : commencer par le design system",[21,4639,4640,4641,4644],{},"On a tout repris. Cette fois, on a utilisé ",[63,4642,4643],{},"Claude (la version chat classique)"," pour extraire méthodiquement du site et du blog HoppR :",[266,4646,4647,4650,4653,4656],{},[269,4648,4649],{},"la palette de couleurs (codes hexadécimaux précis)",[269,4651,4652],{},"les polices utilisées (Fira Sans, JetBrains Mono, Orbitron)",[269,4654,4655],{},"les composants récurrents (cartes, badges, boutons)",[269,4657,4658],{},"le ton, les principes visuels",[21,4660,4661,4662,4665,4666,202],{},"Toutes ces informations ont été agrégées dans un ",[63,4663,4664],{},"prompt structuré",", qu'on a ensuite envoyé à Claude Design avec une consigne simple : ",[63,4667,4668],{},"génère d'abord le design system, pas la page",[21,4670,4671,4672],{},"Et là, le rendu était vraiment bon. Le design system généré reprenait l'identité HoppR de façon convaincante : style CSS, typographie, palette, composants de base. ",[63,4673,4674],{},"Un vrai socle réutilisable.",[490,4676,4677],{},[21,4678,4679,4680,4683],{},"💡 Note importante : ça prend du temps. Comptez ",[63,4681,4682],{},"10 à 15 minutes"," pour qu'une page complète soit générée. C'est loin de l’effet \"instantané\" qu'on imagine parfois avec ces outils.",[43,4685,4687],{"id":4686},"de-la-page-de-catalogue-à-la-page-de-détail","De la page de catalogue à la page de détail",[21,4689,4690,4691,4694],{},"Avec le design system en place, on a enchaîné sur la ",[63,4692,4693],{},"page de catalogue des formations",". Cette fois, le style HoppR était bien présent. Victoire ?",[21,4696,4697,4698,4701,4702,4705],{},"Presque. On s'est retrouvés avec pas mal d'éléments ",[63,4699,4700],{},"non demandés"," : boutons de lancement, système de crédits, navbar latérale… qui venaient en réalité de l'exemple Google Skills Boost qu'on avait donné en référence. Leçon retenue : ",[63,4703,4704],{},"fournir des exemples est utile, mais c'est à double tranchant",". Claude Design recopie aussi les fonctionnalités, pas juste l'esthétique.",[21,4707,4708,4709,4712,4713,4716],{},"Et voici la première vraie limite ergonomique qu'on a heurtée : ",[63,4710,4711],{},"impossible de supprimer un élément directement"," dans l'interface. Pour modifier du texte ou retoucher du CSS léger, on peut éditer en place. Mais pour enlever toute une section, il faut ",[63,4714,4715],{},"reprompter et regénérer",". Ce qui consomme du quota, ce qui prend du temps, et ce qui peut introduire d'autres modifications non désirées.",[21,4718,4719,4720,4723,4724,202],{},"Pour la troisième page, le ",[63,4721,4722],{},"détail d'une formation."," On a aussi cogné un autre mur : le ",[63,4725,4726],{},"quota de Claude Design",[43,4728,4730],{"id":4729},"le-mur-du-quota","Le mur du quota",[21,4732,4733],{},[352,4734],{"alt":4735,"src":4736},"Le message d'avertissement de quota Claude Design","\u002Fcontent-assets\u002F2026-05-27-notre-ux-designer-sappelle-claude\u002Fassets\u002Fimg2.webp",[21,4738,4739,4740,4743,4744,202],{},"C'est probablement l'élément le plus important à anticiper si vous voulez utiliser Claude Design sur un vrai projet. Nous utilisions le ",[63,4741,4742],{},"plan Pro à 20 €\u002Fmois"," qui est adapté à une utilisation ponctuelle, mais qui brûle vite pour une utilisation intensive. Les plans Max offrent des allocations hebdomadaires plus généreuses. Pour le détail par plan, voir la ",[68,4745,4748],{"href":4746,"rel":4747},"https:\u002F\u002Fsupport.claude.com\u002Ffr\u002Farticles\u002F14667344-utilisation-et-tarification-de-l-abonnement-claude-design",[72],"documentation officielle",[266,4750,4751,4758,4764,4771],{},[269,4752,4753,4754,4757],{},"Le quota Claude Design est ",[63,4755,4756],{},"séparé du quota Claude classique"," (pas de mutualisation).",[269,4759,4760,4761,202],{},"Il se ",[63,4762,4763],{},"renouvelle de façon hebdomadaire",[269,4765,4766,4767,4770],{},"Il ",[63,4768,4769],{},"brûle très vite",", surtout en mode \"high fidelity\" qui est celui qui produit les rendus les plus exploitables.",[269,4772,4773,4774,4777],{},"Même l'",[63,4775,4776],{},"export d'une page en HTML standalone"," consomme des tokens, et prend du temps.",[21,4779,4780],{},"Concrètement, on a épuisé le quota d'un compte avant la fin du deuxième jour. Pour continuer, nous avons :",[266,4782,4783,4786,4789],{},[269,4784,4785],{},"Exporté le design system en HTML standalone.",[269,4787,4788],{},"Exporté la page catalogue.",[269,4790,4791,4792,202],{},"Repris la session sur le compte d'un collègue, en ",[63,4793,4794],{},"fournissant ces exports comme contexte initial",[21,4796,4797,4798,4801],{},"Avec ce contexte fourni d'entrée de jeu, on a eu un ",[63,4799,4800],{},"prototype très correct dès la première génération"," sur la page de détail. Et pour les ajustements (suppression des sections non désirées, etc.), on est passés directement dans le code HTML exporté, plutôt que de redemander à Claude Design.",[43,4803,4805],{"id":4804},"ce-quon-a-aimé","Ce qu'on a aimé",[21,4807,4808],{},[352,4809],{"alt":4810,"src":4811},"Page de détail d'une formation — générée par Claude Design à partir du design system HoppR et des exports HTML comme contexte.","\u002Fcontent-assets\u002F2026-05-27-notre-ux-designer-sappelle-claude\u002Fassets\u002Fimg3.webp",[266,4813,4814,4820,4826,4833,4839],{},[269,4815,4816,4819],{},[63,4817,4818],{},"La qualité du prototype",", vraiment au-dessus de nos attentes pour un projet sans designer.",[269,4821,4822,4825],{},[63,4823,4824],{},"La cohérence entre les pages",", qui était le gros point faible de Google Stitch.",[269,4827,4828,4829,4832],{},"La possibilité de ",[63,4830,4831],{},"transformer un projet en template"," réutilisable.",[269,4834,193,4835,4838],{},[63,4836,4837],{},"multiples formats d'export"," : ZIP, PDF, PPTX, Canva, HTML standalone.",[269,4840,4841,4842,4845],{},"La capacité à ",[63,4843,4844],{},"déléguer ensuite l'implémentation"," à Claude Code ou un autre agent, à condition de bien cadrer la stack technique et les principes d'architecture en amont.",[43,4847,4849],{"id":4848},"ce-quon-a-moins-aimé","Ce qu'on a moins aimé",[266,4851,4852,4858,4863,4869,4875,4881,4888,4894],{},[269,4853,4854,4857],{},[63,4855,4856],{},"Le quota qui brûle vite",", et sa nature hebdomadaire qui peut bloquer un sprint.",[269,4859,193,4860,4862],{},[63,4861,4682],{}," par génération de page : utile à intégrer dans son planning.",[269,4864,4865,4868],{},[63,4866,4867],{},"Pas d'historique de versions"," : si une régénération abîme votre prototype, c'est terminé.",[269,4870,4871,4874],{},[63,4872,4873],{},"Impossible de renommer"," les pages dans l'interface, ce qui peut prêter à confusion sur un projet à plusieurs.",[269,4876,4877,4880],{},[63,4878,4879],{},"Impossible de supprimer un élément"," sans passer par un reprompt.",[269,4882,4883,4884,4887],{},"Claude Design est ",[63,4885,4886],{},"disponible uniquement en web",", donc à jongler avec Claude Code (côté desktop \u002F terminal) pour la suite.",[269,4889,193,4890,4893],{},[63,4891,4892],{},"exemples fournis contaminent"," le résultat : Claude Design recopie aussi les features de l'exemple, pas juste le style.",[269,4895,4896,4899],{},[63,4897,4898],{},"L'accessibilité, angle mort du prototype."," Claude Design ne pense pas les contrastes, la structure sémantique, ni les parcours clavier. Pour un POC interne, c'est acceptable. Pour un produit qu'on livre à des clients, c'est un chantier à anticiper.",[43,4901,4903],{"id":4902},"notre-recette-si-cétait-à-refaire","Notre recette, si c'était à refaire",[21,4905,4906],{},"Avec le recul, voici l'ordre dans lequel on s'y prendrait :",[266,4908,4909,4915,4921,4928,4934,4941],{},[269,4910,4911,4914],{},[63,4912,4913],{},"Commencer par le design system",", et le sécuriser avant tout le reste.",[269,4916,4917,4920],{},[63,4918,4919],{},"L'exporter en HTML standalone"," dès qu'il est satisfaisant.",[269,4922,4923,4924,4927],{},"Selon le quota restant, ",[63,4925,4926],{},"prioriser les pages les plus structurantes"," (celles qui définissent les patterns réutilisés ailleurs).",[269,4929,4930,4933],{},[63,4931,4932],{},"Exporter à chaque milestone"," atteint : c'est votre seul historique.",[269,4935,4936,4937,4940],{},"Pour toute ",[63,4938,4939],{},"modification mineure"," (texte, couleur, suppression d'un élément), travailler directement sur l'export, dans Figma ou dans la phase de dev. Ne pas consommer du quota Claude Design pour ça.",[269,4942,4943,4944,4947],{},"Une fois le quota épuisé, ",[63,4945,4946],{},"déléguer le reste de l'implémentation à Claude Code"," (ou autre agent IA), avec le design system et les pages clés comme contexte.",[490,4949,4950],{},[21,4951,4952,4953,4956],{},"💡 Et tout du long : ",[63,4954,4955],{},"s'assister d'autres IA (Claude, ChatGPT, Gemini) pour préparer les prompts",". Plus le prompt d'entrée est riche et précis, moins on consomme de quota en allers-retours.",[43,4958,4960],{"id":4959},"alors-claude-est-il-vraiment-notre-ux-designer","Alors, Claude est-il vraiment notre UX Designer ?",[21,4962,4963,4964,202],{},"Soyons honnêtes : ",[63,4965,4966],{},"non",[21,4968,4969,4970,4973],{},"Un designer UX, ce n'est pas qu'une personne qui produit de jolis écrans. C'est quelqu'un qui mène des entretiens utilisateurs, qui challenge le besoin métier, qui pense les parcours, qui itère sur les micro-interactions, qui défend l'accessibilité, qui construit une vision produit sur la durée. ",[63,4971,4972],{},"Tout ça, Claude Design ne le fait pas."," Il prend un brief, et il rend un rendu visuel cohérent.",[21,4975,4976,4977,996,4980,996,4983,4986,4987,4990],{},"Mais sur un projet ",[63,4978,4979],{},"interne",[63,4981,4982],{},"à petit périmètre",[63,4984,4985],{},"sans budget designer",", où l'enjeu est de ",[63,4988,4989],{},"prototyper vite quelque chose de présentable pour itérer dessus"," : oui, Claude Design tient ses promesses. Il nous a permis, à trois devs en deux jours, de produire des écrans qui ressemblent à du HoppR. Pas à un projet bricolé.",[21,4992,4993,4994,4997],{},"Pour le vrai produit qu'on vendra à nos clients, quand on passera à l'étape d'après, nous travaillerons évidemment avec un designer. Ce qu'on aura gagné, c'est d'arriver à cette conversation avec ",[63,4995,4996],{},"un prototype concret en main",", plutôt qu'avec un Figma vide et de bonnes intentions.",[21,4999,5000],{},"Et ça, ce n'est pas rien.",[499,5002],{},[43,5004,5006],{"id":5005},"à-retenir",[63,5007,5008],{},"À retenir",[266,5010,5011,5017,5023,5029,5035,5041],{},[269,5012,5013,5016],{},[63,5014,5015],{},"Le design system d'abord."," C'est lui qui garantit la cohérence entre toutes vos pages.",[269,5018,5019,5022],{},[63,5020,5021],{},"Préparez vos prompts avec une autre IA."," Plus le brief est riche, moins vous brûlez de quota.",[269,5024,5025,5028],{},[63,5026,5027],{},"Exportez tôt, exportez souvent."," Il n'y a pas d'historique, vos exports sont votre seul filet.",[269,5030,5031,5034],{},[63,5032,5033],{},"Anticipez le quota."," Hebdomadaire, séparé, et plus court que vous ne le pensez.",[269,5036,5037,5040],{},[63,5038,5039],{},"Claude Design est un excellent prototypeur, pas un designer."," Pour un POC interne, parfait. Pour un produit client final, c'est une étape, pas la destination.",[269,5042,5043,66,5046,5053],{},[63,5044,5045],{},"L’IA ne respecte pas la",[68,5047,5050],{"href":5048,"rel":5049},"https:\u002F\u002Faccessibilite.numerique.gouv.fr\u002F",[72],[63,5051,5052],{},"RGAA",", votre produit en production doit le faire.",{"title":411,"searchDepth":412,"depth":412,"links":5055},[5056,5057,5058,5059,5060,5061,5062,5063,5064,5065,5066],{"id":4546,"depth":412,"text":4547},{"id":4563,"depth":412,"text":4564},{"id":4599,"depth":412,"text":4600},{"id":4636,"depth":412,"text":4637},{"id":4686,"depth":412,"text":4687},{"id":4729,"depth":412,"text":4730},{"id":4804,"depth":412,"text":4805},{"id":4848,"depth":412,"text":4849},{"id":4902,"depth":412,"text":4903},{"id":4959,"depth":412,"text":4960},{"id":5005,"depth":412,"text":5008},"2026-05-27T08:43:23.921Z","Retour d'expérience : 2 jours de Maker Days pour designer une plateforme de formation, sans designer.  ---  Chez HoppR, nous organisons régulièrement des Maker Days : quelques jours pendant lesquels o",{},"\u002Fblogs\u002F2026-05-27-notre-ux-designer-sappelle-claude",[5072],{"id":2294,"name":2295,"image":2296,"linkedin":2297,"x":14,"bio":2298},{"title":4496,"description":5068},"blogs\u002F2026-05-27-notre-ux-designer-sappelle-claude\u002Findex",[5076,461,2255,5077],"rex","ux","AuaVxHr1I5tOV4tTWV4EdDdGYClCNyjGs_TR3nop-7Y",{"id":5080,"title":5081,"alt":5082,"authors":5083,"body":5086,"date":5526,"description":5527,"extension":431,"image":432,"meta":5528,"navigation":434,"ogImage":432,"path":5529,"published":434,"reviewers":5530,"seo":5548,"stem":5549,"tags":5550,"__hash__":5552},"blogs\u002Fblogs\u002F2025-12-02-alors-ctait-comment-ce-premier-devfest-lyon\u002Findex.md","Alors ? C’était comment ce premier DevFest Lyon ?","L’équipe HoppR sur la scène du DevFest Lyon",[5084],{"id":2294,"name":2295,"image":5085,"linkedin":2297,"x":14},".\u002Fassets\u002Fauthor-michal-bernasinski.webp",{"type":18,"value":5087,"toc":5519},[5088,5096,5108,5111,5117,5120,5123,5126,5130,5135,5138,5153,5162,5168,5171,5192,5198,5201,5204,5208,5213,5222,5247,5256,5259,5265,5268,5271,5286,5289,5314,5317,5331,5334,5338,5343,5352,5355,5358,5364,5367,5378,5381,5389,5393,5398,5407,5415,5418,5424,5427,5442,5455,5458,5483,5486,5489,5493,5496,5499,5510,5513,5516],[21,5089,5090,5091,202],{},"Une question que l’on me pose beaucoup en ce début de semaine. En effet, vendredi 28 novembre 2025, nous avons eu la chance, avec plusieurs collègues de HoppR, de faire partie des 250 participants de la première édition du ",[68,5092,5095],{"href":5093,"rel":5094},"https:\u002F\u002Fdevfest.gdglyon.com\u002F",[72],"DevFest Lyon",[21,5097,5098,5099,1000,5104,1898],{},"En effet, notre participation s’inscrit dans le cadre de la veille tech proposée, organisée et prise en charge par HoppR. C’est d’ailleurs comme cela que j’avais pu participer au Lyon Craft plus tôt cette année (et écrire deux articles sur ce blog, à retrouver ",[68,5100,5103],{"href":5101,"rel":5102},"https:\u002F\u002Fblog.hoppr.tech\u002Fblogs\u002F2025-04-24-lyon-craft-2025-12",[72],"ici",[68,5105,5103],{"href":5106,"rel":5107},"https:\u002F\u002Fblog.hoppr.tech\u002Fblogs\u002F2025-05-07-lyon-craft-2025-22",[72],[21,5109,5110],{},"Avant de rentrer dans le vif du sujet, nous sommes tous unanimes chez HoppR pour saluer l’organisation au poil de l’évènement. Nous avons toutes et tous été très bien accueillis, et nous avons passé un moment de qualité avec nombre d’acteurs importants de la scène tech lyonnaise.",[21,5112,5113],{},[352,5114],{"alt":5115,"src":5116},"Photo du programme de la journée, directement dans le badge nominatif délivré à l’accueil de l’évènement","\u002Fcontent-assets\u002F2025-12-02-alors-ctait-comment-ce-premier-devfest-lyon\u002Fassets\u002Fimg1.webp",[21,5118,5119],{},"Nous voici donc arrivés à cette journée de conférences, réparties sur deux tracks, et donc des choix difficiles à faire tant les talks étaient prometteurs.",[21,5121,5122],{},"Beaucoup de thématiques étaient proposées : Data & IA, Frontend, Backend, Software Architecture, Cloud, Infra et DevOps, il y en avait pour tous les goûts. On notera cependant une forte présence de la première thématique : la datascience et les LLM ont la côte !",[21,5124,5125],{},"Je vous propose ici de vous (re)plonger dans celles auxquelles j’ai pu assister en cette froide matinée lyonnaise.",[43,5127,5129],{"id":5128},"keynote-datascience-for-performance","Keynote : Datascience for performance",[21,5131,5132],{},[28,5133,5134],{},"Par Joseph MESTRALLET - Data & AI - 30 minutes",[21,5136,5137],{},"Après la traditionnelle ouverture par le staff devant une salle pleine, avec remerciement des sponsors et rappels de l’organisation, Joseph prend la parole pour une keynote surprise.",[21,5139,5140,5141,5146,5147,5152],{},"Son CV est impressionnant : il accompagne certains des plus grands champions, comme ",[68,5142,5145],{"href":5143,"rel":5144},"https:\u002F\u002Fwww.equipedefrance.com\u002Fathlete\u002Fquentin-fillon-maillet",[72],"Quentin Fillon Maillet"," (5 médailles de biathlon aux JO de Pékin 2022, dont 2 en or) ou ",[68,5148,5151],{"href":5149,"rel":5150},"https:\u002F\u002Ffr.wikipedia.org\u002Fwiki\u002FRuth_Croft",[72],"Ruth Croft"," (vainqueure de l’Ultra-Trail du Mont-Blanc 2025). Et comment fait-il pour aider ces grands champions ? Par la data, par la science, par la datascience !",[21,5154,5155,5156,5161],{},"Joseph nous fait un petit historique des liens entre sport de haut niveau et science, de l’amélioration des photos finish à l’exploit du ",[68,5157,5160],{"href":5158,"rel":5159},"https:\u002F\u002Ffr.wikipedia.org\u002Fwiki\u002FIneos_1:59_Challenge",[72],"marathon en moins de 2h de Kipchoge",". La densification des performances au plus haut niveau a nécessité une nouvelle approche basée sur la science et la data, pour gagner encore les quelques secondes, les quelques centimètres qui font la différence entre un champion olympique et les finalistes qui resteront inconnus du grand public.",[21,5163,5164],{},[352,5165],{"alt":5166,"src":5167},"Ruth Croft à l’arrivée de l’UTMB en 2025","\u002Fcontent-assets\u002F2025-12-02-alors-ctait-comment-ce-premier-devfest-lyon\u002Fassets\u002Fimg2.webp",[21,5169,5170],{},"Mais revenons au travail de Joseph, qui nous parle de quatre niveaux de datas, toujours plus précis:",[266,5172,5173,5176,5179,5186],{},[269,5174,5175],{},"Les données issues de la littérature",[269,5177,5178],{},"Les données personnalisées, via des applications de suivi comme Strava par exemple",[269,5180,165,5181],{},[68,5182,5185],{"href":5183,"rel":5184},"https:\u002F\u002Ffr.wikipedia.org\u002Fwiki\u002FR%C3%A9glage_fin",[72],"fine tuning",[269,5187,5188,5189],{},"Le compute, pour trouver les meilleures conditions pour une course via un ",[28,5190,5191],{},"digital twin",[21,5193,5194,5195,5197],{},"Cette notion de ",[28,5196,5191],{}," revient souvent : il s’agit d’un avatar numérique de l’athlète, que l’on fait participer virtuellement des centaines de fois à la prochaine course, avec des paramètres différents, pour trouver la meilleure stratégie à adopter.",[21,5199,5200],{},"Joseph nous parle également de son quotidien aux côtés des athlètes. Ceux-ci doivent être très impliqués au quotidien pour obtenir de la data de la meilleure qualité possible. A l’inverse, une grande confiance avec lui doit être construite, il s’est donc lui aussi mis à la course à pied de manière intensive pour gagner de la connaissance du terrain et de la légitimité.",[21,5202,5203],{},"Le speaker, visiblement passionné, égraine les anecdotes de ses championnes et champions, et montre à quel point ce travail de performance demande une communication et une proximité forte entre le scientifique et les sportifs.",[43,5205,5207],{"id":5206},"démêler-vrais-produits-et-hallucinations-rex-dun-agent-téléphonique-chercheur-de-chaussettes","Démêler vrais produits et hallucinations, REX d’un agent téléphonique chercheur de chaussettes",[21,5209,5210],{},[28,5211,5212],{},"Par Marie TERRIER - Data & AI - 50 minutes",[21,5214,5215,5216,5221],{},"Marie est CTO d’une ",[68,5217,5220],{"href":5218,"rel":5219},"https:\u002F\u002Fwww.yelda.ai\u002F",[72],"start-up"," proposant un SaaS d’agent vocaux. Cette société a proposé des solutions avant l’avènement des LLMs, et a suivi celui-ci pour présenter des solutions plus performantes. Ainsi, nous faisons un tour de l’historique :",[266,5223,5224,5241,5244],{},[269,5225,5226,5227,5234,5238,5240],{},"2017 : Le Machine Learning existe déjà depuis longtemps, mais les LLMs n’en sont qu’à leurs balbutiements. L’agent vocal est alors basé sur du ",[68,5228,5231],{"href":5229,"rel":5230},"https:\u002F\u002Ffr.wikipedia.org\u002Fwiki\u002FTraitement_automatique_des_langues",[72],[28,5232,5233],{},"natural language processing",[68,5235,5237],{"href":5229,"rel":5236},[72]," (NLP)",[28,5239,202],{}," On essaie de déterminer l’intention du client au bout du fil, et de proposer une réponse pré-généré en fonction. Et si on y parvient pas, alors on demande à l’utilisateur de répéter. Un bon début, mais ce n’est pas très pratique.",[269,5242,5243],{},"2022 : Les LLMs sont utilisés pour ces cas de questions inattendues, et permettent donc de combler le besoin. La fin de l’histoire ?",[269,5245,5246],{},"Fin 2023 : Une nouvelle commande arrive, avec pour problématique la suivante : l’IA peut elle aider les pharmaciens à commander des produits par téléphone ?",[21,5248,5249,5250,5255],{},"A priori, rien de bien sorcier maintenant que nous avons des outils adaptés et efficaces. Mais finalement, c’est la douche froide. Une liste de 40 produits seront proposés, et ceux-ci posent de nombreux problèmes : nous avons ici affaire avec du franglais, sans aucun standard, avec des notions complexes et difficilement transcriptibles comme le ",[68,5251,5254],{"href":5252,"rel":5253},"https:\u002F\u002Ffr.wikipedia.org\u002Fwiki\u002FMillim%C3%A8tre_de_mercure",[72],"mmHg"," par exemple.",[21,5257,5258],{},"Difficile ainsi de trouver la bonne paire de chaussettes ou de bas de contention à commander…",[21,5260,5261],{},[352,5262],{"alt":5263,"src":5264},"Marie nous présente un échantillon de la liste des 40 produits qui seront disponibles à l’achat. On comprend tout de suite la problématique.","\u002Fcontent-assets\u002F2025-12-02-alors-ctait-comment-ce-premier-devfest-lyon\u002Fassets\u002Fimg3.webp",[21,5266,5267],{},"De plus, les pharmaciens ne connaissent pas le nom complet de chaque produit, il est donc nécessaire de poser des questions pour être sûrs de comprendre, tout en étant rapide étant donné que nous sommes au téléphone. Le service existant alors est inadapté, tout est trop long, et le LLM pose trop de questions pour arriver au produit désiré.",[21,5269,5270],{},"La solution passe par des sous-agents, qui permettent d’avoir plus de pertinence dans les questions posées tout en étant plus rapide. C’est donc parfait ! Enfin jusqu’à ce que le catalogue passe de 40 à 20000 références dont certaines en allemand…",[21,5272,5273,5274,5279,5280,5285],{},"Nous sommes en 2023, et les LLMs disposent encore de limites, comme de petites ",[68,5275,5278],{"href":5276,"rel":5277},"https:\u002F\u002Ffr.wikipedia.org\u002Fwiki\u002FFen%C3%AAtre_de_contexte",[72],"fenêtres de contexte"," (8000 tokens puis le modèle “oublie”), une latence trop importante (difficile d’attendre 30s au téléphone) et des ",[68,5281,5284],{"href":5282,"rel":5283},"https:\u002F\u002Ffr.wikipedia.org\u002Fwiki\u002FHallucination_(intelligence_artificielle)",[72],"hallucinations"," fréquentes.",[21,5287,5288],{},"Plusieurs essais sont donc effectués :",[266,5290,5291,5297,5306],{},[269,5292,5293,5296],{},[68,5294,663],{"href":661,"rel":5295},[72]," et prompt dynamique, un bon début mais toujours trop lent et ne gère que 80 produits max lors des tests",[269,5298,5299,5300,5305],{},"Une ",[68,5301,5304],{"href":5302,"rel":5303},"https:\u002F\u002Ffr.wikipedia.org\u002Fwiki\u002FBase_de_donn%C3%A9es_vectorielle",[72],"base de données vectorielle",", mais beaucoup de produits ont des noms trop proches sémantiquement, et chaque requête donne trop de retours",[269,5307,5308,5313],{},[68,5309,5312],{"href":5310,"rel":5311},"https:\u002F\u002Fwww.algolia.com\u002Ffr",[72],"Algolia",", un moteur de recherche boosté à l’IA, qui donne de bons résultats",[21,5315,5316],{},"La solution se construit alors avec plusieurs briques comme ceci :",[266,5318,5319,5322,5325,5328],{},[269,5320,5321],{},"LLM extracteur, qui fournit un nom de produit partiel",[269,5323,5324],{},"Algolia, permettant d’effectuer la recherche",[269,5326,5327],{},"LLM conversationnel",[269,5329,5330],{},"LLM évaluateur",[21,5332,5333],{},"Ainsi, Marie et son équipe ont pu proposer à leur client un outil répondant pleinement au besoin : celui de permettre à des pharmaciens de commander des produits… dont les fameuses chaussettes du titre !",[43,5335,5337],{"id":5336},"lets-play-factorio","Let’s play Factorio",[21,5339,5340],{},[28,5341,5342],{},"Par Julien WITTOUCK - Software Architecture - 50 minutes",[21,5344,5345,5346,5351],{},"Julien est un grand fan du jeu ",[68,5347,5350],{"href":5348,"rel":5349},"https:\u002F\u002Ffactorio.com\u002F",[72],"Factorio",". Ce jeu bac-à-sable consiste à construire et gérer une usine permettant d’exploiter des ressources afin de s’échapper de la planète. Tout le plaisir du jeu et d’agrandir et d’optimiser chaque extraction et production.",[21,5353,5354],{},"Le jeu permet, à l’instar de Minecraft, une grande liberté dans sa construction, y compris en utilisant de la logique permettant même de coder dans Factorio.",[21,5356,5357],{},"Julien se propose ici de nous illustrer de nombreux concepts que l’on peut trouver dans nos projets professionnels.",[21,5359,5360],{},[352,5361],{"alt":5362,"src":5363},"Le logo du jeu Factorio","\u002Fcontent-assets\u002F2025-12-02-alors-ctait-comment-ce-premier-devfest-lyon\u002Fassets\u002Fimg4.webp",[21,5365,5366],{},"Voici les concepts abordés :",[266,5368,5369,5372,5375],{},[269,5370,5371],{},"Développement (Plat de spaghettis, Architecture en couches, Micro-services..)",[269,5373,5374],{},"Urbanisation (ESB, Scaling Vertical\u002FHorizontal)",[269,5376,5377],{},"Sécurité (Métriques & monitoring, DDoS, Firewalls…)",[21,5379,5380],{},"L’exécution est impressionnante, et tous les concepts sont expliqués de manière visuelle et claire. Parfait pour présenter notre travail de tous les jours à des personnes non-tech ! Et il aura fallu plus de 100h pour préparer ce talk original.",[21,5382,5383,5384,202],{},"Si vous souhaitez vous aussi voir ce qu’a construit Julien, un replay de son ",[68,5385,5388],{"href":5386,"rel":5387},"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=I07DxOLw10E",[72],"talk est disponible sur YouTube",[43,5390,5392],{"id":5391},"cétait-dans-quel-épisode-déjà-bref-jai-indexé-une-série-culte","C'était dans quel épisode déjà ? Bref, j'ai indexé une série culte",[21,5394,5395],{},[28,5396,5397],{},"Par Tim Carry - Data & AI - 20 minutes",[21,5399,5400,5401,5406],{},"Tim travaille chez Algolia (oui encore eux). Tim est développeur. Mais surtout, Tim est un très grand fan de la série ",[68,5402,5405],{"href":5403,"rel":5404},"https:\u002F\u002Fwww.imdb.com\u002Ffr\u002Ftitle\u002Ftt2044128\u002F",[72],"Bref"," (note personnelle : il a bien raison !).",[21,5408,5409,5410,202],{},"Il s’est lancé sur un projet personnel qui lui tenait à cœur : un site qui permettrait de trouver l’épisode et l’extrait d’une réplique culte que l’on recherche. Ce sera la genèse de ",[68,5411,5414],{"href":5412,"rel":5413},"https:\u002F\u002Fwww.brefsearch.com\u002F",[72],"brefsearch.com",[21,5416,5417],{},"Les fonctionnalités du site : recherche par ligne de dialogue \u002F pensée, gère les fautes de frappe, aperçu animé de l’extrait au survol, recherche rapide et qui mène directement au moment trouvé.",[21,5419,5420],{},[352,5421],{"alt":5422,"src":5423},"Un exemple : la recherche du terme “Internet” sur brefsearch.com. Le résultat est très rapide et pertinent, et les extraits se jouent au survol.","\u002Fcontent-assets\u002F2025-12-02-alors-ctait-comment-ce-premier-devfest-lyon\u002Fassets\u002Fimg5.webp",[21,5425,5426],{},"Mais comment cela marche-t-il ?",[21,5428,5429,5430,5435,5436,5441],{},"Tout d’abord, il faut une extraction via ",[68,5431,5434],{"href":5432,"rel":5433},"https:\u002F\u002Fgithub.com\u002Fyt-dlp\u002Fyt-dlp",[72],"Yt-dlp",", un outil en lignes de commande qui permet à Tim de récupérer toutes les vidéos de la ",[68,5437,5440],{"href":5438,"rel":5439},"https:\u002F\u002Fwww.youtube.com\u002Fplaylist?list=PLlFikkv2B2ffwYiFQJmcao3RKtw1DFMz5",[72],"playlist Bref sur YouTube",". Il obtient également beaucoup de metadatas très utiles, et également les sous-titres automatiques.",[21,5443,5444,5445,5450,5451,5454],{},"Un problème se pose cependant, dans Bref, ça parle vite. Les sous-titres automatiques sont de qualité médiocre. Pour récupérer du texte exploitable, une extraction audio est alors faite par Yt-dlp puis passés dans ",[68,5446,5449],{"href":5447,"rel":5448},"https:\u002F\u002Fwww.happyscribe.com\u002Ffr",[72],"HappyScribe",", un outil de ",[28,5452,5453],{},"speech-to-text"," IA. C’est bien mieux, et la retouche des dialogues est facilement réalisable (et cela donne une raison de plus de revoir la série !)",[21,5456,5457],{},"Et pour la suite :",[266,5459,5460,5468,5471],{},[269,5461,5462,5467],{},[68,5463,5466],{"href":5464,"rel":5465},"https:\u002F\u002Fwww.ffmpeg.org\u002F",[72],"ffmpeg"," permet de construire les frames des lignes de texte trouvées et les aperçus animés",[269,5469,5470],{},"Algolia permet la recherche",[269,5472,5473,5474,5479,5480,1898],{},"Le frontend est hébergé sur Netlify en utilisant le CDN ",[68,5475,5478],{"href":5476,"rel":5477},"https:\u002F\u002Fcloudinary.com\u002F",[72],"Cloudinary",", avec quelques astuces données par Tim (notamment l’utilisation de LQIP (",[28,5481,5482],{},"Low Quality Image Placeholder",[21,5484,5485],{},"Le résultat ?",[21,5487,5488],{},"Un site efficace, qui fait très bien ce qu’il a à faire, et qui impressionne les créateurs de la série eux-mêmes. Je ne sais pas vous, mais moi cela m’a donné envie de revoir Bref… J’en ai mangé tout le week-end suivant !",[43,5490,5492],{"id":5491},"speechless-fin-de-la-matinée","Speechless & fin de la matinée",[21,5494,5495],{},"Après ces présentations toutes plus intéressantes les unes que les autres, il est maintenant temps de récupérer des forces et de débriefer autour d’un grand buffet. Mais l’heure n’est pas qu’à la pause : un speechless live est organisé.",[21,5497,5498],{},"Le principe ? Plusieurs speakeuses et speakers passent devant le public dans un exercice d’improvisation :",[266,5500,5501,5504,5507],{},[269,5502,5503],{},"Un thème tiré au sort",[269,5505,5506],{},"Un sujet choisi par le public",[269,5508,5509],{},"Des slides imposées, qui n’ont aucun sens",[21,5511,5512],{},"C’était en tout cas un plaisir de voir Carmen Piciorus passer un entretien d’embauche pour devenir gardienne de nains de jardin, et Tim Carry nous pitcher son nouveau film “La revanche des cacahuètes”. Un moment amusant qui clôture une matinée aux petits oignons au DevFest Lyon !",[21,5514,5515],{},"Il est temps ensuite d’attaquer un après-midi qui s’avèrera tout aussi riche en enseignements et en échanges de qualité. Vous voulez en savoir plus ?",[21,5517,5518],{},"Guettez ce blog, j’ai entendu dire qu’un second article était en préparation…",{"title":411,"searchDepth":412,"depth":412,"links":5520},[5521,5522,5523,5524,5525],{"id":5128,"depth":412,"text":5129},{"id":5206,"depth":412,"text":5207},{"id":5336,"depth":412,"text":5337},{"id":5391,"depth":412,"text":5392},{"id":5491,"depth":412,"text":5492},"2025-12-02T10:02:07.045Z","Une question que l’on me pose beaucoup en ce début de semaine. En effet, vendredi 28 novembre 2025, nous avons eu la chance, avec plusieurs collègues de HoppR, de faire partie des 250 participants de ",{},"\u002Fblogs\u002F2025-12-02-alors-ctait-comment-ce-premier-devfest-lyon",[5531,5536,5538,5543],{"id":5532,"name":5533,"image":5534,"linkedin":5535,"x":14},"70a8663a-742d-4937-a6d4-5cef079b12c8","Théo Lanord","https:\u002F\u002Fprod-files-secure.s3.us-west-2.amazonaws.com\u002F5863e833-64f2-4f13-9f7a-2c92c72b5bbf\u002F53946b9e-3bb9-45bd-a8b4-429c51156179\u002FT04PC176TGB-U05EW3YF61Z-5e129f612df3-512.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAZI2LB466Y7KSVBHC%2F20251202%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20251202T100206Z&X-Amz-Expires=3600&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEEoaCXVzLXdlc3QtMiJHMEUCIQDlPhoO6t9yJQoUoZw%2FLTwJI5MC%2Foym8X1E%2Bg6KJ%2BiFgwIgalDq7jA%2BP85pFMTva72lsMaql%2B9LjtYqLDQH3dgn1M0q%2FwMIExAAGgw2Mzc0MjMxODM4MDUiDNOvwSwCkwWPXxfr2CrcA8769%2FoIXsCvhgFS4Dv2as%2FMadMS7wa5TlBrAZ7cnJv7%2BruPZECofduiEAoBV9ATh622gA0pQ231dPxprnYq6SLobx%2FEXgHUroXG3Hqn%2ByV4BZcmFzpgks2HcaAcuaHoAxQhO%2FJOFl%2FDUsk7u2C%2F03ZHWHalr4QFq8HF2kBEzUf5y9Z7lCS23wHUe9yrlp6dnDaMZv7ctg37nRsZ5cPFFyP%2Bi6DvsRbv4jk7ZR4d1uGo%2FyGh6TxAtZ6bjsPYjOKjZ8cDFQubPif7rBAfK8Gu2lMBuI8Cpd1qw32YzUj4dprm8t1R1SUxs4t9d3SmZ415ZoYHufTwtLVK2sMPIP1y2pVCL5TQxoCQIeZknhH6tf7lN%2BJs7CiIk9lolBqdAUPcwZ3F%2F5Fp4IC63yn6syo0RgnVB8MqfB%2BSgFz%2BdmhDCDcQ%2B54ndcErvY2ae44aPLzBYI6haQ8DpNzmYS6KvY3lcnCqKPTRx2M6%2BTlHpOEeq7CbpF%2FYsMtskDgQyVVqQRGZJJ98f4naA%2F8A41AIqXTDNAK8ifTyOLNOa8pF%2BGwiNsbrbjT%2F4qhB43PK%2FjzXCKtb8czB7vQydYQ0mjlSkxtXFecZ5qOzQIYc%2BJI%2BNhPsJoCLRKw3sr9EwLqY5d6NMJrvuskGOqUBkmJA1855ur4UyoLjGj1WPfKYtvmOStTXYnAk6EEA5p4DMsWp%2FtC79u340iUu7rojNw3oS3XeDN7pdCo%2FZMsMGkduaNvN3RB3crutakC38cpYKKo8%2Fg1VYP9a5GzXDfesiZ4RzRQIMUhkFjYbvPnQiOxmXU%2FxTyvR57RMWG7ApufvcgZqmTQgxzACj5uuwFn8iXfklA7WVG0WqI3CseqOO%2F7ssBqz&X-Amz-Signature=0f9dedf66c69728d181b86c075540248b1da9d52cb45a0d9b21654912eac01eb&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fth%C3%A9o-lanord\u002F",{"id":438,"name":439,"image":5537,"linkedin":441,"x":442},"https:\u002F\u002Fprod-files-secure.s3.us-west-2.amazonaws.com\u002F5863e833-64f2-4f13-9f7a-2c92c72b5bbf\u002Fc69d0b59-558d-4e48-879f-bea3fec1fdef\u002FLinkedin_Profile.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAZI2LB466QRTGLWHL%2F20251202%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20251202T100206Z&X-Amz-Expires=3600&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEEkaCXVzLXdlc3QtMiJHMEUCIQDm4%2F0Wbjn1yhS08yXFNJ3YxNfXhqedQ1Ibi1ixjAZwQAIgfOCHgnZEctCvQodF01gw3q43a2oTC9uvnFD5rnVsxQkq%2FwMIEhAAGgw2Mzc0MjMxODM4MDUiDEGDfT3DvHNF4e0%2F1ircA%2BMNtVAYwDGaDc4cTMBzN4fvTjoy2vcW6lqQwt0fckDmqFnu4KACIzQS0IBnqRuEKVrwHDf462itGMt45GGMFgrJ%2FwZjcEXN7mqtsDnO6Okzrr8o2cez6enA7ugl2qQa1K9n00YRnX6S9YbDBhvJk4%2Fob8H1RM5f3g%2FWZ0DE%2Bw4ZQtTkqyzk9cmEFnZj9PgP3P5JJ6%2B1XC6y4hKPodsLFwdB%2FiWv93l%2BIQJvtA7Pmzf7MEsf%2Fjfo9lBKh96v0muhHM%2BOW3HziW%2B2%2F43PzDRq0fLk5PEHcyDk0ir6a0d1SE54JtxwNCQ2r4c9kr2U4QPmDgplyC0rvhlk1MkY8KQW%2BbKHW%2B7bDhIIUZKx6blcBvvnsHF8SxMYxMaKSuOigd8%2FfKtXdYhUIv5kl4a4pjX8%2Btgg4E1FEgXY6OOSuvWlAlKEOS1TLV5Mm9BxvLdM6lCaoPeD%2BwjBRBe3QsEal0tM8%2FoPZzY6qjoajqvXvfL6LVwme461vj52ccT9xnaR2bRChgs%2BU8ucdg320zC3PiGEn55r19XsS2syF4KKPQ2ZqotsOp8ddRvwjdUs2yeIjMi8MfSSklsKTRnqzGITcKfg9UPQ%2FkmP4ZIfFJ9BAEug3TroU6elUhH%2FX99VHkbdMJnQuskGOqUBDw6lrXPYCboisCRNK3rSof7RUE8dcfUUhSnHXeQhFy%2Bxtswny8NKyhzu2f3axx%2B8BAWeqnJLi9juYMoEcyH57Z1OlduE9j4c8XNeb5S5QGuPgL2eFFm2Q6A2%2B1%2Bx%2B%2FWc9u8KRHsPWxmnH%2FDvGCo%2B5NAwT2Z59tSaAy4WLaU69x7pOXJw2GLcmvqj7GY8t1wWC%2BgZmvjgT5pr7JoAqMyCTlqWW0p8&X-Amz-Signature=c4e986c0dead60c4b87052795a3446cf2dc94d9ffdea6f9da0065c64e12d46b3&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject",{"id":5539,"name":5540,"image":5541,"linkedin":5542,"x":14},"e8163b24-7e01-41c5-adbf-0dc655f929d0","Nicolas Zago","https:\u002F\u002Fprod-files-secure.s3.us-west-2.amazonaws.com\u002F5863e833-64f2-4f13-9f7a-2c92c72b5bbf\u002Ff8f82a79-9d41-4302-b1a5-37882985167f\u002Fnicoz_hoppr.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAZI2LB4664RUX22IJ%2F20251202%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20251202T100206Z&X-Amz-Expires=3600&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEEoaCXVzLXdlc3QtMiJIMEYCIQC2nkVt1TGIZcU4J2cW%2BwnOm%2FJYMKPRvr9QoJI0ln9rtAIhAMbp5av2Mva0lC3zvk9RTnOZcfJVPe3y49DPXDto73qKKv8DCBMQABoMNjM3NDIzMTgzODA1IgxWonWoO8Q%2F6Tb5h5wq3APC9x01ntajt7LgXx2%2F6oWSdtYAHetuavmLKHuZBE4qZkUxVZlNf8yev7okfjbHkNTEZGT9ewi71Ep6%2Fj7OgQALj8WCrQ0NStHtOAGlQxjSBldfbVhSqpD%2FcKXOxmZe78PH9Bah3KKZgd%2Fzq1QZxCFIUp9YdjF%2FbL9yDF32Qffz6s4hE2xPX%2BIWXiLgy%2FoAHqyuuF9yLOJGFULNae1K0SpX%2BUPc9bGDrF5eqmdZEagZw3NdTYVzpYNJeJjDdTA2wSH9V3zloZQUllFmA2FapNJ7m43SbD5crno2TvsppP%2FIZwtcKkbyYQ1dIu9yUkQcP0YtKL5HESyEHe2wZ%2Fh8ySECV5JLqJ612Tq%2FjQ4WG5IRA3LnmsLqVwlkmclF9qqhCLkr1raV9rxA49bzA9HTJlJbbx9W2IJ%2B1NF9k%2Ba4%2FgPg%2BBKeMMHbVVxnzJVULzJY3wX5CMRMW%2Bsb5j4idcJB9stl3D4taE42iOp%2FRdjAS0hnlyNzgN9wrV0exYYd5KhJjI4Q%2FULsOOo7qA%2B4HsqdYL36zkfJN6T%2BvjrzVG%2FjxzTNwUrTVKwzOHom2lkGd%2BX8KE1Cq3Xx%2FmRIx1Qdp3ua8xccBoGHYsEItydyKDT%2FvmhS8VqeCS3Mf719fVMjDTCT8LrJBjqkAfQTGT%2Fs9MjD6z%2BwJvaGpYM%2F%2Fj7dc8MdLQBOe1TXVGUugJIFO3k9RJBOnpGAcJ8iORYMTxNiQmlpchi%2FeJ%2FloxMKo9KLYsP51i8IawGdvOfcd7gPws3WPQglaWdiRbMl%2BsIKoY3ltOxuyzwHnFe3odYH9Jk7H15EvVy4X7KZns8dNnyZMF19aidySWh55J%2Byb%2BSI0fDuPaOd75%2BN97EwLFgvXSKB&X-Amz-Signature=10f2e76341a5b95b387a7537285d41aa5d73f789611b6e3f7291d5e48bf31b7f&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fnicolaszago\u002F",{"id":5544,"name":5545,"image":5546,"linkedin":5547,"x":14},"0bb914a6-f882-4951-bee6-53e8e8abb807","Emmanuelle Gouvart","https:\u002F\u002Fprod-files-secure.s3.us-west-2.amazonaws.com\u002F5863e833-64f2-4f13-9f7a-2c92c72b5bbf\u002Fc88f5dfa-16db-4e6f-acf1-34dd80ee8766\u002Femma_hoppr.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAZI2LB466Y3X2BERO%2F20251202%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20251202T100206Z&X-Amz-Expires=3600&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEEoaCXVzLXdlc3QtMiJHMEUCIHRw%2FuSZy28SiwpPOCs76n11i%2F1NJe6CZ%2BsRL3AWO%2B2fAiEA4vhBhGzEMfJI4snF1OloxuWCCMbRf1PDwUR5mDJ9XhMq%2FwMIExAAGgw2Mzc0MjMxODM4MDUiDFG70SUdJEiGKkM5bSrcAw9rPmsJGzwqShqiv0%2BeWtdSAO1vDBF77Pr3fo57wA6onGBTD13Mb6SFRhQ9%2Fra6mwI6ViUxzjAKm12NSy5iUxqlpE7OCeRIo9Anm1I3%2BeCrcf9sgDbmjO9%2Fq0CVRI%2FU5IZdPCJ33TU8DMeMHEqWABPbQu2JgRA08oGE7VhNIyxEibEDVBt2efeb9Lo5jxMEz%2FWlDtk3PoQhL%2FLS5Z%2F3VJ46ZG%2FjmqYw0w7eL3RTXvpO3F8ba8FwLP%2BPox3DLRsE%2Bb7RZip03wWeSyGpIyQrk%2Fk%2F5G3jj7VUUplHpHhT5D1Wqy5cXNWNlTczPw5oVN2IUc50L5iFv5LS4fAd8pFkfN62EjccKbWW0KnK539jxa9NktNFfLvcYD%2F6vLcDNwyfQgGP8yceEsSpjcPO0qHzchwhu3DNi7CIZe6US62dUslZUaUrSBMOsmUn%2B9ddPbtRSMqOY%2Bm%2FtLRJg%2FViOt1WXTF3IbqHZ4NJdCtZACK05FQhMzGqqH2dD2ItGI4Omx34fVPkSaT9o4dYKTix8VDrwD5EhMNmYrjOp7D%2BV8xhKoDoiW8JlW1VuSG6lVBEwLYkuwaHxUACflNG8bSl2YauKHvUTet%2FfaANzQSi%2F9UCf9y%2FPrn5IcGO2wdGGRxoMO%2FvuskGOqUBkceK1DQegSzZ4IUtEx%2B4PllbY2t6tdvBH15yyh4%2B%2FGCAcS9vea00xBAgUT4sC5YvyzMBR5INtwcv8At2vEauvXRTSiRU%2B5v13rmi1RpZpgRNRpspuzp4m9IRPeludo%2B%2FPgFsi%2FJ5dUfWIr1kzF%2F6ElvWLADEI9Chpz%2BvdUDbn%2F6ysbTgkF%2F8X4vIJraEEIdfrTio7kDfiOb%2BelfK7YochB5tFNJG&X-Amz-Signature=48a8f72788c038f6fc6755f0a2dd5a263a644eb8957eb8922c1068162f4056db&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Femmanuellegouvart-182b6ab2\u002F",{"title":5081,"description":5527},"blogs\u002F2025-12-02-alors-ctait-comment-ce-premier-devfest-lyon\u002Findex",[2255,461,2302,5551,2303],"2025","sCW66ulOtCP9_c_OAQWwJLKRWm825rxal5BWlrgds-A",{"id":5554,"title":5555,"alt":5556,"authors":5557,"body":5560,"date":6117,"description":6118,"extension":431,"image":432,"meta":6119,"navigation":434,"ogImage":432,"path":6120,"published":434,"reviewers":6121,"seo":6128,"stem":6129,"tags":6130,"__hash__":6134},"blogs\u002Fblogs\u002F2025-09-03-un-ide-avec-agent-ia-une-alternative-open-source-cursor-tout-ce-quil-faut-savoir-pour-bien-dmarrer-avec-void\u002Findex.md","Un IDE avec agent IA, une alternative Open Source à Cursor : tout ce qu’il faut savoir pour bien démarrer avec Void !","Logo de l’IDE Void",[5558],{"id":5532,"name":5533,"image":5559,"linkedin":5535,"x":14},".\u002Fassets\u002Fauthor-tho-lanord.webp",{"type":18,"value":5561,"toc":6101},[5562,5572,5575,5579,5582,5585,5611,5615,5630,5656,5660,5673,5677,5685,5694,5700,5709,5715,5718,5721,5727,5730,5733,5740,5746,5750,5757,5760,5833,5842,5848,5854,5860,5874,5880,5890,5896,5899,5904,5911,5915,5918,5924,5928,5931,5937,5942,5946,5949,5955,5958,5964,5967,5971,5974,5980,5986,5989,5995,5998,6002,6005,6008,6022,6026,6029,6056,6070,6072,6077,6082,6087,6090,6093,6096],[21,5563,5564,5565,1000,5568,5571],{},"Cursor séduit par son interface familière, sa compatibilité avec les extensions existantes, et son intégration poussée avec des modèles comme ",[28,5566,5567],{},"GPT-4",[28,5569,5570],{},"Claude",". Mais derrière cette puissance se cache une infrastructure propriétaire, où la confidentialité et le contrôle des données peuvent soulever des questions.",[21,5573,5574],{},"Depuis 5 mois, j’utilise, une alternative Open Source, Void. Il m’accompagne dans mes développements notamment dans la reprise de base de code (Suppression de code mort, Abstraction de conditions complexes, Extraction de méthode, etc) et l’ajout de fonctionnalités en Java, Python, Go. A travers ce guide, je souhaite vous partager mon retour d’expérience et vous faire découvrir Void, de ses fonctionnalités essentielles à quelques cas d’usage.",[43,5576,5578],{"id":5577},"pourquoi-lopen-source","Pourquoi l’open-source ?",[21,5580,5581],{},"Quand on parle de développement et d’IA, la principale problématique est la confidentialité d’envoi de code propriétaire à des services tiers. Par exemple, avec Cursor, vous devez envoyer vos données privées via le backend de Cursor à chaque utilisation. Cela entraîne des problèmes évidents de confidentialité. C'est également coûteux pour les développeur·euse·s, et cela signifie qu'une seule personne a le contrôle total d'un puissant modèle d'IA.",[21,5583,5584],{},"Vous l’aurez compris Void, répond à cette problématique. Il propose de nombreuses fonctionnalités dont nous avons maintenant l’habitude :",[266,5586,5587,5593,5599,5605],{},[269,5588,5589,5592],{},[63,5590,5591],{},"Auto-complétion :"," Appliquer les suggestions proposées par l’IA en appuyant sur Tab.",[269,5594,5595,5598],{},[63,5596,5597],{},"Éditeur de lignes :"," Sélectionner des lignes dont nous voulons modifier le contenu en ouvrant une fenêtre dialogue (Ctrl-K) et demandez les modifications.",[269,5600,5601,5604],{},[63,5602,5603],{},"Éditeur de fichiers :"," Nous pouvons aussi inclure des fichiers, voir toute notre base de code, via la fenêtre de dialogue globale (Ctrl-L).",[269,5606,5607,5610],{},[63,5608,5609],{},"“Any LLM, Anywhere”:"," Connexion à nos modèles préférés en local ou via le Cloud.",[43,5612,5614],{"id":5613},"quest-ce-que-cest-void","Qu’est ce que c’est Void ?",[21,5616,5617,5618,5623,5624,5629],{},"Si vous êtes un habitué de VS Code, vous serez à votre aise avec ",[68,5619,5622],{"href":5620,"rel":5621},"https:\u002F\u002Fvoideditor.com\u002F",[72],"Void",". Void est basé sur ",[68,5625,5628],{"href":5626,"rel":5627},"https:\u002F\u002Fvscodium.com\u002F",[72],"VSCodium",", un fork de VS Code. Il met l’accent sur la confidentialité, la personnalisation et l’implication de communauté sans sacrifier les fonctionnalités IA sur les quelles les développeur·euse·s peuvent d’appuyer :",[266,5631,5632,5638,5644,5650],{},[269,5633,5634,5637],{},[63,5635,5636],{},"Fondamentaux de VS Codium\u002FCode :"," Transférer tous nos thèmes, raccourcis clavier et paramètres en un clic.",[269,5639,5640,5643],{},[63,5641,5642],{},"Fonctionnalités communautaires :"," Plugins VS Codium\u002FCode ou même des fonctionnalités d'IA créées par la communauté.",[269,5645,5646,5649],{},[63,5647,5648],{},"Axé sur la confidentialité :"," Héberger les modèles localement ou se connecter directement aux fournisseurs sans intermédiaire.",[269,5651,5652,5655],{},[63,5653,5654],{},"Open-source :"," Consulter, modifier, contribuer au code source.",[43,5657,5659],{"id":5658},"comment-installer-void","Comment installer Void ?",[21,5661,5662,5663,5666,5667,5672],{},"Void est en version bêta ouverte, les installateurs (Windows, Mac & Linux) sont directement disponibles sur leur site : ",[68,5664,5620],{"href":5620,"rel":5665},[72],". Si il y a le moindre soucis, la communauté officielle de Void sur ",[68,5668,5671],{"href":5669,"rel":5670},"https:\u002F\u002Fdiscord.com\u002Finvite\u002FRSNjgaugJs",[72],"Discord"," est très active.",[2609,5674,5676],{"id":5675},"connexions-à-un-llm","Connexions à un LLM",[21,5678,5679,5680,202],{},"L'un des principaux avantages de Void repose sur sa flexibilité de connexion à différents LLM. Lors de l’installation, Void propose une connexion a ",[68,5681,5684],{"href":5682,"rel":5683},"https:\u002F\u002Faistudio.google.com\u002Fapikey",[72],"Gemini via API Key",[21,5686,5687,5688,1000,5691],{},"A défaut d’être Open Source, cette connexion a un provider externe permet d’avoir accès un LLM puissant à moindre coût en contrôlant nos tokens, voir même gratuit, dans le cas des modèles ",[28,5689,5690],{},"gemini-2.0-flash",[28,5692,5693],{},"gemini-2.0-flash-lite.",[21,5695,5696],{},[352,5697],{"alt":5698,"src":5699},"Capture d’écran de l’ajout de l’API Key Gemini dans Void","\u002Fcontent-assets\u002F2025-09-03-un-ide-avec-agent-ia-une-alternative-open-source-cursor-tout-ce-quil-faut-savoir-pour-bien-dmarrer-avec-void\u002Fassets\u002Fimg1.webp",[21,5701,5702,5703,5708],{},"Nous verrons qu’il est aussi possible d’héberger nos propres modèles localement. Si vous partez sur le solution ",[68,5704,5707],{"href":5705,"rel":5706},"https:\u002F\u002Follama.com\u002F",[72],"Ollama",", Void est déjà pré-configuré en ce sens.",[21,5710,5711],{},[352,5712],{"alt":5713,"src":5714},"Configuration par défaut pour l’utilisation d’Ollama dans Void","\u002Fcontent-assets\u002F2025-09-03-un-ide-avec-agent-ia-une-alternative-open-source-cursor-tout-ce-quil-faut-savoir-pour-bien-dmarrer-avec-void\u002Fassets\u002Fimg2.webp",[21,5716,5717],{},"Dans les deux cas, en cliquant sur les liens dans la configuration, Void nous accompagne pour mettre en place notre token Gemini ou installer Ollama.",[21,5719,5720],{},"Si vous avez configuré votre token Gemini, dans les paramètres des modèles Void (Engrenage en haut à droit), vous devriez trouvez les modèles Gemini actifs.",[21,5722,5723],{},[352,5724],{"alt":5725,"src":5726},"Modèles Gemini actifs après configuration du token","\u002Fcontent-assets\u002F2025-09-03-un-ide-avec-agent-ia-une-alternative-open-source-cursor-tout-ce-quil-faut-savoir-pour-bien-dmarrer-avec-void\u002Fassets\u002Fimg3.webp",[21,5728,5729],{},"Wouah ! Le nombre de connecteurs disponibles !",[21,5731,5732],{},"A vous de jouer avec vos clés des différents providers de LLM ! Ici, nous nous allons passer plus de temps sur comment faire tourner un modèle en local car c’est l’une des façon les plus rapides pour avoir de l’auto-complétion et non seulement une fenêtre de dialogue.",[21,5734,5735,5736,5739],{},"En effet, comme vous pouvez le voir dans l’onglet “",[28,5737,5738],{},"Feature Options","” des paramètres, les modèles Gemini ne sont pas compatibles avec l’auto-complétion (FIM models).",[21,5741,5742],{},[352,5743],{"alt":5744,"src":5745},"L’auto-complétion non compatible avec les modèles de Gemini","\u002Fcontent-assets\u002F2025-09-03-un-ide-avec-agent-ia-une-alternative-open-source-cursor-tout-ce-quil-faut-savoir-pour-bien-dmarrer-avec-void\u002Fassets\u002Fimg4.webp",[2609,5747,5749],{"id":5748},"utilisation-dun-llm-local","Utilisation d’un LLM local",[21,5751,5752,5753],{},"Pour utiliser un LLM en local, nous pouvons utiliser Ollama. Vous trouverez les différents installateurs (Windows, Mac & Linux) sur leur site : ",[68,5754,5755],{"href":5755,"rel":5756},"https:\u002F\u002Follama.com\u002Fdownload",[72],[21,5758,5759],{},"Il est nécessaire de faire un choix dans le LLM à utiliser, et parmis les LLMs dédiés à l’écriture de code voici les références dans leur domaine car développés par des grandes entreprises ou des laboratoires :",[1508,5761,5762,5778],{},[1511,5763,5764],{},[1514,5765,5766,5769,5772,5775],{},[1517,5767,5768],{},"Nom du modèle",[1517,5770,5771],{},"FIM Support",[1517,5773,5774],{},"Fonctionnalités liés au code",[1517,5776,5777],{},"Poids",[1524,5779,5780,5794,5807,5820],{},[1514,5781,5782,5785,5788,5791],{},[1529,5783,5784],{},"CodeLlama  34B",[1529,5786,5787],{},"✅",[1529,5789,5790],{},"Advanced code generation, refactoring, multi-file context",[1529,5792,5793],{},"~19GB",[1514,5795,5796,5799,5801,5804],{},[1529,5797,5798],{},"Deepseek-Coder  33B",[1529,5800,5787],{},[1529,5802,5803],{},"Complex logic generation, Java debugging, test creation",[1529,5805,5806],{},"~17GB",[1514,5808,5809,5812,5814,5817],{},[1529,5810,5811],{},"Qwen2.5-Coder  32B",[1529,5813,5787],{},[1529,5815,5816],{},"Multi-language support, strong architectural reasoning",[1529,5818,5819],{},"~16GB",[1514,5821,5822,5825,5827,5830],{},[1529,5823,5824],{},"CodeLlama  13B",[1529,5826,5787],{},[1529,5828,5829],{},"Lightweight, good for method-level FIM and snippets",[1529,5831,5832],{},"~7GB",[21,5834,5835,5836,5841],{},"Un challenger intéressant, Open-Source et particulièrement transparent dans ces résultats d’évaluation est ",[68,5837,5840],{"href":5838,"rel":5839},"https:\u002F\u002Follama.com\u002Flibrary\u002Fcodestral",[72],"CodeStral"," (~13GB). En auto-complétion, voici les scores disponibles :",[21,5843,5844],{},[352,5845],{"alt":5846,"src":5847},"Score de différents LLMs en chat","\u002Fcontent-assets\u002F2025-09-03-un-ide-avec-agent-ia-une-alternative-open-source-cursor-tout-ce-quil-faut-savoir-pour-bien-dmarrer-avec-void\u002Fassets\u002Fimg5.webp",[21,5849,5850],{},[352,5851],{"alt":5852,"src":5853},"Score de différents LLMs en auto-complétion","\u002Fcontent-assets\u002F2025-09-03-un-ide-avec-agent-ia-une-alternative-open-source-cursor-tout-ce-quil-faut-savoir-pour-bien-dmarrer-avec-void\u002Fassets\u002Fimg6.webp",[21,5855,5856,5859],{},[63,5857,5858],{},"Mais"," tous ces LLMs demandent des ressources sur votre machine, notamment de la RAM. Aujourd’hui, au vu du coût en énergie et en achat de la machine, pour ces grands LLMs de référence, il reste plus intéressant de passer par des providers et de payer les tokens utilisés.",[21,5861,5862,5863,5868,5869,5873],{},"Il est toujours possible d’héberger des modèles plus petits sur nos machines. L’un des plus petit est ",[68,5864,5867],{"href":5865,"rel":5866},"https:\u002F\u002Follama.com\u002Flibrary\u002Fqwen2.5-coder",[72],"qwen2.5-coder:0.5b",", un modèle de 398MB. Pour un compromis entre pertinence et ressources, j’utilise ",[68,5870,5872],{"href":5865,"rel":5871},[72],"qwen2.5-coder:3b"," (~1,9GB).",[21,5875,5876],{},[352,5877],{"alt":5878,"src":5879},"Évaluation des différents modèles Qwen2.5-coder ","\u002Fcontent-assets\u002F2025-09-03-un-ide-avec-agent-ia-une-alternative-open-source-cursor-tout-ce-quil-faut-savoir-pour-bien-dmarrer-avec-void\u002Fassets\u002Fimg7.webp",[21,5881,5882,5883,1000,5886,5889],{},"Dans tous les cas, pour lancer votre modèle, il nous suffit de 2 commandes : ",[529,5884,5885],{},"ollama pull nom_du_modèle",[529,5887,5888],{},"ollama run nom_du_modèle"," . Cette opération est unique, il n’est pas nécessaire de le faire à chaque redémarrage de notre machine.",[21,5891,5892],{},[352,5893],{"alt":5894,"src":5895},"Détection du modèle local par Void","\u002Fcontent-assets\u002F2025-09-03-un-ide-avec-agent-ia-une-alternative-open-source-cursor-tout-ce-quil-faut-savoir-pour-bien-dmarrer-avec-void\u002Fassets\u002Fimg8.webp",[21,5897,5898],{},"Voilà ! Aucune action supplémentaire n'est requise. Void détecte automatiquement les modèles exécutés localement. Il ne nous reste plus qu’à les activer.",[490,5900,5901],{},[21,5902,5903],{},"💡 Si vous souhaitez modifier le point de terminaison de vos modèles hébergés localement, vous pouvez le faire.",[21,5905,5906,5907,5910],{},"Avant de nous lancer dans l’utilisation des fonctionnalités de Void, n’oubliez pas d’activer l’option d’auto-complétion dans les paramètres “",[28,5908,5909],{},"Features Options","”.",[43,5912,5914],{"id":5913},"utilisation-des-fonctionnalités-de-void","Utilisation des fonctionnalités de Void",[21,5916,5917],{},"J’ai demandé à notre LLM de créer un projet Java avec un simple Controller retournant “Hello, World!”. Les exemples seront basés dessus :",[21,5919,5920],{},[352,5921],{"alt":5922,"src":5923},"Fichier crée par le LLM pour nos futurs exemples","\u002Fcontent-assets\u002F2025-09-03-un-ide-avec-agent-ia-une-alternative-open-source-cursor-tout-ce-quil-faut-savoir-pour-bien-dmarrer-avec-void\u002Fassets\u002Fimg9.webp",[2609,5925,5927],{"id":5926},"auto-complétion-de-code","Auto-complétion de code",[21,5929,5930],{},"L’auto-complétion de Void comprend le fichier actuel et le code source. À mesure que nous saisissons du code, nous pouvons accepter les suggestions du LLM en appuyant sur Tab.",[21,5932,5933],{},[352,5934],{"alt":5935,"src":5936},"Auto-complétion proposé par le LLM","\u002Fcontent-assets\u002F2025-09-03-un-ide-avec-agent-ia-une-alternative-open-source-cursor-tout-ce-quil-faut-savoir-pour-bien-dmarrer-avec-void\u002Fassets\u002Fimg10.webp",[490,5938,5939],{},[21,5940,5941],{},"💡 L’auto-complétion peut aussi proposer plusieurs lignes à intégrer au code.",[2609,5943,5945],{"id":5944},"éditeur-de-lignes-ctrl-k","Éditeur de lignes (Ctrl-K)",[21,5947,5948],{},"Nous avons maintenant besoin de refactoriser notre code. Sélectionnons les lignes à modifier, appuyons sur Ctrl+K. Une fenêtre de chat apparaît !",[21,5950,5951],{},[352,5952],{"alt":5953,"src":5954},"Fenêtre de chat pour la modification de lignes ","\u002Fcontent-assets\u002F2025-09-03-un-ide-avec-agent-ia-une-alternative-open-source-cursor-tout-ce-quil-faut-savoir-pour-bien-dmarrer-avec-void\u002Fassets\u002Fimg11.webp",[21,5956,5957],{},"Les modifications nous sons proposées et nous pouvons les accepter ou non (Dans leur intégralité ou ligne par ligne).",[21,5959,5960],{},[352,5961],{"alt":5962,"src":5963},"Suggestions d’insertion de variable par le LLM","\u002Fcontent-assets\u002F2025-09-03-un-ide-avec-agent-ia-une-alternative-open-source-cursor-tout-ce-quil-faut-savoir-pour-bien-dmarrer-avec-void\u002Fassets\u002Fimg12.webp",[21,5965,5966],{},"Nous pouvons aussi lui poser des questions plus complexes (Fonctions, documentation, refactorisation). La limite est notre budget de tokens ou notre machine !",[2609,5968,5970],{"id":5969},"éditeur-de-fichiers-ctrl-l","Éditeur de fichiers (Ctrl-L)",[21,5972,5973],{},"Nous pouvons aussi avoir des questions plus large sur notre code qui inclut soit des fichiers spécifiques, soit l’entièreté de notre base de code. Pour cela, nous pouvons utiliser le chat global de Void.",[21,5975,5976,5977],{},"Choisissons notre LLM et posons notre question pour améliorer notre code : ",[28,5978,5979],{},"“Can you suggest me improvements for my code ?”",[21,5981,5982],{},[352,5983],{"alt":5984,"src":5985},"Suggestions d’améliorations par le LLM pour toute la base de code","\u002Fcontent-assets\u002F2025-09-03-un-ide-avec-agent-ia-une-alternative-open-source-cursor-tout-ce-quil-faut-savoir-pour-bien-dmarrer-avec-void\u002Fassets\u002Fimg13.webp",[21,5987,5988],{},"Il identifie clairement notre mauvaise gestion des erreurs, de logs et suggère des modifications !",[21,5990,5991],{},[352,5992],{"alt":5993,"src":5994},"Suggestions en détails des améliorations","\u002Fcontent-assets\u002F2025-09-03-un-ide-avec-agent-ia-une-alternative-open-source-cursor-tout-ce-quil-faut-savoir-pour-bien-dmarrer-avec-void\u002Fassets\u002Fimg14.webp",[21,5996,5997],{},"Comme précédemment, nous pouvons accepter les modifications dans leur intégralité ou ligne par ligne.",[43,5999,6001],{"id":6000},"mon-utilisation-en-tant-que-développeur","Mon utilisation en tant que développeur",[21,6003,6004],{},"J’utilise Void depuis maintenant cinq mois principalement dans le cadre de refactoring de mon code. Mes tests restent mes garde-fous et sont conçus et maintenus pour garantir la robustesse de mes développements.",[21,6006,6007],{},"Pour les tâches plus lourdes comme l’édition de lignes ou de fichiers via interface Chat, je m’appuie sur les modèles Gemini, qui me permettent d’accéder à une puissance de calcul que ma machine ne pourrait pas supporter seule.",[21,6009,6010,6011,6017,6018,6021],{},"Pour l’auto-complétion, je privilégie les modèles ",[68,6012,6014],{"href":5865,"rel":6013},[72],[63,6015,6016],{},"Qwen2.5-Coder",", qui offrent un compromis entre légèreté et fonctionnalités. Si je disposais de plus de RAM, je basculerais probablement vers ",[68,6019,5840],{"href":5838,"rel":6020},[72]," qui semble être une alternative prometteuse.",[43,6023,6025],{"id":6024},"pour-les-curieux","Pour les curieux !",[21,6027,6028],{},"L’architecture de Void est modulaire et intègre de manière expérimentale de nombreuses fonctionnalités :",[266,6030,6031,6034,6037],{},[269,6032,6033],{},"Indexation de fichiers : capacités de recherche et de navigation améliorées",[269,6035,6036],{},"Génération de Docstring : assistance automatisée à la documentation",[269,6038,6039,6040,6045,6046,6049,6050,6055],{},"Intégrations de composants externes : ",[68,6041,6044],{"href":6042,"rel":6043},"https:\u002F\u002Fwww.greptile.com\u002F",[72],"Greptile"," (Revue de code), ",[68,6047,5707],{"href":5705,"rel":6048},[72]," (Hébergement local) et ",[68,6051,6054],{"href":6052,"rel":6053},"https:\u002F\u002Fdocsearch.algolia.com\u002F",[72],"DocSearch"," (Recherche de documentation)",[21,6057,6058,6059,6063,6064,6069],{},"N’hésitez pas à faire un tour sur le ",[68,6060,6062],{"href":5669,"rel":6061},[72],"Discord officiel"," et sur le répertoire ",[68,6065,6068],{"href":6066,"rel":6067},"https:\u002F\u002Fgithub.com\u002Fvoideditor\u002Fvoid",[72],"Github"," !",[43,6071,2244],{"id":2243},[490,6073,6074],{},[21,6075,6076],{},"1️⃣ Void répond à la problématique de confidentialité en nous permettant d’héberger nos modèles sur nos machines et, en garantissant que notre code ne quitte jamais notre environnement !",[490,6078,6079],{},[21,6080,6081],{},"2️⃣ Void reste ouvert et nous propose des connecteurs aux providers de LLMs et donc une accès à des LLMs puissant !",[490,6083,6084],{},[21,6085,6086],{},"3️⃣ Void est transparent dans les modifications que font les LLMs à notre code. A nous de valider ou non les suggestions !",[21,6088,6089],{},"Mais… les avantages vont au-delà de la simple confidentialité et des économies de coûts. En tant que projet open source, Void invite la communauté à contribuer pour repousser les limites du développement assisté par l’IA.",[21,6091,6092],{},"La transparence du projet offre également de précieuses opportunités d’apprentissage aux développeur·euse·s intéressés par l’interaction entre les outils de développement traditionnels et l’IA.",[21,6094,6095],{},"Que vous soyez soucieux de la confidentialité, que vous cherchiez à réduire vos coûts ou que vous préférez simplement les outils open source, Void offre une alternative performante qui mérite d’être explorée. N’hésitez pas à prendre le meilleur des deux mondes !",[21,6097,6098],{},[28,6099,6100],{},"Merci de votre lecture !",{"title":411,"searchDepth":412,"depth":412,"links":6102},[6103,6104,6105,6109,6114,6115,6116],{"id":5577,"depth":412,"text":5578},{"id":5613,"depth":412,"text":5614},{"id":5658,"depth":412,"text":5659,"children":6106},[6107,6108],{"id":5675,"depth":558,"text":5676},{"id":5748,"depth":558,"text":5749},{"id":5913,"depth":412,"text":5914,"children":6110},[6111,6112,6113],{"id":5926,"depth":558,"text":5927},{"id":5944,"depth":558,"text":5945},{"id":5969,"depth":558,"text":5970},{"id":6000,"depth":412,"text":6001},{"id":6024,"depth":412,"text":6025},{"id":2243,"depth":412,"text":2244},"2025-09-03T07:35:06.710Z","Cursor séduit par son interface familière, sa compatibilité avec les extensions existantes, et son intégration poussée avec des modèles comme _GPT-4_ et _Claude_. Mais derrière cette puissance se cach",{},"\u002Fblogs\u002F2025-09-03-un-ide-avec-agent-ia-une-alternative-open-source-cursor-tout-ce-quil-faut-savoir-pour-bien-dmarrer-avec-void",[6122,6124,6126],{"id":5539,"name":5540,"image":6123,"linkedin":5542,"x":14},"https:\u002F\u002Fprod-files-secure.s3.us-west-2.amazonaws.com\u002F5863e833-64f2-4f13-9f7a-2c92c72b5bbf\u002Ff8f82a79-9d41-4302-b1a5-37882985167f\u002Fnicoz_hoppr.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAZI2LB466ZDLKRYVF%2F20250903%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20250903T073506Z&X-Amz-Expires=3600&X-Amz-Security-Token=IQoJb3JpZ2luX2VjENb%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaCXVzLXdlc3QtMiJGMEQCIG%2BvaXFMQt%2B6Qj8eNPF9N%2BSUaZ0cNFSYx2baFXn%2FbKW6AiB%2B3P5tZFm9jlWPtGCaF4DLnQM3zhKIq%2B9K1uaRu86vnir%2FAwg%2FEAAaDDYzNzQyMzE4MzgwNSIMw5bxg3sltrFNkUxOKtwDSPFYwesUC22hxfy2kHqgnD3lNSSuItCcUQ4D2B97GRE65RzXTWyuJEjU9lXyw0faxArG2NbcoPniX4bE8fwbuMcKV4tugd2BfRB8YnKKm%2FdUSbAmAlXx9Js5nifbWH0mz5L0OK7EhmXYZw%2FO48DOtzIKGei4YFCghhW4%2FYYa9FzQKdjbeM8oEOFaR9h9uK1hEOe7zAvN%2FvzaTyA0gjNR3FwW%2BtmvaYQDQlWqXvdHMXHs8FfJjEYO4SY6BjnDkF9lWlGpnv6BKvaEIyJQai1mARLgQ%2B5gjM5LEnq%2BkSAddwGYXtXp%2FI237%2BmWMbUboqNZeYyFf3UJSJkrW%2Fyqo%2FC6fhqb1k9sS1ytKASXiWgBNPoUN6eZHXi5l0qFJAyXRwpYTJiuidc%2BgVtrOmkSMVm6Eg77ieUq8H6T6Qt6UsVPLWMTRfieE9a4ax0keUk9PFR%2BonQ0Nb%2BfSNlsLrBv6cIo68a42GyZ3jpn4JbMBN4%2Ff%2BnRHg%2FiU%2BWy7NzoTy1QvlZ22%2BfUo0nApRTcnCg%2F647J5OqkDlkoZn6NsrJ0lXgIBxNgRfaQOG4L6q5WSzU%2BbGO2ci89EJqkS32Msug9IjzrK%2F5obEXxrs1NbR5y3KQFLNsUlIVr%2F5%2F%2BvY%2BfjB0w6bjfxQY6pgH4Qs%2Bft%2Fnfe0Fphwrc%2B6PKxo0pBzJsnGHLgN2ghniYkK8tKxZ6GAVtKXnpvqtr5UKhOS%2Ft%2FeS93kZrRV9V5kAZ3xCEq9G9ewA%2FbzgtFtQ6xVAsn6n57V2U8e7e5sXbHtyd780KexydA2%2F%2FelidNyBI5bCZSV8JdqkinYKVwRyw9q2rwEsKmYVBj6E1Rc%2FNLuxtncPdjAWOM2ydYlly118Bry3aufLW&X-Amz-Signature=4e04cd8aee99b1e1f1045840307945dc87a3a9be1036625ac33254fc598ef394&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject",{"id":5544,"name":5545,"image":6125,"linkedin":5547,"x":14},"https:\u002F\u002Fprod-files-secure.s3.us-west-2.amazonaws.com\u002F5863e833-64f2-4f13-9f7a-2c92c72b5bbf\u002Fc88f5dfa-16db-4e6f-acf1-34dd80ee8766\u002Femma_hoppr.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAZI2LB4663B3BM6TB%2F20250903%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20250903T073506Z&X-Amz-Expires=3600&X-Amz-Security-Token=IQoJb3JpZ2luX2VjENb%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaCXVzLXdlc3QtMiJHMEUCIG9fB1ykwU%2FbGIaGsJvhCPPFqNNxLym7wZJL2IBrrfByAiEA2dAwm9ubQtgkLGO%2FFfFNhn3sWE%2FTFr8sHTc0Xkpklfoq%2FwMIPxAAGgw2Mzc0MjMxODM4MDUiDCRssieECgWoB2hW9CrcA7GhvJZ2CKT8EoZg3VZPvy670nbucj7%2F6cMOgZD1XxfmYMplYVipz5WRjLwwevWAwXoE1mKhz6zd0oQyeIDP9CuHGXUsrvr6Q2sCuhXhT3RTnE13AO5rhH1dpXfz3kEI87JZy07LvKVUvO%2B6B2xhJq1sy%2B9XvEzffS7L5mUFFIpWs0%2FtJkj01hFq4qgDsPwJ3cdlR7CQpo5bIYAn%2BMwPWsSOoDciHA5ZwqixPZV0u9YvA1NeBGBHP3KHzDoiNWxuBuCpcxeCYFGrWe5O7VSEBOSbSl4vXuxlC6wyJhf%2FmlPnqigdg%2FvfrgZRTy0xE3dV99Z8H9EubyucSlmkVctU58qO4UolWQzTL4I0X5lE%2Bkkfl32%2F2pek7dZyI9N7sCkyxxBfEpXteOoZuGvDrEg3XaDOv%2FZmkcbpfuOwqUSelFSg8Gn8OTalUUWn17GtN1LjCaXoPgsbnrdDZR8B1XUkGbGWDm%2F0zxZEsUWPMocXnICc15HXYSmCj6p49STA4VhMnTDeuGLDYCp7id%2B0JUld6IhNwwVy%2FotUYzJ2OEt0DvmYwFfO3G4HVGV8qHMezrZl%2BDlPjTEiqyhGJNY0o8VJNgPQIEm0ty1O0L5UFBPtS1KXbCaYTUk8j258SoVQMPS438UGOqUBvKpEkUYaVgCRzjUR%2FZldhU5j3j7K%2FQaMUl6dyQEBTObMLMRndG69O6%2BmXG64%2Fr70Bfna5zX7dlSYIi%2FuoiJgFC2U7E%2BhMXIx%2Fj1G7uCZcCFxj%2FSQHZcSuTb06IrCq%2BR%2Bnk%2FNbUPVdqR27Iy5jWH1kwsToggvfdZZpu4uEANo2eIywrfnbeS9DFtIRvQ0QU1wX16503etcJfbx%2FkK5XctZJf6NccA&X-Amz-Signature=f38eb48ec7cf12e65f4309d7f2f18155ec4d49c9d0bf1c92e7b5e766e531cb1e&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject",{"id":438,"name":439,"image":6127,"linkedin":441,"x":442},"https:\u002F\u002Fprod-files-secure.s3.us-west-2.amazonaws.com\u002F5863e833-64f2-4f13-9f7a-2c92c72b5bbf\u002Fc69d0b59-558d-4e48-879f-bea3fec1fdef\u002FLinkedin_Profile.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAZI2LB4667JYBD3L7%2F20250903%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20250903T073505Z&X-Amz-Expires=3600&X-Amz-Security-Token=IQoJb3JpZ2luX2VjENb%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaCXVzLXdlc3QtMiJIMEYCIQDNcPq3tjGuMjsX2jiE05qzyBCZlZJd7vSyfz8pUACQIwIhALHMUKQBWe8Q50wZnCaM2SaWqzMy%2BNu6ui6T6FcbYUBXKv8DCD8QABoMNjM3NDIzMTgzODA1Igylzx0C5ER%2BTcsz62wq3ANW0VQXJ9phcHpCMqjXYADIQj83r%2BaNpCT7Avsl5pIFfcsm5sv2sIydUsNgPFEEjCO8sy4LVpeLZeZAIg6d8KZRDoSzoqXKjPIAmUTu5R6EKTr0lY0pNz9460KriIQEujLc75DMkbNskJsaCF%2F6w3x9siUXkK%2BMGKI6ctlRgN%2FGAmwE%2F326tODQ4dI%2Fnaiux%2BUqOvUbEqvoEUAQA65KDci%2FHPBYrrMl4Ux%2B8qGyPYwhpEPF5YVagJKyfVtbA0i47Res9FAF0IroZeKLwW%2FT%2Fj9nUOuA%2BdwkcXd9tgqIp97wVz7F%2FIZIssQqnGD%2BHRWCo8TLO0fPyHM3a9S1GxD2FaabMkyDQL2dx%2BKdd7tV5%2BqzmHf3GvnZG8mF89kIgAuXvyIkL6pnGPZ2c6yN4cLEpSEmjKJs7Eb2%2Bl9u2VCj06nkkwzioo88MiaMQY7uNLGZpZbzHBSezjp4A5XwZIenzSnmD7kFwmcN5jJ9WwyZkk8aiaL%2BLw0ZFI2Mn4V4kZjNHtshKyW%2B6SDW4dJ3m6e8Smzb0yfKsry2%2BIS2dQALSMF7IlcV2HBWQ3U6sTWshkQrk00%2FAkKoUQ9PHdKZw57AgSBIZKiAz5AWM23NJxP5TWLnhS%2FR4LIodJck3z4qUDCNud%2FFBjqkAb%2FKIeBwUN7B%2BizO9jiaQpFlaSZ5MsnstclqDJSmIUeBl8Blmoo47GyO%2FtAO1CdGW%2FigELwrrFw61xd6fJY3Nz4dSXi5YOnx%2BFhkOae0ulyDAgfBkSb%2BYocPzjqDI%2FFluWCHiB74bRqoTWIbj6n82U8uwSdMAV8JJ5vLDR%2B%2FcdZSj8pTeFbpMIcPn0Gyib7rryVu9ZVJeK%2B3HJnfWPSWggXfhLtU&X-Amz-Signature=8f393726be490557a096afcb84d2658e4eecb9f480bcbd1334ee2d4c7aa71a78&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject",{"title":5555,"description":6118},"blogs\u002F2025-09-03-un-ide-avec-agent-ia-une-alternative-open-source-cursor-tout-ce-quil-faut-savoir-pour-bien-dmarrer-avec-void\u002Findex",[1734,6131,6132,6133,461],"documentation","void","ide","DdcZCpXJfDb-grewP-bh1RjdNGzVaQihm_7bpcqssb0",1787157471591]