{"id":64820,"date":"2025-05-27T08:40:00","date_gmt":"2025-05-27T06:40:00","guid":{"rendered":"https:\/\/www.herr-rau.de\/wordpress\/?p=64820"},"modified":"2025-06-03T06:13:09","modified_gmt":"2025-06-03T04:13:09","slug":"llm-grundlagen-teil-2-ueber-token","status":"publish","type":"post","link":"https:\/\/www.herr-rau.de\/wordpress\/2025\/05\/llm-grundlagen-teil-2-ueber-token.htm","title":{"rendered":"LLM Grundlagen, Teil 2: \u00dcber Token"},"content":{"rendered":"<div style='text-align:right;'><small>(<a href='https:\/\/www.herr-rau.de\/wordpress\/2025\/05\/llm-grundlagen-teil-2-ueber-token.htm#comments'>4 Kommentare.<\/a>)<\/small> <\/div>\n<p><em><a href=\"https:\/\/www.herr-rau.de\/wordpress\/2025\/05\/llm-grundlagen-teil-1-ueber-n-gramme.htm\">Fortsetzung von hier.<\/a> Diesmal geht es noch gar nicht darum, wie Texte erzeugt werden, sondern um die Einf\u00fchrung des Begriffs <\/em>Token; <em>ein f\u00fcr die Erkl\u00e4rung vielleicht nicht notwendiges, aber doch interessantes Konzept.<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. Token statt W\u00f6rter<\/h2>\n\n\n\n<p>In den bisherigen Erkl\u00e4rungen ging es immer um <em>W\u00f6rter<\/em> und darum, dass W\u00f6rter vorausgesagt werden. Manche Verfahren arbeiten auch tats\u00e4chlich mit W\u00f6rtern, siehe n\u00e4chste Folge. Aber moderne LLM arbeiten mit etwas anderem, n\u00e4mlich <em>Token.<\/em><\/p>\n\n\n\n<p>Ein Token ist eine Zeichenkette, eine kurze Folge von Buchstaben. Das hier sind alles verschiedene Token:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><em>ant, ast, bar, de, des, Die, ist, Menschen, un, W\u00fcr<\/em><\/li>\n\n\n\n<li><em>apping, I, n, nearly, nodded, while<\/em><\/li>\n\n\n\n<li><em>a, b, c, d, e, A, B, C, ., :, ;, ?<\/em><\/li>\n<\/ul>\n\n\n\n<p>In vielen Beispielen f\u00fcr die Erkl\u00e4rung von LLM werden W\u00f6rter statt Token gezeigt, weil das anschaulicher ist. Das Prinzip bleibt dabei ohnehin gleich, der Unterschied ist f\u00fcr die Praxis wichtig, f\u00fcr das Verst\u00e4ndnis gar nicht mal so sehr. Dennoch will ich den Begriff kl\u00e4ren, auch um mich zu dr\u00fccken vor den schwierigeren Sachen sp\u00e4ter.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2. Tokenization<\/h2>\n\n\n\n<p>Tokenization hei\u00dft der Vorgang, bei dem Texte in Token zerlegt werden. Das kann hier: <a href=\"https:\/\/platform.openai.com\/tokenizer\">https:\/\/platform.openai.com\/tokenizer<\/a> ausprobieren f\u00fcr GPT-4 und GPT-3. Die folgenden Beispiele stammen alle aus der Version f\u00fcr GPT-4:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Die W\u00fcr-de des Menschen ist un-ant-ast-bar.<\/p>\n\n\n\n<p>8796, 74743, 613, 731, 19488, 2496, 537, 493, 629, 2990, 13<\/p>\n<\/blockquote>\n\n\n\n<p>Der Satz &#8222;Die W\u00fcrde des Menschen ist unantastbar.&#8220; besteht aus 6 W\u00f6rtern und 1 Satzzeichen, aufgeteilt in 11 Token. Jedes Token hat eine eindeutige ID, mit der intern gearbeitet wird.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Es gibt verschiedene Tokenizer-Verfahren je nach LLM.<\/li>\n\n\n\n<li>Zum Beispiel gibt es 50.000 bis 200.000 verschiedene Token je nach System.<\/li>\n\n\n\n<li>Englisch: im Durchschnitt etwa 1,2 Token pro Wort<\/li>\n\n\n\n<li>Deutsch: im Durchschnitt etwa 1,4 Token pro Wort<\/li>\n<\/ul>\n\n\n\n<p>Wenn man W\u00f6rter statt Token nehmen w\u00fcrde, h\u00e4tte man viel mehr davon und m\u00fcsste sich \u00fcberlegen, wie mit bislang unbekannten W\u00f6rtern umzugehen w\u00e4re. Wenn man Buchstaben statt W\u00f6rter nehmen w\u00fcrde, h\u00e4tte man sehr viel weniger davon, was gut w\u00e4re, aber dann h\u00e4tten die einzelnen Buchstaben viel weniger Bedeutung: Aus 100 W\u00f6rtern oder Wortteilen l\u00e4sst sich das n\u00e4chste besser vorhersagen, als aus 100 Buchstaben der n\u00e4chste Buchstabe.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">3. Mehr Beispiele f\u00fcr Tokenization<\/h2>\n\n\n\n<p>Hier habe ich ein paar Fragmente in den Tokenizer eingegeben. Links sieht man den Text, rechts die Aufteilung in Token, wobei die f\u00fcnf Farben nichts zu bedeuten haben, sie dienen nur zu optischen Trennung der Token. Darunter sind die IDs der einzelnen Token angegeben:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"700\" height=\"223\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_openai_tokenizer_tokenization-700x223.png\" alt=\"\" class=\"wp-image-64823\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_openai_tokenizer_tokenization-700x223.png 700w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_openai_tokenizer_tokenization-300x95.png 300w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_openai_tokenizer_tokenization-150x48.png 150w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_openai_tokenizer_tokenization.png 993w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"700\" height=\"232\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_openai_tokenizer_tokenization2-700x232.png\" alt=\"\" class=\"wp-image-64825\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_openai_tokenizer_tokenization2-700x232.png 700w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_openai_tokenizer_tokenization2-300x99.png 300w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_openai_tokenizer_tokenization2-150x50.png 150w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_openai_tokenizer_tokenization2.png 990w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">4. Was f\u00e4llt auf?<\/h2>\n\n\n\n<p>Wenn man sich das genau ansieht, kann man daraus Schl\u00fcsse ziehen:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Ein f\u00fchrendes Leerzeichen, oder von mir aus ein Zeilenumbruch stattdessen, geh\u00f6rt quasi mit zum Token: <em>un<\/em> mit Leerzeichen davor und <em>un<\/em> ohne sind verschiedene Token. Deshalb werden &#8222;unm\u00f6glich&#8220; und &#8222;unbelievable&#8220; verschieden separiert: ein kleingeschriebenes &#8222;unbelievable&#8220; am Zeilanfang ist etwas anderes als ein kleingeschriebenes &#8222;unbelievable&#8220; mitten im Satz.<\/li>\n\n\n\n<li>Dementsprechend ist auch ein Punkt mit Absatz danach ein anderes Token als ein Punkt ohne Absatzende danach. Das sieht man im Beispiel nicht, zugegeben, aber es ist so.<\/li>\n\n\n\n<li>Da es f\u00fcr jeden Buchstaben ein eigenes Token gibt (im Beispiel sieht man das nur am &#8222;m&#8220; in der vierten Zeile), l\u00e4sst sich jeder Text \u00fcber diesem Alphabet in Token aufteilen, aber f\u00fcr die h\u00e4ufigen Kombinationen (so etwas wie Wortbestandteile) gibt es eigene Token.<\/li>\n\n\n\n<li>Die Sprache ist irrelevant: Auf der Tokenization-Ebene spielt es keine Rolle, ob &#8222;un&#8220; eine deutsche oder englische Vorsilbe, ein franz\u00f6sischer Artikel oder ein spanisches Zahlwort ist. Das ist Token 537 und gut ist. (Am Absatzanfang: Token 373.) <\/li>\n<\/ol>\n\n\n\n<p>Manchmal haben W\u00f6rter der menschlichen Sprache verschiedene Bedeutungen. Ein LLM kann zwar auf einer sp\u00e4teren Ebene damit umgehen, aber als Token betrachtet werden keine Unterschiede gemacht, egal was etwa das englische <em>duck<\/em> gerade bedeutet. Der mittlere der folgenden S\u00e4tze ist mehrdeutig, er kann hei\u00dfen \u201eIch sah ihre Ente\u201c oder \u201eIch sah, wie sie sich duckte.\u201c Das Token ist ohnehin immer das gleiche, n\u00e4mlich Nummer 61769.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>You should <strong>duck<\/strong> now.<br>I saw her <strong>duck<\/strong>.<br>A <strong>duck<\/strong> goes qu-ack.<\/p>\n\n\n\n<p>3575, 1757, <strong>61769,<\/strong> 1954, 558,<br>40, 8274, 1335, <strong>61769,<\/strong> 558,<br>32, <strong>61769,<\/strong> 8805, 474, 12, 552, 558<\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">5. Kleine Fu\u00dfnote: Token und Morpheme<\/h2>\n\n\n\n<p>GPT-4 benutzt etwa 100.000 verschiedene Token, zum Beispiel: <em>ant, ast, bar, de, des, Die, ist, Menschen, un, W\u00fcr<\/em>. Die Sprachwissenschaft arbeitet mit anderen, vielleicht vergleichbaren Elementen, die <em>Morpheme<\/em> hei\u00dfen: Das sind die kleinsten eine Bedeutung tragende Bausteine der Sprache. Das Adjektiv <em>unantastbar<\/em> etwa besteht aus den Morphemen: <em>un-an-tast-bar,<\/em> das Verb <em>tastet<\/em> aus den Morphemen <em>tast-et,<\/em> wobei das erste Morphem das gleiche wie im Wort davor ist und das zweite Morphem die Bedeutung &#8222;3. Person Singular Pr\u00e4sens Indikativ&#8220; tr\u00e4gt.<\/p>\n\n\n\n<p>Wie relevant ist es, dass GPT-4 das Wort <em>unantastbar<\/em> stattdessen in die Token <em>un-ant-ast-bar<\/em> aufteilt? Ist eine Aufteilung irgendwie <em>echter<\/em> als die andere oder sind beides einfach unterschiedliche Modelle mit unterschiedlichen Anwendungsbereichen? Solange unterschiedliche Sprachen auf einmal trainiert werden, l\u00e4sst sich da vermutlich ohnehin nicht viel sagen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">6. Wo kommen die Token her?<\/h2>\n\n\n\n<p>Man beginnt mit einer gro\u00dfen Textsammlung, und dann gibt es verschiedene Algorithmen, die herausfinden, welche Token am geeignetsten sind, um diese Texte effektiv in sie aufteilen zu k\u00f6nnen. Mit denen habe ich mich nicht gro\u00df besch\u00e4ftigt, man k\u00f6nnte zum Beispiel nach Byte Pair Encoding (BPE) suchen. Am Ende hat man jedenfalls eine Liste von Token, die hei\u00dft das <em>Vokabular.<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">7. Liste der Token<\/h2>\n\n\n\n<p>Hier ist eine Liste der Token von GPT 4: <a href=\"https:\/\/github.com\/kaisugi\/gpt4_vocab_list\/tree\/main\">https:\/\/github.com\/kaisugi\/gpt4_vocab_list\/tree\/main<\/a>. Genaugenommen sind das zwei Varianten: Einmal die Liste der 100.000 Token von GPT-4 und einmal die Liste mit den 200.000 Token von GPT-4o. Die Zeilennummern in der 4o-Liste entsprechend der ID des Tokens, wie ich sie oben als Beispiele gezeigt habe, allerdings muss man f\u00fcr die ID 1 von der Zeilennummer abziehen: Die Zeilennummerierung beginnt bei 1, die Tokennummerierung bei 0.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"349\" height=\"234\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_gpt4o_token.png\" alt=\"\" class=\"wp-image-64836\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_gpt4o_token.png 349w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_gpt4o_token-300x201.png 300w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_gpt4o_token-150x101.png 150w\" sizes=\"auto, (max-width: 349px) 100vw, 349px\" \/><\/figure>\n\n\n\n<p>Man sieht im Screenshot unseren alten Freund, das &#8220; un&#8220; mit dem Leerzeichen davor, Token ID 537, in Zeile 538. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">8. Links und Ausprobieren<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ausprobieren, in welche Token ChatGPT Texte zerlegt: <a href=\"https:\/\/platform.openai.com\/tokenizer\">https:\/\/platform.openai.com\/tokenizer<\/a> <\/li>\n\n\n\n<li>Liste der Token von ChatGPT: <a href=\"https:\/\/github.com\/kaisugi\/gpt4_vocab_list\/tree\/main\">https:\/\/github.com\/kaisugi\/gpt4_vocab_list\/tree\/main<\/a> (GPT-4 und GPT-4o).<\/li>\n<\/ul>\n\n\n\n<p><em><a href=\"https:\/\/www.herr-rau.de\/wordpress\/2025\/06\/llm-grundlagen-teil-3-ueber-embedding.htm\">Fortsetzung folgt.<\/a> (Da beginnt es dann haarig zu werden. Nicht nur wegen der Katzen und Hunde.)<\/em><\/p>\n\n\n\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/vg01.met.vgwort.de\/na\/e75b836a44d640448b55d16daf0282c4\" width=\"1\" height=\"1\" alt=\"\">\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>(4 Kommentare.) Fortsetzung von hier. Diesmal geht es noch gar nicht darum, wie Texte erzeugt werden, sondern um die Einf\u00fchrung des Begriffs Token; ein f\u00fcr die Erkl\u00e4rung vielleicht nicht notwendiges, aber doch interessantes Konzept. 1. Token statt W\u00f6rter In den bisherigen Erkl\u00e4rungen ging es immer um W\u00f6rter und darum, dass W\u00f6rter vorausgesagt werden. Manche Verfahren [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":64823,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[25],"tags":[227,254],"class_list":["post-64820","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-informatik","tag-informatik","tag-ki"],"jetpack_featured_media_url":"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_openai_tokenizer_tokenization.png","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts\/64820","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/comments?post=64820"}],"version-history":[{"count":3,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts\/64820\/revisions"}],"predecessor-version":[{"id":65146,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts\/64820\/revisions\/65146"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/media\/64823"}],"wp:attachment":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/media?parent=64820"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/categories?post=64820"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/tags?post=64820"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}