{"id":10,"date":"2024-12-17T11:05:05","date_gmt":"2024-12-17T11:05:05","guid":{"rendered":"https:\/\/blog.chataignon.org\/joseph\/?p=10"},"modified":"2025-02-19T17:27:19","modified_gmt":"2025-02-19T17:27:19","slug":"pourquoi-chatgpt-ne-sait-pas-epeler","status":"publish","type":"post","link":"https:\/\/blog.chataignon.org\/joseph\/fr\/post-10\/pourquoi-chatgpt-ne-sait-pas-epeler\/","title":{"rendered":"Pourquoi ChatGPT ne sait pas \u00e9peler"},"content":{"rendered":"\n<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary>note pr\u00e9alable<\/summary>\n<p>Les exp\u00e9riences pr\u00e9sent\u00e9es ici n&rsquo;ont pas \u00e9t\u00e9 faites en m\u00eame temps, et les r\u00e9sultats \u00e0 un essai particulier peuvent \u00eatre diff\u00e9rents suivant les mises \u00e0 jour de chatgpt. Elles ont \u00e9t\u00e9 men\u00e9es en Fran\u00e7ais et en Anglais avec des r\u00e9sultats g\u00e9n\u00e9ralement similaires. J&rsquo;ai utilis\u00e9 GPT-4o, qui a fait un peu mieux que Mistral Large et un peu moins bien que claude-3-haiku.<br>Les tests peuvent \u00eatre r\u00e9p\u00e9t\u00e9s avec un <a href=\"https:\/\/www.dcode.fr\/caesar-cipher\">encodeur du chiffre de C\u00e9sar<\/a> et le <a href=\"https:\/\/platform.openai.com\/tokenizer\"><em>tokenizer<\/em> d&rsquo;OpenAI<\/a>.<\/p>\n<\/details>\n\n\n\n<h2 class=\"wp-block-heading\">Le chiffre de C\u00e9sar<\/h2>\n\n\n\n<p>Lorsque C\u00e9sar, en campagne en Gaule, \u00e9crivait \u00e0 l&rsquo;administrateur de ses domaines \u00e0 Rome, il utilisait une astuce pour que ses messages ne soient lisibles que de celui-ci. Chaque lettre \u00e9tait remplac\u00e9e par la lettre qui se trouve trois places devant dans l&rsquo;alphabet: le A devenait un D, le B devenait un E, <em>et caetera<\/em>. Par exemple, \u00ab\u00a0alea jacta est\u00a0\u00bb devient \u00ab\u00a0dohd mdfwd hvw\u00a0\u00bb. Cette m\u00e9thode de chiffrement simple est rest\u00e9e sous le nom de <strong>chiffre de C\u00e9sar<\/strong>.<\/p>\n\n\n\n<p>Le chiffre de C\u00e9sar, trop simple et trop connu, n&rsquo;offre plus aucune s\u00e9curit\u00e9 depuis longtemps. N\u00e9anmoins j&rsquo;ai pens\u00e9 qu&rsquo;il serait un exercice int\u00e9ressant pour tester les capacit\u00e9s de ChatGPT \u00e0 reconna\u00eetre un texte chiffr\u00e9. Que se passerait-il si j&rsquo;essayais d&rsquo;envoyer un message chiffr\u00e9, sans contexte ni explications: ChatGPT parviendrait-il \u00e0 reconna\u00eetre le code et le d\u00e9chiffrer ?<\/p>\n\n\n\n<p>Et c&rsquo;est l\u00e0 qu&rsquo;il se passe quelque chose d&rsquo;\u00e9trange. Pour un humain, la partie difficile de cette t\u00e2che est de reconna\u00eetre ou trouver le code, mais une fois que celui-ci est trouv\u00e9 le d\u00e9codage est simple, il suffit de permuter les lettres du message une par une. ChatGPT, lui, s&rsquo;il n&rsquo;a aucun mal \u00e0 d\u00e9tecter le code, a beaucoup de mal \u00e0 le d\u00e9coder correctement. Dans les tests que j&rsquo;ai fait, ChatGPT reconnaissait en g\u00e9n\u00e9ral le chiffre de C\u00e9sar (avec plus de difficult\u00e9s en fran\u00e7ais qu&rsquo;en anglais), \u00e9tait capable d&rsquo;expliquer son principe, voire donnait la correspondance entre lettres en clair et lettres chiffr\u00e9es pour tout l&rsquo;alphabet; mais le d\u00e9codage est approximatif, voire carr\u00e9ment faux. Cela se v\u00e9rifie particuli\u00e8rement pour les mots longs et peu usit\u00e9s, isol\u00e9s lexicalement comme \u00ab\u00a0saperlipopette\u00a0\u00bb ou \u00ab\u00a0hurlberlu\u00a0\u00bb.<\/p>\n\n\n\n<p>Alors, d&rsquo;o\u00f9 cela vient-il ? Pour comprendre il faut se pencher sur la premi\u00e8re \u00e9tape du traitement du texte par un mod\u00e8le Transformer: la <em>lex\u00e9misation<\/em> (<em>tokenisation<\/em> en anglais), c&rsquo;est-\u00e0-dire la d\u00e9composition du texte en <em>lex\u00e8mes<\/em> (<em>tokens<\/em>) et la vectorisation (<em>embedding<\/em> en anglais) de ces lex\u00e8mes.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">La lex\u00e9misation<\/h2>\n\n\n\n<p>Pour faire des calculs sur du texte, et donc pour construire des mod\u00e8les de langage, il est d&rsquo;abord n\u00e9cessaire de transformer le texte en chiffres. La fa\u00e7on la plus simple est de reprendre la fa\u00e7on dont le texte est g\u00e9n\u00e9ralement encod\u00e9 sur les ordinateurs, c&rsquo;est-\u00e0-dire avec un code binaire (convertible en nombre) associ\u00e9 \u00e0 chaque lettre. Cela fonctionne mais n&rsquo;est pas tr\u00e8s efficace, car pour extraire le sens du texte il faut d&rsquo;abord combiner ces lettres en mots. L&rsquo;autre approche simple est d&rsquo;attribuer un nombre par mot du dictionnaire, plut\u00f4t que par lettre. Cela \u00e9pargne beaucoup de calculs \u00e0 la machine mais cause d&rsquo;autres probl\u00e8mes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>un vocabulaire beaucoup plus \u00e9lev\u00e9 est n\u00e9cessaire. Au lieu de 26 nombres n\u00e9cessaires pour encoder les lettres, on passe \u00e0 plusieurs dizaines de milliers pour le vocabulaire complet d&rsquo;une langue<\/li>\n\n\n\n<li>le mod\u00e8le qui en r\u00e9sulte est tr\u00e8s sensible \u00e0 l&rsquo;orthographe. Ainsi, lorsqu&rsquo;une variante inhabituelle d&rsquo;un mot est utilis\u00e9e ou tout simplement lorsqu&rsquo;une faute de frappe s&rsquo;y glisse, le mot risque de ne pas \u00eatre reconnu dans le vocabulaire. Le mod\u00e8le ne sera pas capable de le traiter du tout.<\/li>\n<\/ul>\n\n\n\n<p>La solution interm\u00e9diaire consiste \u00e0 d\u00e9composer le texte en <em>lex\u00e8mes<\/em>, c&rsquo;est-\u00e0-dire des fragments de mots que l&rsquo;ont retrouve souvent et qui ont un sens. Par exemple, le suffixe -eur est un lex\u00e8me qui porte du sens: il transforme une action en l&rsquo;agent de cette action (\u00ab\u00a0transport\u00a0\u00bb -&gt; \u00ab\u00a0transporteur\u00a0\u00bb). Les conjugaisons, les pr\u00e9fixes et suffixes courants, et les radicaux des mots constituent de bons lex\u00e8mes pour d\u00e9composer le texte. La lex\u00e9misation constitue une unit\u00e9 interm\u00e9diaire entre les lettres et les mots.<\/p>\n\n\n\n<p>Mais comment distinguer efficacement les lex\u00e8mes qui valent le coup d&rsquo;\u00eatre dans notre vocabulaire ? Pourquoi y enregistrer \u00ab\u00a0-eur\u00a0\u00bb plut\u00f4t que \u00ab\u00a0tkq\u00a0\u00bb par exemple ? Heureusement nous n&rsquo;avons pas besoin de cr\u00e9er la liste de lex\u00e8mes \u00e0 la main, on utilise plut\u00f4t des m\u00e9thodes statistiques. La plus courante est l&rsquo;algorithme du <em>Byte-Pair Encoding<\/em> (Encodage de paires d&rsquo;octets), qui groupe r\u00e9cursivement la paire d&rsquo;octets qui apparaissent le plus souvent ensembles. Dans les faits, ce simple crit\u00e8re \u00ab\u00a0les lettres apparaissent souvent ensembles\u00a0\u00bb est suffisant pour obtenir des lex\u00e8mes satisfaisants.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Revenons \u00e0 nos moutons<\/h2>\n\n\n\n<p>Alors, quel rapport avec notre sujet ? Eh bien comme le texte est toujours d\u00e9compos\u00e9 en lex\u00e8mes, le mod\u00e8le ne \u00ab\u00a0voit\u00a0\u00bb que des lex\u00e8mes, pas des lettres individuelles. Il n&rsquo;a pas acc\u00e8s au texte lui-m\u00eame, mais \u00e0 une suite de codes dont chacun correspond \u00e0 un lex\u00e8me, et n&rsquo;a pas acc\u00e8s \u00e0 la composition de ces lex\u00e8mes. On comprend qu&rsquo;il ait du mal \u00e0 \u00e9peler un mot.<\/p>\n\n\n\n<p>En voyant les choses comme \u00e7a, on peut finalement \u00eatre surpris que ChatGPT sache \u00e9peler des mots et manipuler les lettres une par une.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Combien y a-t-il de \u00ab\u00a0R\u00a0\u00bb dans \u00ab\u00a0strawberry\u00a0\u00bb ?<\/h2>\n\n\n\n<p>Depuis la sortie de ChatGPT, les utilisateurs ont remarqu\u00e9 qu&rsquo;il \u00e9tait incapable de r\u00e9soudre un simple probl\u00e8me: compter le nombre de \u00ab\u00a0R\u00a0\u00bb dans le mot \u00ab\u00a0strawberry\u00a0\u00bb ? (\u00ab\u00a0fraise\u00a0\u00bb en anglais). Ce probl\u00e8me persiste avec les versions les plus r\u00e9centes (plus forc\u00e9ment avec \u00ab\u00a0strawberry\u00a0\u00bb maintenant qu&rsquo;il a \u00e9t\u00e9 inclus dans les donn\u00e9es d&rsquo;entra\u00eenement, mais essayez avec les C dans \u00ab\u00a0archiduc\u00a0\u00bb ou les S dans \u00ab\u00a0assassin\u00a0\u00bb).<\/p>\n\n\n\n<p>L&rsquo;explication est la m\u00eame qu&rsquo;avec le chiffre de C\u00e9sar: le d\u00e9coupage en lex\u00e8mes ne correspond pas aux lettres individuelles. GPT-4o d\u00e9coupe \u00ab\u00a0strawberry\u00a0\u00bb en 3 lex\u00e8mes: st-raw-berry (le tokenizer d&rsquo;OpenAI est disponible <a href=\"https:\/\/platform.openai.com\/tokenizer\">ici<\/a> pour tester), il sait qu&rsquo;il y a un R dans \u00ab\u00a0raw\u00a0\u00bb et un autre dans \u00ab\u00a0berry\u00a0\u00bb mais ne sait pas combien il y en a dedans.<\/p>\n\n\n\n<p>Vous pouvez facilement trouver d&rsquo;autres mots qui poseront le m\u00eame probl\u00e8me. Il vous faut un mot o\u00f9 une lettre appara\u00eet deux fois, dont une fois doubl\u00e9e (par exemple les S de \u00ab\u00a0spadassin\u00a0\u00bb) ou associ\u00e9e dans un digramme tr\u00e8s courant comme \u00ab\u00a0ch\u00a0\u00bb ou \u00ab\u00a0qu\u00a0\u00bb (par exemple les U de \u00ab\u00a0ubiquit\u00e9\u00a0\u00bb).<\/p>\n\n\n\n<p>Notez qu&rsquo;il existe une parade simple pour \u00e9viter ce probl\u00e8me: ajoutez \u00ab\u00a0proc\u00e8de \u00e9tape par \u00e9tape\u00a0\u00bb \u00e0 votre question.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Addition de derni\u00e8re minute: le <em>patching<\/em><\/h2>\n\n\n\n<p>Ce 12 d\u00e9cembre, Meta a publi\u00e9 un <a href=\"https:\/\/ai.meta.com\/research\/publications\/byte-latent-transformer-patches-scale-better-than-tokens\/\">papier<\/a> exposant une approche diff\u00e9rente: le <em>patching<\/em>. Cette approche consiste \u00e0 grouper les lettres en s\u00e9quences dynamiquement, sans vocabulaire fix\u00e9. L&rsquo;architecture pr\u00e9sent\u00e9e comporte une premi\u00e8re couche Transformer qui encode les lettres en repr\u00e9sentations de patches, et des couches d&rsquo;Attention crois\u00e9e reli\u00e9es directement aux lettres elles-m\u00eames ce qui permet au mod\u00e8le de \u00ab\u00a0voir\u00a0\u00bb la composition des patches.<\/p>\n\n\n\n<p>Les tests effectu\u00e9s par Meta montrent que non seulement cette m\u00e9thode parmet de mieux saisir l&rsquo;orthographe des mots, mais aussi que sa performance est meilleure \u00e0 grande \u00e9chelle que la lex\u00e9misation avec un vocabulaire fix\u00e9.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Pourquoi les IA comme ChatGPT, si performantes sur certaines t\u00e2ches, ont-elles tant de mal \u00e0 distinguer les lettres qui composent un mot ?<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[11,13],"tags":[],"class_list":["post-10","post","type-post","status-publish","format-standard","hentry","category-ia","category-llm"],"_links":{"self":[{"href":"https:\/\/blog.chataignon.org\/joseph\/wp-json\/wp\/v2\/posts\/10","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.chataignon.org\/joseph\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.chataignon.org\/joseph\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.chataignon.org\/joseph\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.chataignon.org\/joseph\/wp-json\/wp\/v2\/comments?post=10"}],"version-history":[{"count":3,"href":"https:\/\/blog.chataignon.org\/joseph\/wp-json\/wp\/v2\/posts\/10\/revisions"}],"predecessor-version":[{"id":124,"href":"https:\/\/blog.chataignon.org\/joseph\/wp-json\/wp\/v2\/posts\/10\/revisions\/124"}],"wp:attachment":[{"href":"https:\/\/blog.chataignon.org\/joseph\/wp-json\/wp\/v2\/media?parent=10"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.chataignon.org\/joseph\/wp-json\/wp\/v2\/categories?post=10"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.chataignon.org\/joseph\/wp-json\/wp\/v2\/tags?post=10"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}