Capítulo 5: Ingeniería de Prompts e Instrucciones del Sistema
5.3 Plantillas de Prompts: Programación, Productividad, Atención al Cliente
Las plantillas de prompts son instrucciones pre-formuladas y cuidadosamente diseñadas que sirven como planos para las interacciones con IA. Estas plantillas actúan como marcos estructurados que guían a los modelos de IA para generar respuestas de manera consistente, predecible y en el formato deseado. Piensa en ellas como tarjetas de recetas - contienen todos los ingredientes y pasos necesarios para producir exactamente el resultado que necesitas.
El poder de las plantillas de prompts radica en su capacidad para:
- Estandarizar la Comunicación: Aseguran que cada interacción siga un patrón predeterminado
- Mejorar la Eficiencia: Al eliminar la necesidad de crear nuevos prompts para solicitudes similares
- Aumentar la Calidad: A través de instrucciones cuidadosamente redactadas que previenen errores comunes
- Ahorrar Tiempo: Al reducir el proceso de prueba y error en la ingeniería de prompts
En esta sección, exploraremos tres categorías esenciales de plantillas de prompts que forman la columna vertebral de muchas aplicaciones de IA:
- Programación – Para ayuda en programación, depuración o generación de código
- Incluye corrección de sintaxis, optimización de código y guía arquitectónica
- Ayuda a mantener estándares de codificación y mejores prácticas consistentes
- Productividad – Para generar resúmenes, listas de tareas o información de programación
- Facilita una mejor gestión del tiempo y organización de tareas
- Ayuda a crear elementos claros y procesables a partir de información compleja
- Atención al Cliente – Para atender consultas, proporcionar pasos de solución de problemas o responder a comentarios de clientes
- Asegura una comunicación profesional y consistente con los clientes
- Mantiene la voz de la marca mientras proporciona soluciones útiles
Exploremos cada categoría con ejemplos detallados.
5.3.1 Plantillas de Prompts para Programación
Al construir asistentes de programación o sistemas de tutoría impulsados por IA, la claridad es absolutamente esencial para obtener resultados efectivos. Tu plantilla de prompt sirve como base para todas las interacciones, por lo que debe ser meticulosamente elaborada con varios elementos clave. Exploremos cada elemento en detalle para entender su importancia e implementación:
Primero, debe definir claramente la tarea en cuestión - ya sea revisión de código, corrección de errores o explicación de conceptos. Esta definición debe ser lo suficientemente específica para que la IA entienda exactamente qué tipo de asistencia se requiere. Por ejemplo, en lugar de decir "revisa este código", especifica "revisa esta función de Python para detectar posibles fugas de memoria y sugiere optimizaciones para un mejor rendimiento". Este nivel de especificidad ayuda a la IA a proporcionar asistencia más precisa y valiosa.
Segundo, la plantilla debe especificar cualquier restricción o requerimiento importante, como el lenguaje de programación, pautas de estilo de código o consideraciones de rendimiento. Estas restricciones ayudan a asegurar que la respuesta de la IA se mantenga dentro de parámetros útiles. Por ejemplo, podrías especificar:
- Versión del lenguaje de programación (ej., "Python 3.9+")
- Requisitos de guía de estilo (ej., "compatible con PEP 8")
- Objetivos de rendimiento (ej., "optimizar para uso de memoria sobre velocidad")
- Convenciones específicas del proyecto (ej., "seguir convenciones de nomenclatura de la empresa")
Finalmente, incluir un ejemplo relevante en tu plantilla puede mejorar significativamente la calidad de las respuestas. Este ejemplo sirve como punto de referencia concreto, mostrando a la IA exactamente qué tipo de resultado estás buscando. Por ejemplo, al solicitar optimización de código, proporcionar una muestra de la estructura actual del código ayuda a la IA a entender tu estilo de programación y mantener la consistencia. Un buen ejemplo debe incluir:
- Contexto sobre el propósito y entorno del código
- Cualquier documentación o comentarios existentes
- Funciones o dependencias relacionadas
- Comportamientos esperados de entrada/salida
- Métricas o problemas de rendimiento actuales
Ejemplo: Asistencia en Depuración
Imagina que quieres que la IA te ayude a depurar un fragmento de código Python. Tu prompt podría proporcionar contexto, mostrar el fragmento de código y hacer preguntas específicas sobre posibles errores.
Plantilla:
import openai
import os
from dotenv import load_dotenv
import logging
from typing import Optional
# Set up logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
def setup_openai_client() -> bool:
"""Initialize OpenAI client with API key from environment."""
try:
load_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")
if not openai.api_key:
raise ValueError("OpenAI API key not found")
return True
except Exception as e:
logger.error(f"Failed to initialize OpenAI client: {e}")
return False
def factorial(n: int) -> Optional[int]:
"""
Calculate the factorial of a non-negative integer.
Args:
n (int): The number to calculate factorial for
Returns:
Optional[int]: The factorial result or None if input is invalid
Raises:
RecursionError: If input is too large
ValueError: If input is negative
"""
try:
if not isinstance(n, int):
raise TypeError("Input must be an integer")
if n < 0:
raise ValueError("Input must be non-negative")
if n == 0:
return 1
else:
return n * factorial(n - 1) # Fixed recursion
except Exception as e:
logger.error(f"Error calculating factorial: {e}")
return None
def get_debugging_assistance(code_snippet: str) -> str:
"""
Get AI assistance for debugging code.
Args:
code_snippet (str): The problematic code to debug
Returns:
str: AI's debugging suggestions
"""
if not setup_openai_client():
return "Failed to initialize OpenAI client"
messages = [
{"role": "system", "content": "You are a knowledgeable and patient coding assistant."},
{"role": "user", "content": (
f"I have the following Python code that needs debugging:\n\n"
f"{code_snippet}\n\n"
"Please identify any bugs and suggest fixes."
)}
]
try:
response = openai.ChatCompletion.create(
model="gpt-4",
messages=messages,
max_tokens=200,
temperature=0.5
)
return response["choices"][0]["message"]["content"]
except Exception as e:
logger.error(f"Error getting OpenAI response: {e}")
return f"Failed to get debugging assistance: {str(e)}"
def main():
# Example usage
test_cases = [5, 0, -1, "invalid", 10]
for test in test_cases:
print(f"\nTesting factorial({test})")
try:
result = factorial(test)
print(f"Result: {result}")
except Exception as e:
print(f"Error: {e}")
# Example of getting debugging assistance
problematic_code = """
def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n) # Bug: infinite recursion
"""
print("\nGetting debugging assistance:")
assistance = get_debugging_assistance(problematic_code)
print(assistance)
if __name__ == "__main__":
main()
Explicación del Desglose del Código:
- Estructura y Organización
- Las importaciones están agrupadas de manera lógica e incluyen sugerencias de tipo y registro
- Las funciones están bien documentadas con docstrings
- El manejo de errores está implementado en todo el código
- Componentes Principales
- setup_openai_client(): Maneja la inicialización de la API de manera segura
- factorial(): Mejorado con sugerencias de tipo y manejo de errores
- get_debugging_assistance(): Encapsula la lógica de interacción con IA
- main(): Demuestra el uso con varios casos de prueba
- Mejoras Sobre el Original
- Se agregó manejo integral de errores
- Se incluyeron sugerencias de tipo para mayor claridad del código
- Se implementó registro para depuración
- Se agregaron casos de prueba para demostrar diferentes escenarios
- Mejores Prácticas Demostradas
- Separación de funciones para mejor mantenibilidad
- Documentación y comentarios apropiados
- Manejo de errores y registro robusto
- Sugerencias de tipo para mayor claridad del código
En esta plantilla, el prompt establece claramente las expectativas al indicar el rol de la IA y proporcionar el problema exacto. Esto ayuda al asistente a diagnosticar problemas de manera efectiva.
5.3.2 Plantillas de Prompts para Productividad
Para aplicaciones de productividad, tus prompts deben estar cuidadosamente diseñados para generar diferentes tipos de contenido organizacional. Estas plantillas deben estar estructuradas para manejar tres categorías principales de herramientas de productividad:
1. Resúmenes Detallados
Estos deben condensar información compleja en formatos digeribles mientras preservan el significado esencial. Al crear prompts para resúmenes, considera:
- Técnicas de extracción de información clave
- Usar análisis semántico para identificar conceptos principales
- Implementar reconocimiento de palabras clave para puntos importantes
- Aplicar procesamiento de lenguaje natural para detectar temas clave
- Organización jerárquica de puntos principales y detalles de apoyo
- Crear niveles claros de información primaria, secundaria y terciaria
- Establecer conexiones lógicas entre puntos relacionados
- Usar formato consistente para indicar jerarquía de información
- Métodos para mantener el contexto mientras se reduce la extensión
- Preservar información contextual crítica
- Usar lenguaje conciso sin sacrificar claridad
- Implementar frases de transición efectivas para mantener el flujo
Ejemplo: Generador de Resúmenes Detallados
import openai
import os
from dotenv import load_dotenv
from typing import Dict, List, Optional
import logging
# Configure logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
class SummaryGenerator:
def __init__(self):
"""Initialize the SummaryGenerator with OpenAI credentials."""
load_dotenv()
self.api_key = os.getenv("OPENAI_API_KEY")
if not self.api_key:
raise ValueError("OpenAI API key not found in environment")
openai.api_key = self.api_key
def extract_key_points(self, text: str) -> List[str]:
"""
Extract main points from the input text using semantic analysis.
Args:
text (str): Input text to analyze
Returns:
List[str]: List of key points extracted from the text
"""
try:
messages = [
{"role": "system", "content": "You are a precise summarization assistant. Extract only the main points from the following text."},
{"role": "user", "content": text}
]
response = openai.ChatCompletion.create(
model="gpt-4",
messages=messages,
max_tokens=150,
temperature=0.3
)
return response.choices[0].message.content.split('\n')
except Exception as e:
logger.error(f"Error extracting key points: {e}")
return []
def generate_hierarchical_summary(self, text: str, max_length: int = 500) -> Dict[str, any]:
"""
Generate a structured summary with hierarchical organization.
Args:
text (str): Input text to summarize
max_length (int): Maximum length of the summary
Returns:
Dict: Structured summary with main points and supporting details
"""
try:
messages = [
{"role": "system", "content": (
"Create a hierarchical summary with the following structure:\n"
"1. Main points (maximum 3)\n"
"2. Supporting details for each point\n"
"3. Key takeaways"
)},
{"role": "user", "content": f"Summarize this text in {max_length} characters:\n{text}"}
]
response = openai.ChatCompletion.create(
model="gpt-4",
messages=messages,
max_tokens=300,
temperature=0.4
)
return {
"summary": response.choices[0].message.content,
"length": len(response.choices[0].message.content),
"timestamp": datetime.now().isoformat()
}
except Exception as e:
logger.error(f"Error generating summary: {e}")
return {"error": str(e)}
def format_summary(self, summary_dict: Dict[str, any]) -> str:
"""
Format the summary into a readable structure.
Args:
summary_dict (Dict): Dictionary containing summary information
Returns:
str: Formatted summary
"""
if "error" in summary_dict:
return f"Error generating summary: {summary_dict['error']}"
formatted_output = [
"# Summary Report",
f"Generated on: {summary_dict['timestamp']}",
f"Length: {summary_dict['length']} characters\n",
summary_dict['summary']
]
return "\n".join(formatted_output)
def main():
# Example usage
sample_text = """
Artificial Intelligence has transformed various industries, from healthcare to finance.
Machine learning algorithms now power recommendation systems, fraud detection, and
medical diagnosis. Deep learning, a subset of AI, has particularly excelled in image
and speech recognition tasks. However, these advances also raise important ethical
considerations regarding privacy and bias in AI systems.
"""
summarizer = SummaryGenerator()
# Generate and display summary
summary = summarizer.generate_hierarchical_summary(sample_text)
formatted_summary = summarizer.format_summary(summary)
print(formatted_summary)
if __name__ == "__main__":
main()
Explicación del Desglose del Código:
- Estructura y Organización de Clases
- La clase SummaryGenerator encapsula toda la funcionalidad relacionada con resúmenes
- Clara separación de responsabilidades con métodos distintos para diferentes tareas
- Manejo apropiado de errores y registro a lo largo del código
- Componentes Principales
- extract_key_points(): Utiliza análisis semántico para identificar conceptos principales
- generate_hierarchical_summary(): Crea resúmenes estructurados con jerarquía clara
- format_summary(): Convierte datos brutos del resumen en salida legible
- Características Avanzadas
- Anotaciones de tipo para mejor claridad y mantenibilidad del código
- Longitud y estructura de resumen configurables
- Seguimiento de marca temporal para la generación de resúmenes
- Manejo de errores con registro detallado
- Mejores Prácticas Demostradas
- Gestión de variables de entorno para claves API
- Documentación exhaustiva con docstrings
- Diseño modular para facilitar pruebas y mantenimiento
- Estructura de código limpia siguiendo las pautas PEP 8
Este ejemplo demuestra un enfoque listo para producción en la generación de resúmenes detallados, con manejo apropiado de errores, registro y una estructura clara que puede integrarse fácilmente en aplicaciones más grandes.
2. Listas de Tareas
Estas dividen las tareas en pasos manejables. Los prompts efectivos para listas de tareas deben incorporar:
- Mecanismos de priorización de tareas
- Indicadores de prioridad Alta/Media/Baja para identificar tareas críticas
- Indicadores de urgencia basados en plazos e impacto
- Repriorización dinámica basada en circunstancias cambiantes
- Pautas de estimación de tiempo
- Plazos realistas para completar tareas
- Períodos de amortiguación para retrasos inesperados
- Estimaciones basadas en esfuerzo (por ejemplo, victorias rápidas vs. tareas complejas)
- Mapeo de dependencias entre tareas
- Identificación clara de prerrequisitos
- Relaciones de tareas secuenciales vs. paralelas
- Análisis de ruta crítica para proyectos complejos
- Indicadores de seguimiento de progreso
- Métricas de porcentaje de finalización
- Puntos de control de hitos
- Actualizaciones de estado (No Iniciado, En Progreso, Completado)
Ejemplo: Sistema de Gestión de Tareas
import openai
import os
from datetime import datetime, timedelta
from typing import List, Dict, Optional
from enum import Enum
import logging
# Configure logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
class Priority(Enum):
LOW = "low"
MEDIUM = "medium"
HIGH = "high"
class TaskStatus(Enum):
NOT_STARTED = "not_started"
IN_PROGRESS = "in_progress"
COMPLETED = "completed"
class Task:
def __init__(
self,
title: str,
description: str,
priority: Priority,
due_date: datetime,
estimated_hours: float
):
self.title = title
self.description = description
self.priority = priority
self.due_date = due_date
self.estimated_hours = estimated_hours
self.status = TaskStatus.NOT_STARTED
self.completion_percentage = 0
self.dependencies: List[Task] = []
self.created_at = datetime.now()
class TodoListManager:
def __init__(self):
"""Initialize TodoListManager with OpenAI credentials."""
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
self.tasks: List[Task] = []
def add_task(self, task: Task) -> None:
"""Add a new task to the list."""
self.tasks.append(task)
logger.info(f"Added task: {task.title}")
def update_task_status(
self,
task: Task,
status: TaskStatus,
completion_percentage: int
) -> None:
"""Update task status and completion percentage."""
task.status = status
task.completion_percentage = min(100, max(0, completion_percentage))
logger.info(f"Updated task {task.title}: {status.value}, {completion_percentage}%")
def add_dependency(self, task: Task, dependency: Task) -> None:
"""Add a dependency to a task."""
if dependency not in task.dependencies:
task.dependencies.append(dependency)
logger.info(f"Added dependency {dependency.title} to {task.title}")
def get_priority_tasks(self, priority: Priority) -> List[Task]:
"""Get all tasks of a specific priority."""
return [task for task in self.tasks if task.priority == priority]
def get_overdue_tasks(self) -> List[Task]:
"""Get all overdue tasks."""
now = datetime.now()
return [
task for task in self.tasks
if task.due_date < now and task.status != TaskStatus.COMPLETED
]
def generate_task_summary(self) -> str:
"""Generate a summary of all tasks using AI."""
try:
tasks_text = "\n".join(
f"- {task.title} ({task.priority.value}, {task.completion_percentage}%)"
for task in self.tasks
)
messages = [
{"role": "system", "content": "You are a task management assistant."},
{"role": "user", "content": f"Generate a brief summary of these tasks:\n{tasks_text}"}
]
response = openai.ChatCompletion.create(
model="gpt-4",
messages=messages,
max_tokens=150,
temperature=0.3
)
return response.choices[0].message.content
except Exception as e:
logger.error(f"Error generating task summary: {e}")
return "Unable to generate summary at this time."
def main():
# Example usage
todo_manager = TodoListManager()
# Create sample tasks
task1 = Task(
"Implement user authentication",
"Add OAuth2 authentication to the API",
Priority.HIGH,
datetime.now() + timedelta(days=2),
8.0
)
task2 = Task(
"Write unit tests",
"Create comprehensive test suite",
Priority.MEDIUM,
datetime.now() + timedelta(days=4),
6.0
)
# Add tasks and dependencies
todo_manager.add_task(task1)
todo_manager.add_task(task2)
todo_manager.add_dependency(task2, task1)
# Update task status
todo_manager.update_task_status(task1, TaskStatus.IN_PROGRESS, 50)
# Generate and print summary
summary = todo_manager.generate_task_summary()
print("\nTask Summary:")
print(summary)
if __name__ == "__main__":
main()
Explicación del Desglose del Código:
- Estructura y Diseño de Clases
- La clase Task encapsula todos los atributos y metadatos relacionados con las tareas
- TodoListManager maneja las operaciones de tareas e interacciones con IA
- Las clases Enum proporcionan seguridad de tipos para Priority y TaskStatus
- Características Principales
- Seguimiento integral de tareas con prioridades y dependencias
- Monitoreo de progreso con porcentajes de completitud
- Capacidad de resumen impulsada por IA
- Manejo robusto de errores y registro
- Funcionalidad Avanzada
- Gestión de dependencias entre tareas
- Identificación de tareas vencidas
- Filtrado de tareas basado en prioridades
- Resúmenes de tareas generados por IA
- Mejores Prácticas Implementadas
- Anotaciones de tipo para mejor claridad del código
- Manejo integral de errores
- Implementación adecuada de registro
- Estructura de código limpia y modular
Esta implementación demuestra un sistema de gestión de tareas listo para producción que combina la funcionalidad tradicional de lista de tareas con características impulsadas por IA para mejorar la productividad.
3. Esquemas de Proyecto
Estos trazan objetivos e hitos, proporcionando una hoja de ruta integral para el éxito del proyecto. Tus instrucciones deben abordar:
- Definición del alcance del proyecto
- Objetivos y entregables claros
- Límites y restricciones del proyecto
- Requisitos de los interesados clave
- Creación y gestión de cronogramas
- Identificación de hitos principales
- Secuenciación y dependencias de tareas
- Métodos de establecimiento y seguimiento de plazos
- Consideraciones de asignación de recursos
- Roles y responsabilidades de los miembros del equipo
- Distribución y seguimiento del presupuesto
- Requisitos de equipos y herramientas
- Factores de evaluación de riesgos
- Obstáculos y desafíos potenciales
- Estrategias de mitigación
- Enfoques de planificación de contingencia
Ejemplo: Sistema de Gestión de Proyectos
import openai
import os
from datetime import datetime, timedelta
from typing import List, Dict, Optional
from enum import Enum
import logging
from dataclasses import dataclass
# Configure logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
@dataclass
class Milestone:
title: str
due_date: datetime
description: str
completion_status: float = 0.0
class ProjectStatus(Enum):
PLANNING = "planning"
IN_PROGRESS = "in_progress"
ON_HOLD = "on_hold"
COMPLETED = "completed"
class ProjectOutlineManager:
def __init__(self):
"""Initialize ProjectOutlineManager with OpenAI configuration."""
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
self.objectives: List[str] = []
self.milestones: List[Milestone] = []
self.resources: Dict[str, List[str]] = {}
self.risks: List[Dict[str, str]] = []
self.status = ProjectStatus.PLANNING
def add_objective(self, objective: str) -> None:
"""Add a project objective."""
self.objectives.append(objective)
logger.info(f"Added objective: {objective}")
def add_milestone(self, milestone: Milestone) -> None:
"""Add a project milestone."""
self.milestones.append(milestone)
logger.info(f"Added milestone: {milestone.title}")
def add_resource(self, category: str, resource: str) -> None:
"""Add a resource under a specific category."""
if category not in self.resources:
self.resources[category] = []
self.resources[category].append(resource)
logger.info(f"Added {resource} to {category}")
def add_risk(self, risk: str, mitigation: str) -> None:
"""Add a risk and its mitigation strategy."""
self.risks.append({"risk": risk, "mitigation": mitigation})
logger.info(f"Added risk: {risk}")
def generate_project_summary(self) -> str:
"""Generate an AI-powered project summary."""
try:
project_details = {
"objectives": self.objectives,
"milestones": [f"{m.title} (Due: {m.due_date})" for m in self.milestones],
"resources": self.resources,
"risks": self.risks,
"status": self.status.value
}
messages = [
{"role": "system", "content": "You are a project management assistant."},
{"role": "user", "content": f"Generate a concise summary of this project:\n{project_details}"}
]
response = openai.ChatCompletion.create(
model="gpt-4",
messages=messages,
max_tokens=200,
temperature=0.3
)
return response.choices[0].message.content
except Exception as e:
logger.error(f"Error generating project summary: {e}")
return "Unable to generate summary at this time."
def export_outline(self) -> Dict:
"""Export the project outline in a structured format."""
return {
"status": self.status.value,
"objectives": self.objectives,
"milestones": [
{
"title": m.title,
"due_date": m.due_date.isoformat(),
"description": m.description,
"completion": m.completion_status
}
for m in self.milestones
],
"resources": self.resources,
"risks": self.risks,
"last_updated": datetime.now().isoformat()
}
def main():
# Example usage
project_manager = ProjectOutlineManager()
# Add objectives
project_manager.add_objective("Develop a scalable web application")
project_manager.add_objective("Launch beta version within 3 months")
# Add milestones
milestone1 = Milestone(
"Complete Backend API",
datetime.now() + timedelta(days=30),
"Implement RESTful API endpoints"
)
project_manager.add_milestone(milestone1)
# Add resources
project_manager.add_resource("Development Team", "Frontend Developer")
project_manager.add_resource("Development Team", "Backend Developer")
project_manager.add_resource("Tools", "AWS Cloud Services")
# Add risks
project_manager.add_risk(
"Technical debt accumulation",
"Regular code reviews and refactoring sessions"
)
# Generate and display summary
summary = project_manager.generate_project_summary()
print("\nProject Summary:")
print(summary)
if __name__ == "__main__":
main()
Explicación del Desglose del Código:
- Estructura y Diseño Principal
- Utiliza dataclasses para una representación limpia de estructuras de datos
- Implementa Enum para el seguimiento del estado del proyecto
- Centraliza la funcionalidad de gestión de proyectos en ProjectOutlineManager
- Componentes Clave
- Seguimiento de hitos con fechas límite y estado de finalización
- Gestión de recursos categorizada por departamento/tipo
- Evaluación de riesgos con estrategias de mitigación
- Generación de resúmenes de proyecto impulsada por IA
- Características Avanzadas
- Funcionalidad de exportación de datos estructurados
- Sistema integral de registro
- Manejo de errores para interacciones con IA
- Categorización flexible de recursos
- Mejores Prácticas Implementadas
- Anotaciones de tipo para mejor mantenibilidad del código
- Manejo adecuado de errores y registro
- Organización limpia del código siguiendo PEP 8
- Documentación exhaustiva
Esta implementación proporciona una base sólida para gestionar esquemas de proyectos, combinando principios tradicionales de gestión de proyectos con perspectivas impulsadas por IA para mejorar la planificación y el seguimiento de proyectos.
Los elementos clave a considerar al diseñar estos prompts son:
Claridad
Asegurar que las instrucciones sean inequívocas y específicas es crucial para una ingeniería de prompts efectiva. Aquí hay un desglose detallado de las prácticas clave:
El lenguaje y la terminología precisos son esenciales al crear prompts. Esto significa elegir palabras que tengan significados claros y específicos en lugar de términos vagos o ambiguos. Es importante usar terminología estándar de la industria cuando sea aplicable para evitar confusiones, y mantener la consistencia con la terminología a lo largo de tus prompts.
Los ejemplos concretos juegan un papel vital en la ingeniería efectiva de prompts. Incluye ejemplos relevantes del mundo real que ilustren claramente tus requisitos. Es útil mostrar tanto buenos como malos ejemplos para resaltar distinciones importantes, y asegurar que los ejemplos sean apropiados para el nivel de experiencia de tu audiencia objetivo.
Cuando se trata de formatos de salida, la claridad es clave. Debes especificar requisitos exactos de estructura, ya sea JSON, markdown o viñetas. Incluir ejemplos de salidas que muestren el formato deseado ayuda a eliminar ambigüedades, y definir reglas o convenciones especiales de formato asegura la consistencia en los resultados.
Finalmente, establecer parámetros y restricciones claras ayuda a guiar la salida de manera efectiva. Esto implica establecer límites específicos de longitud, alcance y contenido, definir cualquier limitación o requisito técnico, y especificar elementos o enfoques prohibidos a evitar.
Estructura
Mantener un flujo lógico y una organización jerárquica requiere varias estrategias clave. Primero, establecer secciones y subsecciones claras es esencial. Esto implica desglosar el contenido en temas principales distintos, crear subdivisiones lógicas dentro de cada sección, y usar niveles de encabezado consistentes para mostrar relaciones entre diferentes partes del contenido.
La implementación de pautas de formato consistentes es igualmente importante. Esto significa definir estilos estándar para diferentes tipos de contenido, mantener espaciado y alineación uniformes en todos los documentos, y usar estilos y tamaños de fuente consistentes para elementos similares para asegurar la coherencia visual.
Los sistemas de etiquetado estandarizados juegan un papel crucial en la organización. Estos sistemas deben incluir convenciones claras de nomenclatura para secciones, esquemas sistemáticos de numeración o codificación, y etiquetas descriptivas y significativas que ayuden a los usuarios a navegar eficientemente por el contenido.
Finalmente, desarrollar jerarquías de información coherentes asegura una estructura óptima del contenido. Esto implica organizar la información desde conceptos generales hasta específicos, agrupar información relacionada de manera lógica, y establecer relaciones claras padre-hijo entre diferentes conceptos. Estas relaciones jerárquicas ayudan a los usuarios a entender cómo se relacionan entre sí las diferentes piezas de información.
Al implementar estos elementos, sé específico en tus requisitos. Para resúmenes, indica explícitamente la longitud deseada (por ejemplo, "200 palabras"), puntos clave a destacar, y formato preferido (por ejemplo, viñetas vs. párrafos). Para listas de tareas, indica claramente niveles de prioridad (alto/medio/bajo), plazos específicos y dependencias de tareas. Con esquemas de proyecto, define el alcance con objetivos medibles, establece cronogramas concretos y especifica el nivel de detalle requerido para cada componente.
Esta atención meticulosa al detalle en el diseño de prompts asegura que la salida de la IA no solo sea práctica y accionable de inmediato, sino que también esté formateada consistentemente y se integre fácilmente en los flujos de trabajo de productividad existentes.
5.3.3 Plantillas de Prompts para Atención al Cliente
En escenarios de atención al cliente, la comunicación clara y empática es crucial. Tus prompts deben instruir al asistente para abordar problemas exhaustivamente, proporcionar pasos de solución de problemas o responder a consultas de manera amigable. Exploremos estos componentes esenciales en detalle:
Primero, el prompt debe guiar a la IA para reconocer la preocupación del cliente con empatía, mostrando comprensión de su frustración o dificultad. Esto significa enseñar a la IA a reconocer señales emocionales en los mensajes de los clientes y responder apropiadamente. Por ejemplo, si un cliente expresa frustración sobre un pago fallido, la IA debe primero reconocer esta frustración antes de pasar a las soluciones: "Entiendo lo frustrante que pueden ser los problemas de pago, especialmente cuando estás tratando de completar una transacción importante." Esto ayuda a establecer una conexión positiva desde el principio y muestra al cliente que está siendo escuchado.
Segundo, las respuestas deben estar estructuradas claramente, con un flujo lógico desde el reconocimiento hasta la resolución. Esto significa desglosar soluciones complejas en pasos manejables y usar un lenguaje claro, sin jerga, que cualquier cliente pueda entender. Cada paso debe estar numerado o claramente separado, con acciones específicas que el cliente pueda tomar. Por ejemplo, en lugar de decir "revisa tu caché," la IA debería decir "Abre la configuración de tu navegador haciendo clic en los tres puntos en la esquina superior derecha, luego selecciona 'Borrar datos de navegación.'" Este nivel de detalle asegura que los clientes puedan seguir las instrucciones sin confusión.
Tercero, el prompt debe enfatizar la importancia de la minuciosidad - asegurando que se aborden todos los aspectos del problema del cliente, mientras se mantiene un equilibrio entre ser exhaustivo y conciso. Esto incluye anticipar preguntas de seguimiento y proporcionar información adicional relevante. La IA debe estar entrenada para identificar problemas relacionados que puedan surgir y abordarlos proactivamente. Por ejemplo, al ayudar con problemas de inicio de sesión, la IA podría no solo resolver el problema inmediato de restablecimiento de contraseña sino también explicar la configuración de autenticación de dos factores y las mejores prácticas de seguridad.
Finalmente, el tono debe permanecer consistentemente profesional pero amigable durante toda la interacción, haciendo que los clientes se sientan valorados mientras se mantienen los estándares profesionales de la empresa. Esto incluye usar lenguaje positivo, ofrecer tranquilidad y terminar con pasos claros a seguir o una invitación para más preguntas si es necesario. La IA debe ser guiada para usar frases que construyan confianza ("Te ayudaré a resolver esto"), muestren proactividad ("Déjame revisar eso por ti"), y mantengan el compromiso ("¿Hay algo más que te gustaría que te aclare?"). El lenguaje debe ser cálido pero no excesivamente casual, encontrando un equilibrio entre accesibilidad y profesionalismo.
Ejemplo: Respuesta a una Consulta de Soporte
Por ejemplo, podrías querer que el asistente ayude a responder a un cliente que está teniendo problemas con el inicio de sesión de su cuenta.
Plantilla:
import openai
import os
from dotenv import load_dotenv
load_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")
messages = [
{"role": "system", "content": "You are a courteous and knowledgeable customer support assistant."},
{"role": "user", "content": (
"A customer says: 'I'm unable to log into my account even after resetting my password. "
"What steps can I take to resolve this issue? Please provide a friendly response with troubleshooting steps.'"
)}
]
response = openai.ChatCompletion.create(
model="gpt-4o",
messages=messages,
max_tokens=150,
temperature=0.5
)
print("Customer Support Response Example:")
print(response["choices"][0]["message"]["content"])
Permíteme desglosar este código de ejemplo, que demuestra una implementación simple de chat para atención al cliente:
1. Configuración e Inicialización
- Utiliza las bibliotecas OpenAI y dotenv para gestionar el acceso a la API
- Carga variables de entorno para manejar de forma segura la clave de API
2. Estructura de Mensajes
- Crea un array de mensajes con dos componentes:
- Un mensaje del sistema que define el rol de la IA como asistente de atención al cliente
- Un mensaje del usuario que contiene el problema de inicio de sesión del cliente y la solicitud de ayuda
3. Configuración de la Llamada a la API
- Realiza una llamada a la API ChatCompletion de OpenAI con parámetros específicos:
- Utiliza el modelo GPT-4
- Establece un límite de 150 tokens
- Utiliza una temperatura de 0.5 (equilibrando creatividad y consistencia)
4. Manejo de la Salida
- El código imprime la respuesta como un "Ejemplo de Respuesta de Atención al Cliente"
Este prompt instruye al asistente para ser empático y presentar pasos claros de solución de problemas, asegurando una experiencia positiva para el cliente. No solo aborda el problema específico del cliente sino que también mantiene un tono cordial.
Ejemplo: Plantilla de Respuesta de Soporte
# customer_support_templates.py
from dataclasses import dataclass
from datetime import datetime
from typing import List, Dict, Optional
import openai
import logging
@dataclass
class CustomerQuery:
query_id: str
customer_name: str
issue_type: str
description: str
timestamp: datetime
priority: str
class CustomerSupportSystem:
def __init__(self, api_key: str):
self.api_key = api_key
openai.api_key = self.api_key
self.templates: Dict[str, str] = self._load_templates()
def _load_templates(self) -> Dict[str, str]:
return {
"login_issues": """
Please help the customer with their login issue.
Key points to address:
- Express understanding of their frustration
- Provide clear step-by-step troubleshooting
- Include security best practices
- Offer additional assistance
Context: {context}
Customer query: {query}
""",
"billing_issues": """
Address the customer's billing concern.
Key points to cover:
- Acknowledge the payment problem
- Explain the situation clearly
- Provide resolution steps
- Detail prevention measures
Context: {context}
Customer query: {query}
"""
}
def generate_response(self, query: CustomerQuery) -> str:
template = self.templates.get(query.issue_type, self.templates["general"])
messages = [
{
"role": "system",
"content": "You are an empathetic customer support specialist. Maintain a professional yet friendly tone."
},
{
"role": "user",
"content": template.format(
context=f"Customer: {query.customer_name}, Priority: {query.priority}",
query=query.description
)
}
]
try:
response = openai.ChatCompletion.create(
model="gpt-4",
messages=messages,
max_tokens=300,
temperature=0.7
)
return response.choices[0].message.content
except Exception as e:
logging.error(f"Error generating response: {e}")
return "We apologize, but we're experiencing technical difficulties. Please try again later."
def main():
# Example usage
support_system = CustomerSupportSystem("your-api-key")
# Sample customer query
query = CustomerQuery(
query_id="QRY123",
customer_name="John Doe",
issue_type="login_issues",
description="I can't log in after multiple password reset attempts",
timestamp=datetime.now(),
priority="high"
)
# Generate response
response = support_system.generate_response(query)
print(f"Generated Response:\n{response}")
if __name__ == "__main__":
main()
Desglose del Código:
- Componentes Principales y Estructura
- Utiliza dataclass CustomerQuery para la representación estructurada de consultas
- Implementa una clase CustomerSupportSystem para operaciones centralizadas de soporte
- Mantiene un diccionario de plantillas para diferentes tipos de problemas de clientes
- Características Principales
- Generación de respuestas basada en plantillas con conciencia del contexto
- Manejo de consultas basado en prioridades
- Sistema flexible de plantillas para diferentes tipos de problemas
- Mecanismos de manejo de errores y registro
- Capacidades Avanzadas
- Formateo dinámico de plantillas con contexto del cliente
- Parámetros de respuesta personalizables (temperatura, límite de tokens)
- Sistema extensible de plantillas para nuevos tipos de problemas
- Generación profesional de respuestas con tono consistente
- Implementación de Mejores Prácticas
- Sugerencias de tipo para mejor mantenimiento del código
- Manejo apropiado de errores con registro
- Organización limpia del código siguiendo PEP 8
- Diseño modular para fácil expansión
Esta implementación proporciona una base sólida para gestionar respuestas de atención al cliente, combinando estructura basada en plantillas con personalización impulsada por IA para asegurar una comunicación con el cliente consistente, útil y empática.
5.3.4 Reflexiones Finales sobre las Plantillas de Prompts
Las plantillas de prompts sirven como bloques fundamentales en la creación de interacciones efectivas con IA. Estas plantillas actúan como marcos estandarizados que conectan la intención del usuario con las respuestas de la IA de varias maneras importantes:
Primero, establecen un protocolo de comunicación consistente. Al proporcionar formatos estructurados para entradas y salidas, las plantillas aseguran que cada interacción siga patrones establecidos. Esta estandarización es particularmente valiosa cuando múltiples miembros del equipo o departamentos están trabajando con el mismo sistema de IA, ya que mantiene la uniformidad en cómo se solicita y recibe la información.
Segundo, las plantillas reducen significativamente la ambigüedad en las interacciones con IA. Guían a los usuarios para proporcionar el contexto y los parámetros necesarios desde el principio, previniendo malentendidos y reduciendo la necesidad de preguntas aclaratorias. Esta claridad conduce a respuestas más precisas y relevantes del sistema de IA.
Tercero, las plantillas bien diseñadas son inherentemente escalables. A medida que tu aplicación crece, estas plantillas pueden ser fácilmente replicadas, modificadas o extendidas para manejar nuevos casos de uso mientras mantienen la consistencia con la funcionalidad existente. Esta escalabilidad es esencial para organizaciones en crecimiento que necesitan mantener la calidad mientras expanden sus capacidades de IA.
Los ejemplos que hemos explorado a lo largo de este capítulo demuestran la versatilidad de las plantillas de prompts en diferentes escenarios. Desde asistir a desarrolladores con la depuración de código hasta agilizar la gestión de tareas diarias y mejorar las interacciones de atención al cliente, cada plantilla puede ser personalizada para abordar necesidades específicas mientras mantiene las mejores prácticas fundamentales.
En última instancia, las plantillas de prompts efectivas son la base para crear interacciones de IA confiables y de alta calidad. No solo establecen el escenario para respuestas específicas sino que también aseguran que estas respuestas permanezcan consistentes, escalables y alineadas con los objetivos de tu organización. Ya sea que estés construyendo una aplicación pequeña o un sistema de IA a gran escala, invertir tiempo en desarrollar plantillas de prompts robustas rendirá dividendos en la calidad y consistencia de tus interacciones con IA.
5.3 Plantillas de Prompts: Programación, Productividad, Atención al Cliente
Las plantillas de prompts son instrucciones pre-formuladas y cuidadosamente diseñadas que sirven como planos para las interacciones con IA. Estas plantillas actúan como marcos estructurados que guían a los modelos de IA para generar respuestas de manera consistente, predecible y en el formato deseado. Piensa en ellas como tarjetas de recetas - contienen todos los ingredientes y pasos necesarios para producir exactamente el resultado que necesitas.
El poder de las plantillas de prompts radica en su capacidad para:
- Estandarizar la Comunicación: Aseguran que cada interacción siga un patrón predeterminado
- Mejorar la Eficiencia: Al eliminar la necesidad de crear nuevos prompts para solicitudes similares
- Aumentar la Calidad: A través de instrucciones cuidadosamente redactadas que previenen errores comunes
- Ahorrar Tiempo: Al reducir el proceso de prueba y error en la ingeniería de prompts
En esta sección, exploraremos tres categorías esenciales de plantillas de prompts que forman la columna vertebral de muchas aplicaciones de IA:
- Programación – Para ayuda en programación, depuración o generación de código
- Incluye corrección de sintaxis, optimización de código y guía arquitectónica
- Ayuda a mantener estándares de codificación y mejores prácticas consistentes
- Productividad – Para generar resúmenes, listas de tareas o información de programación
- Facilita una mejor gestión del tiempo y organización de tareas
- Ayuda a crear elementos claros y procesables a partir de información compleja
- Atención al Cliente – Para atender consultas, proporcionar pasos de solución de problemas o responder a comentarios de clientes
- Asegura una comunicación profesional y consistente con los clientes
- Mantiene la voz de la marca mientras proporciona soluciones útiles
Exploremos cada categoría con ejemplos detallados.
5.3.1 Plantillas de Prompts para Programación
Al construir asistentes de programación o sistemas de tutoría impulsados por IA, la claridad es absolutamente esencial para obtener resultados efectivos. Tu plantilla de prompt sirve como base para todas las interacciones, por lo que debe ser meticulosamente elaborada con varios elementos clave. Exploremos cada elemento en detalle para entender su importancia e implementación:
Primero, debe definir claramente la tarea en cuestión - ya sea revisión de código, corrección de errores o explicación de conceptos. Esta definición debe ser lo suficientemente específica para que la IA entienda exactamente qué tipo de asistencia se requiere. Por ejemplo, en lugar de decir "revisa este código", especifica "revisa esta función de Python para detectar posibles fugas de memoria y sugiere optimizaciones para un mejor rendimiento". Este nivel de especificidad ayuda a la IA a proporcionar asistencia más precisa y valiosa.
Segundo, la plantilla debe especificar cualquier restricción o requerimiento importante, como el lenguaje de programación, pautas de estilo de código o consideraciones de rendimiento. Estas restricciones ayudan a asegurar que la respuesta de la IA se mantenga dentro de parámetros útiles. Por ejemplo, podrías especificar:
- Versión del lenguaje de programación (ej., "Python 3.9+")
- Requisitos de guía de estilo (ej., "compatible con PEP 8")
- Objetivos de rendimiento (ej., "optimizar para uso de memoria sobre velocidad")
- Convenciones específicas del proyecto (ej., "seguir convenciones de nomenclatura de la empresa")
Finalmente, incluir un ejemplo relevante en tu plantilla puede mejorar significativamente la calidad de las respuestas. Este ejemplo sirve como punto de referencia concreto, mostrando a la IA exactamente qué tipo de resultado estás buscando. Por ejemplo, al solicitar optimización de código, proporcionar una muestra de la estructura actual del código ayuda a la IA a entender tu estilo de programación y mantener la consistencia. Un buen ejemplo debe incluir:
- Contexto sobre el propósito y entorno del código
- Cualquier documentación o comentarios existentes
- Funciones o dependencias relacionadas
- Comportamientos esperados de entrada/salida
- Métricas o problemas de rendimiento actuales
Ejemplo: Asistencia en Depuración
Imagina que quieres que la IA te ayude a depurar un fragmento de código Python. Tu prompt podría proporcionar contexto, mostrar el fragmento de código y hacer preguntas específicas sobre posibles errores.
Plantilla:
import openai
import os
from dotenv import load_dotenv
import logging
from typing import Optional
# Set up logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
def setup_openai_client() -> bool:
"""Initialize OpenAI client with API key from environment."""
try:
load_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")
if not openai.api_key:
raise ValueError("OpenAI API key not found")
return True
except Exception as e:
logger.error(f"Failed to initialize OpenAI client: {e}")
return False
def factorial(n: int) -> Optional[int]:
"""
Calculate the factorial of a non-negative integer.
Args:
n (int): The number to calculate factorial for
Returns:
Optional[int]: The factorial result or None if input is invalid
Raises:
RecursionError: If input is too large
ValueError: If input is negative
"""
try:
if not isinstance(n, int):
raise TypeError("Input must be an integer")
if n < 0:
raise ValueError("Input must be non-negative")
if n == 0:
return 1
else:
return n * factorial(n - 1) # Fixed recursion
except Exception as e:
logger.error(f"Error calculating factorial: {e}")
return None
def get_debugging_assistance(code_snippet: str) -> str:
"""
Get AI assistance for debugging code.
Args:
code_snippet (str): The problematic code to debug
Returns:
str: AI's debugging suggestions
"""
if not setup_openai_client():
return "Failed to initialize OpenAI client"
messages = [
{"role": "system", "content": "You are a knowledgeable and patient coding assistant."},
{"role": "user", "content": (
f"I have the following Python code that needs debugging:\n\n"
f"{code_snippet}\n\n"
"Please identify any bugs and suggest fixes."
)}
]
try:
response = openai.ChatCompletion.create(
model="gpt-4",
messages=messages,
max_tokens=200,
temperature=0.5
)
return response["choices"][0]["message"]["content"]
except Exception as e:
logger.error(f"Error getting OpenAI response: {e}")
return f"Failed to get debugging assistance: {str(e)}"
def main():
# Example usage
test_cases = [5, 0, -1, "invalid", 10]
for test in test_cases:
print(f"\nTesting factorial({test})")
try:
result = factorial(test)
print(f"Result: {result}")
except Exception as e:
print(f"Error: {e}")
# Example of getting debugging assistance
problematic_code = """
def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n) # Bug: infinite recursion
"""
print("\nGetting debugging assistance:")
assistance = get_debugging_assistance(problematic_code)
print(assistance)
if __name__ == "__main__":
main()
Explicación del Desglose del Código:
- Estructura y Organización
- Las importaciones están agrupadas de manera lógica e incluyen sugerencias de tipo y registro
- Las funciones están bien documentadas con docstrings
- El manejo de errores está implementado en todo el código
- Componentes Principales
- setup_openai_client(): Maneja la inicialización de la API de manera segura
- factorial(): Mejorado con sugerencias de tipo y manejo de errores
- get_debugging_assistance(): Encapsula la lógica de interacción con IA
- main(): Demuestra el uso con varios casos de prueba
- Mejoras Sobre el Original
- Se agregó manejo integral de errores
- Se incluyeron sugerencias de tipo para mayor claridad del código
- Se implementó registro para depuración
- Se agregaron casos de prueba para demostrar diferentes escenarios
- Mejores Prácticas Demostradas
- Separación de funciones para mejor mantenibilidad
- Documentación y comentarios apropiados
- Manejo de errores y registro robusto
- Sugerencias de tipo para mayor claridad del código
En esta plantilla, el prompt establece claramente las expectativas al indicar el rol de la IA y proporcionar el problema exacto. Esto ayuda al asistente a diagnosticar problemas de manera efectiva.
5.3.2 Plantillas de Prompts para Productividad
Para aplicaciones de productividad, tus prompts deben estar cuidadosamente diseñados para generar diferentes tipos de contenido organizacional. Estas plantillas deben estar estructuradas para manejar tres categorías principales de herramientas de productividad:
1. Resúmenes Detallados
Estos deben condensar información compleja en formatos digeribles mientras preservan el significado esencial. Al crear prompts para resúmenes, considera:
- Técnicas de extracción de información clave
- Usar análisis semántico para identificar conceptos principales
- Implementar reconocimiento de palabras clave para puntos importantes
- Aplicar procesamiento de lenguaje natural para detectar temas clave
- Organización jerárquica de puntos principales y detalles de apoyo
- Crear niveles claros de información primaria, secundaria y terciaria
- Establecer conexiones lógicas entre puntos relacionados
- Usar formato consistente para indicar jerarquía de información
- Métodos para mantener el contexto mientras se reduce la extensión
- Preservar información contextual crítica
- Usar lenguaje conciso sin sacrificar claridad
- Implementar frases de transición efectivas para mantener el flujo
Ejemplo: Generador de Resúmenes Detallados
import openai
import os
from dotenv import load_dotenv
from typing import Dict, List, Optional
import logging
# Configure logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
class SummaryGenerator:
def __init__(self):
"""Initialize the SummaryGenerator with OpenAI credentials."""
load_dotenv()
self.api_key = os.getenv("OPENAI_API_KEY")
if not self.api_key:
raise ValueError("OpenAI API key not found in environment")
openai.api_key = self.api_key
def extract_key_points(self, text: str) -> List[str]:
"""
Extract main points from the input text using semantic analysis.
Args:
text (str): Input text to analyze
Returns:
List[str]: List of key points extracted from the text
"""
try:
messages = [
{"role": "system", "content": "You are a precise summarization assistant. Extract only the main points from the following text."},
{"role": "user", "content": text}
]
response = openai.ChatCompletion.create(
model="gpt-4",
messages=messages,
max_tokens=150,
temperature=0.3
)
return response.choices[0].message.content.split('\n')
except Exception as e:
logger.error(f"Error extracting key points: {e}")
return []
def generate_hierarchical_summary(self, text: str, max_length: int = 500) -> Dict[str, any]:
"""
Generate a structured summary with hierarchical organization.
Args:
text (str): Input text to summarize
max_length (int): Maximum length of the summary
Returns:
Dict: Structured summary with main points and supporting details
"""
try:
messages = [
{"role": "system", "content": (
"Create a hierarchical summary with the following structure:\n"
"1. Main points (maximum 3)\n"
"2. Supporting details for each point\n"
"3. Key takeaways"
)},
{"role": "user", "content": f"Summarize this text in {max_length} characters:\n{text}"}
]
response = openai.ChatCompletion.create(
model="gpt-4",
messages=messages,
max_tokens=300,
temperature=0.4
)
return {
"summary": response.choices[0].message.content,
"length": len(response.choices[0].message.content),
"timestamp": datetime.now().isoformat()
}
except Exception as e:
logger.error(f"Error generating summary: {e}")
return {"error": str(e)}
def format_summary(self, summary_dict: Dict[str, any]) -> str:
"""
Format the summary into a readable structure.
Args:
summary_dict (Dict): Dictionary containing summary information
Returns:
str: Formatted summary
"""
if "error" in summary_dict:
return f"Error generating summary: {summary_dict['error']}"
formatted_output = [
"# Summary Report",
f"Generated on: {summary_dict['timestamp']}",
f"Length: {summary_dict['length']} characters\n",
summary_dict['summary']
]
return "\n".join(formatted_output)
def main():
# Example usage
sample_text = """
Artificial Intelligence has transformed various industries, from healthcare to finance.
Machine learning algorithms now power recommendation systems, fraud detection, and
medical diagnosis. Deep learning, a subset of AI, has particularly excelled in image
and speech recognition tasks. However, these advances also raise important ethical
considerations regarding privacy and bias in AI systems.
"""
summarizer = SummaryGenerator()
# Generate and display summary
summary = summarizer.generate_hierarchical_summary(sample_text)
formatted_summary = summarizer.format_summary(summary)
print(formatted_summary)
if __name__ == "__main__":
main()
Explicación del Desglose del Código:
- Estructura y Organización de Clases
- La clase SummaryGenerator encapsula toda la funcionalidad relacionada con resúmenes
- Clara separación de responsabilidades con métodos distintos para diferentes tareas
- Manejo apropiado de errores y registro a lo largo del código
- Componentes Principales
- extract_key_points(): Utiliza análisis semántico para identificar conceptos principales
- generate_hierarchical_summary(): Crea resúmenes estructurados con jerarquía clara
- format_summary(): Convierte datos brutos del resumen en salida legible
- Características Avanzadas
- Anotaciones de tipo para mejor claridad y mantenibilidad del código
- Longitud y estructura de resumen configurables
- Seguimiento de marca temporal para la generación de resúmenes
- Manejo de errores con registro detallado
- Mejores Prácticas Demostradas
- Gestión de variables de entorno para claves API
- Documentación exhaustiva con docstrings
- Diseño modular para facilitar pruebas y mantenimiento
- Estructura de código limpia siguiendo las pautas PEP 8
Este ejemplo demuestra un enfoque listo para producción en la generación de resúmenes detallados, con manejo apropiado de errores, registro y una estructura clara que puede integrarse fácilmente en aplicaciones más grandes.
2. Listas de Tareas
Estas dividen las tareas en pasos manejables. Los prompts efectivos para listas de tareas deben incorporar:
- Mecanismos de priorización de tareas
- Indicadores de prioridad Alta/Media/Baja para identificar tareas críticas
- Indicadores de urgencia basados en plazos e impacto
- Repriorización dinámica basada en circunstancias cambiantes
- Pautas de estimación de tiempo
- Plazos realistas para completar tareas
- Períodos de amortiguación para retrasos inesperados
- Estimaciones basadas en esfuerzo (por ejemplo, victorias rápidas vs. tareas complejas)
- Mapeo de dependencias entre tareas
- Identificación clara de prerrequisitos
- Relaciones de tareas secuenciales vs. paralelas
- Análisis de ruta crítica para proyectos complejos
- Indicadores de seguimiento de progreso
- Métricas de porcentaje de finalización
- Puntos de control de hitos
- Actualizaciones de estado (No Iniciado, En Progreso, Completado)
Ejemplo: Sistema de Gestión de Tareas
import openai
import os
from datetime import datetime, timedelta
from typing import List, Dict, Optional
from enum import Enum
import logging
# Configure logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
class Priority(Enum):
LOW = "low"
MEDIUM = "medium"
HIGH = "high"
class TaskStatus(Enum):
NOT_STARTED = "not_started"
IN_PROGRESS = "in_progress"
COMPLETED = "completed"
class Task:
def __init__(
self,
title: str,
description: str,
priority: Priority,
due_date: datetime,
estimated_hours: float
):
self.title = title
self.description = description
self.priority = priority
self.due_date = due_date
self.estimated_hours = estimated_hours
self.status = TaskStatus.NOT_STARTED
self.completion_percentage = 0
self.dependencies: List[Task] = []
self.created_at = datetime.now()
class TodoListManager:
def __init__(self):
"""Initialize TodoListManager with OpenAI credentials."""
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
self.tasks: List[Task] = []
def add_task(self, task: Task) -> None:
"""Add a new task to the list."""
self.tasks.append(task)
logger.info(f"Added task: {task.title}")
def update_task_status(
self,
task: Task,
status: TaskStatus,
completion_percentage: int
) -> None:
"""Update task status and completion percentage."""
task.status = status
task.completion_percentage = min(100, max(0, completion_percentage))
logger.info(f"Updated task {task.title}: {status.value}, {completion_percentage}%")
def add_dependency(self, task: Task, dependency: Task) -> None:
"""Add a dependency to a task."""
if dependency not in task.dependencies:
task.dependencies.append(dependency)
logger.info(f"Added dependency {dependency.title} to {task.title}")
def get_priority_tasks(self, priority: Priority) -> List[Task]:
"""Get all tasks of a specific priority."""
return [task for task in self.tasks if task.priority == priority]
def get_overdue_tasks(self) -> List[Task]:
"""Get all overdue tasks."""
now = datetime.now()
return [
task for task in self.tasks
if task.due_date < now and task.status != TaskStatus.COMPLETED
]
def generate_task_summary(self) -> str:
"""Generate a summary of all tasks using AI."""
try:
tasks_text = "\n".join(
f"- {task.title} ({task.priority.value}, {task.completion_percentage}%)"
for task in self.tasks
)
messages = [
{"role": "system", "content": "You are a task management assistant."},
{"role": "user", "content": f"Generate a brief summary of these tasks:\n{tasks_text}"}
]
response = openai.ChatCompletion.create(
model="gpt-4",
messages=messages,
max_tokens=150,
temperature=0.3
)
return response.choices[0].message.content
except Exception as e:
logger.error(f"Error generating task summary: {e}")
return "Unable to generate summary at this time."
def main():
# Example usage
todo_manager = TodoListManager()
# Create sample tasks
task1 = Task(
"Implement user authentication",
"Add OAuth2 authentication to the API",
Priority.HIGH,
datetime.now() + timedelta(days=2),
8.0
)
task2 = Task(
"Write unit tests",
"Create comprehensive test suite",
Priority.MEDIUM,
datetime.now() + timedelta(days=4),
6.0
)
# Add tasks and dependencies
todo_manager.add_task(task1)
todo_manager.add_task(task2)
todo_manager.add_dependency(task2, task1)
# Update task status
todo_manager.update_task_status(task1, TaskStatus.IN_PROGRESS, 50)
# Generate and print summary
summary = todo_manager.generate_task_summary()
print("\nTask Summary:")
print(summary)
if __name__ == "__main__":
main()
Explicación del Desglose del Código:
- Estructura y Diseño de Clases
- La clase Task encapsula todos los atributos y metadatos relacionados con las tareas
- TodoListManager maneja las operaciones de tareas e interacciones con IA
- Las clases Enum proporcionan seguridad de tipos para Priority y TaskStatus
- Características Principales
- Seguimiento integral de tareas con prioridades y dependencias
- Monitoreo de progreso con porcentajes de completitud
- Capacidad de resumen impulsada por IA
- Manejo robusto de errores y registro
- Funcionalidad Avanzada
- Gestión de dependencias entre tareas
- Identificación de tareas vencidas
- Filtrado de tareas basado en prioridades
- Resúmenes de tareas generados por IA
- Mejores Prácticas Implementadas
- Anotaciones de tipo para mejor claridad del código
- Manejo integral de errores
- Implementación adecuada de registro
- Estructura de código limpia y modular
Esta implementación demuestra un sistema de gestión de tareas listo para producción que combina la funcionalidad tradicional de lista de tareas con características impulsadas por IA para mejorar la productividad.
3. Esquemas de Proyecto
Estos trazan objetivos e hitos, proporcionando una hoja de ruta integral para el éxito del proyecto. Tus instrucciones deben abordar:
- Definición del alcance del proyecto
- Objetivos y entregables claros
- Límites y restricciones del proyecto
- Requisitos de los interesados clave
- Creación y gestión de cronogramas
- Identificación de hitos principales
- Secuenciación y dependencias de tareas
- Métodos de establecimiento y seguimiento de plazos
- Consideraciones de asignación de recursos
- Roles y responsabilidades de los miembros del equipo
- Distribución y seguimiento del presupuesto
- Requisitos de equipos y herramientas
- Factores de evaluación de riesgos
- Obstáculos y desafíos potenciales
- Estrategias de mitigación
- Enfoques de planificación de contingencia
Ejemplo: Sistema de Gestión de Proyectos
import openai
import os
from datetime import datetime, timedelta
from typing import List, Dict, Optional
from enum import Enum
import logging
from dataclasses import dataclass
# Configure logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
@dataclass
class Milestone:
title: str
due_date: datetime
description: str
completion_status: float = 0.0
class ProjectStatus(Enum):
PLANNING = "planning"
IN_PROGRESS = "in_progress"
ON_HOLD = "on_hold"
COMPLETED = "completed"
class ProjectOutlineManager:
def __init__(self):
"""Initialize ProjectOutlineManager with OpenAI configuration."""
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
self.objectives: List[str] = []
self.milestones: List[Milestone] = []
self.resources: Dict[str, List[str]] = {}
self.risks: List[Dict[str, str]] = []
self.status = ProjectStatus.PLANNING
def add_objective(self, objective: str) -> None:
"""Add a project objective."""
self.objectives.append(objective)
logger.info(f"Added objective: {objective}")
def add_milestone(self, milestone: Milestone) -> None:
"""Add a project milestone."""
self.milestones.append(milestone)
logger.info(f"Added milestone: {milestone.title}")
def add_resource(self, category: str, resource: str) -> None:
"""Add a resource under a specific category."""
if category not in self.resources:
self.resources[category] = []
self.resources[category].append(resource)
logger.info(f"Added {resource} to {category}")
def add_risk(self, risk: str, mitigation: str) -> None:
"""Add a risk and its mitigation strategy."""
self.risks.append({"risk": risk, "mitigation": mitigation})
logger.info(f"Added risk: {risk}")
def generate_project_summary(self) -> str:
"""Generate an AI-powered project summary."""
try:
project_details = {
"objectives": self.objectives,
"milestones": [f"{m.title} (Due: {m.due_date})" for m in self.milestones],
"resources": self.resources,
"risks": self.risks,
"status": self.status.value
}
messages = [
{"role": "system", "content": "You are a project management assistant."},
{"role": "user", "content": f"Generate a concise summary of this project:\n{project_details}"}
]
response = openai.ChatCompletion.create(
model="gpt-4",
messages=messages,
max_tokens=200,
temperature=0.3
)
return response.choices[0].message.content
except Exception as e:
logger.error(f"Error generating project summary: {e}")
return "Unable to generate summary at this time."
def export_outline(self) -> Dict:
"""Export the project outline in a structured format."""
return {
"status": self.status.value,
"objectives": self.objectives,
"milestones": [
{
"title": m.title,
"due_date": m.due_date.isoformat(),
"description": m.description,
"completion": m.completion_status
}
for m in self.milestones
],
"resources": self.resources,
"risks": self.risks,
"last_updated": datetime.now().isoformat()
}
def main():
# Example usage
project_manager = ProjectOutlineManager()
# Add objectives
project_manager.add_objective("Develop a scalable web application")
project_manager.add_objective("Launch beta version within 3 months")
# Add milestones
milestone1 = Milestone(
"Complete Backend API",
datetime.now() + timedelta(days=30),
"Implement RESTful API endpoints"
)
project_manager.add_milestone(milestone1)
# Add resources
project_manager.add_resource("Development Team", "Frontend Developer")
project_manager.add_resource("Development Team", "Backend Developer")
project_manager.add_resource("Tools", "AWS Cloud Services")
# Add risks
project_manager.add_risk(
"Technical debt accumulation",
"Regular code reviews and refactoring sessions"
)
# Generate and display summary
summary = project_manager.generate_project_summary()
print("\nProject Summary:")
print(summary)
if __name__ == "__main__":
main()
Explicación del Desglose del Código:
- Estructura y Diseño Principal
- Utiliza dataclasses para una representación limpia de estructuras de datos
- Implementa Enum para el seguimiento del estado del proyecto
- Centraliza la funcionalidad de gestión de proyectos en ProjectOutlineManager
- Componentes Clave
- Seguimiento de hitos con fechas límite y estado de finalización
- Gestión de recursos categorizada por departamento/tipo
- Evaluación de riesgos con estrategias de mitigación
- Generación de resúmenes de proyecto impulsada por IA
- Características Avanzadas
- Funcionalidad de exportación de datos estructurados
- Sistema integral de registro
- Manejo de errores para interacciones con IA
- Categorización flexible de recursos
- Mejores Prácticas Implementadas
- Anotaciones de tipo para mejor mantenibilidad del código
- Manejo adecuado de errores y registro
- Organización limpia del código siguiendo PEP 8
- Documentación exhaustiva
Esta implementación proporciona una base sólida para gestionar esquemas de proyectos, combinando principios tradicionales de gestión de proyectos con perspectivas impulsadas por IA para mejorar la planificación y el seguimiento de proyectos.
Los elementos clave a considerar al diseñar estos prompts son:
Claridad
Asegurar que las instrucciones sean inequívocas y específicas es crucial para una ingeniería de prompts efectiva. Aquí hay un desglose detallado de las prácticas clave:
El lenguaje y la terminología precisos son esenciales al crear prompts. Esto significa elegir palabras que tengan significados claros y específicos en lugar de términos vagos o ambiguos. Es importante usar terminología estándar de la industria cuando sea aplicable para evitar confusiones, y mantener la consistencia con la terminología a lo largo de tus prompts.
Los ejemplos concretos juegan un papel vital en la ingeniería efectiva de prompts. Incluye ejemplos relevantes del mundo real que ilustren claramente tus requisitos. Es útil mostrar tanto buenos como malos ejemplos para resaltar distinciones importantes, y asegurar que los ejemplos sean apropiados para el nivel de experiencia de tu audiencia objetivo.
Cuando se trata de formatos de salida, la claridad es clave. Debes especificar requisitos exactos de estructura, ya sea JSON, markdown o viñetas. Incluir ejemplos de salidas que muestren el formato deseado ayuda a eliminar ambigüedades, y definir reglas o convenciones especiales de formato asegura la consistencia en los resultados.
Finalmente, establecer parámetros y restricciones claras ayuda a guiar la salida de manera efectiva. Esto implica establecer límites específicos de longitud, alcance y contenido, definir cualquier limitación o requisito técnico, y especificar elementos o enfoques prohibidos a evitar.
Estructura
Mantener un flujo lógico y una organización jerárquica requiere varias estrategias clave. Primero, establecer secciones y subsecciones claras es esencial. Esto implica desglosar el contenido en temas principales distintos, crear subdivisiones lógicas dentro de cada sección, y usar niveles de encabezado consistentes para mostrar relaciones entre diferentes partes del contenido.
La implementación de pautas de formato consistentes es igualmente importante. Esto significa definir estilos estándar para diferentes tipos de contenido, mantener espaciado y alineación uniformes en todos los documentos, y usar estilos y tamaños de fuente consistentes para elementos similares para asegurar la coherencia visual.
Los sistemas de etiquetado estandarizados juegan un papel crucial en la organización. Estos sistemas deben incluir convenciones claras de nomenclatura para secciones, esquemas sistemáticos de numeración o codificación, y etiquetas descriptivas y significativas que ayuden a los usuarios a navegar eficientemente por el contenido.
Finalmente, desarrollar jerarquías de información coherentes asegura una estructura óptima del contenido. Esto implica organizar la información desde conceptos generales hasta específicos, agrupar información relacionada de manera lógica, y establecer relaciones claras padre-hijo entre diferentes conceptos. Estas relaciones jerárquicas ayudan a los usuarios a entender cómo se relacionan entre sí las diferentes piezas de información.
Al implementar estos elementos, sé específico en tus requisitos. Para resúmenes, indica explícitamente la longitud deseada (por ejemplo, "200 palabras"), puntos clave a destacar, y formato preferido (por ejemplo, viñetas vs. párrafos). Para listas de tareas, indica claramente niveles de prioridad (alto/medio/bajo), plazos específicos y dependencias de tareas. Con esquemas de proyecto, define el alcance con objetivos medibles, establece cronogramas concretos y especifica el nivel de detalle requerido para cada componente.
Esta atención meticulosa al detalle en el diseño de prompts asegura que la salida de la IA no solo sea práctica y accionable de inmediato, sino que también esté formateada consistentemente y se integre fácilmente en los flujos de trabajo de productividad existentes.
5.3.3 Plantillas de Prompts para Atención al Cliente
En escenarios de atención al cliente, la comunicación clara y empática es crucial. Tus prompts deben instruir al asistente para abordar problemas exhaustivamente, proporcionar pasos de solución de problemas o responder a consultas de manera amigable. Exploremos estos componentes esenciales en detalle:
Primero, el prompt debe guiar a la IA para reconocer la preocupación del cliente con empatía, mostrando comprensión de su frustración o dificultad. Esto significa enseñar a la IA a reconocer señales emocionales en los mensajes de los clientes y responder apropiadamente. Por ejemplo, si un cliente expresa frustración sobre un pago fallido, la IA debe primero reconocer esta frustración antes de pasar a las soluciones: "Entiendo lo frustrante que pueden ser los problemas de pago, especialmente cuando estás tratando de completar una transacción importante." Esto ayuda a establecer una conexión positiva desde el principio y muestra al cliente que está siendo escuchado.
Segundo, las respuestas deben estar estructuradas claramente, con un flujo lógico desde el reconocimiento hasta la resolución. Esto significa desglosar soluciones complejas en pasos manejables y usar un lenguaje claro, sin jerga, que cualquier cliente pueda entender. Cada paso debe estar numerado o claramente separado, con acciones específicas que el cliente pueda tomar. Por ejemplo, en lugar de decir "revisa tu caché," la IA debería decir "Abre la configuración de tu navegador haciendo clic en los tres puntos en la esquina superior derecha, luego selecciona 'Borrar datos de navegación.'" Este nivel de detalle asegura que los clientes puedan seguir las instrucciones sin confusión.
Tercero, el prompt debe enfatizar la importancia de la minuciosidad - asegurando que se aborden todos los aspectos del problema del cliente, mientras se mantiene un equilibrio entre ser exhaustivo y conciso. Esto incluye anticipar preguntas de seguimiento y proporcionar información adicional relevante. La IA debe estar entrenada para identificar problemas relacionados que puedan surgir y abordarlos proactivamente. Por ejemplo, al ayudar con problemas de inicio de sesión, la IA podría no solo resolver el problema inmediato de restablecimiento de contraseña sino también explicar la configuración de autenticación de dos factores y las mejores prácticas de seguridad.
Finalmente, el tono debe permanecer consistentemente profesional pero amigable durante toda la interacción, haciendo que los clientes se sientan valorados mientras se mantienen los estándares profesionales de la empresa. Esto incluye usar lenguaje positivo, ofrecer tranquilidad y terminar con pasos claros a seguir o una invitación para más preguntas si es necesario. La IA debe ser guiada para usar frases que construyan confianza ("Te ayudaré a resolver esto"), muestren proactividad ("Déjame revisar eso por ti"), y mantengan el compromiso ("¿Hay algo más que te gustaría que te aclare?"). El lenguaje debe ser cálido pero no excesivamente casual, encontrando un equilibrio entre accesibilidad y profesionalismo.
Ejemplo: Respuesta a una Consulta de Soporte
Por ejemplo, podrías querer que el asistente ayude a responder a un cliente que está teniendo problemas con el inicio de sesión de su cuenta.
Plantilla:
import openai
import os
from dotenv import load_dotenv
load_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")
messages = [
{"role": "system", "content": "You are a courteous and knowledgeable customer support assistant."},
{"role": "user", "content": (
"A customer says: 'I'm unable to log into my account even after resetting my password. "
"What steps can I take to resolve this issue? Please provide a friendly response with troubleshooting steps.'"
)}
]
response = openai.ChatCompletion.create(
model="gpt-4o",
messages=messages,
max_tokens=150,
temperature=0.5
)
print("Customer Support Response Example:")
print(response["choices"][0]["message"]["content"])
Permíteme desglosar este código de ejemplo, que demuestra una implementación simple de chat para atención al cliente:
1. Configuración e Inicialización
- Utiliza las bibliotecas OpenAI y dotenv para gestionar el acceso a la API
- Carga variables de entorno para manejar de forma segura la clave de API
2. Estructura de Mensajes
- Crea un array de mensajes con dos componentes:
- Un mensaje del sistema que define el rol de la IA como asistente de atención al cliente
- Un mensaje del usuario que contiene el problema de inicio de sesión del cliente y la solicitud de ayuda
3. Configuración de la Llamada a la API
- Realiza una llamada a la API ChatCompletion de OpenAI con parámetros específicos:
- Utiliza el modelo GPT-4
- Establece un límite de 150 tokens
- Utiliza una temperatura de 0.5 (equilibrando creatividad y consistencia)
4. Manejo de la Salida
- El código imprime la respuesta como un "Ejemplo de Respuesta de Atención al Cliente"
Este prompt instruye al asistente para ser empático y presentar pasos claros de solución de problemas, asegurando una experiencia positiva para el cliente. No solo aborda el problema específico del cliente sino que también mantiene un tono cordial.
Ejemplo: Plantilla de Respuesta de Soporte
# customer_support_templates.py
from dataclasses import dataclass
from datetime import datetime
from typing import List, Dict, Optional
import openai
import logging
@dataclass
class CustomerQuery:
query_id: str
customer_name: str
issue_type: str
description: str
timestamp: datetime
priority: str
class CustomerSupportSystem:
def __init__(self, api_key: str):
self.api_key = api_key
openai.api_key = self.api_key
self.templates: Dict[str, str] = self._load_templates()
def _load_templates(self) -> Dict[str, str]:
return {
"login_issues": """
Please help the customer with their login issue.
Key points to address:
- Express understanding of their frustration
- Provide clear step-by-step troubleshooting
- Include security best practices
- Offer additional assistance
Context: {context}
Customer query: {query}
""",
"billing_issues": """
Address the customer's billing concern.
Key points to cover:
- Acknowledge the payment problem
- Explain the situation clearly
- Provide resolution steps
- Detail prevention measures
Context: {context}
Customer query: {query}
"""
}
def generate_response(self, query: CustomerQuery) -> str:
template = self.templates.get(query.issue_type, self.templates["general"])
messages = [
{
"role": "system",
"content": "You are an empathetic customer support specialist. Maintain a professional yet friendly tone."
},
{
"role": "user",
"content": template.format(
context=f"Customer: {query.customer_name}, Priority: {query.priority}",
query=query.description
)
}
]
try:
response = openai.ChatCompletion.create(
model="gpt-4",
messages=messages,
max_tokens=300,
temperature=0.7
)
return response.choices[0].message.content
except Exception as e:
logging.error(f"Error generating response: {e}")
return "We apologize, but we're experiencing technical difficulties. Please try again later."
def main():
# Example usage
support_system = CustomerSupportSystem("your-api-key")
# Sample customer query
query = CustomerQuery(
query_id="QRY123",
customer_name="John Doe",
issue_type="login_issues",
description="I can't log in after multiple password reset attempts",
timestamp=datetime.now(),
priority="high"
)
# Generate response
response = support_system.generate_response(query)
print(f"Generated Response:\n{response}")
if __name__ == "__main__":
main()
Desglose del Código:
- Componentes Principales y Estructura
- Utiliza dataclass CustomerQuery para la representación estructurada de consultas
- Implementa una clase CustomerSupportSystem para operaciones centralizadas de soporte
- Mantiene un diccionario de plantillas para diferentes tipos de problemas de clientes
- Características Principales
- Generación de respuestas basada en plantillas con conciencia del contexto
- Manejo de consultas basado en prioridades
- Sistema flexible de plantillas para diferentes tipos de problemas
- Mecanismos de manejo de errores y registro
- Capacidades Avanzadas
- Formateo dinámico de plantillas con contexto del cliente
- Parámetros de respuesta personalizables (temperatura, límite de tokens)
- Sistema extensible de plantillas para nuevos tipos de problemas
- Generación profesional de respuestas con tono consistente
- Implementación de Mejores Prácticas
- Sugerencias de tipo para mejor mantenimiento del código
- Manejo apropiado de errores con registro
- Organización limpia del código siguiendo PEP 8
- Diseño modular para fácil expansión
Esta implementación proporciona una base sólida para gestionar respuestas de atención al cliente, combinando estructura basada en plantillas con personalización impulsada por IA para asegurar una comunicación con el cliente consistente, útil y empática.
5.3.4 Reflexiones Finales sobre las Plantillas de Prompts
Las plantillas de prompts sirven como bloques fundamentales en la creación de interacciones efectivas con IA. Estas plantillas actúan como marcos estandarizados que conectan la intención del usuario con las respuestas de la IA de varias maneras importantes:
Primero, establecen un protocolo de comunicación consistente. Al proporcionar formatos estructurados para entradas y salidas, las plantillas aseguran que cada interacción siga patrones establecidos. Esta estandarización es particularmente valiosa cuando múltiples miembros del equipo o departamentos están trabajando con el mismo sistema de IA, ya que mantiene la uniformidad en cómo se solicita y recibe la información.
Segundo, las plantillas reducen significativamente la ambigüedad en las interacciones con IA. Guían a los usuarios para proporcionar el contexto y los parámetros necesarios desde el principio, previniendo malentendidos y reduciendo la necesidad de preguntas aclaratorias. Esta claridad conduce a respuestas más precisas y relevantes del sistema de IA.
Tercero, las plantillas bien diseñadas son inherentemente escalables. A medida que tu aplicación crece, estas plantillas pueden ser fácilmente replicadas, modificadas o extendidas para manejar nuevos casos de uso mientras mantienen la consistencia con la funcionalidad existente. Esta escalabilidad es esencial para organizaciones en crecimiento que necesitan mantener la calidad mientras expanden sus capacidades de IA.
Los ejemplos que hemos explorado a lo largo de este capítulo demuestran la versatilidad de las plantillas de prompts en diferentes escenarios. Desde asistir a desarrolladores con la depuración de código hasta agilizar la gestión de tareas diarias y mejorar las interacciones de atención al cliente, cada plantilla puede ser personalizada para abordar necesidades específicas mientras mantiene las mejores prácticas fundamentales.
En última instancia, las plantillas de prompts efectivas son la base para crear interacciones de IA confiables y de alta calidad. No solo establecen el escenario para respuestas específicas sino que también aseguran que estas respuestas permanezcan consistentes, escalables y alineadas con los objetivos de tu organización. Ya sea que estés construyendo una aplicación pequeña o un sistema de IA a gran escala, invertir tiempo en desarrollar plantillas de prompts robustas rendirá dividendos en la calidad y consistencia de tus interacciones con IA.
5.3 Plantillas de Prompts: Programación, Productividad, Atención al Cliente
Las plantillas de prompts son instrucciones pre-formuladas y cuidadosamente diseñadas que sirven como planos para las interacciones con IA. Estas plantillas actúan como marcos estructurados que guían a los modelos de IA para generar respuestas de manera consistente, predecible y en el formato deseado. Piensa en ellas como tarjetas de recetas - contienen todos los ingredientes y pasos necesarios para producir exactamente el resultado que necesitas.
El poder de las plantillas de prompts radica en su capacidad para:
- Estandarizar la Comunicación: Aseguran que cada interacción siga un patrón predeterminado
- Mejorar la Eficiencia: Al eliminar la necesidad de crear nuevos prompts para solicitudes similares
- Aumentar la Calidad: A través de instrucciones cuidadosamente redactadas que previenen errores comunes
- Ahorrar Tiempo: Al reducir el proceso de prueba y error en la ingeniería de prompts
En esta sección, exploraremos tres categorías esenciales de plantillas de prompts que forman la columna vertebral de muchas aplicaciones de IA:
- Programación – Para ayuda en programación, depuración o generación de código
- Incluye corrección de sintaxis, optimización de código y guía arquitectónica
- Ayuda a mantener estándares de codificación y mejores prácticas consistentes
- Productividad – Para generar resúmenes, listas de tareas o información de programación
- Facilita una mejor gestión del tiempo y organización de tareas
- Ayuda a crear elementos claros y procesables a partir de información compleja
- Atención al Cliente – Para atender consultas, proporcionar pasos de solución de problemas o responder a comentarios de clientes
- Asegura una comunicación profesional y consistente con los clientes
- Mantiene la voz de la marca mientras proporciona soluciones útiles
Exploremos cada categoría con ejemplos detallados.
5.3.1 Plantillas de Prompts para Programación
Al construir asistentes de programación o sistemas de tutoría impulsados por IA, la claridad es absolutamente esencial para obtener resultados efectivos. Tu plantilla de prompt sirve como base para todas las interacciones, por lo que debe ser meticulosamente elaborada con varios elementos clave. Exploremos cada elemento en detalle para entender su importancia e implementación:
Primero, debe definir claramente la tarea en cuestión - ya sea revisión de código, corrección de errores o explicación de conceptos. Esta definición debe ser lo suficientemente específica para que la IA entienda exactamente qué tipo de asistencia se requiere. Por ejemplo, en lugar de decir "revisa este código", especifica "revisa esta función de Python para detectar posibles fugas de memoria y sugiere optimizaciones para un mejor rendimiento". Este nivel de especificidad ayuda a la IA a proporcionar asistencia más precisa y valiosa.
Segundo, la plantilla debe especificar cualquier restricción o requerimiento importante, como el lenguaje de programación, pautas de estilo de código o consideraciones de rendimiento. Estas restricciones ayudan a asegurar que la respuesta de la IA se mantenga dentro de parámetros útiles. Por ejemplo, podrías especificar:
- Versión del lenguaje de programación (ej., "Python 3.9+")
- Requisitos de guía de estilo (ej., "compatible con PEP 8")
- Objetivos de rendimiento (ej., "optimizar para uso de memoria sobre velocidad")
- Convenciones específicas del proyecto (ej., "seguir convenciones de nomenclatura de la empresa")
Finalmente, incluir un ejemplo relevante en tu plantilla puede mejorar significativamente la calidad de las respuestas. Este ejemplo sirve como punto de referencia concreto, mostrando a la IA exactamente qué tipo de resultado estás buscando. Por ejemplo, al solicitar optimización de código, proporcionar una muestra de la estructura actual del código ayuda a la IA a entender tu estilo de programación y mantener la consistencia. Un buen ejemplo debe incluir:
- Contexto sobre el propósito y entorno del código
- Cualquier documentación o comentarios existentes
- Funciones o dependencias relacionadas
- Comportamientos esperados de entrada/salida
- Métricas o problemas de rendimiento actuales
Ejemplo: Asistencia en Depuración
Imagina que quieres que la IA te ayude a depurar un fragmento de código Python. Tu prompt podría proporcionar contexto, mostrar el fragmento de código y hacer preguntas específicas sobre posibles errores.
Plantilla:
import openai
import os
from dotenv import load_dotenv
import logging
from typing import Optional
# Set up logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
def setup_openai_client() -> bool:
"""Initialize OpenAI client with API key from environment."""
try:
load_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")
if not openai.api_key:
raise ValueError("OpenAI API key not found")
return True
except Exception as e:
logger.error(f"Failed to initialize OpenAI client: {e}")
return False
def factorial(n: int) -> Optional[int]:
"""
Calculate the factorial of a non-negative integer.
Args:
n (int): The number to calculate factorial for
Returns:
Optional[int]: The factorial result or None if input is invalid
Raises:
RecursionError: If input is too large
ValueError: If input is negative
"""
try:
if not isinstance(n, int):
raise TypeError("Input must be an integer")
if n < 0:
raise ValueError("Input must be non-negative")
if n == 0:
return 1
else:
return n * factorial(n - 1) # Fixed recursion
except Exception as e:
logger.error(f"Error calculating factorial: {e}")
return None
def get_debugging_assistance(code_snippet: str) -> str:
"""
Get AI assistance for debugging code.
Args:
code_snippet (str): The problematic code to debug
Returns:
str: AI's debugging suggestions
"""
if not setup_openai_client():
return "Failed to initialize OpenAI client"
messages = [
{"role": "system", "content": "You are a knowledgeable and patient coding assistant."},
{"role": "user", "content": (
f"I have the following Python code that needs debugging:\n\n"
f"{code_snippet}\n\n"
"Please identify any bugs and suggest fixes."
)}
]
try:
response = openai.ChatCompletion.create(
model="gpt-4",
messages=messages,
max_tokens=200,
temperature=0.5
)
return response["choices"][0]["message"]["content"]
except Exception as e:
logger.error(f"Error getting OpenAI response: {e}")
return f"Failed to get debugging assistance: {str(e)}"
def main():
# Example usage
test_cases = [5, 0, -1, "invalid", 10]
for test in test_cases:
print(f"\nTesting factorial({test})")
try:
result = factorial(test)
print(f"Result: {result}")
except Exception as e:
print(f"Error: {e}")
# Example of getting debugging assistance
problematic_code = """
def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n) # Bug: infinite recursion
"""
print("\nGetting debugging assistance:")
assistance = get_debugging_assistance(problematic_code)
print(assistance)
if __name__ == "__main__":
main()
Explicación del Desglose del Código:
- Estructura y Organización
- Las importaciones están agrupadas de manera lógica e incluyen sugerencias de tipo y registro
- Las funciones están bien documentadas con docstrings
- El manejo de errores está implementado en todo el código
- Componentes Principales
- setup_openai_client(): Maneja la inicialización de la API de manera segura
- factorial(): Mejorado con sugerencias de tipo y manejo de errores
- get_debugging_assistance(): Encapsula la lógica de interacción con IA
- main(): Demuestra el uso con varios casos de prueba
- Mejoras Sobre el Original
- Se agregó manejo integral de errores
- Se incluyeron sugerencias de tipo para mayor claridad del código
- Se implementó registro para depuración
- Se agregaron casos de prueba para demostrar diferentes escenarios
- Mejores Prácticas Demostradas
- Separación de funciones para mejor mantenibilidad
- Documentación y comentarios apropiados
- Manejo de errores y registro robusto
- Sugerencias de tipo para mayor claridad del código
En esta plantilla, el prompt establece claramente las expectativas al indicar el rol de la IA y proporcionar el problema exacto. Esto ayuda al asistente a diagnosticar problemas de manera efectiva.
5.3.2 Plantillas de Prompts para Productividad
Para aplicaciones de productividad, tus prompts deben estar cuidadosamente diseñados para generar diferentes tipos de contenido organizacional. Estas plantillas deben estar estructuradas para manejar tres categorías principales de herramientas de productividad:
1. Resúmenes Detallados
Estos deben condensar información compleja en formatos digeribles mientras preservan el significado esencial. Al crear prompts para resúmenes, considera:
- Técnicas de extracción de información clave
- Usar análisis semántico para identificar conceptos principales
- Implementar reconocimiento de palabras clave para puntos importantes
- Aplicar procesamiento de lenguaje natural para detectar temas clave
- Organización jerárquica de puntos principales y detalles de apoyo
- Crear niveles claros de información primaria, secundaria y terciaria
- Establecer conexiones lógicas entre puntos relacionados
- Usar formato consistente para indicar jerarquía de información
- Métodos para mantener el contexto mientras se reduce la extensión
- Preservar información contextual crítica
- Usar lenguaje conciso sin sacrificar claridad
- Implementar frases de transición efectivas para mantener el flujo
Ejemplo: Generador de Resúmenes Detallados
import openai
import os
from dotenv import load_dotenv
from typing import Dict, List, Optional
import logging
# Configure logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
class SummaryGenerator:
def __init__(self):
"""Initialize the SummaryGenerator with OpenAI credentials."""
load_dotenv()
self.api_key = os.getenv("OPENAI_API_KEY")
if not self.api_key:
raise ValueError("OpenAI API key not found in environment")
openai.api_key = self.api_key
def extract_key_points(self, text: str) -> List[str]:
"""
Extract main points from the input text using semantic analysis.
Args:
text (str): Input text to analyze
Returns:
List[str]: List of key points extracted from the text
"""
try:
messages = [
{"role": "system", "content": "You are a precise summarization assistant. Extract only the main points from the following text."},
{"role": "user", "content": text}
]
response = openai.ChatCompletion.create(
model="gpt-4",
messages=messages,
max_tokens=150,
temperature=0.3
)
return response.choices[0].message.content.split('\n')
except Exception as e:
logger.error(f"Error extracting key points: {e}")
return []
def generate_hierarchical_summary(self, text: str, max_length: int = 500) -> Dict[str, any]:
"""
Generate a structured summary with hierarchical organization.
Args:
text (str): Input text to summarize
max_length (int): Maximum length of the summary
Returns:
Dict: Structured summary with main points and supporting details
"""
try:
messages = [
{"role": "system", "content": (
"Create a hierarchical summary with the following structure:\n"
"1. Main points (maximum 3)\n"
"2. Supporting details for each point\n"
"3. Key takeaways"
)},
{"role": "user", "content": f"Summarize this text in {max_length} characters:\n{text}"}
]
response = openai.ChatCompletion.create(
model="gpt-4",
messages=messages,
max_tokens=300,
temperature=0.4
)
return {
"summary": response.choices[0].message.content,
"length": len(response.choices[0].message.content),
"timestamp": datetime.now().isoformat()
}
except Exception as e:
logger.error(f"Error generating summary: {e}")
return {"error": str(e)}
def format_summary(self, summary_dict: Dict[str, any]) -> str:
"""
Format the summary into a readable structure.
Args:
summary_dict (Dict): Dictionary containing summary information
Returns:
str: Formatted summary
"""
if "error" in summary_dict:
return f"Error generating summary: {summary_dict['error']}"
formatted_output = [
"# Summary Report",
f"Generated on: {summary_dict['timestamp']}",
f"Length: {summary_dict['length']} characters\n",
summary_dict['summary']
]
return "\n".join(formatted_output)
def main():
# Example usage
sample_text = """
Artificial Intelligence has transformed various industries, from healthcare to finance.
Machine learning algorithms now power recommendation systems, fraud detection, and
medical diagnosis. Deep learning, a subset of AI, has particularly excelled in image
and speech recognition tasks. However, these advances also raise important ethical
considerations regarding privacy and bias in AI systems.
"""
summarizer = SummaryGenerator()
# Generate and display summary
summary = summarizer.generate_hierarchical_summary(sample_text)
formatted_summary = summarizer.format_summary(summary)
print(formatted_summary)
if __name__ == "__main__":
main()
Explicación del Desglose del Código:
- Estructura y Organización de Clases
- La clase SummaryGenerator encapsula toda la funcionalidad relacionada con resúmenes
- Clara separación de responsabilidades con métodos distintos para diferentes tareas
- Manejo apropiado de errores y registro a lo largo del código
- Componentes Principales
- extract_key_points(): Utiliza análisis semántico para identificar conceptos principales
- generate_hierarchical_summary(): Crea resúmenes estructurados con jerarquía clara
- format_summary(): Convierte datos brutos del resumen en salida legible
- Características Avanzadas
- Anotaciones de tipo para mejor claridad y mantenibilidad del código
- Longitud y estructura de resumen configurables
- Seguimiento de marca temporal para la generación de resúmenes
- Manejo de errores con registro detallado
- Mejores Prácticas Demostradas
- Gestión de variables de entorno para claves API
- Documentación exhaustiva con docstrings
- Diseño modular para facilitar pruebas y mantenimiento
- Estructura de código limpia siguiendo las pautas PEP 8
Este ejemplo demuestra un enfoque listo para producción en la generación de resúmenes detallados, con manejo apropiado de errores, registro y una estructura clara que puede integrarse fácilmente en aplicaciones más grandes.
2. Listas de Tareas
Estas dividen las tareas en pasos manejables. Los prompts efectivos para listas de tareas deben incorporar:
- Mecanismos de priorización de tareas
- Indicadores de prioridad Alta/Media/Baja para identificar tareas críticas
- Indicadores de urgencia basados en plazos e impacto
- Repriorización dinámica basada en circunstancias cambiantes
- Pautas de estimación de tiempo
- Plazos realistas para completar tareas
- Períodos de amortiguación para retrasos inesperados
- Estimaciones basadas en esfuerzo (por ejemplo, victorias rápidas vs. tareas complejas)
- Mapeo de dependencias entre tareas
- Identificación clara de prerrequisitos
- Relaciones de tareas secuenciales vs. paralelas
- Análisis de ruta crítica para proyectos complejos
- Indicadores de seguimiento de progreso
- Métricas de porcentaje de finalización
- Puntos de control de hitos
- Actualizaciones de estado (No Iniciado, En Progreso, Completado)
Ejemplo: Sistema de Gestión de Tareas
import openai
import os
from datetime import datetime, timedelta
from typing import List, Dict, Optional
from enum import Enum
import logging
# Configure logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
class Priority(Enum):
LOW = "low"
MEDIUM = "medium"
HIGH = "high"
class TaskStatus(Enum):
NOT_STARTED = "not_started"
IN_PROGRESS = "in_progress"
COMPLETED = "completed"
class Task:
def __init__(
self,
title: str,
description: str,
priority: Priority,
due_date: datetime,
estimated_hours: float
):
self.title = title
self.description = description
self.priority = priority
self.due_date = due_date
self.estimated_hours = estimated_hours
self.status = TaskStatus.NOT_STARTED
self.completion_percentage = 0
self.dependencies: List[Task] = []
self.created_at = datetime.now()
class TodoListManager:
def __init__(self):
"""Initialize TodoListManager with OpenAI credentials."""
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
self.tasks: List[Task] = []
def add_task(self, task: Task) -> None:
"""Add a new task to the list."""
self.tasks.append(task)
logger.info(f"Added task: {task.title}")
def update_task_status(
self,
task: Task,
status: TaskStatus,
completion_percentage: int
) -> None:
"""Update task status and completion percentage."""
task.status = status
task.completion_percentage = min(100, max(0, completion_percentage))
logger.info(f"Updated task {task.title}: {status.value}, {completion_percentage}%")
def add_dependency(self, task: Task, dependency: Task) -> None:
"""Add a dependency to a task."""
if dependency not in task.dependencies:
task.dependencies.append(dependency)
logger.info(f"Added dependency {dependency.title} to {task.title}")
def get_priority_tasks(self, priority: Priority) -> List[Task]:
"""Get all tasks of a specific priority."""
return [task for task in self.tasks if task.priority == priority]
def get_overdue_tasks(self) -> List[Task]:
"""Get all overdue tasks."""
now = datetime.now()
return [
task for task in self.tasks
if task.due_date < now and task.status != TaskStatus.COMPLETED
]
def generate_task_summary(self) -> str:
"""Generate a summary of all tasks using AI."""
try:
tasks_text = "\n".join(
f"- {task.title} ({task.priority.value}, {task.completion_percentage}%)"
for task in self.tasks
)
messages = [
{"role": "system", "content": "You are a task management assistant."},
{"role": "user", "content": f"Generate a brief summary of these tasks:\n{tasks_text}"}
]
response = openai.ChatCompletion.create(
model="gpt-4",
messages=messages,
max_tokens=150,
temperature=0.3
)
return response.choices[0].message.content
except Exception as e:
logger.error(f"Error generating task summary: {e}")
return "Unable to generate summary at this time."
def main():
# Example usage
todo_manager = TodoListManager()
# Create sample tasks
task1 = Task(
"Implement user authentication",
"Add OAuth2 authentication to the API",
Priority.HIGH,
datetime.now() + timedelta(days=2),
8.0
)
task2 = Task(
"Write unit tests",
"Create comprehensive test suite",
Priority.MEDIUM,
datetime.now() + timedelta(days=4),
6.0
)
# Add tasks and dependencies
todo_manager.add_task(task1)
todo_manager.add_task(task2)
todo_manager.add_dependency(task2, task1)
# Update task status
todo_manager.update_task_status(task1, TaskStatus.IN_PROGRESS, 50)
# Generate and print summary
summary = todo_manager.generate_task_summary()
print("\nTask Summary:")
print(summary)
if __name__ == "__main__":
main()
Explicación del Desglose del Código:
- Estructura y Diseño de Clases
- La clase Task encapsula todos los atributos y metadatos relacionados con las tareas
- TodoListManager maneja las operaciones de tareas e interacciones con IA
- Las clases Enum proporcionan seguridad de tipos para Priority y TaskStatus
- Características Principales
- Seguimiento integral de tareas con prioridades y dependencias
- Monitoreo de progreso con porcentajes de completitud
- Capacidad de resumen impulsada por IA
- Manejo robusto de errores y registro
- Funcionalidad Avanzada
- Gestión de dependencias entre tareas
- Identificación de tareas vencidas
- Filtrado de tareas basado en prioridades
- Resúmenes de tareas generados por IA
- Mejores Prácticas Implementadas
- Anotaciones de tipo para mejor claridad del código
- Manejo integral de errores
- Implementación adecuada de registro
- Estructura de código limpia y modular
Esta implementación demuestra un sistema de gestión de tareas listo para producción que combina la funcionalidad tradicional de lista de tareas con características impulsadas por IA para mejorar la productividad.
3. Esquemas de Proyecto
Estos trazan objetivos e hitos, proporcionando una hoja de ruta integral para el éxito del proyecto. Tus instrucciones deben abordar:
- Definición del alcance del proyecto
- Objetivos y entregables claros
- Límites y restricciones del proyecto
- Requisitos de los interesados clave
- Creación y gestión de cronogramas
- Identificación de hitos principales
- Secuenciación y dependencias de tareas
- Métodos de establecimiento y seguimiento de plazos
- Consideraciones de asignación de recursos
- Roles y responsabilidades de los miembros del equipo
- Distribución y seguimiento del presupuesto
- Requisitos de equipos y herramientas
- Factores de evaluación de riesgos
- Obstáculos y desafíos potenciales
- Estrategias de mitigación
- Enfoques de planificación de contingencia
Ejemplo: Sistema de Gestión de Proyectos
import openai
import os
from datetime import datetime, timedelta
from typing import List, Dict, Optional
from enum import Enum
import logging
from dataclasses import dataclass
# Configure logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
@dataclass
class Milestone:
title: str
due_date: datetime
description: str
completion_status: float = 0.0
class ProjectStatus(Enum):
PLANNING = "planning"
IN_PROGRESS = "in_progress"
ON_HOLD = "on_hold"
COMPLETED = "completed"
class ProjectOutlineManager:
def __init__(self):
"""Initialize ProjectOutlineManager with OpenAI configuration."""
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
self.objectives: List[str] = []
self.milestones: List[Milestone] = []
self.resources: Dict[str, List[str]] = {}
self.risks: List[Dict[str, str]] = []
self.status = ProjectStatus.PLANNING
def add_objective(self, objective: str) -> None:
"""Add a project objective."""
self.objectives.append(objective)
logger.info(f"Added objective: {objective}")
def add_milestone(self, milestone: Milestone) -> None:
"""Add a project milestone."""
self.milestones.append(milestone)
logger.info(f"Added milestone: {milestone.title}")
def add_resource(self, category: str, resource: str) -> None:
"""Add a resource under a specific category."""
if category not in self.resources:
self.resources[category] = []
self.resources[category].append(resource)
logger.info(f"Added {resource} to {category}")
def add_risk(self, risk: str, mitigation: str) -> None:
"""Add a risk and its mitigation strategy."""
self.risks.append({"risk": risk, "mitigation": mitigation})
logger.info(f"Added risk: {risk}")
def generate_project_summary(self) -> str:
"""Generate an AI-powered project summary."""
try:
project_details = {
"objectives": self.objectives,
"milestones": [f"{m.title} (Due: {m.due_date})" for m in self.milestones],
"resources": self.resources,
"risks": self.risks,
"status": self.status.value
}
messages = [
{"role": "system", "content": "You are a project management assistant."},
{"role": "user", "content": f"Generate a concise summary of this project:\n{project_details}"}
]
response = openai.ChatCompletion.create(
model="gpt-4",
messages=messages,
max_tokens=200,
temperature=0.3
)
return response.choices[0].message.content
except Exception as e:
logger.error(f"Error generating project summary: {e}")
return "Unable to generate summary at this time."
def export_outline(self) -> Dict:
"""Export the project outline in a structured format."""
return {
"status": self.status.value,
"objectives": self.objectives,
"milestones": [
{
"title": m.title,
"due_date": m.due_date.isoformat(),
"description": m.description,
"completion": m.completion_status
}
for m in self.milestones
],
"resources": self.resources,
"risks": self.risks,
"last_updated": datetime.now().isoformat()
}
def main():
# Example usage
project_manager = ProjectOutlineManager()
# Add objectives
project_manager.add_objective("Develop a scalable web application")
project_manager.add_objective("Launch beta version within 3 months")
# Add milestones
milestone1 = Milestone(
"Complete Backend API",
datetime.now() + timedelta(days=30),
"Implement RESTful API endpoints"
)
project_manager.add_milestone(milestone1)
# Add resources
project_manager.add_resource("Development Team", "Frontend Developer")
project_manager.add_resource("Development Team", "Backend Developer")
project_manager.add_resource("Tools", "AWS Cloud Services")
# Add risks
project_manager.add_risk(
"Technical debt accumulation",
"Regular code reviews and refactoring sessions"
)
# Generate and display summary
summary = project_manager.generate_project_summary()
print("\nProject Summary:")
print(summary)
if __name__ == "__main__":
main()
Explicación del Desglose del Código:
- Estructura y Diseño Principal
- Utiliza dataclasses para una representación limpia de estructuras de datos
- Implementa Enum para el seguimiento del estado del proyecto
- Centraliza la funcionalidad de gestión de proyectos en ProjectOutlineManager
- Componentes Clave
- Seguimiento de hitos con fechas límite y estado de finalización
- Gestión de recursos categorizada por departamento/tipo
- Evaluación de riesgos con estrategias de mitigación
- Generación de resúmenes de proyecto impulsada por IA
- Características Avanzadas
- Funcionalidad de exportación de datos estructurados
- Sistema integral de registro
- Manejo de errores para interacciones con IA
- Categorización flexible de recursos
- Mejores Prácticas Implementadas
- Anotaciones de tipo para mejor mantenibilidad del código
- Manejo adecuado de errores y registro
- Organización limpia del código siguiendo PEP 8
- Documentación exhaustiva
Esta implementación proporciona una base sólida para gestionar esquemas de proyectos, combinando principios tradicionales de gestión de proyectos con perspectivas impulsadas por IA para mejorar la planificación y el seguimiento de proyectos.
Los elementos clave a considerar al diseñar estos prompts son:
Claridad
Asegurar que las instrucciones sean inequívocas y específicas es crucial para una ingeniería de prompts efectiva. Aquí hay un desglose detallado de las prácticas clave:
El lenguaje y la terminología precisos son esenciales al crear prompts. Esto significa elegir palabras que tengan significados claros y específicos en lugar de términos vagos o ambiguos. Es importante usar terminología estándar de la industria cuando sea aplicable para evitar confusiones, y mantener la consistencia con la terminología a lo largo de tus prompts.
Los ejemplos concretos juegan un papel vital en la ingeniería efectiva de prompts. Incluye ejemplos relevantes del mundo real que ilustren claramente tus requisitos. Es útil mostrar tanto buenos como malos ejemplos para resaltar distinciones importantes, y asegurar que los ejemplos sean apropiados para el nivel de experiencia de tu audiencia objetivo.
Cuando se trata de formatos de salida, la claridad es clave. Debes especificar requisitos exactos de estructura, ya sea JSON, markdown o viñetas. Incluir ejemplos de salidas que muestren el formato deseado ayuda a eliminar ambigüedades, y definir reglas o convenciones especiales de formato asegura la consistencia en los resultados.
Finalmente, establecer parámetros y restricciones claras ayuda a guiar la salida de manera efectiva. Esto implica establecer límites específicos de longitud, alcance y contenido, definir cualquier limitación o requisito técnico, y especificar elementos o enfoques prohibidos a evitar.
Estructura
Mantener un flujo lógico y una organización jerárquica requiere varias estrategias clave. Primero, establecer secciones y subsecciones claras es esencial. Esto implica desglosar el contenido en temas principales distintos, crear subdivisiones lógicas dentro de cada sección, y usar niveles de encabezado consistentes para mostrar relaciones entre diferentes partes del contenido.
La implementación de pautas de formato consistentes es igualmente importante. Esto significa definir estilos estándar para diferentes tipos de contenido, mantener espaciado y alineación uniformes en todos los documentos, y usar estilos y tamaños de fuente consistentes para elementos similares para asegurar la coherencia visual.
Los sistemas de etiquetado estandarizados juegan un papel crucial en la organización. Estos sistemas deben incluir convenciones claras de nomenclatura para secciones, esquemas sistemáticos de numeración o codificación, y etiquetas descriptivas y significativas que ayuden a los usuarios a navegar eficientemente por el contenido.
Finalmente, desarrollar jerarquías de información coherentes asegura una estructura óptima del contenido. Esto implica organizar la información desde conceptos generales hasta específicos, agrupar información relacionada de manera lógica, y establecer relaciones claras padre-hijo entre diferentes conceptos. Estas relaciones jerárquicas ayudan a los usuarios a entender cómo se relacionan entre sí las diferentes piezas de información.
Al implementar estos elementos, sé específico en tus requisitos. Para resúmenes, indica explícitamente la longitud deseada (por ejemplo, "200 palabras"), puntos clave a destacar, y formato preferido (por ejemplo, viñetas vs. párrafos). Para listas de tareas, indica claramente niveles de prioridad (alto/medio/bajo), plazos específicos y dependencias de tareas. Con esquemas de proyecto, define el alcance con objetivos medibles, establece cronogramas concretos y especifica el nivel de detalle requerido para cada componente.
Esta atención meticulosa al detalle en el diseño de prompts asegura que la salida de la IA no solo sea práctica y accionable de inmediato, sino que también esté formateada consistentemente y se integre fácilmente en los flujos de trabajo de productividad existentes.
5.3.3 Plantillas de Prompts para Atención al Cliente
En escenarios de atención al cliente, la comunicación clara y empática es crucial. Tus prompts deben instruir al asistente para abordar problemas exhaustivamente, proporcionar pasos de solución de problemas o responder a consultas de manera amigable. Exploremos estos componentes esenciales en detalle:
Primero, el prompt debe guiar a la IA para reconocer la preocupación del cliente con empatía, mostrando comprensión de su frustración o dificultad. Esto significa enseñar a la IA a reconocer señales emocionales en los mensajes de los clientes y responder apropiadamente. Por ejemplo, si un cliente expresa frustración sobre un pago fallido, la IA debe primero reconocer esta frustración antes de pasar a las soluciones: "Entiendo lo frustrante que pueden ser los problemas de pago, especialmente cuando estás tratando de completar una transacción importante." Esto ayuda a establecer una conexión positiva desde el principio y muestra al cliente que está siendo escuchado.
Segundo, las respuestas deben estar estructuradas claramente, con un flujo lógico desde el reconocimiento hasta la resolución. Esto significa desglosar soluciones complejas en pasos manejables y usar un lenguaje claro, sin jerga, que cualquier cliente pueda entender. Cada paso debe estar numerado o claramente separado, con acciones específicas que el cliente pueda tomar. Por ejemplo, en lugar de decir "revisa tu caché," la IA debería decir "Abre la configuración de tu navegador haciendo clic en los tres puntos en la esquina superior derecha, luego selecciona 'Borrar datos de navegación.'" Este nivel de detalle asegura que los clientes puedan seguir las instrucciones sin confusión.
Tercero, el prompt debe enfatizar la importancia de la minuciosidad - asegurando que se aborden todos los aspectos del problema del cliente, mientras se mantiene un equilibrio entre ser exhaustivo y conciso. Esto incluye anticipar preguntas de seguimiento y proporcionar información adicional relevante. La IA debe estar entrenada para identificar problemas relacionados que puedan surgir y abordarlos proactivamente. Por ejemplo, al ayudar con problemas de inicio de sesión, la IA podría no solo resolver el problema inmediato de restablecimiento de contraseña sino también explicar la configuración de autenticación de dos factores y las mejores prácticas de seguridad.
Finalmente, el tono debe permanecer consistentemente profesional pero amigable durante toda la interacción, haciendo que los clientes se sientan valorados mientras se mantienen los estándares profesionales de la empresa. Esto incluye usar lenguaje positivo, ofrecer tranquilidad y terminar con pasos claros a seguir o una invitación para más preguntas si es necesario. La IA debe ser guiada para usar frases que construyan confianza ("Te ayudaré a resolver esto"), muestren proactividad ("Déjame revisar eso por ti"), y mantengan el compromiso ("¿Hay algo más que te gustaría que te aclare?"). El lenguaje debe ser cálido pero no excesivamente casual, encontrando un equilibrio entre accesibilidad y profesionalismo.
Ejemplo: Respuesta a una Consulta de Soporte
Por ejemplo, podrías querer que el asistente ayude a responder a un cliente que está teniendo problemas con el inicio de sesión de su cuenta.
Plantilla:
import openai
import os
from dotenv import load_dotenv
load_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")
messages = [
{"role": "system", "content": "You are a courteous and knowledgeable customer support assistant."},
{"role": "user", "content": (
"A customer says: 'I'm unable to log into my account even after resetting my password. "
"What steps can I take to resolve this issue? Please provide a friendly response with troubleshooting steps.'"
)}
]
response = openai.ChatCompletion.create(
model="gpt-4o",
messages=messages,
max_tokens=150,
temperature=0.5
)
print("Customer Support Response Example:")
print(response["choices"][0]["message"]["content"])
Permíteme desglosar este código de ejemplo, que demuestra una implementación simple de chat para atención al cliente:
1. Configuración e Inicialización
- Utiliza las bibliotecas OpenAI y dotenv para gestionar el acceso a la API
- Carga variables de entorno para manejar de forma segura la clave de API
2. Estructura de Mensajes
- Crea un array de mensajes con dos componentes:
- Un mensaje del sistema que define el rol de la IA como asistente de atención al cliente
- Un mensaje del usuario que contiene el problema de inicio de sesión del cliente y la solicitud de ayuda
3. Configuración de la Llamada a la API
- Realiza una llamada a la API ChatCompletion de OpenAI con parámetros específicos:
- Utiliza el modelo GPT-4
- Establece un límite de 150 tokens
- Utiliza una temperatura de 0.5 (equilibrando creatividad y consistencia)
4. Manejo de la Salida
- El código imprime la respuesta como un "Ejemplo de Respuesta de Atención al Cliente"
Este prompt instruye al asistente para ser empático y presentar pasos claros de solución de problemas, asegurando una experiencia positiva para el cliente. No solo aborda el problema específico del cliente sino que también mantiene un tono cordial.
Ejemplo: Plantilla de Respuesta de Soporte
# customer_support_templates.py
from dataclasses import dataclass
from datetime import datetime
from typing import List, Dict, Optional
import openai
import logging
@dataclass
class CustomerQuery:
query_id: str
customer_name: str
issue_type: str
description: str
timestamp: datetime
priority: str
class CustomerSupportSystem:
def __init__(self, api_key: str):
self.api_key = api_key
openai.api_key = self.api_key
self.templates: Dict[str, str] = self._load_templates()
def _load_templates(self) -> Dict[str, str]:
return {
"login_issues": """
Please help the customer with their login issue.
Key points to address:
- Express understanding of their frustration
- Provide clear step-by-step troubleshooting
- Include security best practices
- Offer additional assistance
Context: {context}
Customer query: {query}
""",
"billing_issues": """
Address the customer's billing concern.
Key points to cover:
- Acknowledge the payment problem
- Explain the situation clearly
- Provide resolution steps
- Detail prevention measures
Context: {context}
Customer query: {query}
"""
}
def generate_response(self, query: CustomerQuery) -> str:
template = self.templates.get(query.issue_type, self.templates["general"])
messages = [
{
"role": "system",
"content": "You are an empathetic customer support specialist. Maintain a professional yet friendly tone."
},
{
"role": "user",
"content": template.format(
context=f"Customer: {query.customer_name}, Priority: {query.priority}",
query=query.description
)
}
]
try:
response = openai.ChatCompletion.create(
model="gpt-4",
messages=messages,
max_tokens=300,
temperature=0.7
)
return response.choices[0].message.content
except Exception as e:
logging.error(f"Error generating response: {e}")
return "We apologize, but we're experiencing technical difficulties. Please try again later."
def main():
# Example usage
support_system = CustomerSupportSystem("your-api-key")
# Sample customer query
query = CustomerQuery(
query_id="QRY123",
customer_name="John Doe",
issue_type="login_issues",
description="I can't log in after multiple password reset attempts",
timestamp=datetime.now(),
priority="high"
)
# Generate response
response = support_system.generate_response(query)
print(f"Generated Response:\n{response}")
if __name__ == "__main__":
main()
Desglose del Código:
- Componentes Principales y Estructura
- Utiliza dataclass CustomerQuery para la representación estructurada de consultas
- Implementa una clase CustomerSupportSystem para operaciones centralizadas de soporte
- Mantiene un diccionario de plantillas para diferentes tipos de problemas de clientes
- Características Principales
- Generación de respuestas basada en plantillas con conciencia del contexto
- Manejo de consultas basado en prioridades
- Sistema flexible de plantillas para diferentes tipos de problemas
- Mecanismos de manejo de errores y registro
- Capacidades Avanzadas
- Formateo dinámico de plantillas con contexto del cliente
- Parámetros de respuesta personalizables (temperatura, límite de tokens)
- Sistema extensible de plantillas para nuevos tipos de problemas
- Generación profesional de respuestas con tono consistente
- Implementación de Mejores Prácticas
- Sugerencias de tipo para mejor mantenimiento del código
- Manejo apropiado de errores con registro
- Organización limpia del código siguiendo PEP 8
- Diseño modular para fácil expansión
Esta implementación proporciona una base sólida para gestionar respuestas de atención al cliente, combinando estructura basada en plantillas con personalización impulsada por IA para asegurar una comunicación con el cliente consistente, útil y empática.
5.3.4 Reflexiones Finales sobre las Plantillas de Prompts
Las plantillas de prompts sirven como bloques fundamentales en la creación de interacciones efectivas con IA. Estas plantillas actúan como marcos estandarizados que conectan la intención del usuario con las respuestas de la IA de varias maneras importantes:
Primero, establecen un protocolo de comunicación consistente. Al proporcionar formatos estructurados para entradas y salidas, las plantillas aseguran que cada interacción siga patrones establecidos. Esta estandarización es particularmente valiosa cuando múltiples miembros del equipo o departamentos están trabajando con el mismo sistema de IA, ya que mantiene la uniformidad en cómo se solicita y recibe la información.
Segundo, las plantillas reducen significativamente la ambigüedad en las interacciones con IA. Guían a los usuarios para proporcionar el contexto y los parámetros necesarios desde el principio, previniendo malentendidos y reduciendo la necesidad de preguntas aclaratorias. Esta claridad conduce a respuestas más precisas y relevantes del sistema de IA.
Tercero, las plantillas bien diseñadas son inherentemente escalables. A medida que tu aplicación crece, estas plantillas pueden ser fácilmente replicadas, modificadas o extendidas para manejar nuevos casos de uso mientras mantienen la consistencia con la funcionalidad existente. Esta escalabilidad es esencial para organizaciones en crecimiento que necesitan mantener la calidad mientras expanden sus capacidades de IA.
Los ejemplos que hemos explorado a lo largo de este capítulo demuestran la versatilidad de las plantillas de prompts en diferentes escenarios. Desde asistir a desarrolladores con la depuración de código hasta agilizar la gestión de tareas diarias y mejorar las interacciones de atención al cliente, cada plantilla puede ser personalizada para abordar necesidades específicas mientras mantiene las mejores prácticas fundamentales.
En última instancia, las plantillas de prompts efectivas son la base para crear interacciones de IA confiables y de alta calidad. No solo establecen el escenario para respuestas específicas sino que también aseguran que estas respuestas permanezcan consistentes, escalables y alineadas con los objetivos de tu organización. Ya sea que estés construyendo una aplicación pequeña o un sistema de IA a gran escala, invertir tiempo en desarrollar plantillas de prompts robustas rendirá dividendos en la calidad y consistencia de tus interacciones con IA.
5.3 Plantillas de Prompts: Programación, Productividad, Atención al Cliente
Las plantillas de prompts son instrucciones pre-formuladas y cuidadosamente diseñadas que sirven como planos para las interacciones con IA. Estas plantillas actúan como marcos estructurados que guían a los modelos de IA para generar respuestas de manera consistente, predecible y en el formato deseado. Piensa en ellas como tarjetas de recetas - contienen todos los ingredientes y pasos necesarios para producir exactamente el resultado que necesitas.
El poder de las plantillas de prompts radica en su capacidad para:
- Estandarizar la Comunicación: Aseguran que cada interacción siga un patrón predeterminado
- Mejorar la Eficiencia: Al eliminar la necesidad de crear nuevos prompts para solicitudes similares
- Aumentar la Calidad: A través de instrucciones cuidadosamente redactadas que previenen errores comunes
- Ahorrar Tiempo: Al reducir el proceso de prueba y error en la ingeniería de prompts
En esta sección, exploraremos tres categorías esenciales de plantillas de prompts que forman la columna vertebral de muchas aplicaciones de IA:
- Programación – Para ayuda en programación, depuración o generación de código
- Incluye corrección de sintaxis, optimización de código y guía arquitectónica
- Ayuda a mantener estándares de codificación y mejores prácticas consistentes
- Productividad – Para generar resúmenes, listas de tareas o información de programación
- Facilita una mejor gestión del tiempo y organización de tareas
- Ayuda a crear elementos claros y procesables a partir de información compleja
- Atención al Cliente – Para atender consultas, proporcionar pasos de solución de problemas o responder a comentarios de clientes
- Asegura una comunicación profesional y consistente con los clientes
- Mantiene la voz de la marca mientras proporciona soluciones útiles
Exploremos cada categoría con ejemplos detallados.
5.3.1 Plantillas de Prompts para Programación
Al construir asistentes de programación o sistemas de tutoría impulsados por IA, la claridad es absolutamente esencial para obtener resultados efectivos. Tu plantilla de prompt sirve como base para todas las interacciones, por lo que debe ser meticulosamente elaborada con varios elementos clave. Exploremos cada elemento en detalle para entender su importancia e implementación:
Primero, debe definir claramente la tarea en cuestión - ya sea revisión de código, corrección de errores o explicación de conceptos. Esta definición debe ser lo suficientemente específica para que la IA entienda exactamente qué tipo de asistencia se requiere. Por ejemplo, en lugar de decir "revisa este código", especifica "revisa esta función de Python para detectar posibles fugas de memoria y sugiere optimizaciones para un mejor rendimiento". Este nivel de especificidad ayuda a la IA a proporcionar asistencia más precisa y valiosa.
Segundo, la plantilla debe especificar cualquier restricción o requerimiento importante, como el lenguaje de programación, pautas de estilo de código o consideraciones de rendimiento. Estas restricciones ayudan a asegurar que la respuesta de la IA se mantenga dentro de parámetros útiles. Por ejemplo, podrías especificar:
- Versión del lenguaje de programación (ej., "Python 3.9+")
- Requisitos de guía de estilo (ej., "compatible con PEP 8")
- Objetivos de rendimiento (ej., "optimizar para uso de memoria sobre velocidad")
- Convenciones específicas del proyecto (ej., "seguir convenciones de nomenclatura de la empresa")
Finalmente, incluir un ejemplo relevante en tu plantilla puede mejorar significativamente la calidad de las respuestas. Este ejemplo sirve como punto de referencia concreto, mostrando a la IA exactamente qué tipo de resultado estás buscando. Por ejemplo, al solicitar optimización de código, proporcionar una muestra de la estructura actual del código ayuda a la IA a entender tu estilo de programación y mantener la consistencia. Un buen ejemplo debe incluir:
- Contexto sobre el propósito y entorno del código
- Cualquier documentación o comentarios existentes
- Funciones o dependencias relacionadas
- Comportamientos esperados de entrada/salida
- Métricas o problemas de rendimiento actuales
Ejemplo: Asistencia en Depuración
Imagina que quieres que la IA te ayude a depurar un fragmento de código Python. Tu prompt podría proporcionar contexto, mostrar el fragmento de código y hacer preguntas específicas sobre posibles errores.
Plantilla:
import openai
import os
from dotenv import load_dotenv
import logging
from typing import Optional
# Set up logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
def setup_openai_client() -> bool:
"""Initialize OpenAI client with API key from environment."""
try:
load_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")
if not openai.api_key:
raise ValueError("OpenAI API key not found")
return True
except Exception as e:
logger.error(f"Failed to initialize OpenAI client: {e}")
return False
def factorial(n: int) -> Optional[int]:
"""
Calculate the factorial of a non-negative integer.
Args:
n (int): The number to calculate factorial for
Returns:
Optional[int]: The factorial result or None if input is invalid
Raises:
RecursionError: If input is too large
ValueError: If input is negative
"""
try:
if not isinstance(n, int):
raise TypeError("Input must be an integer")
if n < 0:
raise ValueError("Input must be non-negative")
if n == 0:
return 1
else:
return n * factorial(n - 1) # Fixed recursion
except Exception as e:
logger.error(f"Error calculating factorial: {e}")
return None
def get_debugging_assistance(code_snippet: str) -> str:
"""
Get AI assistance for debugging code.
Args:
code_snippet (str): The problematic code to debug
Returns:
str: AI's debugging suggestions
"""
if not setup_openai_client():
return "Failed to initialize OpenAI client"
messages = [
{"role": "system", "content": "You are a knowledgeable and patient coding assistant."},
{"role": "user", "content": (
f"I have the following Python code that needs debugging:\n\n"
f"{code_snippet}\n\n"
"Please identify any bugs and suggest fixes."
)}
]
try:
response = openai.ChatCompletion.create(
model="gpt-4",
messages=messages,
max_tokens=200,
temperature=0.5
)
return response["choices"][0]["message"]["content"]
except Exception as e:
logger.error(f"Error getting OpenAI response: {e}")
return f"Failed to get debugging assistance: {str(e)}"
def main():
# Example usage
test_cases = [5, 0, -1, "invalid", 10]
for test in test_cases:
print(f"\nTesting factorial({test})")
try:
result = factorial(test)
print(f"Result: {result}")
except Exception as e:
print(f"Error: {e}")
# Example of getting debugging assistance
problematic_code = """
def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n) # Bug: infinite recursion
"""
print("\nGetting debugging assistance:")
assistance = get_debugging_assistance(problematic_code)
print(assistance)
if __name__ == "__main__":
main()
Explicación del Desglose del Código:
- Estructura y Organización
- Las importaciones están agrupadas de manera lógica e incluyen sugerencias de tipo y registro
- Las funciones están bien documentadas con docstrings
- El manejo de errores está implementado en todo el código
- Componentes Principales
- setup_openai_client(): Maneja la inicialización de la API de manera segura
- factorial(): Mejorado con sugerencias de tipo y manejo de errores
- get_debugging_assistance(): Encapsula la lógica de interacción con IA
- main(): Demuestra el uso con varios casos de prueba
- Mejoras Sobre el Original
- Se agregó manejo integral de errores
- Se incluyeron sugerencias de tipo para mayor claridad del código
- Se implementó registro para depuración
- Se agregaron casos de prueba para demostrar diferentes escenarios
- Mejores Prácticas Demostradas
- Separación de funciones para mejor mantenibilidad
- Documentación y comentarios apropiados
- Manejo de errores y registro robusto
- Sugerencias de tipo para mayor claridad del código
En esta plantilla, el prompt establece claramente las expectativas al indicar el rol de la IA y proporcionar el problema exacto. Esto ayuda al asistente a diagnosticar problemas de manera efectiva.
5.3.2 Plantillas de Prompts para Productividad
Para aplicaciones de productividad, tus prompts deben estar cuidadosamente diseñados para generar diferentes tipos de contenido organizacional. Estas plantillas deben estar estructuradas para manejar tres categorías principales de herramientas de productividad:
1. Resúmenes Detallados
Estos deben condensar información compleja en formatos digeribles mientras preservan el significado esencial. Al crear prompts para resúmenes, considera:
- Técnicas de extracción de información clave
- Usar análisis semántico para identificar conceptos principales
- Implementar reconocimiento de palabras clave para puntos importantes
- Aplicar procesamiento de lenguaje natural para detectar temas clave
- Organización jerárquica de puntos principales y detalles de apoyo
- Crear niveles claros de información primaria, secundaria y terciaria
- Establecer conexiones lógicas entre puntos relacionados
- Usar formato consistente para indicar jerarquía de información
- Métodos para mantener el contexto mientras se reduce la extensión
- Preservar información contextual crítica
- Usar lenguaje conciso sin sacrificar claridad
- Implementar frases de transición efectivas para mantener el flujo
Ejemplo: Generador de Resúmenes Detallados
import openai
import os
from dotenv import load_dotenv
from typing import Dict, List, Optional
import logging
# Configure logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
class SummaryGenerator:
def __init__(self):
"""Initialize the SummaryGenerator with OpenAI credentials."""
load_dotenv()
self.api_key = os.getenv("OPENAI_API_KEY")
if not self.api_key:
raise ValueError("OpenAI API key not found in environment")
openai.api_key = self.api_key
def extract_key_points(self, text: str) -> List[str]:
"""
Extract main points from the input text using semantic analysis.
Args:
text (str): Input text to analyze
Returns:
List[str]: List of key points extracted from the text
"""
try:
messages = [
{"role": "system", "content": "You are a precise summarization assistant. Extract only the main points from the following text."},
{"role": "user", "content": text}
]
response = openai.ChatCompletion.create(
model="gpt-4",
messages=messages,
max_tokens=150,
temperature=0.3
)
return response.choices[0].message.content.split('\n')
except Exception as e:
logger.error(f"Error extracting key points: {e}")
return []
def generate_hierarchical_summary(self, text: str, max_length: int = 500) -> Dict[str, any]:
"""
Generate a structured summary with hierarchical organization.
Args:
text (str): Input text to summarize
max_length (int): Maximum length of the summary
Returns:
Dict: Structured summary with main points and supporting details
"""
try:
messages = [
{"role": "system", "content": (
"Create a hierarchical summary with the following structure:\n"
"1. Main points (maximum 3)\n"
"2. Supporting details for each point\n"
"3. Key takeaways"
)},
{"role": "user", "content": f"Summarize this text in {max_length} characters:\n{text}"}
]
response = openai.ChatCompletion.create(
model="gpt-4",
messages=messages,
max_tokens=300,
temperature=0.4
)
return {
"summary": response.choices[0].message.content,
"length": len(response.choices[0].message.content),
"timestamp": datetime.now().isoformat()
}
except Exception as e:
logger.error(f"Error generating summary: {e}")
return {"error": str(e)}
def format_summary(self, summary_dict: Dict[str, any]) -> str:
"""
Format the summary into a readable structure.
Args:
summary_dict (Dict): Dictionary containing summary information
Returns:
str: Formatted summary
"""
if "error" in summary_dict:
return f"Error generating summary: {summary_dict['error']}"
formatted_output = [
"# Summary Report",
f"Generated on: {summary_dict['timestamp']}",
f"Length: {summary_dict['length']} characters\n",
summary_dict['summary']
]
return "\n".join(formatted_output)
def main():
# Example usage
sample_text = """
Artificial Intelligence has transformed various industries, from healthcare to finance.
Machine learning algorithms now power recommendation systems, fraud detection, and
medical diagnosis. Deep learning, a subset of AI, has particularly excelled in image
and speech recognition tasks. However, these advances also raise important ethical
considerations regarding privacy and bias in AI systems.
"""
summarizer = SummaryGenerator()
# Generate and display summary
summary = summarizer.generate_hierarchical_summary(sample_text)
formatted_summary = summarizer.format_summary(summary)
print(formatted_summary)
if __name__ == "__main__":
main()
Explicación del Desglose del Código:
- Estructura y Organización de Clases
- La clase SummaryGenerator encapsula toda la funcionalidad relacionada con resúmenes
- Clara separación de responsabilidades con métodos distintos para diferentes tareas
- Manejo apropiado de errores y registro a lo largo del código
- Componentes Principales
- extract_key_points(): Utiliza análisis semántico para identificar conceptos principales
- generate_hierarchical_summary(): Crea resúmenes estructurados con jerarquía clara
- format_summary(): Convierte datos brutos del resumen en salida legible
- Características Avanzadas
- Anotaciones de tipo para mejor claridad y mantenibilidad del código
- Longitud y estructura de resumen configurables
- Seguimiento de marca temporal para la generación de resúmenes
- Manejo de errores con registro detallado
- Mejores Prácticas Demostradas
- Gestión de variables de entorno para claves API
- Documentación exhaustiva con docstrings
- Diseño modular para facilitar pruebas y mantenimiento
- Estructura de código limpia siguiendo las pautas PEP 8
Este ejemplo demuestra un enfoque listo para producción en la generación de resúmenes detallados, con manejo apropiado de errores, registro y una estructura clara que puede integrarse fácilmente en aplicaciones más grandes.
2. Listas de Tareas
Estas dividen las tareas en pasos manejables. Los prompts efectivos para listas de tareas deben incorporar:
- Mecanismos de priorización de tareas
- Indicadores de prioridad Alta/Media/Baja para identificar tareas críticas
- Indicadores de urgencia basados en plazos e impacto
- Repriorización dinámica basada en circunstancias cambiantes
- Pautas de estimación de tiempo
- Plazos realistas para completar tareas
- Períodos de amortiguación para retrasos inesperados
- Estimaciones basadas en esfuerzo (por ejemplo, victorias rápidas vs. tareas complejas)
- Mapeo de dependencias entre tareas
- Identificación clara de prerrequisitos
- Relaciones de tareas secuenciales vs. paralelas
- Análisis de ruta crítica para proyectos complejos
- Indicadores de seguimiento de progreso
- Métricas de porcentaje de finalización
- Puntos de control de hitos
- Actualizaciones de estado (No Iniciado, En Progreso, Completado)
Ejemplo: Sistema de Gestión de Tareas
import openai
import os
from datetime import datetime, timedelta
from typing import List, Dict, Optional
from enum import Enum
import logging
# Configure logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
class Priority(Enum):
LOW = "low"
MEDIUM = "medium"
HIGH = "high"
class TaskStatus(Enum):
NOT_STARTED = "not_started"
IN_PROGRESS = "in_progress"
COMPLETED = "completed"
class Task:
def __init__(
self,
title: str,
description: str,
priority: Priority,
due_date: datetime,
estimated_hours: float
):
self.title = title
self.description = description
self.priority = priority
self.due_date = due_date
self.estimated_hours = estimated_hours
self.status = TaskStatus.NOT_STARTED
self.completion_percentage = 0
self.dependencies: List[Task] = []
self.created_at = datetime.now()
class TodoListManager:
def __init__(self):
"""Initialize TodoListManager with OpenAI credentials."""
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
self.tasks: List[Task] = []
def add_task(self, task: Task) -> None:
"""Add a new task to the list."""
self.tasks.append(task)
logger.info(f"Added task: {task.title}")
def update_task_status(
self,
task: Task,
status: TaskStatus,
completion_percentage: int
) -> None:
"""Update task status and completion percentage."""
task.status = status
task.completion_percentage = min(100, max(0, completion_percentage))
logger.info(f"Updated task {task.title}: {status.value}, {completion_percentage}%")
def add_dependency(self, task: Task, dependency: Task) -> None:
"""Add a dependency to a task."""
if dependency not in task.dependencies:
task.dependencies.append(dependency)
logger.info(f"Added dependency {dependency.title} to {task.title}")
def get_priority_tasks(self, priority: Priority) -> List[Task]:
"""Get all tasks of a specific priority."""
return [task for task in self.tasks if task.priority == priority]
def get_overdue_tasks(self) -> List[Task]:
"""Get all overdue tasks."""
now = datetime.now()
return [
task for task in self.tasks
if task.due_date < now and task.status != TaskStatus.COMPLETED
]
def generate_task_summary(self) -> str:
"""Generate a summary of all tasks using AI."""
try:
tasks_text = "\n".join(
f"- {task.title} ({task.priority.value}, {task.completion_percentage}%)"
for task in self.tasks
)
messages = [
{"role": "system", "content": "You are a task management assistant."},
{"role": "user", "content": f"Generate a brief summary of these tasks:\n{tasks_text}"}
]
response = openai.ChatCompletion.create(
model="gpt-4",
messages=messages,
max_tokens=150,
temperature=0.3
)
return response.choices[0].message.content
except Exception as e:
logger.error(f"Error generating task summary: {e}")
return "Unable to generate summary at this time."
def main():
# Example usage
todo_manager = TodoListManager()
# Create sample tasks
task1 = Task(
"Implement user authentication",
"Add OAuth2 authentication to the API",
Priority.HIGH,
datetime.now() + timedelta(days=2),
8.0
)
task2 = Task(
"Write unit tests",
"Create comprehensive test suite",
Priority.MEDIUM,
datetime.now() + timedelta(days=4),
6.0
)
# Add tasks and dependencies
todo_manager.add_task(task1)
todo_manager.add_task(task2)
todo_manager.add_dependency(task2, task1)
# Update task status
todo_manager.update_task_status(task1, TaskStatus.IN_PROGRESS, 50)
# Generate and print summary
summary = todo_manager.generate_task_summary()
print("\nTask Summary:")
print(summary)
if __name__ == "__main__":
main()
Explicación del Desglose del Código:
- Estructura y Diseño de Clases
- La clase Task encapsula todos los atributos y metadatos relacionados con las tareas
- TodoListManager maneja las operaciones de tareas e interacciones con IA
- Las clases Enum proporcionan seguridad de tipos para Priority y TaskStatus
- Características Principales
- Seguimiento integral de tareas con prioridades y dependencias
- Monitoreo de progreso con porcentajes de completitud
- Capacidad de resumen impulsada por IA
- Manejo robusto de errores y registro
- Funcionalidad Avanzada
- Gestión de dependencias entre tareas
- Identificación de tareas vencidas
- Filtrado de tareas basado en prioridades
- Resúmenes de tareas generados por IA
- Mejores Prácticas Implementadas
- Anotaciones de tipo para mejor claridad del código
- Manejo integral de errores
- Implementación adecuada de registro
- Estructura de código limpia y modular
Esta implementación demuestra un sistema de gestión de tareas listo para producción que combina la funcionalidad tradicional de lista de tareas con características impulsadas por IA para mejorar la productividad.
3. Esquemas de Proyecto
Estos trazan objetivos e hitos, proporcionando una hoja de ruta integral para el éxito del proyecto. Tus instrucciones deben abordar:
- Definición del alcance del proyecto
- Objetivos y entregables claros
- Límites y restricciones del proyecto
- Requisitos de los interesados clave
- Creación y gestión de cronogramas
- Identificación de hitos principales
- Secuenciación y dependencias de tareas
- Métodos de establecimiento y seguimiento de plazos
- Consideraciones de asignación de recursos
- Roles y responsabilidades de los miembros del equipo
- Distribución y seguimiento del presupuesto
- Requisitos de equipos y herramientas
- Factores de evaluación de riesgos
- Obstáculos y desafíos potenciales
- Estrategias de mitigación
- Enfoques de planificación de contingencia
Ejemplo: Sistema de Gestión de Proyectos
import openai
import os
from datetime import datetime, timedelta
from typing import List, Dict, Optional
from enum import Enum
import logging
from dataclasses import dataclass
# Configure logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
@dataclass
class Milestone:
title: str
due_date: datetime
description: str
completion_status: float = 0.0
class ProjectStatus(Enum):
PLANNING = "planning"
IN_PROGRESS = "in_progress"
ON_HOLD = "on_hold"
COMPLETED = "completed"
class ProjectOutlineManager:
def __init__(self):
"""Initialize ProjectOutlineManager with OpenAI configuration."""
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
self.objectives: List[str] = []
self.milestones: List[Milestone] = []
self.resources: Dict[str, List[str]] = {}
self.risks: List[Dict[str, str]] = []
self.status = ProjectStatus.PLANNING
def add_objective(self, objective: str) -> None:
"""Add a project objective."""
self.objectives.append(objective)
logger.info(f"Added objective: {objective}")
def add_milestone(self, milestone: Milestone) -> None:
"""Add a project milestone."""
self.milestones.append(milestone)
logger.info(f"Added milestone: {milestone.title}")
def add_resource(self, category: str, resource: str) -> None:
"""Add a resource under a specific category."""
if category not in self.resources:
self.resources[category] = []
self.resources[category].append(resource)
logger.info(f"Added {resource} to {category}")
def add_risk(self, risk: str, mitigation: str) -> None:
"""Add a risk and its mitigation strategy."""
self.risks.append({"risk": risk, "mitigation": mitigation})
logger.info(f"Added risk: {risk}")
def generate_project_summary(self) -> str:
"""Generate an AI-powered project summary."""
try:
project_details = {
"objectives": self.objectives,
"milestones": [f"{m.title} (Due: {m.due_date})" for m in self.milestones],
"resources": self.resources,
"risks": self.risks,
"status": self.status.value
}
messages = [
{"role": "system", "content": "You are a project management assistant."},
{"role": "user", "content": f"Generate a concise summary of this project:\n{project_details}"}
]
response = openai.ChatCompletion.create(
model="gpt-4",
messages=messages,
max_tokens=200,
temperature=0.3
)
return response.choices[0].message.content
except Exception as e:
logger.error(f"Error generating project summary: {e}")
return "Unable to generate summary at this time."
def export_outline(self) -> Dict:
"""Export the project outline in a structured format."""
return {
"status": self.status.value,
"objectives": self.objectives,
"milestones": [
{
"title": m.title,
"due_date": m.due_date.isoformat(),
"description": m.description,
"completion": m.completion_status
}
for m in self.milestones
],
"resources": self.resources,
"risks": self.risks,
"last_updated": datetime.now().isoformat()
}
def main():
# Example usage
project_manager = ProjectOutlineManager()
# Add objectives
project_manager.add_objective("Develop a scalable web application")
project_manager.add_objective("Launch beta version within 3 months")
# Add milestones
milestone1 = Milestone(
"Complete Backend API",
datetime.now() + timedelta(days=30),
"Implement RESTful API endpoints"
)
project_manager.add_milestone(milestone1)
# Add resources
project_manager.add_resource("Development Team", "Frontend Developer")
project_manager.add_resource("Development Team", "Backend Developer")
project_manager.add_resource("Tools", "AWS Cloud Services")
# Add risks
project_manager.add_risk(
"Technical debt accumulation",
"Regular code reviews and refactoring sessions"
)
# Generate and display summary
summary = project_manager.generate_project_summary()
print("\nProject Summary:")
print(summary)
if __name__ == "__main__":
main()
Explicación del Desglose del Código:
- Estructura y Diseño Principal
- Utiliza dataclasses para una representación limpia de estructuras de datos
- Implementa Enum para el seguimiento del estado del proyecto
- Centraliza la funcionalidad de gestión de proyectos en ProjectOutlineManager
- Componentes Clave
- Seguimiento de hitos con fechas límite y estado de finalización
- Gestión de recursos categorizada por departamento/tipo
- Evaluación de riesgos con estrategias de mitigación
- Generación de resúmenes de proyecto impulsada por IA
- Características Avanzadas
- Funcionalidad de exportación de datos estructurados
- Sistema integral de registro
- Manejo de errores para interacciones con IA
- Categorización flexible de recursos
- Mejores Prácticas Implementadas
- Anotaciones de tipo para mejor mantenibilidad del código
- Manejo adecuado de errores y registro
- Organización limpia del código siguiendo PEP 8
- Documentación exhaustiva
Esta implementación proporciona una base sólida para gestionar esquemas de proyectos, combinando principios tradicionales de gestión de proyectos con perspectivas impulsadas por IA para mejorar la planificación y el seguimiento de proyectos.
Los elementos clave a considerar al diseñar estos prompts son:
Claridad
Asegurar que las instrucciones sean inequívocas y específicas es crucial para una ingeniería de prompts efectiva. Aquí hay un desglose detallado de las prácticas clave:
El lenguaje y la terminología precisos son esenciales al crear prompts. Esto significa elegir palabras que tengan significados claros y específicos en lugar de términos vagos o ambiguos. Es importante usar terminología estándar de la industria cuando sea aplicable para evitar confusiones, y mantener la consistencia con la terminología a lo largo de tus prompts.
Los ejemplos concretos juegan un papel vital en la ingeniería efectiva de prompts. Incluye ejemplos relevantes del mundo real que ilustren claramente tus requisitos. Es útil mostrar tanto buenos como malos ejemplos para resaltar distinciones importantes, y asegurar que los ejemplos sean apropiados para el nivel de experiencia de tu audiencia objetivo.
Cuando se trata de formatos de salida, la claridad es clave. Debes especificar requisitos exactos de estructura, ya sea JSON, markdown o viñetas. Incluir ejemplos de salidas que muestren el formato deseado ayuda a eliminar ambigüedades, y definir reglas o convenciones especiales de formato asegura la consistencia en los resultados.
Finalmente, establecer parámetros y restricciones claras ayuda a guiar la salida de manera efectiva. Esto implica establecer límites específicos de longitud, alcance y contenido, definir cualquier limitación o requisito técnico, y especificar elementos o enfoques prohibidos a evitar.
Estructura
Mantener un flujo lógico y una organización jerárquica requiere varias estrategias clave. Primero, establecer secciones y subsecciones claras es esencial. Esto implica desglosar el contenido en temas principales distintos, crear subdivisiones lógicas dentro de cada sección, y usar niveles de encabezado consistentes para mostrar relaciones entre diferentes partes del contenido.
La implementación de pautas de formato consistentes es igualmente importante. Esto significa definir estilos estándar para diferentes tipos de contenido, mantener espaciado y alineación uniformes en todos los documentos, y usar estilos y tamaños de fuente consistentes para elementos similares para asegurar la coherencia visual.
Los sistemas de etiquetado estandarizados juegan un papel crucial en la organización. Estos sistemas deben incluir convenciones claras de nomenclatura para secciones, esquemas sistemáticos de numeración o codificación, y etiquetas descriptivas y significativas que ayuden a los usuarios a navegar eficientemente por el contenido.
Finalmente, desarrollar jerarquías de información coherentes asegura una estructura óptima del contenido. Esto implica organizar la información desde conceptos generales hasta específicos, agrupar información relacionada de manera lógica, y establecer relaciones claras padre-hijo entre diferentes conceptos. Estas relaciones jerárquicas ayudan a los usuarios a entender cómo se relacionan entre sí las diferentes piezas de información.
Al implementar estos elementos, sé específico en tus requisitos. Para resúmenes, indica explícitamente la longitud deseada (por ejemplo, "200 palabras"), puntos clave a destacar, y formato preferido (por ejemplo, viñetas vs. párrafos). Para listas de tareas, indica claramente niveles de prioridad (alto/medio/bajo), plazos específicos y dependencias de tareas. Con esquemas de proyecto, define el alcance con objetivos medibles, establece cronogramas concretos y especifica el nivel de detalle requerido para cada componente.
Esta atención meticulosa al detalle en el diseño de prompts asegura que la salida de la IA no solo sea práctica y accionable de inmediato, sino que también esté formateada consistentemente y se integre fácilmente en los flujos de trabajo de productividad existentes.
5.3.3 Plantillas de Prompts para Atención al Cliente
En escenarios de atención al cliente, la comunicación clara y empática es crucial. Tus prompts deben instruir al asistente para abordar problemas exhaustivamente, proporcionar pasos de solución de problemas o responder a consultas de manera amigable. Exploremos estos componentes esenciales en detalle:
Primero, el prompt debe guiar a la IA para reconocer la preocupación del cliente con empatía, mostrando comprensión de su frustración o dificultad. Esto significa enseñar a la IA a reconocer señales emocionales en los mensajes de los clientes y responder apropiadamente. Por ejemplo, si un cliente expresa frustración sobre un pago fallido, la IA debe primero reconocer esta frustración antes de pasar a las soluciones: "Entiendo lo frustrante que pueden ser los problemas de pago, especialmente cuando estás tratando de completar una transacción importante." Esto ayuda a establecer una conexión positiva desde el principio y muestra al cliente que está siendo escuchado.
Segundo, las respuestas deben estar estructuradas claramente, con un flujo lógico desde el reconocimiento hasta la resolución. Esto significa desglosar soluciones complejas en pasos manejables y usar un lenguaje claro, sin jerga, que cualquier cliente pueda entender. Cada paso debe estar numerado o claramente separado, con acciones específicas que el cliente pueda tomar. Por ejemplo, en lugar de decir "revisa tu caché," la IA debería decir "Abre la configuración de tu navegador haciendo clic en los tres puntos en la esquina superior derecha, luego selecciona 'Borrar datos de navegación.'" Este nivel de detalle asegura que los clientes puedan seguir las instrucciones sin confusión.
Tercero, el prompt debe enfatizar la importancia de la minuciosidad - asegurando que se aborden todos los aspectos del problema del cliente, mientras se mantiene un equilibrio entre ser exhaustivo y conciso. Esto incluye anticipar preguntas de seguimiento y proporcionar información adicional relevante. La IA debe estar entrenada para identificar problemas relacionados que puedan surgir y abordarlos proactivamente. Por ejemplo, al ayudar con problemas de inicio de sesión, la IA podría no solo resolver el problema inmediato de restablecimiento de contraseña sino también explicar la configuración de autenticación de dos factores y las mejores prácticas de seguridad.
Finalmente, el tono debe permanecer consistentemente profesional pero amigable durante toda la interacción, haciendo que los clientes se sientan valorados mientras se mantienen los estándares profesionales de la empresa. Esto incluye usar lenguaje positivo, ofrecer tranquilidad y terminar con pasos claros a seguir o una invitación para más preguntas si es necesario. La IA debe ser guiada para usar frases que construyan confianza ("Te ayudaré a resolver esto"), muestren proactividad ("Déjame revisar eso por ti"), y mantengan el compromiso ("¿Hay algo más que te gustaría que te aclare?"). El lenguaje debe ser cálido pero no excesivamente casual, encontrando un equilibrio entre accesibilidad y profesionalismo.
Ejemplo: Respuesta a una Consulta de Soporte
Por ejemplo, podrías querer que el asistente ayude a responder a un cliente que está teniendo problemas con el inicio de sesión de su cuenta.
Plantilla:
import openai
import os
from dotenv import load_dotenv
load_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")
messages = [
{"role": "system", "content": "You are a courteous and knowledgeable customer support assistant."},
{"role": "user", "content": (
"A customer says: 'I'm unable to log into my account even after resetting my password. "
"What steps can I take to resolve this issue? Please provide a friendly response with troubleshooting steps.'"
)}
]
response = openai.ChatCompletion.create(
model="gpt-4o",
messages=messages,
max_tokens=150,
temperature=0.5
)
print("Customer Support Response Example:")
print(response["choices"][0]["message"]["content"])
Permíteme desglosar este código de ejemplo, que demuestra una implementación simple de chat para atención al cliente:
1. Configuración e Inicialización
- Utiliza las bibliotecas OpenAI y dotenv para gestionar el acceso a la API
- Carga variables de entorno para manejar de forma segura la clave de API
2. Estructura de Mensajes
- Crea un array de mensajes con dos componentes:
- Un mensaje del sistema que define el rol de la IA como asistente de atención al cliente
- Un mensaje del usuario que contiene el problema de inicio de sesión del cliente y la solicitud de ayuda
3. Configuración de la Llamada a la API
- Realiza una llamada a la API ChatCompletion de OpenAI con parámetros específicos:
- Utiliza el modelo GPT-4
- Establece un límite de 150 tokens
- Utiliza una temperatura de 0.5 (equilibrando creatividad y consistencia)
4. Manejo de la Salida
- El código imprime la respuesta como un "Ejemplo de Respuesta de Atención al Cliente"
Este prompt instruye al asistente para ser empático y presentar pasos claros de solución de problemas, asegurando una experiencia positiva para el cliente. No solo aborda el problema específico del cliente sino que también mantiene un tono cordial.
Ejemplo: Plantilla de Respuesta de Soporte
# customer_support_templates.py
from dataclasses import dataclass
from datetime import datetime
from typing import List, Dict, Optional
import openai
import logging
@dataclass
class CustomerQuery:
query_id: str
customer_name: str
issue_type: str
description: str
timestamp: datetime
priority: str
class CustomerSupportSystem:
def __init__(self, api_key: str):
self.api_key = api_key
openai.api_key = self.api_key
self.templates: Dict[str, str] = self._load_templates()
def _load_templates(self) -> Dict[str, str]:
return {
"login_issues": """
Please help the customer with their login issue.
Key points to address:
- Express understanding of their frustration
- Provide clear step-by-step troubleshooting
- Include security best practices
- Offer additional assistance
Context: {context}
Customer query: {query}
""",
"billing_issues": """
Address the customer's billing concern.
Key points to cover:
- Acknowledge the payment problem
- Explain the situation clearly
- Provide resolution steps
- Detail prevention measures
Context: {context}
Customer query: {query}
"""
}
def generate_response(self, query: CustomerQuery) -> str:
template = self.templates.get(query.issue_type, self.templates["general"])
messages = [
{
"role": "system",
"content": "You are an empathetic customer support specialist. Maintain a professional yet friendly tone."
},
{
"role": "user",
"content": template.format(
context=f"Customer: {query.customer_name}, Priority: {query.priority}",
query=query.description
)
}
]
try:
response = openai.ChatCompletion.create(
model="gpt-4",
messages=messages,
max_tokens=300,
temperature=0.7
)
return response.choices[0].message.content
except Exception as e:
logging.error(f"Error generating response: {e}")
return "We apologize, but we're experiencing technical difficulties. Please try again later."
def main():
# Example usage
support_system = CustomerSupportSystem("your-api-key")
# Sample customer query
query = CustomerQuery(
query_id="QRY123",
customer_name="John Doe",
issue_type="login_issues",
description="I can't log in after multiple password reset attempts",
timestamp=datetime.now(),
priority="high"
)
# Generate response
response = support_system.generate_response(query)
print(f"Generated Response:\n{response}")
if __name__ == "__main__":
main()
Desglose del Código:
- Componentes Principales y Estructura
- Utiliza dataclass CustomerQuery para la representación estructurada de consultas
- Implementa una clase CustomerSupportSystem para operaciones centralizadas de soporte
- Mantiene un diccionario de plantillas para diferentes tipos de problemas de clientes
- Características Principales
- Generación de respuestas basada en plantillas con conciencia del contexto
- Manejo de consultas basado en prioridades
- Sistema flexible de plantillas para diferentes tipos de problemas
- Mecanismos de manejo de errores y registro
- Capacidades Avanzadas
- Formateo dinámico de plantillas con contexto del cliente
- Parámetros de respuesta personalizables (temperatura, límite de tokens)
- Sistema extensible de plantillas para nuevos tipos de problemas
- Generación profesional de respuestas con tono consistente
- Implementación de Mejores Prácticas
- Sugerencias de tipo para mejor mantenimiento del código
- Manejo apropiado de errores con registro
- Organización limpia del código siguiendo PEP 8
- Diseño modular para fácil expansión
Esta implementación proporciona una base sólida para gestionar respuestas de atención al cliente, combinando estructura basada en plantillas con personalización impulsada por IA para asegurar una comunicación con el cliente consistente, útil y empática.
5.3.4 Reflexiones Finales sobre las Plantillas de Prompts
Las plantillas de prompts sirven como bloques fundamentales en la creación de interacciones efectivas con IA. Estas plantillas actúan como marcos estandarizados que conectan la intención del usuario con las respuestas de la IA de varias maneras importantes:
Primero, establecen un protocolo de comunicación consistente. Al proporcionar formatos estructurados para entradas y salidas, las plantillas aseguran que cada interacción siga patrones establecidos. Esta estandarización es particularmente valiosa cuando múltiples miembros del equipo o departamentos están trabajando con el mismo sistema de IA, ya que mantiene la uniformidad en cómo se solicita y recibe la información.
Segundo, las plantillas reducen significativamente la ambigüedad en las interacciones con IA. Guían a los usuarios para proporcionar el contexto y los parámetros necesarios desde el principio, previniendo malentendidos y reduciendo la necesidad de preguntas aclaratorias. Esta claridad conduce a respuestas más precisas y relevantes del sistema de IA.
Tercero, las plantillas bien diseñadas son inherentemente escalables. A medida que tu aplicación crece, estas plantillas pueden ser fácilmente replicadas, modificadas o extendidas para manejar nuevos casos de uso mientras mantienen la consistencia con la funcionalidad existente. Esta escalabilidad es esencial para organizaciones en crecimiento que necesitan mantener la calidad mientras expanden sus capacidades de IA.
Los ejemplos que hemos explorado a lo largo de este capítulo demuestran la versatilidad de las plantillas de prompts en diferentes escenarios. Desde asistir a desarrolladores con la depuración de código hasta agilizar la gestión de tareas diarias y mejorar las interacciones de atención al cliente, cada plantilla puede ser personalizada para abordar necesidades específicas mientras mantiene las mejores prácticas fundamentales.
En última instancia, las plantillas de prompts efectivas son la base para crear interacciones de IA confiables y de alta calidad. No solo establecen el escenario para respuestas específicas sino que también aseguran que estas respuestas permanezcan consistentes, escalables y alineadas con los objetivos de tu organización. Ya sea que estés construyendo una aplicación pequeña o un sistema de IA a gran escala, invertir tiempo en desarrollar plantillas de prompts robustas rendirá dividendos en la calidad y consistencia de tus interacciones con IA.