AI Prompt Engineering · Lección

Definición de firmas y módulos

Sintaxis de firmas, ChainOfThought, ReAct y módulos personalizados de DSPy.

Lección 2 de 413 pasos

Definición de firmas y módulos es una lección gratuita de AI Prompt Engineering en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de AI Prompt Engineering, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de AI Prompt Engineering incluye 4 lecciones en total.

Las firmas son contratos tipados

Una firma de DSPy es una clase de Python que declara las entradas y salidas de un paso de razonamiento. Considérela como el contrato de una función tipada para su llamada al LLM.

El docstring se convierte en la descripción de la tarea. Las anotaciones de los campos indican a DSPy qué debe producir. Nunca escribe el texto real del prompt; DSPy lo deriva de esta declaración.

Definir una firma básica

Una firma mínima hereda de dspy.Signature y anota los campos como InputField u OutputField. El docstring de la clase proporciona la instrucción de la tarea.

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

Múltiples campos de salida

Las firmas pueden tener varios campos de salida. DSPy indicará al modelo que produzca todos en una sola llamada. Esto resulta útil para extraer información estructurada.

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)

El módulo Predict

dspy.Predict es el módulo más sencillo. Recibe una firma y solicita directamente al LM que produzca la salida. No añade ninguna estructura de razonamiento: solo un prompt estructurado que coincide con la firma.

Use Predict cuando la tarea sea sencilla y no requiera pasos de razonamiento explícitos.

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

El módulo ChainOfThought

dspy.ChainOfThought amplía la firma con un campo intermedio reasoning. Primero, el modelo escribe su razonamiento y después produce la respuesta final.

Esto mejora sistemáticamente la exactitud en problemas de varios pasos sin que tenga que escribir instrucciones de prompt de razonamiento paso a paso.

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

El módulo ReAct

dspy.ReAct implementa el ciclo de razonamiento + acción. El modelo alterna entre pasos de razonamiento y llamadas a herramientas, por lo que resulta ideal para agentes que necesitan buscar, calcular u obtener datos.

Proporcione una lista de herramientas (funciones de Python con docstrings) y DSPy gestiona automáticamente la alternancia entre ellas.

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)

Componer módulos en programas

La verdadera potencia se obtiene al componer módulos en programas de varios pasos. Cree una subclase de dspy.Module, defina los submódulos en __init__ e implemente forward() para conectarlos.

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)

Abreviatura de firma en línea

Para casos sencillos, DSPy acepta una firma en forma de cadena insertada: 'input1, input2 -> output1, output2'. Resulta práctica para crear prototipos rápidamente sin definir una clase 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)

Las descripciones de los campos son importantes

El parámetro desc de InputField y OutputField se incluye en el prompt generado. Las buenas descripciones orientan al modelo con precisión.

Considere desc como la documentación del campo que aparece en el prompt junto al nombre 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

Guardar y cargar programas

Después de la optimización, guarde el programa compilado para no tener que volver a ejecutar la optimización cada vez. DSPy serializa el estado optimizado en un archivo 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 para restringir las salidas

Las Assertions de DSPy permiten declarar restricciones para las salidas. Si el modelo infringe la restricción, DSPy vuelve a intentarlo automáticamente con retroalimentación correctiva; no necesita implementar lógica manual de reintento.

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

Comprobación de conocimientos: ChainOfThought

¿Qué añade dspy.ChainOfThought en comparación con dspy.Predict al utilizar la misma firma?

Recapitulación: firmas y módulos

Las firmas de DSPy son declaraciones de clases tipadas que describen lo que debe hacer un paso de LLM: entradas, salidas y una instrucción en el docstring. Módulos como Predict, ChainOfThought y ReAct implementan diferentes estrategias de razonamiento alrededor de una firma. Puede componer varios módulos dentro de una subclase de dspy.Module para crear pipelines de varios pasos. Los valores de desc de los campos orientan al modelo dentro del prompt generado automáticamente, y las Assertions hacen cumplir las restricciones de salida mediante reintentos automáticos.

Gratis para empezar

Aprende AI Prompt Engineering con un tutor de IA — gratis

Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.

Cursos
53
Lecciones
199

Preguntas frecuentes

¿La lección «Definición de firmas y módulos» es gratis?

Sí — el texto completo de «Definición de firmas y módulos» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de AI Prompt Engineering, actualiza a CoddyKit PRO. El curso de AI Prompt Engineering incluye 4 lecciones en total.

¿Qué aprenderé en «Definición de firmas y módulos»?

Sintaxis de firmas, ChainOfThought, ReAct y módulos personalizados de DSPy. Practicas AI Prompt Engineering con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar AI Prompt Engineering?

No se requiere experiencia previa. AI Prompt Engineering en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.

¿Cuánto tiempo toma la lección «Definición de firmas y módulos»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de AI Prompt Engineering?

Sí. Cada lección de AI Prompt Engineering incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Introducción al framework DSPy
  2. Definición de firmas y módulos
  3. Compilación y optimización de prompts
  4. Evaluación de pipelines de DSPy
← Volver a AI Prompt Engineering