{"id":64808,"date":"2025-05-25T07:58:40","date_gmt":"2025-05-25T05:58:40","guid":{"rendered":"https:\/\/www.herr-rau.de\/wordpress\/?p=64808"},"modified":"2025-05-28T05:44:50","modified_gmt":"2025-05-28T03:44:50","slug":"llm-grundlagen-teil-1-ueber-n-gramme","status":"publish","type":"post","link":"https:\/\/www.herr-rau.de\/wordpress\/2025\/05\/llm-grundlagen-teil-1-ueber-n-gramme.htm","title":{"rendered":"LLM Grundlagen, Teil 1: \u00dcber N-Gramme"},"content":{"rendered":"<div style='text-align:right;'><small>(<a href='https:\/\/www.herr-rau.de\/wordpress\/2025\/05\/llm-grundlagen-teil-1-ueber-n-gramme.htm#comments'>13 Kommentare.<\/a>)<\/small> <\/div>\n<p>Ich will in einer Reihe von Blogeintr\u00e4gen mir selbst erkl\u00e4ren, wie das alles funktioniert, und das dann nat\u00fcrlich auch vorzeigen. Vermutlich werden das in relativ rascher Folge drei Blogeintr\u00e4ge mit den einfachen Inhalten, die ich zu verstehen glaube, und dann wird eine lange Pause sein, weil dann die eigentlich spannenden Dinge kommen, die ich noch nicht verstehe.<\/p>\n\n\n\n<p>Mein Wissen habe ich letztlich aus ein paar Papier-Aufs\u00e4tzen und vielen Quellen im Web. Die Quellen im Web sind mir leider meist entweder zu einfach, indem sie die schwierigen Punkte umgehen, oder zu technisch, indem sie sie nicht umgehen. Ich h\u00e4tte die schwierigen Schritte gerne als Black Box erkl\u00e4rt, bei denen ich nicht wissen will, wie das genau funktioniert, aber <em>genau<\/em> wissen will, was der Input und der Output bei diesen Schritten ist. Wir werden sehen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. Begriffskl\u00e4rungen<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>ChatGPT ist ein Chatbot einer konkreten Firma, die auf ein konkretes LLM zugreift.<\/li>\n\n\n\n<li>LLM hei\u00dft Large Language Model und ist das Ding, das hinter dem Chatbot steckt.<\/li>\n\n\n\n<li>Es gibt LLMs von verschiedenen Firmen, und verschiedene Chatbots, und sprachlich geht das oft durcheinanderm h\u00e4ngt ja auch zusammen. Soll sein, soll sein.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">2. Worum es eigentlich geht<\/h2>\n\n\n\n<p>Tats\u00e4chlich geht es nur darum, vorherzusagen, wie ein angefangener Text weitergeht. Das kann man sich so vorstellen wie hier, wo nach und nach ein Wort an das andere gef\u00fcgt wird:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"630\" height=\"672\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_soekiagpt_maerchen_anfang.gif\" alt=\"\" class=\"wp-image-64813\"\/><\/figure>\n\n\n\n<p>Die meisten Satzzeichen fehlen bei diesem einfachen Modell absichtlich. Dass der Text nur m\u00e4\u00dfig Sinn ergibt, liegt daran, dass ein einfaches Modell benutzt wird, zu dem ich sp\u00e4ter mehr schreiben werde. F\u00fcr die Einfachheit des Modells ist das Ergebnis \u00fcbrigens gar nicht schlecht.<\/p>\n\n\n\n<p>Reicht das schon um zu behaupten, dass ChatGPT Sprache <em>versteht?<\/em> Das ist eine Frage f\u00fcr sp\u00e4ter mal. Ich sage: nein, aber man kann das auch anders sehen.<\/p>\n\n\n\n<p>Man kann sich die Entscheidung f\u00fcr das jeweils n\u00e4chste Wort auch so vorstellen:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"700\" height=\"421\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_ruh_nicolas_woerterwahl-700x421.png\" alt=\"\" class=\"wp-image-64814\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_ruh_nicolas_woerterwahl-700x421.png 700w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_ruh_nicolas_woerterwahl-300x180.png 300w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_ruh_nicolas_woerterwahl-150x90.png 150w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_ruh_nicolas_woerterwahl-1536x923.png 1536w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_ruh_nicolas_woerterwahl-2048x1231.png 2048w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><\/figure>\n\n\n\n<p class=\"has-small-font-size\">&#8222;(Wie) Versteht ChatGPT Sprache?&#8220;<br>CC BY NC SA 4.0 <a href=\"https:\/\/creativecommons.org\/licenses\/by-nc-sa\/4.0\/\">https:\/\/creativecommons.org\/licenses\/by-nc-sa\/4.0\/<\/a><br>Dr. Nicolas Ruh, Neue Kantonsschule Aarau, nicolas.ruh@nksa.ch<\/p>\n\n\n\n<p>Au\u00dferdem gibt es hier noch einen Parameter, der <em>Temperatur<\/em> hei\u00dft. Bei niedriger Temperatur kommt stets das Wahrscheinlichste heraus. Das f\u00fchrt dazu, dass im Beispiel oben bei einem Anfang von &#8222;Die Katze frisst&#8220; immer der Satz &#8222;Die Katze frisst M\u00e4use.&#8220; (mit Punkt am Ende) produziert wird. Bei h\u00f6herer Temperatur wird auch mal davon abgewichen, so dass S\u00e4tze wie &#8222;Die Katze frisst keine Elefanten&#8220; (noch ohne Punkt) entstehen k\u00f6nnen.<\/p>\n\n\n\n<p><strong>Ist das wirklich so einfach? <\/strong>Ja und nein. Ja, weil ich denke, dass das wirklich so einfach ist; nein, weil der Knackpunkt nat\u00fcrlich der ist, wie diese Wahrscheinlichkeiten entstehen. Und das kann komplizierter werden. (Daneben gibt es Verfeinerungen und Verbesserungen, aber das, was so \u00fcberrascht und fasziniert, das steckt bereits alles in dieser einfachen Vorhersage.)<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">3. Eine einfache L\u00f6sung: N-Gramme<\/h2>\n\n\n\n<p>Bis vielleicht 2010 herum experimentierte man, so las ich, gerne mit N-Grammen, bevor die durch moderne Verfahren abgel\u00f6st wurden. Dennoch scheint es mir sinnvoll, mit diesen N-Grammen zu beginnen, auch weil sie immer wieder als Beispiel und Erkl\u00e4rung herangezogen werden.<\/p>\n\n\n\n<p>Im Prinzip geht es dabei darum, Wahrscheinlichkeiten von Wort-Kombinationen zu berechnen und zu speichern. Ein <em>Bigramm <\/em>ist eine Folge von zwei W\u00f6rtern, ein <em>Trigramm <\/em>eine Folge von drei W\u00f6rtern, und allgemein ein <em>N-Gramm<\/em> eine Folge von n W\u00f6rtern.<\/p>\n\n\n\n<p>Man geht dabei so vor, dass man eine Sammlung von Texten als Materialbasis nimmt und die H\u00e4ufigkeit von verschiedenen N-Grammen darin berechnet. Man z\u00e4hlt, wie h\u00e4ufig diese Paare sind:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>ein Hund \/ ein Klavier \/ ein gro\u00dfes \/ ein. \/ ein,<\/li>\n<\/ul>\n\n\n\n<p>Alle diese Paare k\u00f6nnten in deutschen Texten auftauchen, das letzte zum Beispiel in S\u00e4tzen wie &#8222;Schalten Sie den Rechner aus und ein, um zu sehen, ob er dann besser funktioniert.&#8220; Wenn man dann wissen will, wie es nach dem Wort &#8222;ein&#8220; weitergeht, schaut man sich an, welches Bigramm mit &#8222;ein&#8220; als ersten Element am h\u00e4ufigsten auftaucht.<\/p>\n\n\n\n<p>Das kann man erweitern auf Trigramme:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>einmal ein Hund \/ einmal ein und \/ einmal ein oder \/ einmal ein. \/ einmal ein,<\/li>\n<\/ul>\n\n\n\n<p>Auch f\u00fcr diese Trigramme gibt es H\u00e4ufigkeiten und damit Wahrscheinlichkeiten. Wenn man dann die ersten beiden Teile davon hat, also &#8222;einmal ein&#8220;, dann kann das System entscheiden, welches Wort am wahrscheinlichsten darauf folgt.<\/p>\n\n\n\n<p>Das kann man erweitern auf 5-Gramme, wie hier:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Es war einmal ein kleines \/ Es war einmal ein junger \/ Es war einmal ein Klavier<\/li>\n<\/ul>\n\n\n\n<p>Dann kann das System entscheiden, was auf das 4-Gramm &#8222;Es war einmal ein&#8220; am wahrscheinlichsten folgt, und so Texte erzeugen.<\/p>\n\n\n\n<p>Nach diesem Prinzip funktioniert <a href=\"https:\/\/www.soekia.ch\/GPT\/\">https:\/\/www.soekia.ch\/GPT\/<\/a> und man kann das da wirklich sch\u00f6n ausprobieren. Machen wir ein Experiment:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Das System wird mit 13 M\u00e4rchenanf\u00e4ngen trainiert.<\/li>\n\n\n\n<li>Das sind zusammen etwa 19.000 W\u00f6rter, was nicht viel ist.<\/li>\n\n\n\n<li>Die Texte enthalten etwa 3.100 verschiedene W\u00f6rter (Gro\u00dfschreibung und Satzzeichen ignoriert).<\/li>\n\n\n\n<li>F\u00fcr diese W\u00f6rter wird die H\u00e4ufigkeit von N-Grammen berechnet.<\/li>\n<\/ol>\n\n\n\n<p>Wenn ich &#8211; bei leicht erh\u00f6hter Temperatur &#8211; nur Bigramme f\u00fcr die Erzeugung von Texten benutze, kommt das heraus:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"641\" height=\"824\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_soekia_2-gram_bunt.png\" alt=\"\" class=\"wp-image-64817\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_soekia_2-gram_bunt.png 641w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_soekia_2-gram_bunt-233x300.png 233w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_soekia_2-gram_bunt-117x150.png 117w\" sizes=\"auto, (max-width: 641px) 100vw, 641px\" \/><\/figure>\n\n\n\n<p>Das ist nicht besonders gut. Wenn ich Bi-, Tri- und 4-Gramme heranziehe, wird das schon viel besser:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"641\" height=\"908\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_soekia_4-gram_bunt.png\" alt=\"\" class=\"wp-image-64816\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_soekia_4-gram_bunt.png 641w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_soekia_4-gram_bunt-212x300.png 212w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_soekia_4-gram_bunt-106x150.png 106w\" sizes=\"auto, (max-width: 641px) 100vw, 641px\" \/><\/figure>\n\n\n\n<p>(Die Farbe bedeuten \u00fcbrigens, dass die entsprechende Wortfolge aus einem bestimmten Einzeltext stammt.)<\/p>\n\n\n\n<p>Wir halten mal fest: Es gibt bessere Ergebnisse, wenn nicht nur Bigramme, sondern auch h\u00f6here N-Gramme ber\u00fccksichtigt werden.<\/p>\n\n\n\n<p>Das Modell ist \u00fcberraschend brauchbar, und kann auch mit verschiedenen Tricks verfeinert werden. Dennoch ist das eine veraltete L\u00f6sung. Es gibt vor allem zwei Probleme beim Arbeiten mit N-Grammen.<\/p>\n\n\n\n<p>Problem 1: Wenn es 50.000 verschiedene W\u00f6rter gibt, gibt es 50.000<sup>2<\/sup> Bigramme, 125.000.000.000.000 Trigramme und 6.250.000.000.000.000.000 4-Gramme. Zugegeben, nicht alle Kombinationen werden in den Trainingstexten auftauchen, dennoch sind das einfach zu viele. Problem 2: Bei N-Grammen, die in den Trainingstexten \u00fcberhaupt nicht auftauchen, k\u00f6nnen auch keine Wahrscheinlichkeiten gespeichert werden, so dass die nie in einem generierten Text verarbeitet werden.<\/p>\n\n\n\n<p>(Solche N-Gramme kann man \u00fcbrigens nicht nur auf Wortebene erstellen, sondern auch auf Zeichen-, also Buchstabenebene. Damit kommt man auch nicht weiter, aber man auch da sch\u00f6n experimentieren. Man kann auch mit eine Ebene zwischen W\u00f6rtern und Buchstaben arbeiten, und darum geht es im n\u00e4chsten Beitrag.)<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">4. Links und Ausprobieren<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>SoekiaGPT, wo man einen Korpus eigener Texte hochladen oder mit den verschiedenen bereits vorhandenen arbeiten kann: <a href=\"https:\/\/www.soekia.ch\/GPT\/\">https:\/\/www.soekia.ch\/GPT\/<\/a><\/li>\n\n\n\n<li>Weil dort N-Gramme auftauchen: In verschiedenen Teil-Korpora von Google Books nach N-Grammen (hier: Wortfolgen) suchen und schauen, wie sich die H\u00e4ufigkeit im Lauf der Jahrzehnte \u00e4ndert: <a href=\"https:\/\/books.google.com\/ngrams\/\">https:\/\/books.google.com\/ngrams\/<\/a><\/li>\n<\/ul>\n\n\n\n<p><em><a href=\"https:\/\/www.herr-rau.de\/wordpress\/2025\/05\/llm-grundlagen-teil-2-ueber-token.htm\">Fortsetzung folgt.<\/a><\/em><\/p>\n\n\n\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/vg01.met.vgwort.de\/na\/2962c4f66dcb4b4383e41a2b8ac1d420\" width=\"1\" height=\"1\" alt=\"\">\n","protected":false},"excerpt":{"rendered":"<p>(13 Kommentare.) Ich will in einer Reihe von Blogeintr\u00e4gen mir selbst erkl\u00e4ren, wie das alles funktioniert, und das dann nat\u00fcrlich auch vorzeigen. Vermutlich werden das in relativ rascher Folge drei Blogeintr\u00e4ge mit den einfachen Inhalten, die ich zu verstehen glaube, und dann wird eine lange Pause sein, weil dann die eigentlich spannenden Dinge kommen, die [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":64816,"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-64808","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_soekia_4-gram_bunt.png","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts\/64808","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=64808"}],"version-history":[{"count":3,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts\/64808\/revisions"}],"predecessor-version":[{"id":64984,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts\/64808\/revisions\/64984"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/media\/64816"}],"wp:attachment":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/media?parent=64808"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/categories?post=64808"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/tags?post=64808"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}