Signaturen und Module definieren
Signatursyntax, ChainOfThought, ReAct und benutzerdefinierte DSPy-Module.
Signaturen und Module definieren ist eine kostenlose AI Prompt Engineering-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des AI Prompt Engineering-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der AI Prompt Engineering-Kurs umfasst insgesamt 4 Lektionen.
Signaturen sind typisierte Verträge
Eine DSPy-Signatur ist eine Python-Klasse, die die Eingaben und Ausgaben eines Reasoning-Schritts deklariert. Stellen Sie sie sich als typisierten Funktionsvertrag für Ihren LLM-Aufruf vor.
Der Docstring wird zur Aufgabenbeschreibung. Feldannotationen teilen DSPy mit, was erzeugt werden soll. Sie schreiben niemals den eigentlichen Prompttext — DSPy leitet ihn aus dieser Deklaration ab.
Eine einfache Signatur definieren
Eine minimale Signatur leitet sich von dspy.Signature ab und versieht Felder mit den Annotationen InputField oder OutputField. Der Docstring der Klasse enthält die Aufgabenanweisung.
import dspy
class QASignature(dspy.Signature):
"""Answer the question based on the given context."""
context: str = dspy.InputField(desc='Relevant background text')
question: str = dspy.InputField(desc='The question to answer')
answer: str = dspy.OutputField(desc='A concise answer')
# Inspect what DSPy sees
print(QASignature.instructions) # The docstring
print(list(QASignature.input_fields.keys())) # ['context', 'question']
print(list(QASignature.output_fields.keys())) # ['answer']Mehrere Ausgabefelder
Signaturen können mehrere Ausgabefelder enthalten. DSPy fordert das Modell auf, alle Ausgaben in einem einzigen Aufruf zu erzeugen. Das ist nützlich, um strukturierte Informationen zu extrahieren.
import dspy
class EntityExtraction(dspy.Signature):
"""Extract named entities from the text."""
text: str = dspy.InputField()
people: list[str] = dspy.OutputField(desc='List of person names mentioned')
organizations: list[str] = dspy.OutputField(desc='List of organization names')
locations: list[str] = dspy.OutputField(desc='List of place names')
extractor = dspy.Predict(EntityExtraction)
result = extractor(text='Elon Musk founded SpaceX in Hawthorne, California.')
print(result.people, result.organizations, result.locations)Das Predict-Modul
dspy.Predict ist das einfachste Modul. Es übernimmt eine Signatur und fordert das LM direkt auf, die Ausgabe zu erzeugen. Es wird keine Reasoning-Struktur hinzugefügt — nur ein strukturierter Prompt, der zur Signatur passt.
Verwenden Sie Predict, wenn die Aufgabe unkompliziert ist und keine expliziten Reasoning-Schritte erfordert.
import dspy
class Classify(dspy.Signature):
"""Classify the sentiment of the review."""
review: str = dspy.InputField()
sentiment: str = dspy.OutputField(desc='positive, negative, or neutral')
# Predict wraps the signature with a direct prompt
classifier = dspy.Predict(Classify)
result = classifier(review='The food was amazing and the service was excellent!')
print(result.sentiment) # positiveDas ChainOfThought-Modul
dspy.ChainOfThought erweitert die Signatur um ein Zwischenfeld namens reasoning. Das Modell formuliert zunächst seine Überlegungen und erzeugt anschließend die endgültige Antwort.
Das verbessert die Genauigkeit bei mehrstufigen Problemen zuverlässig, ohne dass Sie Anweisungen für Chain-of-Thought-Prompts schreiben müssen.
import dspy
class MathSolver(dspy.Signature):
"""Solve the math problem."""
problem: str = dspy.InputField()
answer: str = dspy.OutputField(desc='The numerical answer')
# ChainOfThought adds a 'reasoning' step automatically
solver = dspy.ChainOfThought(MathSolver)
result = solver(problem='If a train travels 60 mph for 2.5 hours, how far does it go?')
print(result.reasoning) # Step-by-step reasoning
print(result.answer) # 150 milesDas ReAct-Modul
dspy.ReAct implementiert die Reason-and-Act-Schleife. Das Modell wechselt zwischen Reasoning-Schritten und Tool-Aufrufen und eignet sich daher ideal für Agenten, die suchen, Berechnungen durchführen oder Daten abrufen müssen.
Sie stellen eine Liste von Tools bereit (Python-Funktionen mit Docstrings), und DSPy übernimmt die automatische Abfolge.
import dspy
def search_web(query: str) -> str:
"""Search the web and return relevant results."""
# In production, call a real search API
return f'Search results for: {query}'
def calculate(expression: str) -> str:
"""Evaluate a mathematical expression."""
return str(eval(expression))
class ResearchQA(dspy.Signature):
"""Answer the question using web search and calculation as needed."""
question: str = dspy.InputField()
answer: str = dspy.OutputField()
agent = dspy.ReAct(ResearchQA, tools=[search_web, calculate])
result = agent(question='What is 15% of 847?')
print(result.answer)Module zu Programmen kombinieren
Die eigentliche Leistungsfähigkeit entsteht, wenn Sie Module zu mehrstufigen Programmen kombinieren. Leiten Sie eine Klasse von dspy.Module ab, definieren Sie die Unter-Module in __init__ und implementieren Sie forward(), um sie miteinander zu verbinden.
import dspy
class RetrieveAndAnswer(dspy.Module):
def __init__(self):
super().__init__()
self.retrieve = dspy.Retrieve(k=3) # Retrieves top-3 passages
self.generate = dspy.ChainOfThought('context, question -> answer')
def forward(self, question):
passages = self.retrieve(question).passages
context = '\n'.join(passages)
return self.generate(context=context, question=question)
# This is a complete RAG pipeline in ~10 lines
rag = RetrieveAndAnswer()
result = rag(question='What are the main causes of climate change?')
print(result.answer)Kurzschreibweise für Inline-Signaturen
Für einfache Fälle akzeptiert DSPy eine Signatur als Inline-Zeichenkette: 'input1, input2 -> output1, output2'. Das ist praktisch für schnelles Prototyping, ohne eine vollständige Klasse zu definieren.
import dspy
# Full class signature
class Translate(dspy.Signature):
"""Translate text to French."""
text: str = dspy.InputField()
translation: str = dspy.OutputField()
# Equivalent inline shorthand
translator_v1 = dspy.Predict(Translate)
translator_v2 = dspy.Predict('text -> translation') # Less metadata
# Both work the same way
result = translator_v1(text='Hello world')
print(result.translation)Feldbeschreibungen sind wichtig
Der Parameter desc in InputField und OutputField wird in den generierten Prompt aufgenommen. Gute Beschreibungen geben dem Modell präzise Anweisungen.
Betrachten Sie desc als die Dokumentation auf Feldebene, die neben dem Feldnamen im Prompt erscheint.
import dspy
class Summarize(dspy.Signature):
"""Summarize the article for a busy executive."""
article: str = dspy.InputField(
desc='The full article text to summarize'
)
summary: str = dspy.OutputField(
desc='3-5 bullet points highlighting key decisions and numbers'
)
confidence: float = dspy.OutputField(
desc='Your confidence in the summary accuracy from 0.0 to 1.0'
)
summarizer = dspy.Predict(Summarize)
# DSPy constructs a prompt using all the desc values automaticallyProgramme speichern und laden
Nach der Optimierung speichern Sie das kompilierte Programm, damit Sie die Optimierung nicht jedes Mal erneut ausführen müssen. DSPy serialisiert den optimierten Zustand in eine JSON-Datei.
import dspy
class QA(dspy.Signature):
"""Answer questions accurately."""
question: str = dspy.InputField()
answer: str = dspy.OutputField()
program = dspy.ChainOfThought(QA)
# After optimization, save the compiled state
program.save('optimized_qa.json')
# Load it later without re-running optimization
loaded_program = dspy.ChainOfThought(QA)
loaded_program.load('optimized_qa.json')
result = loaded_program(question='What is the speed of light?')
print(result.answer)Assertions für Ausgabebeschränkungen
Mit DSPy-Assertions können Sie Beschränkungen für Ausgaben deklarieren. Verletzt das Modell eine Beschränkung, versucht DSPy die Anfrage automatisch mit korrigierendem Feedback erneut — eine manuelle Retry-Logik ist nicht erforderlich.
import dspy
class ShortAnswer(dspy.Signature):
"""Answer in at most 10 words."""
question: str = dspy.InputField()
answer: str = dspy.OutputField()
class ConstrainedQA(dspy.Module):
def __init__(self):
super().__init__()
self.predict = dspy.Predict(ShortAnswer)
def forward(self, question):
result = self.predict(question=question)
# Assert: answer must be at most 10 words
dspy.Assert(
len(result.answer.split()) <= 10,
'The answer must be 10 words or fewer.'
)
return resultWissenscheck: ChainOfThought
Was fügt dspy.ChainOfThought im Vergleich zu dspy.Predict hinzu, wenn dieselbe Signatur verwendet wird?
Zusammenfassung: Signaturen und Module
DSPy-Signaturen sind typisierte Klassendeklarationen, die beschreiben, was ein LLM-Schritt tun soll — Eingaben, Ausgaben und eine Anweisung im Docstring. Module wie Predict, ChainOfThought und ReAct implementieren verschiedene Reasoning-Strategien rund um eine Signatur. Sie kombinieren mehrere Module innerhalb einer von dspy.Module abgeleiteten Klasse, um mehrstufige Pipelines zu erstellen. Die desc-Werte der Felder leiten das Modell im automatisch generierten Prompt an, und Assertions setzen Ausgabebeschränkungen mit automatischen Wiederholungen durch.
Lerne AI Prompt Engineering mit einem KI-Tutor — kostenlos
Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.
- Kurse
- 53
- Lektionen
- 199
Häufig gestellte Fragen
Ist die Lektion „Signaturen und Module definieren“ kostenlos?
Ja — der vollständige Text von „Signaturen und Module definieren“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des AI Prompt Engineering-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der AI Prompt Engineering-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Signaturen und Module definieren“?
Signatursyntax, ChainOfThought, ReAct und benutzerdefinierte DSPy-Module. Du übst AI Prompt Engineering mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um AI Prompt Engineering zu starten?
Keine Vorkenntnisse erforderlich. AI Prompt Engineering auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.
Wie lange dauert die Lektion „Signaturen und Module definieren“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser AI Prompt Engineering-Lektion Code schreiben und ausführen?
Ja. Jede AI Prompt Engineering-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Einführung in das DSPy Framework
- Signaturen und Module definieren
- Prompts kompilieren und optimieren
- DSPy-Pipelines evaluieren