In diesem Beitrag beschäftige ich mich mit Python-Anwendungen zum Thema Generative KI.
Bezugspunkt ist das gleichnamige Buch (1.Auflage) und die Code-Beispiele darin. Leider funktionieren die dort abgedruckten bzw. im git-Repository des Autors abgelegten Programme nicht immer problemlos, was meist dem Umstand geschuldet ist, dass die Entwicklung der benutzten Python-Bibliotheken einem ständigen und rasanten Wandel unterworfen ist.
Auf Nachfrage beim Verlag erhielt ich aber sehr schnell Antwort und tatkräftige Unterstützung durch den Autor.
Ich verwende wie im Buch empfohlen uv zur Python-Konfiguration sowie in den meisten Fällen Jupyter Notebooks.
Nach den ersten frustrierenden Erfahrungen in Kapitel 3 konnte ich nach und nach alle Codierungs-Probleme lösen,
meist durch eine schrittweise Vorgehensweise mittels Jupyter Notebooks und eine geduldige Internet-Recherche anhand konkreter Fehlermeldungen. An einer Stelle fand ich als einzige Lösung das komplette Rücksetzen der Programmierumgebung und erneute Klonen des Git-Repositorys. Im Nachgang kann ich nicht mehr alle Problemstellen aus Kapitel 3 aus dem Kopf benennen. Daher beginne ich mit Kapitel 4 alle Probleme aufzulisten, die während der Tests auftraten, sowie meine Behelfslösungen dazu.
Dieser Blog-Beitrag soll keine reine Druck- und Programm-Fehler Dokumentation des obigen Buches sein, sondern auch zusätzliche Experimente und eigene Erfahrungen darstellen. Ich möchte auch explizit betonen, dass ich das Buch für sehr gut strukturiert und lesenswert erachte, um einen schnellen Einstieg und eine gute Übersicht über aktuelle Entwicklungen auf dem Gebiet Generative KI zu erhalten!
4) Large Language Models
4.2) LLMs mit Hilfe von Python nutzen
4.2.4) Coding: Multimodale Modelle
Da ich keinen kommerziellen API-Schlüssel bei OpenAI erwerben wollte, habe ich das erste Beispiel auf den Seiten 94-96 nicht ausprobiert, sondern stattdessen die Beispiele für die kostenlosen LLMs von Groq genutzt. Im Buch wird das zugehörige Python-Skript falsch benannt, es muss auf S.97 unten „20_model_chat_groq.py“ statt „10_model_chat_groq.py“ heißen. Aber auch das richtige Skript bricht mit einer Fehlermeldung ab, da das verwendete Modell „llama-3.1-70b-versatile“ nicht mehr verfügbar ist. Stattdessen kann das Nachfolge-Modell „llama-3.3-70b-versatile“ verwendet werden. Zudem ist zusätzlich ein Methodenaufruf nicht mehr aktuell und die zugehörige print-Anweisung fehlt. Damit funktionert das Programm momentan.

Selbstverständlich ist das Beispielprogramm auch in der Lage, andere Fragen in deutscher Sprache zu beantworten😎 Beeindruckend!

Im nächsten Beispiel (60_multimodal.py) soll ein Bild textuell erklärt werden. Doch das angegebene Modell ist veraltet und wirft eine entsprechende Fehlermeldung.

Glücklicherweise gibt uns die Fehlermeldung auch gleich den Hinweis, wo wir Ersatz finden.

Mit dem neuen Modell funktioniert das Programm dann auch.

Wir folgen dem Hinweis im Buch, detailliertere Fragen zu stellen und lassen uns die genaue Funktionsweise des Optimizers erklären.

Das Ergebnis stellt uns durchaus zufrieden.

4.2.5) Coding: LLMs lokal betreiben
Der Beispielcode 70_ollama.py funktioniert wie beschrieben.
Wir gehen einen Schritt weiter und versuchen uns an einer kurzen Sprachübersetzung.

Wir passen den obigen Code den Hinweisen der Warnmeldung entsprechend an.
Das Ergebnis kann sich sehen lassen – nicht nur, dass neben der wörtlichen weitere alternative Übersetzungen angeboten werden. Das Modell ist sich offenbar über die Bedeutung des lustig gemeinten Zusammenhangs voll bewusst!

Die Übersetzung Italienisch-Deutsch funktioniert zwar etwas holprig – aber trotzdem beeindruckend!

4.6) Prompt Templates
4.6.2) Coding…
Die Coding-Beispiele zu LangChain Hub und Chains sind allesamt ohne kostenpflichtigen API-Key von OpenAI nicht nutzbar! Ein kostenloser API-Key funktioniert nicht☹️
Z.B. stürzt der Beispielcode 31_prompt_hub.py im Buch mit folgender Fehlermeldung ab.

Wir versuchen das obige Beispiel auf Groq umzumünzen und erhalten ein Ergebnis.

