Der Zitat Generator soll in der Lage sein, zu einem vorgegebenen Thema ein Zitat im Stil einer bestimmten berühmten Persönlichkeit zu generieren. Das Projekt dient der Festigung der grundlegenden Konzepte von DSPy, insbesondere der Signatures und Predict-Module. Für ChainOfThought sehe ich hier keine Verwendeung, da es keine verschachtelten Aufgaben gibt, die man in Einzelschritten durchgehen muss.
Theoretische Grundlagen
Ich werde den Zitat-Generators auf den folgenden beiden Komponenten des DSPy-Frameworks aufbauen.
dspy.Signature
Details unter: Tag 2: Das erste DSPy-Programmdspy.Predict
Details unter: Tag 2: Das erste DSPy-Programm
Praktische Umsetzung
Die Umsetzung erfolgt in mehreren Schritten: Konfiguration der Umgebung, Definition der Signatur, Erstellung des Vorhersagemoduls und schließlich die Ausführung des Programms.
Konfiguration des Sprachmodells
Zunächst muss wieder eine Verbindung zu einem Sprachmodell hergestellt werden. In diesem Beispiel wird ein Modell von Qwen verwendet. Es ist ein 8 Milliarden Parameter Vision Modell, wobei in dem Beispiel kein Vision Encoder verwendet wird. Daher kann man auch ein anderes kleines Modell verwenden.
import dspy
local_llm = dspy.LM(
"openai/Qwen3-VL-8B-Instruct-Q4_K_M.gguf",
api_base="http://localhost:8080/v1",
api_key="no_key_needed",
temperature=2,
cache=False
)
dspy.configure(lm=local_llm)
Ich habe hier den DSPy Cache deaktiviert und die temperature sehr hoch festgelegt. Das führt zu mehr „Kreativität“ und diverseren Antworten. So kann man das DSPY Programm mehrmals ausführen und erhält jedes mal ein anders Zitat. Details zu temperature kann man unter Die Macht der Parameter in der Huggingface Transformer-Textgenerierung nachlesen.
Definition der Signatur
Die Signatur legt die Ein- und Ausgabestruktur fest. Der Docstring der Klasse beschreibt die Gesamtaufgabe des Moduls. Die Docstrings der einzelnen Felder spezifizieren deren Inhalt.
class GenerateQuote(dspy.Signature):
"""Generiere ein Zitat zu einem bestimmten Thema im Stil einer berühmten Persönlichkeit."""
# Eingabefeld für das Thema des Zitats
topic = dspy.InputField(desc="Das Thema, über das das Zitat handeln soll.")
# Eingabefeld für die Persönlichkeit, deren Stil imitiert werden soll
persona = dspy.InputField(desc="Die berühmte Persönlichkeit, deren Schreibstil nachgeahmt werden soll.")
# Ausgabefeld für das generierte Zitat
quote = dspy.OutputField(desc="Ein prägnantes und inspirierendes Zitat (ca. 1-2 Sätze).")
Erstellung und Ausführung des Generators
Ein dspy.Predict-Modul wird mit der soeben definierten GenerateQuote-Signatur instanziiert. Anschließend wird das Modul mit konkreten Werten für topic und persona aufgerufen, um ein Zitat zu generieren.
# Erstellen einer Instanz des Predict-Moduls mit der definierten Signatur
quote_generator = dspy.Predict(GenerateQuote)
# Ausführen des Generators mit spezifischen Eingaben
topic_input = "die Bedeutung von künstlicher Intelligenz für die Zukunft der Menschheit"
persona_input = "Albert Einstein"
# Der Aufruf an das Modul führt die LLM-Inferenz aus
prediction = quote_generator(topic=topic_input, persona=persona_input)
# Ausgabe des generierten Zitats
print(f"Thema: {topic_input}")
print(f"Persona: {persona_input}")
print("-" * 30)
print(f"Generiertes Zitat: {prediction.quote}")
Ergebnis
Die Ausführung des obigen Codes führt zu einer Ausgabe, die ein Zitat enthält, das sowohl das Thema als auch den Stil der angegebenen Persönlichkeit widerspiegelt. Ein Beispielergebnis könnte wie folgt aussehen:
Thema: die Bedeutung von künstlicher Intelligenz für die Zukunft der Menschheit
Persona: Albert Einstein
------------------------------
Generiertes Zitat: Künstliche Intelligenz ist nicht nur ein Werkzeug, sondern ein Spiegel unserer eigenen Fähigkeit zur Erkenntnis – und wenn wir sie nicht mit Weisheit lenken, wird sie das, was wir fürchten, nicht das, was wir hoffen.
Interpretation der Ergebnisse
Das generierte Ergebnis demonstriert die Funktionsweise der programmatischen Prompt-Erstellung in DSPy. Das Framework hat die in der GenerateQuote-Signatur definierten Felder und deren Beschreibungen genutzt, um eine präzise Anweisung für das Sprachmodell zu formulieren. Das LLM wurde dadurch angewiesen, nicht nur eine allgemeine Aussage zur künstlichen Intelligenz zu treffen, sondern dies spezifisch im nachdenklichen und leicht metaphorischen Stil von Albert Einstein zu tun. Das Ergebnis ist somit kein zufälliges Produkt, sondern eine direkte Folge der strukturierten und deskriptiven Vorgaben in der Signatur.
Analyse des Prompts
System message:
Your input fields are:
1. `topic` (str): Das Thema, über das das Zitat handeln soll.
2. `persona` (str): Die berühmte Persönlichkeit, deren Schreibstil nachgeahmt werden soll.
Your output fields are:
1. `quote` (str): Ein prägnantes und inspirierendes Zitat (ca. 1-2 Sätze).
All interactions will be structured in the following way, with the appropriate values filled in.
[[ ## topic ## ]]
{topic}
[[ ## persona ## ]]
{persona}
[[ ## quote ## ]]
{quote}
[[ ## completed ## ]]
In adhering to this structure, your objective is:
Generiere ein Zitat zu einem bestimmten Thema im Stil einer berühmten Persönlichkeit.
User message:
[[ ## topic ## ]]
die Bedeutung von künstlicher Intelligenz für die Zukunft der Menschheit
[[ ## persona ## ]]
Albert Einstein
Respond with the corresponding output fields, starting with the field `[[ ## quote ## ]]`, and then ending with the marker for `[[ ## completed ## ]]`.
Response:
[[ ## quote ## ]]
Künstliche Intelligenz ist nicht nur ein Werkzeug, sondern ein Spiegel unserer eigenen Fähigkeit zur Erkenntnis – und wenn wir sie nicht mit Weisheit lenken, wird sie das, was wir fürchten, nicht das, was wir hoffen.
[[ ## completed ## ]]
DSPy wandelt die programmatische Definition von Signatur und Modul in eine strukturierte Anweisung um, die dem LLM eine klare und unmissverständliche Aufgabe stellt.
Analyse des System-Prompts (System Message)
Der System-Prompt dient dazu, dem LLM den Kontext und die Struktur der Aufgabe zu vermitteln. Er lässt sich in drei funktionale Blöcke unterteilen:
Definition der Ein- und Ausgabefelder:
Your input fields are: ...Your output fields are: ...
Der Prompt listet explizit die Namen und Datentypen der in derdspy.Signaturedefinierten Felder (topic,persona,quote). Entscheidend ist, dass DSPy diedesc-Attribute der Felder (Das Thema, über das das Zitat handeln soll.) direkt in den Prompt übernimmt. Dadurch wird dem Modell die genaue semantische Bedeutung jedes Feldes mitgeteilt.
Festlegung der Interaktionsstruktur:
All interactions will be structured in the following way...
Hier wird ein striktes Format für den Datenaustausch definiert. Jedes Feld wird durch eindeutige Marker ([[ ## field_name ## ]]) gekapselt. Diese Strukturierung zwingt das LLM, in einem vorhersagbaren und maschinell einfach zu verarbeitenden Format zu antworten. Dies eliminiert die Variabilität und Unzuverlässigkeit von Freitextantworten.
Beschreibung der Gesamtaufgabe:
In adhering to this structure, your objective is: Generiere ein Zitat zu einem bestimmten Thema im Stil einer berühmten Persönlichkeit.
Dieser Teil des Prompts entspricht dem Docstring derGenerateQuote-Signaturklasse. DSPy nutzt diesen, um dem Modell das übergeordnete Ziel der Aufgabe zu vermitteln.
Zusammenfassend lässt sich sagen, dass der System-Prompt nicht einfach eine Frage stellt, sondern das LLM instruiert, wie ein Programm zu funktionieren hat. Es erhält klar definierte Eingaben in einem bestimmten Format und muss klar definierte Ausgaben im selben Format produzieren, um ein spezifisches Ziel zu erreichen.
Analyse der Benutzernachricht (User Message)
Die Benutzernachricht stellt die konkrete Anwendung der im System-Prompt definierten Vorlage dar.
[[ ## topic ## ]] die Bedeutung von künstlicher Intelligenz für die Zukunft der Menschheit[[ ## persona ## ]] Albert Einstein
DSPy füllt hier die Platzhalter der Interaktionsstruktur mit den zur Laufzeit übergebenen Argumenten (topic_input, persona_input). Der abschließende Satz Respond with the corresponding output fields... ist eine direkte Anweisung an das LLM, mit der Generierung der Antwort zu beginnen und dabei exakt die im System-Prompt definierte Struktur zu befolgen.
Analyse der LLM-Antwort (Response)
Die Antwort des LLM wird in zwei Dimensionen bewertet: strukturelle Konformität und inhaltliche Qualität.
Strukturelle Konformität:
[[ ## quote ## ]] ... [[ ## completed ## ]]
Die Antwort des Modells hält sich exakt an das vorgegebene Format. Sie beginnt mit dem Marker für das Ausgabefeld[[ ## quote ## ]]und endet mit dem Abschlussmarker[[ ## completed ## ]]. Dies bestätigt die Effektivität des strukturierten Prompts. DSPy kann diese Antwort nun zuverlässig parsen und den Wert desquote-Feldes extrahieren.
Inhaltliche Qualität:
Künstliche Intelligenz ist nicht nur ein Werkzeug, sondern ein Spiegel unserer eigenen Fähigkeit zur Erkenntnis – und wenn wir sie nicht mit Weisheit lenken, wird sie das, was wir fürchten, nicht das, was wir hoffen.
Das generierte Zitat erfüllt die inhaltlichen Anforderungen der Aufgabe:- Thema: Es bezieht sich direkt auf die „Bedeutung von künstlicher Intelligenz“.
- Persona: Der Stil ist philosophisch, nachdenklich und mahnend, was dem öffentlichen Bild von Albert Einstein entspricht. Die Verwendung von Metaphern („Spiegel unserer eigenen Fähigkeit zur Erkenntnis“) und die Gegenüberstellung von Chance und Risiko („was wir fürchten, nicht das, was wir hoffen“) sind typische Merkmale eines solchen Stils.
- Vorgabe: Das Zitat ist prägnant und besteht aus einem einzigen langen Satz, was der Vorgabe
(ca. 1-2 Sätze)entspricht.
Die Analyse zeigt, dass DSPy eine Aufgabe von einer unstrukturierten Anweisung in einen klar definierten, programmatischen Prozess überführt. Anstatt nur zu fragen „Schreibe ein Zitat…“, definiert DSPy eine Funktion mit expliziten Eingabe- und Ausgabeparametern. Das LLM wird instruiert, diese Funktion auszuführen.
Zusammenfassung
Tag 6 schließt mit einem DSPy-Programm ab, das die Kernkomponenten dspy.Signature und dspy.Predict kombiniert. Dieses Projekt zeigt, wie durch die Abstraktion von Prompts in strukturierte Signaturen eine robuste und wartbare Grundlage für die Entwicklung von LLM-Anwendungen geschaffen wird. Die Fähigkeit, das Verhalten von Modellen durch klar definierte Ein- und Ausgabeschemata zu steuern, ist ein fundamentaler Vorteil des DSPy-Ansatzes.
