Generative KI mit Python

  • Beitrags-Autor:Peter Kühn
  • Beitrags-Kategorie:Wiki
  • Beitrags-Kommentare:0 Kommentare

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.

20_model_chat_groq.ipynb

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.

Fehlermeldung für Modell „llama-3.2-90b-vision-preview“

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

https://console.groq.com/docs/deprecations

Mit dem neuen Modell funktioniert das Programm dann auch.

korrigiertes Jupyter Notebook

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

Frage nach der Funktionsweise des Optimizers

Das Ergebnis stellt uns durchaus zufrieden.

ausführliche Antwort zur gestellten Detailfrage

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.

Warnung wegen veralteter Ollama-Klasse

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!

Das Modell versteht, was es übersetzt

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

Übersetzung aus dem Italienischen

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.

pay to play…

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

Anpassung: ChatGroq statt ChatOpenAI

Die obige Warnung ignorieren wir.

Shakespeare lebt!

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.

Wir wollen etwas Neues von Tommy Jaud lesen
unlustig in den „eisigen Gewässern“ der Nordsee…

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.

lustiger bitte…
weiterhin unlustig trotz komischer Elemente

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.

40_simple_chain.ipynb

4.7.2) Coding: Parallele Chains

Wir stellen das Beispiel 41_parallel_chain.py wieder auf Groq um…

41_parallel_chain.ipynb
eine freundliche Erklärung
die harsche Antwort

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.

Download llama3
Code-Anpassungen

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

eine musikalische Anfrage

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

historische Frage
mathematische Frage

Natürlich nur in gewissen Grenzen 😂

das Modell weiss, das es nichts darüber weiss…

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.

Codeanpassungen für Groq
Rollenspiel von vorgestern mit heutiger KI-Technik

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

Beim Code-Debugging

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.

Antrag genehmigt

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

Programmfehler

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.

korrigiertes Programm

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.

Fehlermeldung mit Verweis auf die Info-Seite
das Ersatzmodell

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

Fehlermeldung wg. „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.

Schreibe einen Kommentar