Die obige Warnung ignorieren wir.


Obwohl ich bei LangSmith wie empfohlen einen Account mit API-Key einrichte und diesen in der Datei .env konfiguriere, funktioniert der obige Code danach überhaupt nicht mehr. Daher belassen wir es so wie es ist.
Immerhin können die Beispiele im Buch damit kostenlos nachvollzogen werden.
Mit Shakespeare haben wir hierzulande wenig am Hut und wollen daher eine Geschichte von einem populären deutschen Autor lesen. Wir ändern dazu lediglich die beiden Prompt-Variablen.


In der Nordsee auf Eisberge zu treffen, klingt nach einer komischen Idee, aber das reisst die obige Story auch nicht raus. Wir versuchen daher, unsere Anforderung klarer zu stellen.


Nun ja – schätzungweise muss Herr Jaud diese Konkurrenz vorerst nicht fürchten…
4.7) Chains
4.7.1) Coding: Eine einfache sequentielle Chain
Das Beispiel 40_simple_chain.py benötigt wieder den kostenpflichtigen API-Key von OpenAI. Wir stellen den Code daher auf Groq um.

4.7.2) Coding: Parallele Chains
Wir stellen das Beispiel 41_parallel_chain.py wieder auf Groq um…



4.7.3) Coding: Router Chain
Das Beispiel 45_semantic_router.py im Buch lässt sich wegen offenbar fehlender Embeddings-Unterstützung derzeit nicht ohne weiteres für Groq adaptieren?!
Da Ollama Embeddings aber gut unterstützt, können wir das Beispiel mit wenigen Anpassungen nutzen.
Zuvor laden wir das entsprechende Modell lokal herunter.


Der restliche Python-Code des Buches kann unangetastet bleiben und funktioniert einwandfrei.

Selbstverständlich funktionieren auch die historische und mathematische Anfrage wie gewünscht.


Natürlich nur in gewissen Grenzen 😂

4.7.4) Coding: Chain mit Gedächtnis
Der Beispielcode 42_chain_game.py ist (nach Umwandlung in ein Jupyter Notebook) wieder mit einer geringfügigen Anpassung für die Umstellung von OpenAI auf Groq sofort lauffähig.


Hinweis: Der obige Programm-Code ist leichter zu verstehen, wenn man einen Debugger zur Hilfe nimmt, z.B. den aus JupyterLab.

Damit lässt sich der Programmfluss leichter verstehen und man erkennt zum Beispiel, dass die Spielhistorie in diesem Programm lediglich in einem Handlungsstrang verläuft – die Session-ID „03“ ändert sich hier nicht. Die ID „03“ hat auch nichts mit einer der drei angebotenen Optionen zu tun, sie könnte genauso gut „hugo“ heißen. Ich finde diesen Umstand etwas verwirrend…
4.8.2 LLM-Schutz
Übung: LLM – Beim Thema bleiben
Das Beispiel 80_llm_stay_on_topic.py funktioniert bei mir ohne Code-Anpassungen.
Llama-Guard
Im Gegensatz zum letzten Beispiel funktioniert 90_llm_llamaguard.py nicht ohne Fehlerbehebung.
Zunächst muss, wie im Buch erläutert, der entsprechende Antrag auf Hugging Face gestellt werden. Bei mir hat es etliche Stunden gedauert, bis dieser genehmigt war.

Bei der nachfolgenden Ausführung stürzt das Programm mit einer AttributError-Exception ab.

Nach etwas Google-Recherche finden wir einen Hinweis und nach entsprechender Korrektur funktioniert unser Programm wie erwartet (Man darf gespannt sein, wann die Software, anstatt abzustürzen, mit entsprechenden KI-Fähigkeiten sich selbst korrigiert, nachdem es anhand seiner eigenen Fehlermeldungen eine Lösung gefunden hat🤗).
Nach einigen Minuten Wartezeit erhalten wir die erwartete Auskunft.

5) Prompt Engineering
5.2) Coding: Few-Shot Prompting
Das Beispielprogramm 10_few_shot.py ist nicht lauffähig.
Zum einen ist das Modell veraltet und muss entsprechend der Info-Seite ersetzt werden.


Nach Austausch des Modells erhalten wir erneut eine Fehlermeldung wegen des angeblichen Fehlens der Python-Bibliothek pyperclip.

Es ist nicht ersichtlich, wozu diese Bibliothek gebraucht wird. Daher kommentieren wir die Zeile einfach aus und erhalten nach einem erneuten Programmstart unser gewünschte Ergebnis. Die Ausgabe des Modells ist zwar nicht wortgleich zur Antwort im Buch, doch im Kern entsprechen sich die Aussagen inhaltlich völlig.

5.5) Coding: Self-Consistency Chain-of-Thought
Auch hier müssen wir in 30_self_consistency.py das veraltete Modell wieder ersetzen, damit das Beispiel funktionieren kann.