AI Prompt Engineering · Lezione

Definizione di signature e moduli

Sintassi delle signature, ChainOfThought, ReAct e moduli DSPy personalizzati

Lezione 2 di 413 passaggi

Definizione di signature e moduli è una lezione AI Prompt Engineering gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento AI Prompt Engineering, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso AI Prompt Engineering include 4 lezioni in totale.

Le signature sono contratti tipizzati

Una signature DSPy è una classe Python che dichiara gli input e gli output di un passaggio di ragionamento. La si può considerare come un contratto di funzione tipizzato per la chiamata al proprio LLM.

La docstring diventa la descrizione dell'attività. Le annotazioni dei campi indicano a DSPy che cosa produrre. Non è mai necessario scrivere il testo effettivo del prompt: DSPy lo ricava da questa dichiarazione.

Definire una signature di base

Una signature minima eredita da dspy.Signature e annota i campi come InputField o OutputField. La docstring della classe fornisce l'istruzione per l'attività.

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']

Più campi di output

Le signature possono avere più campi di output. DSPy chiederà al modello di produrli tutti in un'unica chiamata. Questo è utile per estrarre informazioni strutturate.

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)

Il modulo Predict

dspy.Predict è il modulo più semplice. Riceve una signature e chiede direttamente al LM di produrre l'output. Non aggiunge alcuna struttura di ragionamento: genera soltanto un prompt strutturato conforme alla signature.

Si usi Predict quando l'attività è semplice e non richiede passaggi di ragionamento espliciti.

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

Il modulo ChainOfThought

dspy.ChainOfThought arricchisce la signature con un campo intermedio reasoning. Il modello espone prima il proprio ragionamento, quindi produce la risposta finale.

Questo migliora in modo costante l'accuratezza nei problemi a più passaggi, senza che Lei debba scrivere istruzioni di prompting chain-of-thought.

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

Il modulo ReAct

dspy.ReAct implementa il ciclo Reason + Act. Il modello alterna passaggi di ragionamento e chiamate agli strumenti, risultando ideale per gli agenti che devono cercare, calcolare o recuperare dati.

Si fornisce un elenco di strumenti (funzioni Python con docstring) e DSPy gestisce automaticamente l'alternanza.

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)

Comporre i moduli in programmi

La vera potenza deriva dalla composizione dei moduli in programmi a più passaggi. Si eredita da dspy.Module, si definiscono i sottomoduli in __init__ e si implementa forward() per collegarli.

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)

Abbreviazione per le signature inline

Per i casi semplici, DSPy accetta una signature inline sotto forma di stringa: 'input1, input2 -> output1, output2'. È una soluzione comoda per la prototipazione rapida, senza definire una classe completa.

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)

Le descrizioni dei campi sono importanti

Il parametro desc in InputField e OutputField viene incluso nel prompt generato. Descrizioni accurate guidano il modello con precisione.

Si consideri desc come la documentazione a livello di campo che appare nel prompt accanto al nome del campo.

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

Salvare e caricare i programmi

Dopo l'ottimizzazione, si salvi il programma compilato per non dover eseguire nuovamente l'ottimizzazione ogni volta. DSPy serializza lo stato ottimizzato in un file JSON.

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 per i vincoli sugli output

Le Assertions di DSPy consentono di dichiarare vincoli sugli output. Se il modello viola un vincolo, DSPy riprova automaticamente fornendo un feedback correttivo: non è necessaria alcuna logica manuale per i nuovi tentativi.

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

Verifica delle conoscenze: ChainOfThought

Che cosa aggiunge dspy.ChainOfThought rispetto a dspy.Predict quando si usa la stessa signature?

Riepilogo: signature e moduli

Le signature DSPy sono dichiarazioni di classi tipizzate che descrivono ciò che dovrebbe fare un passaggio LLM: input, output e un'istruzione nella docstring. Moduli come Predict, ChainOfThought e ReAct implementano diverse strategie di ragionamento intorno a una signature. Si compongono più moduli all'interno di una sottoclasse di dspy.Module per creare pipeline a più passaggi. I valori desc dei campi guidano il modello nel prompt generato automaticamente, mentre le Assertions impongono vincoli sugli output con nuovi tentativi automatici.

Gratis per iniziare

Impara AI Prompt Engineering con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
53
Lezioni
199

Domande Frequenti

La lezione «Definizione di signature e moduli» è gratuita?

Sì — il testo completo di «Definizione di signature e moduli» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso AI Prompt Engineering, passa a CoddyKit PRO. Il corso AI Prompt Engineering include 4 lezioni in totale.

Cosa imparerò in «Definizione di signature e moduli»?

Sintassi delle signature, ChainOfThought, ReAct e moduli DSPy personalizzati Eserciti AI Prompt Engineering con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare AI Prompt Engineering?

Non è richiesta alcuna esperienza precedente. AI Prompt Engineering su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.

Quanto tempo richiede la lezione «Definizione di signature e moduli»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione AI Prompt Engineering?

Sì. Ogni lezione AI Prompt Engineering include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Introduzione al framework DSPy
  2. Definizione di signature e moduli
  3. Compilazione e ottimizzazione dei prompt
  4. Valutazione delle pipeline DSPy
← Torna a AI Prompt Engineering