AI Prompt Engineering · Lektion

Signaturen und Module definieren

Signatursyntax, ChainOfThought, ReAct und benutzerdefinierte DSPy-Module.

Lektion 2 von 413 Schritte

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)  # positive

Das 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 miles

Das 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 automatically

Programme 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 result

Wissenscheck: 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.

Kostenlos starten

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

  1. Einführung in das DSPy Framework
  2. Signaturen und Module definieren
  3. Prompts kompilieren und optimieren
  4. DSPy-Pipelines evaluieren
← Zurück zu AI Prompt Engineering