AI Prompt Engineering · Aula

Definindo assinaturas e módulos

Sintaxe de assinaturas, ChainOfThought, ReAct e módulos DSPy personalizados.

Aula 2 de 413 etapas

Definindo assinaturas e módulos é uma aula grátis de AI Prompt Engineering no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de AI Prompt Engineering, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de AI Prompt Engineering inclui 4 aulas no total.

Signatures são contratos tipados

Uma signature do DSPy é uma classe Python que declara as entradas e saídas de uma etapa de raciocínio. Pense nela como um contrato de função tipado para sua chamada ao LLM.

A documentação da classe se torna a descrição da tarefa. As anotações dos campos informam ao DSPy o que produzir. Você nunca escreve o texto real da instrução — o DSPy o deriva dessa declaração.

Definindo uma signature básica

Uma signature mínima herda de dspy.Signature e anota os campos como InputField ou OutputField. A documentação da classe fornece a instrução da tarefa.

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

Vários campos de saída

As assinaturas podem ter vários campos de saída. O DSPy instruirá o modelo a produzir todos eles em uma única chamada. Isso é útil para extrair informações estruturadas.

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)

O módulo Predict

dspy.Predict é o módulo mais simples. Ele recebe uma signature e solicita diretamente ao LM que produza a saída. Nenhuma estrutura de raciocínio é adicionada — apenas uma instrução estruturada correspondente à signature.

Use Predict quando a tarefa for direta e não exigir etapas explícitas de raciocínio.

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

O módulo ChainOfThought

dspy.ChainOfThought amplia a signature com um campo intermediário reasoning. Primeiro, o modelo escreve seu raciocínio e depois produz a resposta final.

Isso melhora consistentemente a precisão em problemas com várias etapas, sem que você precise escrever instruções de raciocínio passo a passo.

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

O módulo ReAct

dspy.ReAct implementa o ciclo Raciocinar + Agir. O modelo alterna entre etapas de raciocínio e chamadas de ferramentas, o que o torna ideal para agentes que precisam pesquisar, calcular ou obter dados.

Você fornece uma lista de ferramentas (funções Python com documentação), e o DSPy gerencia automaticamente a intercalação.

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)

Compondo módulos em programas

O verdadeiro poder surge ao combinar módulos em programas com várias etapas. Herde de dspy.Module, defina os submódulos em __init__ e implemente forward() para conectá-los.

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)

Forma abreviada de signature embutida

Para casos simples, o DSPy aceita uma signature em cadeia de texto embutida: 'input1, input2 -> output1, output2'. Isso é conveniente para prototipagem rápida, sem definir uma 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)

As descrições dos campos são importantes

O parâmetro desc em InputField e OutputField é incluído na instrução gerada. Boas descrições orientam o modelo com precisão.

Pense em desc como a documentação no nível do campo que aparece na instrução ao lado do nome do 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

Salvando e carregando programas

Depois da otimização, você salva o programa compilado para não precisar executar a otimização novamente todas as vezes. O DSPy serializa o estado otimizado em um arquivo 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)

Asserções para restrições de saída

As asserções do DSPy permitem declarar restrições para as saídas. Se o modelo violar a restrição, o DSPy tentará novamente automaticamente usando feedback corretivo — não é necessária nenhuma lógica manual de novas tentativas.

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ção de conhecimento: ChainOfThought

O que dspy.ChainOfThought adiciona em comparação com dspy.Predict ao usar a mesma signature?

Recapitulação: signatures e módulos

As assinaturas do DSPy são declarações de classes tipadas que descrevem o que uma etapa de LLM deve fazer — entradas, saídas e uma instrução na documentação da classe. Módulos como Predict, ChainOfThought e ReAct implementam diferentes estratégias de raciocínio em torno de uma signature. Você combina vários módulos dentro de uma subclasse de dspy.Module para criar fluxos com várias etapas. Os valores de desc dos campos orientam o modelo na instrução gerada automaticamente, e as asserções impõem restrições de saída com novas tentativas automáticas.

Grátis para começar

Aprenda AI Prompt Engineering com um tutor de IA — grátis

Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.

Cursos
53
Aulas
199

Perguntas Frequentes

A aula “Definindo assinaturas e módulos” é grátis?

Sim — o texto completo de “Definindo assinaturas e módulos” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de AI Prompt Engineering, atualize para CoddyKit PRO. O curso de AI Prompt Engineering inclui 4 aulas no total.

O que vou aprender em “Definindo assinaturas e módulos”?

Sintaxe de assinaturas, ChainOfThought, ReAct e módulos DSPy personalizados. Você pratica AI Prompt Engineering com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar AI Prompt Engineering?

Nenhuma experiência prévia é necessária. AI Prompt Engineering no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.

Quanto tempo leva a aula “Definindo assinaturas e módulos”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de AI Prompt Engineering?

Sim. Cada aula de AI Prompt Engineering inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Introdução ao framework DSPy
  2. Definindo assinaturas e módulos
  3. Compilando e otimizando prompts
  4. Avaliando pipelines do DSPy
← Voltar para AI Prompt Engineering