Mini-Sprachmodell in Python
Bauen Sie Ihr eigenes Bigramm-Modell in Python: Wörter zählen, Wahrscheinlichkeiten berechnen, Text generieren — und mit ChatGPT vergleichen.
- Sie können ein Bigramm-Modell in Python implementieren: Wortpaare zählen, Übergangswahrscheinlichkeiten berechnen und Texte generieren.Anwenden
- Sie können den generierten Text evaluieren und den Einfluss des Trainingskorpus auf die Qualität der Ausgabe beurteilen.Anwenden
- Sie können den Massstabsunterschied zwischen dem eigenen Bigramm-Modell und grossen Sprachmodellen (Milliarden Parameter, Transformer) erklären.Verstehen
Ăśberblick
Sie setzen um, was Sie Unplugged simuliert haben: Ein eigenes Sprachmodell in Python. Schritt für Schritt erstellen Sie ein Bigramm-Modell, das Sätze generiert. Zum Vergleich setzen Sie das Ergebnis neben ChatGPT — gleiche Idee, anderer Massstab.
Kompetenzen
- Ein Bigramm-Modell in Python implementieren
- Wortfrequenzen und bedingte Wahrscheinlichkeiten berechnen
- Texte generieren und evaluieren
- Den Massstabsunterschied zum eigenen Modell ↔ ChatGPT erklären
Von der MĂĽnze zum Code
In der Unplugged-Übung haben Sie ein Sprachmodell mit Papier und Stift gebaut: Pfeile zwischen Wörtern, zufällig wählen, Satz aufschreiben.
Jetzt setzen Sie exakt dieses Prinzip in Python um. Keine neuronalen Netze, keine Bibliotheken — nur Wörter zählen und Wahrscheinlichkeiten berechnen.
Dafür benötigen Sie: random und collections (beide sind in Python vorinstalliert).
Challenge
Schritt 1: Trainingsdaten einlesen
Das Modell braucht Text zum Lernen. Wir nutzen wieder die Grimm-Märchen.
Erstellen Sie eine Liste von Trainingssätzen:
trainingsdaten = [
"Es war einmal ein Königssohn der bekam Lust in der Welt umherzuziehen",
"Es war einmal ein König und eine Königin die lebten in Frieden",
"Es war ein armer Mann und eine arme Frau die hatten nichts als eine kleine HĂĽtte"
]Aufgabe: Zerlegen Sie jeden Satz in eine Liste von Wörtern (.split()) und speichern Sie alle Wortpaare (Bigramme) mit ihrer Häufigkeit.
Tipp: Ein Bigramm ist ein Paar (wort1, wort2). Zählen Sie mit defaultdict(int) oder einem normalen Dictionary.
Challenge
Schritt 2: Ăśbergangswahrscheinlichkeiten berechnen
Für die Generierung brauchen wir nicht nur Häufigkeiten, sondern Wahrscheinlichkeiten: Wenn das aktuelle Wort X ist, wie wahrscheinlich ist Wort Y als nächstes?
Bauen Sie ein Dictionary dieser Form:
modell = {
"Es": [("war", 1.0)],
"war": [("einmal", 0.5), ("ein", 0.25), ("eine", 0.25)],
...
}Aufgabe: Berechnen Sie für jedes Wort die relativen Häufigkeiten aller Folge-Wörter. Die Summe der Wahrscheinlichkeiten pro Wort muss 1.0 ergeben.
Challenge
Schritt 3: Text generieren
Nun bauen Sie die Generierungsfunktion. Das ist genau die Münze aus der Unplugged-Übung — nur in Code.
import random
def generiere_text(modell, start_wort, laenge=15):
wort = start_wort
satz = [wort]
for _ in range(laenge):
if wort not in modell:
break
nachfolger = modell[wort]
# Zufällig wählen, gewichtet nach Wahrscheinlichkeit
wort = random.choices(
[w for w, p in nachfolger],
weights=[p for w, p in nachfolger]
)[0]
satz.append(wort)
return " ".join(satz)Aufgabe: Rufen Sie die Funktion mit verschiedenen Startwörtern auf. Was passiert, wenn Sie mit «Es» starten? Was mit «ein»?
Warning
Häufige Fehler
- KeyError bei der Generierung: Nicht jedes Wort aus dem Training hat Folge-Wörter. Prüfen Sie mit
if wort not in modell: break. - Wahrscheinlichkeiten summieren nicht zu 1.0: Prüfen Sie, ob Sie die Häufigkeiten korrekt durch die Gesamtzahl teilen.
- Immer derselbe Output: Vergessen Sie nicht
random.choices()mit Gewichten zu verwenden, nichtrandom.choice(). - Satz wird zu lang: Setzen Sie ein vernĂĽnftiges Limit (
laenge=15) und brechen Sie ab, wenn das Wort keine Nachfolger hat.
Reflection
Vergleich: Ihr Modell vs. ChatGPT
| Ihr Bigramm-Modell | ChatGPT (GPT-4) | |
|---|---|---|
| Parameter | ~50 Übergänge | ~1,8 Billionen |
| Kontext | 1 Wort | 128.000 Token |
| Trainingsdaten | 3 Sätze | ~13 Billionen Token |
| Architektur | Markov-Kette | Transformer + RLHF |
| Generierung | Wort = wahrscheinlichstes nächstes | Token = wahrscheinlichstes nächstes |
Das Prinzip ist identisch: Nächste Einheit vorhersagen, basierend auf Wahrscheinlichkeiten. Der Unterschied? Massstab.
Bonus: Grösseres Korpus
Laden Sie einen längeren Text (z.B. eine Datei mit allen Grimm-Märchen) und trainieren Sie Ihr Modell damit.
Beobachtung: Wie verändert sich die Qualität der generierten Sätze? Werden sie «besser»? Warum?
Dieser Effekt zeigt genau, warum grosse Sprachmodelle so viel mehr Trainingsdaten brauchen: Mehr Daten = bessere Muster = plausiblere Ausgabe.
Abschlussaufgabe
Kopieren Sie Ihren vollständigen Bigramm-Code unten hinein. Ihr Code sollte:
- Trainingsdaten einlesen und Bigramme zählen
- Ăśbergangswahrscheinlichkeiten berechnen
- Einen Text von mindestens 10 Wörtern generieren
Extra: FĂĽgen Sie einen kurzen Kommentar hinzu, was ĂĽberraschend war am generierten Text.
Quellen & Attribution
- Let's build GPT: from scratch, in code (Video) Karpathy, Andrej
- Sprachmodelle unplugged mit Grimms Märchen Olari, V.; Zoppke, T.; Romeike, R.