CapÃtulo 5: IngenierÃa de Prompts e Instrucciones del Sistema
5.4 Prompting Few-shot, Zero-shot y Chain-of-Thought
Entendiendo Diferentes Estrategias de Prompting
Cuando trabajas con modelos de lenguaje de OpenAI, puedes emplear varios métodos sofisticados para guiar la interpretación y respuesta del modelo a tus solicitudes. Estos métodos varían en complejidad y efectividad dependiendo de tus necesidades específicas. Entender estas estrategias es crucial para obtener las respuestas más precisas y útiles del modelo.
Las tres estrategias principales que puedes utilizar son:
- Prompting zero-shot: El enfoque más directo donde pides al modelo realizar una tarea sin proporcionar ejemplos. Esto funciona bien para solicitudes simples y claras donde el modelo puede confiar en su conocimiento pre-entrenado.
- Prompting few-shot: Un enfoque más guiado donde proporcionas al modelo ejemplos del tipo de respuesta que buscas. Esto ayuda a establecer patrones y expectativas para tareas complejas o específicas.
- Prompting chain-of-thought: Una técnica avanzada que anima al modelo a desglosar problemas complejos en pasos lógicos más pequeños. Esto es particularmente útil para tareas de resolución de problemas que requieren razonamiento detallado.
Cada estrategia tiene ventajas distintas y casos de uso óptimos, y tu elección debe basarse en factores como la complejidad de la tarea, el formato de salida deseado y el nivel de razonamiento requerido. La clave es seleccionar la estrategia más apropiada que se alinee con tus objetivos y requisitos específicos.
5.4.1 Prompting sin ejemplos (Zero-shot)
El prompting sin ejemplos se usa cuando proporcionas al modelo una instrucción sin incluir ejemplos adicionales. El modelo se basa únicamente en su conocimiento pre-entrenado para generar una respuesta. Este enfoque aprovecha el extenso entrenamiento del modelo en diversos dominios, permitiéndole interpretar y responder a las instrucciones basándose en su comprensión inherente. Es como hacerle una pregunta a una persona bien educada - utilizan su conocimiento existente sin necesitar ejemplos de cómo responder.
La capacidad del modelo para manejar prompts sin ejemplos proviene de su entrenamiento con enormes cantidades de datos, incluyendo libros, artículos, sitios web y otras fuentes de texto. Este entrenamiento integral le permite entender el contexto, reconocer patrones y generar respuestas apropiadas en muchos temas. Por ejemplo, si preguntas "¿Qué es la fotosíntesis?", el modelo puede proporcionar una explicación detallada sin necesitar ejemplos de respuestas sobre otros procesos biológicos.
A diferencia de otros métodos de prompting, el método sin ejemplos no requiere demostraciones ni pautas específicas de formato. Esto lo hace particularmente eficiente para consultas rápidas y tareas simples. Sin embargo, su éxito depende en gran medida de qué tan bien esté formulada la instrucción y si la tarea está dentro del dominio de conocimiento general del modelo. La clave para un prompting sin ejemplos exitoso radica en ser claro, específico y sin ambigüedades en tu solicitud.
Este método es directo e ideal cuando la pregunta es clara y sin ambigüedades, haciéndolo particularmente efectivo para tareas comunes como definiciones, explicaciones o preguntas directas. Funciona especialmente bien para:
- Consultas de conocimiento general
- Análisis básico de texto
- Clasificaciones simples
- Preguntas directas sobre temas bien documentados
Sin embargo, su éxito depende en gran medida de qué tan bien esté formulada la instrucción y si la tarea está dentro del dominio de conocimiento general del modelo. Cuando la tarea se vuelve demasiado especializada o requiere formatos específicos o patrones de razonamiento, otros métodos de prompting podrían ser más apropiados.
Ejemplo: Prompting sin ejemplos en acción
Supón que quieres definir un término técnico simple sin ninguna guía adicional.
import openai
import os
from dotenv import load_dotenv
import json
from typing import Dict, Any
import logging
# Configure logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
class OpenAIClient:
def __init__(self):
# Load environment variables
load_dotenv()
self.api_key = os.getenv("OPENAI_API_KEY")
if not self.api_key:
raise ValueError("OpenAI API key not found in environment variables")
openai.api_key = self.api_key
def get_zero_shot_response(self, prompt: str, **kwargs) -> Dict[str, Any]:
"""
Get a zero-shot response from the OpenAI API
Args:
prompt (str): The prompt to send to the API
**kwargs: Additional parameters for the API call
Returns:
Dict[str, Any]: The API response
"""
try:
response = openai.ChatCompletion.create(
model=kwargs.get("model", "gpt-4"),
messages=[
{"role": "user", "content": prompt}
],
temperature=kwargs.get("temperature", 0.5),
max_tokens=kwargs.get("max_tokens", 100)
)
return response
except Exception as e:
logger.error(f"Error getting response from OpenAI: {str(e)}")
raise
def main():
# Initialize the OpenAI client
client = OpenAIClient()
# Example prompts
prompts = [
"Define what a hash table is in computer science.",
"Explain the concept of time complexity.",
"What is object-oriented programming?"
]
# Get responses for each prompt
for prompt in prompts:
try:
response = client.get_zero_shot_response(
prompt,
temperature=0.5,
max_tokens=150
)
print(f"\nPrompt: {prompt}")
print("Response:")
print(response["choices"][0]["message"]["content"])
# Log additional response metadata
logger.info(f"Response tokens: {response['usage']['total_tokens']}")
except Exception as e:
logger.error(f"Failed to get response for prompt '{prompt}': {str(e)}")
if __name__ == "__main__":
main()
Desglose del código:
- Estructura y Organización
- Utiliza un enfoque basado en clases con OpenAIClient para una mejor organización del código
- Implementa un manejo adecuado de errores y registro
- Separa las responsabilidades entre la interacción con la API y el flujo principal del programa
- Características Principales
- Manejo de variables de entorno con python-dotenv
- Sugerencias de tipo para mejor mantenibilidad del código
- Paso flexible de parámetros con **kwargs
- Múltiples ejemplos de prompts para demostrar el uso
- Manejo de Errores y Registro
- Captura y reporte exhaustivo de errores
- Configuración de registro para depuración
- Validación de la presencia de la clave API
- Mejores Prácticas
- Estructura limpia del código siguiendo PEP 8
- Documentación apropiada con docstrings
- Diseño modular para fácil extensión
- Consideraciones de gestión de recursos
En este ejemplo sin ejemplos previos, el modelo utiliza su entrenamiento general para proporcionar una definición de una tabla hash, sin requerir ejemplos contextuales adicionales.
5.4.2 Prompting con Ejemplos
En el prompting con ejemplos, proporcionas al modelo un conjunto de ejemplos cuidadosamente seleccionados junto con tu prompt para guiar sus respuestas. Este método poderoso actúa como una enseñanza mediante demostración - similar a cómo un profesor podría mostrar a los estudiantes varios problemas matemáticos resueltos antes de pedirles que resuelvan uno por sí mismos. Al incluir 2-3 ejemplos bien elaborados que demuestran el patrón, estilo o formato que deseas, ayudas al modelo a comprender mejor tus expectativas, tal como un humano aprendería estudiando ejemplos.
El prompting con ejemplos es particularmente efectivo porque crea un marco claro para que el modelo siga. En lugar de depender únicamente de su entrenamiento general, el modelo puede observar y replicar patrones específicos de tus ejemplos. Piensa en ello como darle a alguien una plantilla o plano - pueden ver exactamente cómo debe verse el producto final. Este enfoque reduce significativamente la ambigüedad y conduce a resultados más consistentes y precisamente formateados que se alinean con tus necesidades. Los ejemplos sirven como puntos de referencia concretos que guían la comprensión del modelo sobre la tarea.
Este enfoque es especialmente valioso cuando necesitas respuestas que sigan una estructura particular, utilicen terminología específica, mantengan cierto tono o se adhieran a requisitos únicos de formato. Por ejemplo, si estás generando descripciones de productos, podrías proporcionar ejemplos que muestren la longitud ideal, el nivel de detalle técnico y el lenguaje de marketing. Para respuestas de servicio al cliente, tus ejemplos podrían demostrar el equilibrio perfecto entre profesionalismo y empatía. En documentación técnica, los ejemplos pueden ilustrar el estilo de documentación preferido, el uso de terminología y la profundidad de explicación. Al proporcionar estos ejemplos cuidadosamente seleccionados, efectivamente "entrenas" al modelo para entender y replicar tu estilo de comunicación deseado, asegurando consistencia en todo el contenido generado.
Ejemplo: Prompting con Ejemplos para Escritura de Correos Electrónicos
Imagina que quieres que el modelo genere un correo electrónico siguiendo una plantilla específica. Puedes proporcionar dos ejemplos breves antes de pedirle al modelo que redacte un nuevo correo electrónico.
import openai
import os
from dotenv import load_dotenv
import logging
from typing import Dict, Any, List, Optional
# Configure logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
class EmailTemplate:
def __init__(self, subject: str, body: str, signature: str):
self.subject = subject
self.body = body
self.signature = signature
class EmailAssistant:
def __init__(self):
load_dotenv()
self.api_key = os.getenv("OPENAI_API_KEY")
if not self.api_key:
raise ValueError("OpenAI API key not found")
openai.api_key = self.api_key
def _create_example_emails(self) -> List[EmailTemplate]:
"""Create example email templates for few-shot learning"""
return [
EmailTemplate(
"Meeting Reminder",
"Hi John,\n\nJust a quick reminder about our meeting tomorrow at 10 AM. Looking forward to our discussion.",
"Best regards,\nAlice"
),
EmailTemplate(
"Project Update",
"Hello Team,\n\nHere is a brief update on our current project. We are on track and will meet the upcoming milestones as scheduled.",
"Thanks,\nBob"
)
]
def format_examples(self, examples: List[EmailTemplate]) -> str:
"""Format email examples for the prompt"""
formatted = ""
for i, example in enumerate(examples, 1):
formatted += f"Example {i}:\n"
formatted += f"Subject: {example.subject}\n"
formatted += f"{example.body}\n\n{example.signature}\n\n"
return formatted
def generate_email(self,
task: str,
temperature: float = 0.5,
max_tokens: int = 200) -> Optional[str]:
"""
Generate an email using few-shot learning
Args:
task: Description of the email to generate
temperature: Controls randomness (0.0-1.0)
max_tokens: Maximum tokens in response
Returns:
Generated email text or None if failed
"""
try:
examples = self._create_example_emails()
formatted_examples = self.format_examples(examples)
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[
{
"role": "system",
"content": "You are an email writing assistant who creates professional and friendly emails."
},
{
"role": "user",
"content": f"{formatted_examples}Now, please write an email to {task}"
}
],
temperature=temperature,
max_tokens=max_tokens
)
logger.info(f"Successfully generated email for task: {task}")
return response["choices"][0]["message"]["content"]
except Exception as e:
logger.error(f"Error generating email: {str(e)}")
return None
def main():
# Initialize email assistant
assistant = EmailAssistant()
# Generate email
task = "remind the team to submit their monthly reports"
email = assistant.generate_email(task)
if email:
print("\nGenerated Email:")
print("-" * 50)
print(email)
else:
print("Failed to generate email")
if __name__ == "__main__":
main()
Desglose del código:
- Clases y Estructura
- EmailTemplate: Una clase de datos para almacenar componentes de correo electrónico (asunto, cuerpo, firma)
- EmailAssistant: Clase principal que maneja la generación de correos con la API de OpenAI
- El código organizado sigue los principios SOLID y una adecuada separación de responsabilidades
- Características Principales
- Gestión de variables de entorno con python-dotenv
- Manejo integral de errores y registro
- Sugerencias de tipo para mejor mantenibilidad del código
- Diseño modular con métodos separados para diferentes funcionalidades
- Proceso de Generación de Correos
- Crea plantillas de ejemplo para aprendizaje con pocos ejemplos
- Formatea ejemplos en una estructura consistente
- Maneja la interacción con la API con apropiado control de errores
- Parámetros configurables para temperatura y límites de tokens
- Mejores Prácticas
- Manejo apropiado de excepciones con registro
- Estructura limpia del código siguiendo las pautas PEP 8
- Documentación exhaustiva con docstrings
- Diseño flexible y extensible
En este ejemplo de aprendizaje con pocos ejemplos, el asistente observa la estructura y el tono de las muestras proporcionadas y luego genera un correo electrónico que sigue el mismo estilo.
5.4.3 Prompting con Cadena de Pensamiento
El prompting con cadena de pensamiento es una técnica sofisticada donde guías al modelo para desglosar su proceso de razonamiento en pasos lógicos y claros antes de llegar a una respuesta final. Este poderoso enfoque refleja cómo los humanos abordan problemas complejos - dividiéndolos en piezas más pequeñas y manejables y siguiendo un proceso de pensamiento estructurado. Al igual que un detective resolviendo un caso, el modelo examina evidencia, establece conexiones y saca conclusiones de manera sistemática.
Cuando usas el prompting con cadena de pensamiento, esencialmente le pides al modelo que "muestre su trabajo", similar a cómo un profesor de matemáticas podría requerir que los estudiantes demuestren sus pasos para resolver problemas. Este método sirve múltiples propósitos: ayuda a verificar el razonamiento del modelo, identifica posibles errores lógicos y hace que el proceso de solución sea transparente y más fácil de entender. Al seguir este enfoque, puedes asegurar que el modelo no solo proporcione respuestas, sino que también demuestre una comprensión profunda del proceso de resolución de problemas.
Esta estrategia es particularmente efectiva para tareas de razonamiento complejo o cuando necesitas que el modelo explique su proceso de pensamiento. Considera estas aplicaciones clave:
- Descomposición de Problemas: Desglosar problemas complejos en subproblemas manejables
- Verificación Lógica: Asegurar que cada paso siga lógicamente del anterior
- Detección de Errores: Identificar posibles errores temprano en el proceso de razonamiento
- Transferencia de Conocimiento: Hacer que el proceso de solución sea lo suficientemente claro para que otros aprendan de él
Es especialmente valioso en escenarios que involucran problemas de múltiples pasos, deducciones lógicas o situaciones donde el camino hacia la solución es tan importante como la respuesta final. Por ejemplo:
- Resolución de Problemas Matemáticos: Resolver ecuaciones paso a paso
- Análisis Científico: Desglosar hipótesis complejas y experimentos
- Toma de Decisiones Empresariales: Analizar múltiples factores que influyen en una decisión final
- Razonamiento Legal: Construir argumentos mediante el examen cuidadoso de evidencia y precedentes
A través del prompting con cadena de pensamiento, puedes ayudar a asegurar que cada paso del proceso de razonamiento sea sólido, esté bien documentado y construya lógicamente hacia la conclusión final. Este enfoque no solo mejora la precisión de los resultados sino que también hace que todo el proceso sea más transparente y confiable.
Ejemplo: Cadena de Pensamiento para un Problema Matemático
Digamos que quieres que el modelo resuelva y explique un problema aritmético de múltiples pasos.
import openai
import logging
from typing import Dict, Any
from datetime import datetime
# Configure logging
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)
class MathTutor:
def __init__(self, api_key: str):
self.api_key = api_key
openai.api_key = api_key
def solve_with_explanation(
self,
problem: str,
model: str = "gpt-4",
temperature: float = 0.5,
max_tokens: int = 150
) -> Dict[str, Any]:
"""
Solves a math problem with step-by-step explanation.
Args:
problem: The math problem to solve
model: OpenAI model to use
temperature: Controls randomness (0.0-1.0)
max_tokens: Maximum tokens in response
Returns:
Dictionary containing the response and metadata
"""
try:
start_time = datetime.now()
response = openai.ChatCompletion.create(
model=model,
messages=[
{
"role": "system",
"content": """You are a patient and thorough math tutor.
Explain your reasoning step by step,
showing all work clearly."""
},
{
"role": "user",
"content": f"Solve this problem with detailed explanation: {problem}"
}
],
temperature=temperature,
max_tokens=max_tokens
)
execution_time = (datetime.now() - start_time).total_seconds()
result = {
"solution": response["choices"][0]["message"]["content"],
"model": model,
"execution_time": execution_time,
"tokens_used": response["usage"]["total_tokens"]
}
logger.info(
f"Problem solved successfully. "
f"Execution time: {execution_time:.2f}s, "
f"Tokens used: {result['tokens_used']}"
)
return result
except Exception as e:
logger.error(f"Error solving problem: {str(e)}")
raise
def main():
# Example usage
tutor = MathTutor("your-api-key-here")
problem = """
If you have 3 apples and you buy 2 more,
then give away 1 apple, how many apples do you have?
"""
try:
result = tutor.solve_with_explanation(problem)
print("\nSolution:")
print("-" * 50)
print(result["solution"])
print("\nMetadata:")
print(f"Model used: {result['model']}")
print(f"Execution time: {result['execution_time']:.2f} seconds")
print(f"Tokens used: {result['tokens_used']}")
except Exception as e:
print(f"Failed to solve problem: {str(e)}")
if __name__ == "__main__":
main()
Desglose del código:
- Estructura y Organización
- Crea una clase MathTutor dedicada para una mejor organización del código
- Implementa un manejo de errores y registro apropiado
- Utiliza sugerencias de tipo para mejor mantenibilidad del código
- Sigue los principios de código limpio y las pautas PEP 8
- Características Principales
- Registro completo con marcas de tiempo y formateo
- Seguimiento del rendimiento con medición del tiempo de ejecución
- Monitoreo del uso de tokens
- Configuración flexible de parámetros
- Manejo de Errores
- Bloques try-except para llamadas a la API
- Registro detallado de errores
- Propagación apropiada de excepciones
- Gestión de Salida
- Formato de respuesta estructurado con solución y metadatos
- Presentación clara de resultados
- Métricas de rendimiento incluidas en la salida
En este ejemplo de cadena de pensamiento, el mensaje del sistema instruye a la IA a pensar paso a paso. La salida debe mostrar el proceso de razonamiento antes de llegar a la respuesta final.
5.4.4 Reflexiones Finales sobre Estrategias de Prompting
Sinteticemos lo que hemos aprendido sobre los tres enfoques principales para la interacción con IA. Cada método—desde el prompting sin ejemplos hasta el prompting con cadena de pensamiento—ofrece ventajas distintivas para diferentes escenarios, convirtiéndolos en herramientas vitales para la comunicación efectiva con IA. Al comprender cuándo y cómo usar cada estrategia, puedes mejorar dramáticamente tus interacciones con modelos de lenguaje de IA.
- El prompting sin ejemplos es rápido y funciona bien cuando tu pregunta es directa. Este enfoque no requiere ejemplos y es mejor utilizado para consultas simples y directas donde el contexto es claro. Por ejemplo, preguntar "¿Cuál es la capital de Francia?" no necesita contexto adicional ni ejemplos para obtener una respuesta precisa.
- El prompting con pocos ejemplos proporciona orientación mediante ejemplos, haciéndolo ideal para tareas que requieren un formato o estilo específico. Al mostrar al modelo de IA 2-3 ejemplos del formato de salida deseado, ayudas a que entienda exactamente lo que estás buscando. Esto es particularmente efectivo para tareas como escribir descripciones de productos, formatear datos o mantener un tono consistente en múltiples salidas.
- El prompting con cadena de pensamiento fomenta el razonamiento detallado, convirtiéndolo en una estrategia valiosa para escenarios de resolución de problemas complejos. Este método pide a la IA que desglose su proceso de pensamiento en pasos claros, similar a mostrar el trabajo en un problema matemático. Es especialmente útil para tareas que involucran múltiples pasos, deducciones lógicas o cuando necesitas verificar el proceso de razonamiento de la IA.
Cada estrategia de prompting tiene sus propias fortalezas y casos de uso óptimos en tu conjunto de herramientas. El prompting sin ejemplos funciona mejor para consultas directas, el prompting con pocos ejemplos sobresale en mantener la consistencia y el formato, y la cadena de pensamiento es crucial para tareas de razonamiento complejo. Con práctica y experimentación, desarrollarás una intuición sobre qué método usar según tus necesidades específicas. Considera factores como la complejidad de la tarea, el formato de salida deseado y la importancia de ver el proceso de razonamiento al elegir tu enfoque. Ya sea que estés definiendo términos técnicos, redactando correos electrónicos o resolviendo ecuaciones complejas, seleccionar la estrategia de prompting correcta es crucial para generar resultados de alta calidad y confiables que cumplan exactamente con tus requisitos.
5.4 Prompting Few-shot, Zero-shot y Chain-of-Thought
Entendiendo Diferentes Estrategias de Prompting
Cuando trabajas con modelos de lenguaje de OpenAI, puedes emplear varios métodos sofisticados para guiar la interpretación y respuesta del modelo a tus solicitudes. Estos métodos varían en complejidad y efectividad dependiendo de tus necesidades específicas. Entender estas estrategias es crucial para obtener las respuestas más precisas y útiles del modelo.
Las tres estrategias principales que puedes utilizar son:
- Prompting zero-shot: El enfoque más directo donde pides al modelo realizar una tarea sin proporcionar ejemplos. Esto funciona bien para solicitudes simples y claras donde el modelo puede confiar en su conocimiento pre-entrenado.
- Prompting few-shot: Un enfoque más guiado donde proporcionas al modelo ejemplos del tipo de respuesta que buscas. Esto ayuda a establecer patrones y expectativas para tareas complejas o específicas.
- Prompting chain-of-thought: Una técnica avanzada que anima al modelo a desglosar problemas complejos en pasos lógicos más pequeños. Esto es particularmente útil para tareas de resolución de problemas que requieren razonamiento detallado.
Cada estrategia tiene ventajas distintas y casos de uso óptimos, y tu elección debe basarse en factores como la complejidad de la tarea, el formato de salida deseado y el nivel de razonamiento requerido. La clave es seleccionar la estrategia más apropiada que se alinee con tus objetivos y requisitos específicos.
5.4.1 Prompting sin ejemplos (Zero-shot)
El prompting sin ejemplos se usa cuando proporcionas al modelo una instrucción sin incluir ejemplos adicionales. El modelo se basa únicamente en su conocimiento pre-entrenado para generar una respuesta. Este enfoque aprovecha el extenso entrenamiento del modelo en diversos dominios, permitiéndole interpretar y responder a las instrucciones basándose en su comprensión inherente. Es como hacerle una pregunta a una persona bien educada - utilizan su conocimiento existente sin necesitar ejemplos de cómo responder.
La capacidad del modelo para manejar prompts sin ejemplos proviene de su entrenamiento con enormes cantidades de datos, incluyendo libros, artículos, sitios web y otras fuentes de texto. Este entrenamiento integral le permite entender el contexto, reconocer patrones y generar respuestas apropiadas en muchos temas. Por ejemplo, si preguntas "¿Qué es la fotosíntesis?", el modelo puede proporcionar una explicación detallada sin necesitar ejemplos de respuestas sobre otros procesos biológicos.
A diferencia de otros métodos de prompting, el método sin ejemplos no requiere demostraciones ni pautas específicas de formato. Esto lo hace particularmente eficiente para consultas rápidas y tareas simples. Sin embargo, su éxito depende en gran medida de qué tan bien esté formulada la instrucción y si la tarea está dentro del dominio de conocimiento general del modelo. La clave para un prompting sin ejemplos exitoso radica en ser claro, específico y sin ambigüedades en tu solicitud.
Este método es directo e ideal cuando la pregunta es clara y sin ambigüedades, haciéndolo particularmente efectivo para tareas comunes como definiciones, explicaciones o preguntas directas. Funciona especialmente bien para:
- Consultas de conocimiento general
- Análisis básico de texto
- Clasificaciones simples
- Preguntas directas sobre temas bien documentados
Sin embargo, su éxito depende en gran medida de qué tan bien esté formulada la instrucción y si la tarea está dentro del dominio de conocimiento general del modelo. Cuando la tarea se vuelve demasiado especializada o requiere formatos específicos o patrones de razonamiento, otros métodos de prompting podrían ser más apropiados.
Ejemplo: Prompting sin ejemplos en acción
Supón que quieres definir un término técnico simple sin ninguna guía adicional.
import openai
import os
from dotenv import load_dotenv
import json
from typing import Dict, Any
import logging
# Configure logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
class OpenAIClient:
def __init__(self):
# Load environment variables
load_dotenv()
self.api_key = os.getenv("OPENAI_API_KEY")
if not self.api_key:
raise ValueError("OpenAI API key not found in environment variables")
openai.api_key = self.api_key
def get_zero_shot_response(self, prompt: str, **kwargs) -> Dict[str, Any]:
"""
Get a zero-shot response from the OpenAI API
Args:
prompt (str): The prompt to send to the API
**kwargs: Additional parameters for the API call
Returns:
Dict[str, Any]: The API response
"""
try:
response = openai.ChatCompletion.create(
model=kwargs.get("model", "gpt-4"),
messages=[
{"role": "user", "content": prompt}
],
temperature=kwargs.get("temperature", 0.5),
max_tokens=kwargs.get("max_tokens", 100)
)
return response
except Exception as e:
logger.error(f"Error getting response from OpenAI: {str(e)}")
raise
def main():
# Initialize the OpenAI client
client = OpenAIClient()
# Example prompts
prompts = [
"Define what a hash table is in computer science.",
"Explain the concept of time complexity.",
"What is object-oriented programming?"
]
# Get responses for each prompt
for prompt in prompts:
try:
response = client.get_zero_shot_response(
prompt,
temperature=0.5,
max_tokens=150
)
print(f"\nPrompt: {prompt}")
print("Response:")
print(response["choices"][0]["message"]["content"])
# Log additional response metadata
logger.info(f"Response tokens: {response['usage']['total_tokens']}")
except Exception as e:
logger.error(f"Failed to get response for prompt '{prompt}': {str(e)}")
if __name__ == "__main__":
main()
Desglose del código:
- Estructura y Organización
- Utiliza un enfoque basado en clases con OpenAIClient para una mejor organización del código
- Implementa un manejo adecuado de errores y registro
- Separa las responsabilidades entre la interacción con la API y el flujo principal del programa
- Características Principales
- Manejo de variables de entorno con python-dotenv
- Sugerencias de tipo para mejor mantenibilidad del código
- Paso flexible de parámetros con **kwargs
- Múltiples ejemplos de prompts para demostrar el uso
- Manejo de Errores y Registro
- Captura y reporte exhaustivo de errores
- Configuración de registro para depuración
- Validación de la presencia de la clave API
- Mejores Prácticas
- Estructura limpia del código siguiendo PEP 8
- Documentación apropiada con docstrings
- Diseño modular para fácil extensión
- Consideraciones de gestión de recursos
En este ejemplo sin ejemplos previos, el modelo utiliza su entrenamiento general para proporcionar una definición de una tabla hash, sin requerir ejemplos contextuales adicionales.
5.4.2 Prompting con Ejemplos
En el prompting con ejemplos, proporcionas al modelo un conjunto de ejemplos cuidadosamente seleccionados junto con tu prompt para guiar sus respuestas. Este método poderoso actúa como una enseñanza mediante demostración - similar a cómo un profesor podría mostrar a los estudiantes varios problemas matemáticos resueltos antes de pedirles que resuelvan uno por sí mismos. Al incluir 2-3 ejemplos bien elaborados que demuestran el patrón, estilo o formato que deseas, ayudas al modelo a comprender mejor tus expectativas, tal como un humano aprendería estudiando ejemplos.
El prompting con ejemplos es particularmente efectivo porque crea un marco claro para que el modelo siga. En lugar de depender únicamente de su entrenamiento general, el modelo puede observar y replicar patrones específicos de tus ejemplos. Piensa en ello como darle a alguien una plantilla o plano - pueden ver exactamente cómo debe verse el producto final. Este enfoque reduce significativamente la ambigüedad y conduce a resultados más consistentes y precisamente formateados que se alinean con tus necesidades. Los ejemplos sirven como puntos de referencia concretos que guían la comprensión del modelo sobre la tarea.
Este enfoque es especialmente valioso cuando necesitas respuestas que sigan una estructura particular, utilicen terminología específica, mantengan cierto tono o se adhieran a requisitos únicos de formato. Por ejemplo, si estás generando descripciones de productos, podrías proporcionar ejemplos que muestren la longitud ideal, el nivel de detalle técnico y el lenguaje de marketing. Para respuestas de servicio al cliente, tus ejemplos podrían demostrar el equilibrio perfecto entre profesionalismo y empatía. En documentación técnica, los ejemplos pueden ilustrar el estilo de documentación preferido, el uso de terminología y la profundidad de explicación. Al proporcionar estos ejemplos cuidadosamente seleccionados, efectivamente "entrenas" al modelo para entender y replicar tu estilo de comunicación deseado, asegurando consistencia en todo el contenido generado.
Ejemplo: Prompting con Ejemplos para Escritura de Correos Electrónicos
Imagina que quieres que el modelo genere un correo electrónico siguiendo una plantilla específica. Puedes proporcionar dos ejemplos breves antes de pedirle al modelo que redacte un nuevo correo electrónico.
import openai
import os
from dotenv import load_dotenv
import logging
from typing import Dict, Any, List, Optional
# Configure logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
class EmailTemplate:
def __init__(self, subject: str, body: str, signature: str):
self.subject = subject
self.body = body
self.signature = signature
class EmailAssistant:
def __init__(self):
load_dotenv()
self.api_key = os.getenv("OPENAI_API_KEY")
if not self.api_key:
raise ValueError("OpenAI API key not found")
openai.api_key = self.api_key
def _create_example_emails(self) -> List[EmailTemplate]:
"""Create example email templates for few-shot learning"""
return [
EmailTemplate(
"Meeting Reminder",
"Hi John,\n\nJust a quick reminder about our meeting tomorrow at 10 AM. Looking forward to our discussion.",
"Best regards,\nAlice"
),
EmailTemplate(
"Project Update",
"Hello Team,\n\nHere is a brief update on our current project. We are on track and will meet the upcoming milestones as scheduled.",
"Thanks,\nBob"
)
]
def format_examples(self, examples: List[EmailTemplate]) -> str:
"""Format email examples for the prompt"""
formatted = ""
for i, example in enumerate(examples, 1):
formatted += f"Example {i}:\n"
formatted += f"Subject: {example.subject}\n"
formatted += f"{example.body}\n\n{example.signature}\n\n"
return formatted
def generate_email(self,
task: str,
temperature: float = 0.5,
max_tokens: int = 200) -> Optional[str]:
"""
Generate an email using few-shot learning
Args:
task: Description of the email to generate
temperature: Controls randomness (0.0-1.0)
max_tokens: Maximum tokens in response
Returns:
Generated email text or None if failed
"""
try:
examples = self._create_example_emails()
formatted_examples = self.format_examples(examples)
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[
{
"role": "system",
"content": "You are an email writing assistant who creates professional and friendly emails."
},
{
"role": "user",
"content": f"{formatted_examples}Now, please write an email to {task}"
}
],
temperature=temperature,
max_tokens=max_tokens
)
logger.info(f"Successfully generated email for task: {task}")
return response["choices"][0]["message"]["content"]
except Exception as e:
logger.error(f"Error generating email: {str(e)}")
return None
def main():
# Initialize email assistant
assistant = EmailAssistant()
# Generate email
task = "remind the team to submit their monthly reports"
email = assistant.generate_email(task)
if email:
print("\nGenerated Email:")
print("-" * 50)
print(email)
else:
print("Failed to generate email")
if __name__ == "__main__":
main()
Desglose del código:
- Clases y Estructura
- EmailTemplate: Una clase de datos para almacenar componentes de correo electrónico (asunto, cuerpo, firma)
- EmailAssistant: Clase principal que maneja la generación de correos con la API de OpenAI
- El código organizado sigue los principios SOLID y una adecuada separación de responsabilidades
- Características Principales
- Gestión de variables de entorno con python-dotenv
- Manejo integral de errores y registro
- Sugerencias de tipo para mejor mantenibilidad del código
- Diseño modular con métodos separados para diferentes funcionalidades
- Proceso de Generación de Correos
- Crea plantillas de ejemplo para aprendizaje con pocos ejemplos
- Formatea ejemplos en una estructura consistente
- Maneja la interacción con la API con apropiado control de errores
- Parámetros configurables para temperatura y límites de tokens
- Mejores Prácticas
- Manejo apropiado de excepciones con registro
- Estructura limpia del código siguiendo las pautas PEP 8
- Documentación exhaustiva con docstrings
- Diseño flexible y extensible
En este ejemplo de aprendizaje con pocos ejemplos, el asistente observa la estructura y el tono de las muestras proporcionadas y luego genera un correo electrónico que sigue el mismo estilo.
5.4.3 Prompting con Cadena de Pensamiento
El prompting con cadena de pensamiento es una técnica sofisticada donde guías al modelo para desglosar su proceso de razonamiento en pasos lógicos y claros antes de llegar a una respuesta final. Este poderoso enfoque refleja cómo los humanos abordan problemas complejos - dividiéndolos en piezas más pequeñas y manejables y siguiendo un proceso de pensamiento estructurado. Al igual que un detective resolviendo un caso, el modelo examina evidencia, establece conexiones y saca conclusiones de manera sistemática.
Cuando usas el prompting con cadena de pensamiento, esencialmente le pides al modelo que "muestre su trabajo", similar a cómo un profesor de matemáticas podría requerir que los estudiantes demuestren sus pasos para resolver problemas. Este método sirve múltiples propósitos: ayuda a verificar el razonamiento del modelo, identifica posibles errores lógicos y hace que el proceso de solución sea transparente y más fácil de entender. Al seguir este enfoque, puedes asegurar que el modelo no solo proporcione respuestas, sino que también demuestre una comprensión profunda del proceso de resolución de problemas.
Esta estrategia es particularmente efectiva para tareas de razonamiento complejo o cuando necesitas que el modelo explique su proceso de pensamiento. Considera estas aplicaciones clave:
- Descomposición de Problemas: Desglosar problemas complejos en subproblemas manejables
- Verificación Lógica: Asegurar que cada paso siga lógicamente del anterior
- Detección de Errores: Identificar posibles errores temprano en el proceso de razonamiento
- Transferencia de Conocimiento: Hacer que el proceso de solución sea lo suficientemente claro para que otros aprendan de él
Es especialmente valioso en escenarios que involucran problemas de múltiples pasos, deducciones lógicas o situaciones donde el camino hacia la solución es tan importante como la respuesta final. Por ejemplo:
- Resolución de Problemas Matemáticos: Resolver ecuaciones paso a paso
- Análisis Científico: Desglosar hipótesis complejas y experimentos
- Toma de Decisiones Empresariales: Analizar múltiples factores que influyen en una decisión final
- Razonamiento Legal: Construir argumentos mediante el examen cuidadoso de evidencia y precedentes
A través del prompting con cadena de pensamiento, puedes ayudar a asegurar que cada paso del proceso de razonamiento sea sólido, esté bien documentado y construya lógicamente hacia la conclusión final. Este enfoque no solo mejora la precisión de los resultados sino que también hace que todo el proceso sea más transparente y confiable.
Ejemplo: Cadena de Pensamiento para un Problema Matemático
Digamos que quieres que el modelo resuelva y explique un problema aritmético de múltiples pasos.
import openai
import logging
from typing import Dict, Any
from datetime import datetime
# Configure logging
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)
class MathTutor:
def __init__(self, api_key: str):
self.api_key = api_key
openai.api_key = api_key
def solve_with_explanation(
self,
problem: str,
model: str = "gpt-4",
temperature: float = 0.5,
max_tokens: int = 150
) -> Dict[str, Any]:
"""
Solves a math problem with step-by-step explanation.
Args:
problem: The math problem to solve
model: OpenAI model to use
temperature: Controls randomness (0.0-1.0)
max_tokens: Maximum tokens in response
Returns:
Dictionary containing the response and metadata
"""
try:
start_time = datetime.now()
response = openai.ChatCompletion.create(
model=model,
messages=[
{
"role": "system",
"content": """You are a patient and thorough math tutor.
Explain your reasoning step by step,
showing all work clearly."""
},
{
"role": "user",
"content": f"Solve this problem with detailed explanation: {problem}"
}
],
temperature=temperature,
max_tokens=max_tokens
)
execution_time = (datetime.now() - start_time).total_seconds()
result = {
"solution": response["choices"][0]["message"]["content"],
"model": model,
"execution_time": execution_time,
"tokens_used": response["usage"]["total_tokens"]
}
logger.info(
f"Problem solved successfully. "
f"Execution time: {execution_time:.2f}s, "
f"Tokens used: {result['tokens_used']}"
)
return result
except Exception as e:
logger.error(f"Error solving problem: {str(e)}")
raise
def main():
# Example usage
tutor = MathTutor("your-api-key-here")
problem = """
If you have 3 apples and you buy 2 more,
then give away 1 apple, how many apples do you have?
"""
try:
result = tutor.solve_with_explanation(problem)
print("\nSolution:")
print("-" * 50)
print(result["solution"])
print("\nMetadata:")
print(f"Model used: {result['model']}")
print(f"Execution time: {result['execution_time']:.2f} seconds")
print(f"Tokens used: {result['tokens_used']}")
except Exception as e:
print(f"Failed to solve problem: {str(e)}")
if __name__ == "__main__":
main()
Desglose del código:
- Estructura y Organización
- Crea una clase MathTutor dedicada para una mejor organización del código
- Implementa un manejo de errores y registro apropiado
- Utiliza sugerencias de tipo para mejor mantenibilidad del código
- Sigue los principios de código limpio y las pautas PEP 8
- Características Principales
- Registro completo con marcas de tiempo y formateo
- Seguimiento del rendimiento con medición del tiempo de ejecución
- Monitoreo del uso de tokens
- Configuración flexible de parámetros
- Manejo de Errores
- Bloques try-except para llamadas a la API
- Registro detallado de errores
- Propagación apropiada de excepciones
- Gestión de Salida
- Formato de respuesta estructurado con solución y metadatos
- Presentación clara de resultados
- Métricas de rendimiento incluidas en la salida
En este ejemplo de cadena de pensamiento, el mensaje del sistema instruye a la IA a pensar paso a paso. La salida debe mostrar el proceso de razonamiento antes de llegar a la respuesta final.
5.4.4 Reflexiones Finales sobre Estrategias de Prompting
Sinteticemos lo que hemos aprendido sobre los tres enfoques principales para la interacción con IA. Cada método—desde el prompting sin ejemplos hasta el prompting con cadena de pensamiento—ofrece ventajas distintivas para diferentes escenarios, convirtiéndolos en herramientas vitales para la comunicación efectiva con IA. Al comprender cuándo y cómo usar cada estrategia, puedes mejorar dramáticamente tus interacciones con modelos de lenguaje de IA.
- El prompting sin ejemplos es rápido y funciona bien cuando tu pregunta es directa. Este enfoque no requiere ejemplos y es mejor utilizado para consultas simples y directas donde el contexto es claro. Por ejemplo, preguntar "¿Cuál es la capital de Francia?" no necesita contexto adicional ni ejemplos para obtener una respuesta precisa.
- El prompting con pocos ejemplos proporciona orientación mediante ejemplos, haciéndolo ideal para tareas que requieren un formato o estilo específico. Al mostrar al modelo de IA 2-3 ejemplos del formato de salida deseado, ayudas a que entienda exactamente lo que estás buscando. Esto es particularmente efectivo para tareas como escribir descripciones de productos, formatear datos o mantener un tono consistente en múltiples salidas.
- El prompting con cadena de pensamiento fomenta el razonamiento detallado, convirtiéndolo en una estrategia valiosa para escenarios de resolución de problemas complejos. Este método pide a la IA que desglose su proceso de pensamiento en pasos claros, similar a mostrar el trabajo en un problema matemático. Es especialmente útil para tareas que involucran múltiples pasos, deducciones lógicas o cuando necesitas verificar el proceso de razonamiento de la IA.
Cada estrategia de prompting tiene sus propias fortalezas y casos de uso óptimos en tu conjunto de herramientas. El prompting sin ejemplos funciona mejor para consultas directas, el prompting con pocos ejemplos sobresale en mantener la consistencia y el formato, y la cadena de pensamiento es crucial para tareas de razonamiento complejo. Con práctica y experimentación, desarrollarás una intuición sobre qué método usar según tus necesidades específicas. Considera factores como la complejidad de la tarea, el formato de salida deseado y la importancia de ver el proceso de razonamiento al elegir tu enfoque. Ya sea que estés definiendo términos técnicos, redactando correos electrónicos o resolviendo ecuaciones complejas, seleccionar la estrategia de prompting correcta es crucial para generar resultados de alta calidad y confiables que cumplan exactamente con tus requisitos.
5.4 Prompting Few-shot, Zero-shot y Chain-of-Thought
Entendiendo Diferentes Estrategias de Prompting
Cuando trabajas con modelos de lenguaje de OpenAI, puedes emplear varios métodos sofisticados para guiar la interpretación y respuesta del modelo a tus solicitudes. Estos métodos varían en complejidad y efectividad dependiendo de tus necesidades específicas. Entender estas estrategias es crucial para obtener las respuestas más precisas y útiles del modelo.
Las tres estrategias principales que puedes utilizar son:
- Prompting zero-shot: El enfoque más directo donde pides al modelo realizar una tarea sin proporcionar ejemplos. Esto funciona bien para solicitudes simples y claras donde el modelo puede confiar en su conocimiento pre-entrenado.
- Prompting few-shot: Un enfoque más guiado donde proporcionas al modelo ejemplos del tipo de respuesta que buscas. Esto ayuda a establecer patrones y expectativas para tareas complejas o específicas.
- Prompting chain-of-thought: Una técnica avanzada que anima al modelo a desglosar problemas complejos en pasos lógicos más pequeños. Esto es particularmente útil para tareas de resolución de problemas que requieren razonamiento detallado.
Cada estrategia tiene ventajas distintas y casos de uso óptimos, y tu elección debe basarse en factores como la complejidad de la tarea, el formato de salida deseado y el nivel de razonamiento requerido. La clave es seleccionar la estrategia más apropiada que se alinee con tus objetivos y requisitos específicos.
5.4.1 Prompting sin ejemplos (Zero-shot)
El prompting sin ejemplos se usa cuando proporcionas al modelo una instrucción sin incluir ejemplos adicionales. El modelo se basa únicamente en su conocimiento pre-entrenado para generar una respuesta. Este enfoque aprovecha el extenso entrenamiento del modelo en diversos dominios, permitiéndole interpretar y responder a las instrucciones basándose en su comprensión inherente. Es como hacerle una pregunta a una persona bien educada - utilizan su conocimiento existente sin necesitar ejemplos de cómo responder.
La capacidad del modelo para manejar prompts sin ejemplos proviene de su entrenamiento con enormes cantidades de datos, incluyendo libros, artículos, sitios web y otras fuentes de texto. Este entrenamiento integral le permite entender el contexto, reconocer patrones y generar respuestas apropiadas en muchos temas. Por ejemplo, si preguntas "¿Qué es la fotosíntesis?", el modelo puede proporcionar una explicación detallada sin necesitar ejemplos de respuestas sobre otros procesos biológicos.
A diferencia de otros métodos de prompting, el método sin ejemplos no requiere demostraciones ni pautas específicas de formato. Esto lo hace particularmente eficiente para consultas rápidas y tareas simples. Sin embargo, su éxito depende en gran medida de qué tan bien esté formulada la instrucción y si la tarea está dentro del dominio de conocimiento general del modelo. La clave para un prompting sin ejemplos exitoso radica en ser claro, específico y sin ambigüedades en tu solicitud.
Este método es directo e ideal cuando la pregunta es clara y sin ambigüedades, haciéndolo particularmente efectivo para tareas comunes como definiciones, explicaciones o preguntas directas. Funciona especialmente bien para:
- Consultas de conocimiento general
- Análisis básico de texto
- Clasificaciones simples
- Preguntas directas sobre temas bien documentados
Sin embargo, su éxito depende en gran medida de qué tan bien esté formulada la instrucción y si la tarea está dentro del dominio de conocimiento general del modelo. Cuando la tarea se vuelve demasiado especializada o requiere formatos específicos o patrones de razonamiento, otros métodos de prompting podrían ser más apropiados.
Ejemplo: Prompting sin ejemplos en acción
Supón que quieres definir un término técnico simple sin ninguna guía adicional.
import openai
import os
from dotenv import load_dotenv
import json
from typing import Dict, Any
import logging
# Configure logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
class OpenAIClient:
def __init__(self):
# Load environment variables
load_dotenv()
self.api_key = os.getenv("OPENAI_API_KEY")
if not self.api_key:
raise ValueError("OpenAI API key not found in environment variables")
openai.api_key = self.api_key
def get_zero_shot_response(self, prompt: str, **kwargs) -> Dict[str, Any]:
"""
Get a zero-shot response from the OpenAI API
Args:
prompt (str): The prompt to send to the API
**kwargs: Additional parameters for the API call
Returns:
Dict[str, Any]: The API response
"""
try:
response = openai.ChatCompletion.create(
model=kwargs.get("model", "gpt-4"),
messages=[
{"role": "user", "content": prompt}
],
temperature=kwargs.get("temperature", 0.5),
max_tokens=kwargs.get("max_tokens", 100)
)
return response
except Exception as e:
logger.error(f"Error getting response from OpenAI: {str(e)}")
raise
def main():
# Initialize the OpenAI client
client = OpenAIClient()
# Example prompts
prompts = [
"Define what a hash table is in computer science.",
"Explain the concept of time complexity.",
"What is object-oriented programming?"
]
# Get responses for each prompt
for prompt in prompts:
try:
response = client.get_zero_shot_response(
prompt,
temperature=0.5,
max_tokens=150
)
print(f"\nPrompt: {prompt}")
print("Response:")
print(response["choices"][0]["message"]["content"])
# Log additional response metadata
logger.info(f"Response tokens: {response['usage']['total_tokens']}")
except Exception as e:
logger.error(f"Failed to get response for prompt '{prompt}': {str(e)}")
if __name__ == "__main__":
main()
Desglose del código:
- Estructura y Organización
- Utiliza un enfoque basado en clases con OpenAIClient para una mejor organización del código
- Implementa un manejo adecuado de errores y registro
- Separa las responsabilidades entre la interacción con la API y el flujo principal del programa
- Características Principales
- Manejo de variables de entorno con python-dotenv
- Sugerencias de tipo para mejor mantenibilidad del código
- Paso flexible de parámetros con **kwargs
- Múltiples ejemplos de prompts para demostrar el uso
- Manejo de Errores y Registro
- Captura y reporte exhaustivo de errores
- Configuración de registro para depuración
- Validación de la presencia de la clave API
- Mejores Prácticas
- Estructura limpia del código siguiendo PEP 8
- Documentación apropiada con docstrings
- Diseño modular para fácil extensión
- Consideraciones de gestión de recursos
En este ejemplo sin ejemplos previos, el modelo utiliza su entrenamiento general para proporcionar una definición de una tabla hash, sin requerir ejemplos contextuales adicionales.
5.4.2 Prompting con Ejemplos
En el prompting con ejemplos, proporcionas al modelo un conjunto de ejemplos cuidadosamente seleccionados junto con tu prompt para guiar sus respuestas. Este método poderoso actúa como una enseñanza mediante demostración - similar a cómo un profesor podría mostrar a los estudiantes varios problemas matemáticos resueltos antes de pedirles que resuelvan uno por sí mismos. Al incluir 2-3 ejemplos bien elaborados que demuestran el patrón, estilo o formato que deseas, ayudas al modelo a comprender mejor tus expectativas, tal como un humano aprendería estudiando ejemplos.
El prompting con ejemplos es particularmente efectivo porque crea un marco claro para que el modelo siga. En lugar de depender únicamente de su entrenamiento general, el modelo puede observar y replicar patrones específicos de tus ejemplos. Piensa en ello como darle a alguien una plantilla o plano - pueden ver exactamente cómo debe verse el producto final. Este enfoque reduce significativamente la ambigüedad y conduce a resultados más consistentes y precisamente formateados que se alinean con tus necesidades. Los ejemplos sirven como puntos de referencia concretos que guían la comprensión del modelo sobre la tarea.
Este enfoque es especialmente valioso cuando necesitas respuestas que sigan una estructura particular, utilicen terminología específica, mantengan cierto tono o se adhieran a requisitos únicos de formato. Por ejemplo, si estás generando descripciones de productos, podrías proporcionar ejemplos que muestren la longitud ideal, el nivel de detalle técnico y el lenguaje de marketing. Para respuestas de servicio al cliente, tus ejemplos podrían demostrar el equilibrio perfecto entre profesionalismo y empatía. En documentación técnica, los ejemplos pueden ilustrar el estilo de documentación preferido, el uso de terminología y la profundidad de explicación. Al proporcionar estos ejemplos cuidadosamente seleccionados, efectivamente "entrenas" al modelo para entender y replicar tu estilo de comunicación deseado, asegurando consistencia en todo el contenido generado.
Ejemplo: Prompting con Ejemplos para Escritura de Correos Electrónicos
Imagina que quieres que el modelo genere un correo electrónico siguiendo una plantilla específica. Puedes proporcionar dos ejemplos breves antes de pedirle al modelo que redacte un nuevo correo electrónico.
import openai
import os
from dotenv import load_dotenv
import logging
from typing import Dict, Any, List, Optional
# Configure logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
class EmailTemplate:
def __init__(self, subject: str, body: str, signature: str):
self.subject = subject
self.body = body
self.signature = signature
class EmailAssistant:
def __init__(self):
load_dotenv()
self.api_key = os.getenv("OPENAI_API_KEY")
if not self.api_key:
raise ValueError("OpenAI API key not found")
openai.api_key = self.api_key
def _create_example_emails(self) -> List[EmailTemplate]:
"""Create example email templates for few-shot learning"""
return [
EmailTemplate(
"Meeting Reminder",
"Hi John,\n\nJust a quick reminder about our meeting tomorrow at 10 AM. Looking forward to our discussion.",
"Best regards,\nAlice"
),
EmailTemplate(
"Project Update",
"Hello Team,\n\nHere is a brief update on our current project. We are on track and will meet the upcoming milestones as scheduled.",
"Thanks,\nBob"
)
]
def format_examples(self, examples: List[EmailTemplate]) -> str:
"""Format email examples for the prompt"""
formatted = ""
for i, example in enumerate(examples, 1):
formatted += f"Example {i}:\n"
formatted += f"Subject: {example.subject}\n"
formatted += f"{example.body}\n\n{example.signature}\n\n"
return formatted
def generate_email(self,
task: str,
temperature: float = 0.5,
max_tokens: int = 200) -> Optional[str]:
"""
Generate an email using few-shot learning
Args:
task: Description of the email to generate
temperature: Controls randomness (0.0-1.0)
max_tokens: Maximum tokens in response
Returns:
Generated email text or None if failed
"""
try:
examples = self._create_example_emails()
formatted_examples = self.format_examples(examples)
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[
{
"role": "system",
"content": "You are an email writing assistant who creates professional and friendly emails."
},
{
"role": "user",
"content": f"{formatted_examples}Now, please write an email to {task}"
}
],
temperature=temperature,
max_tokens=max_tokens
)
logger.info(f"Successfully generated email for task: {task}")
return response["choices"][0]["message"]["content"]
except Exception as e:
logger.error(f"Error generating email: {str(e)}")
return None
def main():
# Initialize email assistant
assistant = EmailAssistant()
# Generate email
task = "remind the team to submit their monthly reports"
email = assistant.generate_email(task)
if email:
print("\nGenerated Email:")
print("-" * 50)
print(email)
else:
print("Failed to generate email")
if __name__ == "__main__":
main()
Desglose del código:
- Clases y Estructura
- EmailTemplate: Una clase de datos para almacenar componentes de correo electrónico (asunto, cuerpo, firma)
- EmailAssistant: Clase principal que maneja la generación de correos con la API de OpenAI
- El código organizado sigue los principios SOLID y una adecuada separación de responsabilidades
- Características Principales
- Gestión de variables de entorno con python-dotenv
- Manejo integral de errores y registro
- Sugerencias de tipo para mejor mantenibilidad del código
- Diseño modular con métodos separados para diferentes funcionalidades
- Proceso de Generación de Correos
- Crea plantillas de ejemplo para aprendizaje con pocos ejemplos
- Formatea ejemplos en una estructura consistente
- Maneja la interacción con la API con apropiado control de errores
- Parámetros configurables para temperatura y límites de tokens
- Mejores Prácticas
- Manejo apropiado de excepciones con registro
- Estructura limpia del código siguiendo las pautas PEP 8
- Documentación exhaustiva con docstrings
- Diseño flexible y extensible
En este ejemplo de aprendizaje con pocos ejemplos, el asistente observa la estructura y el tono de las muestras proporcionadas y luego genera un correo electrónico que sigue el mismo estilo.
5.4.3 Prompting con Cadena de Pensamiento
El prompting con cadena de pensamiento es una técnica sofisticada donde guías al modelo para desglosar su proceso de razonamiento en pasos lógicos y claros antes de llegar a una respuesta final. Este poderoso enfoque refleja cómo los humanos abordan problemas complejos - dividiéndolos en piezas más pequeñas y manejables y siguiendo un proceso de pensamiento estructurado. Al igual que un detective resolviendo un caso, el modelo examina evidencia, establece conexiones y saca conclusiones de manera sistemática.
Cuando usas el prompting con cadena de pensamiento, esencialmente le pides al modelo que "muestre su trabajo", similar a cómo un profesor de matemáticas podría requerir que los estudiantes demuestren sus pasos para resolver problemas. Este método sirve múltiples propósitos: ayuda a verificar el razonamiento del modelo, identifica posibles errores lógicos y hace que el proceso de solución sea transparente y más fácil de entender. Al seguir este enfoque, puedes asegurar que el modelo no solo proporcione respuestas, sino que también demuestre una comprensión profunda del proceso de resolución de problemas.
Esta estrategia es particularmente efectiva para tareas de razonamiento complejo o cuando necesitas que el modelo explique su proceso de pensamiento. Considera estas aplicaciones clave:
- Descomposición de Problemas: Desglosar problemas complejos en subproblemas manejables
- Verificación Lógica: Asegurar que cada paso siga lógicamente del anterior
- Detección de Errores: Identificar posibles errores temprano en el proceso de razonamiento
- Transferencia de Conocimiento: Hacer que el proceso de solución sea lo suficientemente claro para que otros aprendan de él
Es especialmente valioso en escenarios que involucran problemas de múltiples pasos, deducciones lógicas o situaciones donde el camino hacia la solución es tan importante como la respuesta final. Por ejemplo:
- Resolución de Problemas Matemáticos: Resolver ecuaciones paso a paso
- Análisis Científico: Desglosar hipótesis complejas y experimentos
- Toma de Decisiones Empresariales: Analizar múltiples factores que influyen en una decisión final
- Razonamiento Legal: Construir argumentos mediante el examen cuidadoso de evidencia y precedentes
A través del prompting con cadena de pensamiento, puedes ayudar a asegurar que cada paso del proceso de razonamiento sea sólido, esté bien documentado y construya lógicamente hacia la conclusión final. Este enfoque no solo mejora la precisión de los resultados sino que también hace que todo el proceso sea más transparente y confiable.
Ejemplo: Cadena de Pensamiento para un Problema Matemático
Digamos que quieres que el modelo resuelva y explique un problema aritmético de múltiples pasos.
import openai
import logging
from typing import Dict, Any
from datetime import datetime
# Configure logging
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)
class MathTutor:
def __init__(self, api_key: str):
self.api_key = api_key
openai.api_key = api_key
def solve_with_explanation(
self,
problem: str,
model: str = "gpt-4",
temperature: float = 0.5,
max_tokens: int = 150
) -> Dict[str, Any]:
"""
Solves a math problem with step-by-step explanation.
Args:
problem: The math problem to solve
model: OpenAI model to use
temperature: Controls randomness (0.0-1.0)
max_tokens: Maximum tokens in response
Returns:
Dictionary containing the response and metadata
"""
try:
start_time = datetime.now()
response = openai.ChatCompletion.create(
model=model,
messages=[
{
"role": "system",
"content": """You are a patient and thorough math tutor.
Explain your reasoning step by step,
showing all work clearly."""
},
{
"role": "user",
"content": f"Solve this problem with detailed explanation: {problem}"
}
],
temperature=temperature,
max_tokens=max_tokens
)
execution_time = (datetime.now() - start_time).total_seconds()
result = {
"solution": response["choices"][0]["message"]["content"],
"model": model,
"execution_time": execution_time,
"tokens_used": response["usage"]["total_tokens"]
}
logger.info(
f"Problem solved successfully. "
f"Execution time: {execution_time:.2f}s, "
f"Tokens used: {result['tokens_used']}"
)
return result
except Exception as e:
logger.error(f"Error solving problem: {str(e)}")
raise
def main():
# Example usage
tutor = MathTutor("your-api-key-here")
problem = """
If you have 3 apples and you buy 2 more,
then give away 1 apple, how many apples do you have?
"""
try:
result = tutor.solve_with_explanation(problem)
print("\nSolution:")
print("-" * 50)
print(result["solution"])
print("\nMetadata:")
print(f"Model used: {result['model']}")
print(f"Execution time: {result['execution_time']:.2f} seconds")
print(f"Tokens used: {result['tokens_used']}")
except Exception as e:
print(f"Failed to solve problem: {str(e)}")
if __name__ == "__main__":
main()
Desglose del código:
- Estructura y Organización
- Crea una clase MathTutor dedicada para una mejor organización del código
- Implementa un manejo de errores y registro apropiado
- Utiliza sugerencias de tipo para mejor mantenibilidad del código
- Sigue los principios de código limpio y las pautas PEP 8
- Características Principales
- Registro completo con marcas de tiempo y formateo
- Seguimiento del rendimiento con medición del tiempo de ejecución
- Monitoreo del uso de tokens
- Configuración flexible de parámetros
- Manejo de Errores
- Bloques try-except para llamadas a la API
- Registro detallado de errores
- Propagación apropiada de excepciones
- Gestión de Salida
- Formato de respuesta estructurado con solución y metadatos
- Presentación clara de resultados
- Métricas de rendimiento incluidas en la salida
En este ejemplo de cadena de pensamiento, el mensaje del sistema instruye a la IA a pensar paso a paso. La salida debe mostrar el proceso de razonamiento antes de llegar a la respuesta final.
5.4.4 Reflexiones Finales sobre Estrategias de Prompting
Sinteticemos lo que hemos aprendido sobre los tres enfoques principales para la interacción con IA. Cada método—desde el prompting sin ejemplos hasta el prompting con cadena de pensamiento—ofrece ventajas distintivas para diferentes escenarios, convirtiéndolos en herramientas vitales para la comunicación efectiva con IA. Al comprender cuándo y cómo usar cada estrategia, puedes mejorar dramáticamente tus interacciones con modelos de lenguaje de IA.
- El prompting sin ejemplos es rápido y funciona bien cuando tu pregunta es directa. Este enfoque no requiere ejemplos y es mejor utilizado para consultas simples y directas donde el contexto es claro. Por ejemplo, preguntar "¿Cuál es la capital de Francia?" no necesita contexto adicional ni ejemplos para obtener una respuesta precisa.
- El prompting con pocos ejemplos proporciona orientación mediante ejemplos, haciéndolo ideal para tareas que requieren un formato o estilo específico. Al mostrar al modelo de IA 2-3 ejemplos del formato de salida deseado, ayudas a que entienda exactamente lo que estás buscando. Esto es particularmente efectivo para tareas como escribir descripciones de productos, formatear datos o mantener un tono consistente en múltiples salidas.
- El prompting con cadena de pensamiento fomenta el razonamiento detallado, convirtiéndolo en una estrategia valiosa para escenarios de resolución de problemas complejos. Este método pide a la IA que desglose su proceso de pensamiento en pasos claros, similar a mostrar el trabajo en un problema matemático. Es especialmente útil para tareas que involucran múltiples pasos, deducciones lógicas o cuando necesitas verificar el proceso de razonamiento de la IA.
Cada estrategia de prompting tiene sus propias fortalezas y casos de uso óptimos en tu conjunto de herramientas. El prompting sin ejemplos funciona mejor para consultas directas, el prompting con pocos ejemplos sobresale en mantener la consistencia y el formato, y la cadena de pensamiento es crucial para tareas de razonamiento complejo. Con práctica y experimentación, desarrollarás una intuición sobre qué método usar según tus necesidades específicas. Considera factores como la complejidad de la tarea, el formato de salida deseado y la importancia de ver el proceso de razonamiento al elegir tu enfoque. Ya sea que estés definiendo términos técnicos, redactando correos electrónicos o resolviendo ecuaciones complejas, seleccionar la estrategia de prompting correcta es crucial para generar resultados de alta calidad y confiables que cumplan exactamente con tus requisitos.
5.4 Prompting Few-shot, Zero-shot y Chain-of-Thought
Entendiendo Diferentes Estrategias de Prompting
Cuando trabajas con modelos de lenguaje de OpenAI, puedes emplear varios métodos sofisticados para guiar la interpretación y respuesta del modelo a tus solicitudes. Estos métodos varían en complejidad y efectividad dependiendo de tus necesidades específicas. Entender estas estrategias es crucial para obtener las respuestas más precisas y útiles del modelo.
Las tres estrategias principales que puedes utilizar son:
- Prompting zero-shot: El enfoque más directo donde pides al modelo realizar una tarea sin proporcionar ejemplos. Esto funciona bien para solicitudes simples y claras donde el modelo puede confiar en su conocimiento pre-entrenado.
- Prompting few-shot: Un enfoque más guiado donde proporcionas al modelo ejemplos del tipo de respuesta que buscas. Esto ayuda a establecer patrones y expectativas para tareas complejas o específicas.
- Prompting chain-of-thought: Una técnica avanzada que anima al modelo a desglosar problemas complejos en pasos lógicos más pequeños. Esto es particularmente útil para tareas de resolución de problemas que requieren razonamiento detallado.
Cada estrategia tiene ventajas distintas y casos de uso óptimos, y tu elección debe basarse en factores como la complejidad de la tarea, el formato de salida deseado y el nivel de razonamiento requerido. La clave es seleccionar la estrategia más apropiada que se alinee con tus objetivos y requisitos específicos.
5.4.1 Prompting sin ejemplos (Zero-shot)
El prompting sin ejemplos se usa cuando proporcionas al modelo una instrucción sin incluir ejemplos adicionales. El modelo se basa únicamente en su conocimiento pre-entrenado para generar una respuesta. Este enfoque aprovecha el extenso entrenamiento del modelo en diversos dominios, permitiéndole interpretar y responder a las instrucciones basándose en su comprensión inherente. Es como hacerle una pregunta a una persona bien educada - utilizan su conocimiento existente sin necesitar ejemplos de cómo responder.
La capacidad del modelo para manejar prompts sin ejemplos proviene de su entrenamiento con enormes cantidades de datos, incluyendo libros, artículos, sitios web y otras fuentes de texto. Este entrenamiento integral le permite entender el contexto, reconocer patrones y generar respuestas apropiadas en muchos temas. Por ejemplo, si preguntas "¿Qué es la fotosíntesis?", el modelo puede proporcionar una explicación detallada sin necesitar ejemplos de respuestas sobre otros procesos biológicos.
A diferencia de otros métodos de prompting, el método sin ejemplos no requiere demostraciones ni pautas específicas de formato. Esto lo hace particularmente eficiente para consultas rápidas y tareas simples. Sin embargo, su éxito depende en gran medida de qué tan bien esté formulada la instrucción y si la tarea está dentro del dominio de conocimiento general del modelo. La clave para un prompting sin ejemplos exitoso radica en ser claro, específico y sin ambigüedades en tu solicitud.
Este método es directo e ideal cuando la pregunta es clara y sin ambigüedades, haciéndolo particularmente efectivo para tareas comunes como definiciones, explicaciones o preguntas directas. Funciona especialmente bien para:
- Consultas de conocimiento general
- Análisis básico de texto
- Clasificaciones simples
- Preguntas directas sobre temas bien documentados
Sin embargo, su éxito depende en gran medida de qué tan bien esté formulada la instrucción y si la tarea está dentro del dominio de conocimiento general del modelo. Cuando la tarea se vuelve demasiado especializada o requiere formatos específicos o patrones de razonamiento, otros métodos de prompting podrían ser más apropiados.
Ejemplo: Prompting sin ejemplos en acción
Supón que quieres definir un término técnico simple sin ninguna guía adicional.
import openai
import os
from dotenv import load_dotenv
import json
from typing import Dict, Any
import logging
# Configure logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
class OpenAIClient:
def __init__(self):
# Load environment variables
load_dotenv()
self.api_key = os.getenv("OPENAI_API_KEY")
if not self.api_key:
raise ValueError("OpenAI API key not found in environment variables")
openai.api_key = self.api_key
def get_zero_shot_response(self, prompt: str, **kwargs) -> Dict[str, Any]:
"""
Get a zero-shot response from the OpenAI API
Args:
prompt (str): The prompt to send to the API
**kwargs: Additional parameters for the API call
Returns:
Dict[str, Any]: The API response
"""
try:
response = openai.ChatCompletion.create(
model=kwargs.get("model", "gpt-4"),
messages=[
{"role": "user", "content": prompt}
],
temperature=kwargs.get("temperature", 0.5),
max_tokens=kwargs.get("max_tokens", 100)
)
return response
except Exception as e:
logger.error(f"Error getting response from OpenAI: {str(e)}")
raise
def main():
# Initialize the OpenAI client
client = OpenAIClient()
# Example prompts
prompts = [
"Define what a hash table is in computer science.",
"Explain the concept of time complexity.",
"What is object-oriented programming?"
]
# Get responses for each prompt
for prompt in prompts:
try:
response = client.get_zero_shot_response(
prompt,
temperature=0.5,
max_tokens=150
)
print(f"\nPrompt: {prompt}")
print("Response:")
print(response["choices"][0]["message"]["content"])
# Log additional response metadata
logger.info(f"Response tokens: {response['usage']['total_tokens']}")
except Exception as e:
logger.error(f"Failed to get response for prompt '{prompt}': {str(e)}")
if __name__ == "__main__":
main()
Desglose del código:
- Estructura y Organización
- Utiliza un enfoque basado en clases con OpenAIClient para una mejor organización del código
- Implementa un manejo adecuado de errores y registro
- Separa las responsabilidades entre la interacción con la API y el flujo principal del programa
- Características Principales
- Manejo de variables de entorno con python-dotenv
- Sugerencias de tipo para mejor mantenibilidad del código
- Paso flexible de parámetros con **kwargs
- Múltiples ejemplos de prompts para demostrar el uso
- Manejo de Errores y Registro
- Captura y reporte exhaustivo de errores
- Configuración de registro para depuración
- Validación de la presencia de la clave API
- Mejores Prácticas
- Estructura limpia del código siguiendo PEP 8
- Documentación apropiada con docstrings
- Diseño modular para fácil extensión
- Consideraciones de gestión de recursos
En este ejemplo sin ejemplos previos, el modelo utiliza su entrenamiento general para proporcionar una definición de una tabla hash, sin requerir ejemplos contextuales adicionales.
5.4.2 Prompting con Ejemplos
En el prompting con ejemplos, proporcionas al modelo un conjunto de ejemplos cuidadosamente seleccionados junto con tu prompt para guiar sus respuestas. Este método poderoso actúa como una enseñanza mediante demostración - similar a cómo un profesor podría mostrar a los estudiantes varios problemas matemáticos resueltos antes de pedirles que resuelvan uno por sí mismos. Al incluir 2-3 ejemplos bien elaborados que demuestran el patrón, estilo o formato que deseas, ayudas al modelo a comprender mejor tus expectativas, tal como un humano aprendería estudiando ejemplos.
El prompting con ejemplos es particularmente efectivo porque crea un marco claro para que el modelo siga. En lugar de depender únicamente de su entrenamiento general, el modelo puede observar y replicar patrones específicos de tus ejemplos. Piensa en ello como darle a alguien una plantilla o plano - pueden ver exactamente cómo debe verse el producto final. Este enfoque reduce significativamente la ambigüedad y conduce a resultados más consistentes y precisamente formateados que se alinean con tus necesidades. Los ejemplos sirven como puntos de referencia concretos que guían la comprensión del modelo sobre la tarea.
Este enfoque es especialmente valioso cuando necesitas respuestas que sigan una estructura particular, utilicen terminología específica, mantengan cierto tono o se adhieran a requisitos únicos de formato. Por ejemplo, si estás generando descripciones de productos, podrías proporcionar ejemplos que muestren la longitud ideal, el nivel de detalle técnico y el lenguaje de marketing. Para respuestas de servicio al cliente, tus ejemplos podrían demostrar el equilibrio perfecto entre profesionalismo y empatía. En documentación técnica, los ejemplos pueden ilustrar el estilo de documentación preferido, el uso de terminología y la profundidad de explicación. Al proporcionar estos ejemplos cuidadosamente seleccionados, efectivamente "entrenas" al modelo para entender y replicar tu estilo de comunicación deseado, asegurando consistencia en todo el contenido generado.
Ejemplo: Prompting con Ejemplos para Escritura de Correos Electrónicos
Imagina que quieres que el modelo genere un correo electrónico siguiendo una plantilla específica. Puedes proporcionar dos ejemplos breves antes de pedirle al modelo que redacte un nuevo correo electrónico.
import openai
import os
from dotenv import load_dotenv
import logging
from typing import Dict, Any, List, Optional
# Configure logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
class EmailTemplate:
def __init__(self, subject: str, body: str, signature: str):
self.subject = subject
self.body = body
self.signature = signature
class EmailAssistant:
def __init__(self):
load_dotenv()
self.api_key = os.getenv("OPENAI_API_KEY")
if not self.api_key:
raise ValueError("OpenAI API key not found")
openai.api_key = self.api_key
def _create_example_emails(self) -> List[EmailTemplate]:
"""Create example email templates for few-shot learning"""
return [
EmailTemplate(
"Meeting Reminder",
"Hi John,\n\nJust a quick reminder about our meeting tomorrow at 10 AM. Looking forward to our discussion.",
"Best regards,\nAlice"
),
EmailTemplate(
"Project Update",
"Hello Team,\n\nHere is a brief update on our current project. We are on track and will meet the upcoming milestones as scheduled.",
"Thanks,\nBob"
)
]
def format_examples(self, examples: List[EmailTemplate]) -> str:
"""Format email examples for the prompt"""
formatted = ""
for i, example in enumerate(examples, 1):
formatted += f"Example {i}:\n"
formatted += f"Subject: {example.subject}\n"
formatted += f"{example.body}\n\n{example.signature}\n\n"
return formatted
def generate_email(self,
task: str,
temperature: float = 0.5,
max_tokens: int = 200) -> Optional[str]:
"""
Generate an email using few-shot learning
Args:
task: Description of the email to generate
temperature: Controls randomness (0.0-1.0)
max_tokens: Maximum tokens in response
Returns:
Generated email text or None if failed
"""
try:
examples = self._create_example_emails()
formatted_examples = self.format_examples(examples)
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[
{
"role": "system",
"content": "You are an email writing assistant who creates professional and friendly emails."
},
{
"role": "user",
"content": f"{formatted_examples}Now, please write an email to {task}"
}
],
temperature=temperature,
max_tokens=max_tokens
)
logger.info(f"Successfully generated email for task: {task}")
return response["choices"][0]["message"]["content"]
except Exception as e:
logger.error(f"Error generating email: {str(e)}")
return None
def main():
# Initialize email assistant
assistant = EmailAssistant()
# Generate email
task = "remind the team to submit their monthly reports"
email = assistant.generate_email(task)
if email:
print("\nGenerated Email:")
print("-" * 50)
print(email)
else:
print("Failed to generate email")
if __name__ == "__main__":
main()
Desglose del código:
- Clases y Estructura
- EmailTemplate: Una clase de datos para almacenar componentes de correo electrónico (asunto, cuerpo, firma)
- EmailAssistant: Clase principal que maneja la generación de correos con la API de OpenAI
- El código organizado sigue los principios SOLID y una adecuada separación de responsabilidades
- Características Principales
- Gestión de variables de entorno con python-dotenv
- Manejo integral de errores y registro
- Sugerencias de tipo para mejor mantenibilidad del código
- Diseño modular con métodos separados para diferentes funcionalidades
- Proceso de Generación de Correos
- Crea plantillas de ejemplo para aprendizaje con pocos ejemplos
- Formatea ejemplos en una estructura consistente
- Maneja la interacción con la API con apropiado control de errores
- Parámetros configurables para temperatura y límites de tokens
- Mejores Prácticas
- Manejo apropiado de excepciones con registro
- Estructura limpia del código siguiendo las pautas PEP 8
- Documentación exhaustiva con docstrings
- Diseño flexible y extensible
En este ejemplo de aprendizaje con pocos ejemplos, el asistente observa la estructura y el tono de las muestras proporcionadas y luego genera un correo electrónico que sigue el mismo estilo.
5.4.3 Prompting con Cadena de Pensamiento
El prompting con cadena de pensamiento es una técnica sofisticada donde guías al modelo para desglosar su proceso de razonamiento en pasos lógicos y claros antes de llegar a una respuesta final. Este poderoso enfoque refleja cómo los humanos abordan problemas complejos - dividiéndolos en piezas más pequeñas y manejables y siguiendo un proceso de pensamiento estructurado. Al igual que un detective resolviendo un caso, el modelo examina evidencia, establece conexiones y saca conclusiones de manera sistemática.
Cuando usas el prompting con cadena de pensamiento, esencialmente le pides al modelo que "muestre su trabajo", similar a cómo un profesor de matemáticas podría requerir que los estudiantes demuestren sus pasos para resolver problemas. Este método sirve múltiples propósitos: ayuda a verificar el razonamiento del modelo, identifica posibles errores lógicos y hace que el proceso de solución sea transparente y más fácil de entender. Al seguir este enfoque, puedes asegurar que el modelo no solo proporcione respuestas, sino que también demuestre una comprensión profunda del proceso de resolución de problemas.
Esta estrategia es particularmente efectiva para tareas de razonamiento complejo o cuando necesitas que el modelo explique su proceso de pensamiento. Considera estas aplicaciones clave:
- Descomposición de Problemas: Desglosar problemas complejos en subproblemas manejables
- Verificación Lógica: Asegurar que cada paso siga lógicamente del anterior
- Detección de Errores: Identificar posibles errores temprano en el proceso de razonamiento
- Transferencia de Conocimiento: Hacer que el proceso de solución sea lo suficientemente claro para que otros aprendan de él
Es especialmente valioso en escenarios que involucran problemas de múltiples pasos, deducciones lógicas o situaciones donde el camino hacia la solución es tan importante como la respuesta final. Por ejemplo:
- Resolución de Problemas Matemáticos: Resolver ecuaciones paso a paso
- Análisis Científico: Desglosar hipótesis complejas y experimentos
- Toma de Decisiones Empresariales: Analizar múltiples factores que influyen en una decisión final
- Razonamiento Legal: Construir argumentos mediante el examen cuidadoso de evidencia y precedentes
A través del prompting con cadena de pensamiento, puedes ayudar a asegurar que cada paso del proceso de razonamiento sea sólido, esté bien documentado y construya lógicamente hacia la conclusión final. Este enfoque no solo mejora la precisión de los resultados sino que también hace que todo el proceso sea más transparente y confiable.
Ejemplo: Cadena de Pensamiento para un Problema Matemático
Digamos que quieres que el modelo resuelva y explique un problema aritmético de múltiples pasos.
import openai
import logging
from typing import Dict, Any
from datetime import datetime
# Configure logging
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)
class MathTutor:
def __init__(self, api_key: str):
self.api_key = api_key
openai.api_key = api_key
def solve_with_explanation(
self,
problem: str,
model: str = "gpt-4",
temperature: float = 0.5,
max_tokens: int = 150
) -> Dict[str, Any]:
"""
Solves a math problem with step-by-step explanation.
Args:
problem: The math problem to solve
model: OpenAI model to use
temperature: Controls randomness (0.0-1.0)
max_tokens: Maximum tokens in response
Returns:
Dictionary containing the response and metadata
"""
try:
start_time = datetime.now()
response = openai.ChatCompletion.create(
model=model,
messages=[
{
"role": "system",
"content": """You are a patient and thorough math tutor.
Explain your reasoning step by step,
showing all work clearly."""
},
{
"role": "user",
"content": f"Solve this problem with detailed explanation: {problem}"
}
],
temperature=temperature,
max_tokens=max_tokens
)
execution_time = (datetime.now() - start_time).total_seconds()
result = {
"solution": response["choices"][0]["message"]["content"],
"model": model,
"execution_time": execution_time,
"tokens_used": response["usage"]["total_tokens"]
}
logger.info(
f"Problem solved successfully. "
f"Execution time: {execution_time:.2f}s, "
f"Tokens used: {result['tokens_used']}"
)
return result
except Exception as e:
logger.error(f"Error solving problem: {str(e)}")
raise
def main():
# Example usage
tutor = MathTutor("your-api-key-here")
problem = """
If you have 3 apples and you buy 2 more,
then give away 1 apple, how many apples do you have?
"""
try:
result = tutor.solve_with_explanation(problem)
print("\nSolution:")
print("-" * 50)
print(result["solution"])
print("\nMetadata:")
print(f"Model used: {result['model']}")
print(f"Execution time: {result['execution_time']:.2f} seconds")
print(f"Tokens used: {result['tokens_used']}")
except Exception as e:
print(f"Failed to solve problem: {str(e)}")
if __name__ == "__main__":
main()
Desglose del código:
- Estructura y Organización
- Crea una clase MathTutor dedicada para una mejor organización del código
- Implementa un manejo de errores y registro apropiado
- Utiliza sugerencias de tipo para mejor mantenibilidad del código
- Sigue los principios de código limpio y las pautas PEP 8
- Características Principales
- Registro completo con marcas de tiempo y formateo
- Seguimiento del rendimiento con medición del tiempo de ejecución
- Monitoreo del uso de tokens
- Configuración flexible de parámetros
- Manejo de Errores
- Bloques try-except para llamadas a la API
- Registro detallado de errores
- Propagación apropiada de excepciones
- Gestión de Salida
- Formato de respuesta estructurado con solución y metadatos
- Presentación clara de resultados
- Métricas de rendimiento incluidas en la salida
En este ejemplo de cadena de pensamiento, el mensaje del sistema instruye a la IA a pensar paso a paso. La salida debe mostrar el proceso de razonamiento antes de llegar a la respuesta final.
5.4.4 Reflexiones Finales sobre Estrategias de Prompting
Sinteticemos lo que hemos aprendido sobre los tres enfoques principales para la interacción con IA. Cada método—desde el prompting sin ejemplos hasta el prompting con cadena de pensamiento—ofrece ventajas distintivas para diferentes escenarios, convirtiéndolos en herramientas vitales para la comunicación efectiva con IA. Al comprender cuándo y cómo usar cada estrategia, puedes mejorar dramáticamente tus interacciones con modelos de lenguaje de IA.
- El prompting sin ejemplos es rápido y funciona bien cuando tu pregunta es directa. Este enfoque no requiere ejemplos y es mejor utilizado para consultas simples y directas donde el contexto es claro. Por ejemplo, preguntar "¿Cuál es la capital de Francia?" no necesita contexto adicional ni ejemplos para obtener una respuesta precisa.
- El prompting con pocos ejemplos proporciona orientación mediante ejemplos, haciéndolo ideal para tareas que requieren un formato o estilo específico. Al mostrar al modelo de IA 2-3 ejemplos del formato de salida deseado, ayudas a que entienda exactamente lo que estás buscando. Esto es particularmente efectivo para tareas como escribir descripciones de productos, formatear datos o mantener un tono consistente en múltiples salidas.
- El prompting con cadena de pensamiento fomenta el razonamiento detallado, convirtiéndolo en una estrategia valiosa para escenarios de resolución de problemas complejos. Este método pide a la IA que desglose su proceso de pensamiento en pasos claros, similar a mostrar el trabajo en un problema matemático. Es especialmente útil para tareas que involucran múltiples pasos, deducciones lógicas o cuando necesitas verificar el proceso de razonamiento de la IA.
Cada estrategia de prompting tiene sus propias fortalezas y casos de uso óptimos en tu conjunto de herramientas. El prompting sin ejemplos funciona mejor para consultas directas, el prompting con pocos ejemplos sobresale en mantener la consistencia y el formato, y la cadena de pensamiento es crucial para tareas de razonamiento complejo. Con práctica y experimentación, desarrollarás una intuición sobre qué método usar según tus necesidades específicas. Considera factores como la complejidad de la tarea, el formato de salida deseado y la importancia de ver el proceso de razonamiento al elegir tu enfoque. Ya sea que estés definiendo términos técnicos, redactando correos electrónicos o resolviendo ecuaciones complejas, seleccionar la estrategia de prompting correcta es crucial para generar resultados de alta calidad y confiables que cumplan exactamente con tus requisitos.