Optimización de prompts con prompt-ops
Copyright (c) Meta Platforms, Inc. y afiliados. Todos los derechos reservados.
Este código fuente está licenciado bajo los términos descritos en el archivo LICENSE en el directorio raíz de este árbol de código fuente.
Este notebook te guiará a través del proceso de usar prompt-ops para optimizar tus prompts para los modelos Llama. Cubriremos:
- Introducción a prompt-ops
- Configuración de tu entorno
- Creación de un proyecto de ejemplo
- Ejecución de la optimización de prompts
- Análisis de los resultados
- Uso avanzado y personalización
1. Introducción a prompt-ops
¿Qué es prompt-ops?
prompt-ops es un paquete de Python que optimiza automáticamente los prompts para los modelos Llama. Transforma prompts que funcionan bien con otros LLM en prompts optimizados para los modelos Llama, mejorando el rendimiento y la fiabilidad.
Cómo funciona
prompt-ops toma tres entradas clave:
- Tu prompt de sistema existente
- Un conjunto de datos de pares consulta-respuesta para evaluación y optimización
- Un archivo de configuración que especifica los parámetros del modelo y los detalles de optimización
Luego aplica técnicas de optimización para transformar tu prompt en uno que funcione mejor con los modelos Llama, y proporciona métricas para medir la mejora.
2. Configuración de tu entorno
Comencemos instalando el paquete Prompt ops y configurando nuestro entorno. Puedes instalarlo desde PyPI o directamente desde el código fuente.
# Install from PyPI
!pip install prompt-ops
Configuración de tu clave API
Prompt ops requiere una clave API para acceder a los servicios de LLM. Puedes usar OpenRouter, que proporciona acceso a varios modelos, incluidos los modelos Llama.
Crea un archivo .env en el directorio de tu proyecto con tu clave API:
# Create a .env file with your API key
%%writefile .env
OPENROUTER_API_KEY=your_key_here
Necesitarás reemplazar your_key_here con tu clave API real de OpenRouter. Puedes obtener una clave API de OpenRouter creando una cuenta en OpenRouter.
Carguemos las variables de entorno del archivo .env:
# Load environment variables from .env file
import os
from dotenv import load_dotenv
load_dotenv()
# Verify the API key is loaded (will show as masked)
api_key = os.getenv("OPENROUTER_API_KEY")
if api_key:
print(f"API key loaded: {'*' * len(api_key)}")
else:
print("API key not found. Please check your .env file.")
3. Creación de un proyecto de ejemplo
Prompt ops proporciona una forma conveniente de crear un proyecto de ejemplo con todos los archivos necesarios. Creemos un proyecto de ejemplo para empezar.
# Create a sample project
!prompt-ops create my-notebook-project
Este comando crea un directorio llamado my-notebook-project con una configuración y un conjunto de datos de ejemplo. Exploremos los archivos que se crearon:
!ls -la my-notebook-project
El proyecto de ejemplo incluye:
.env: Un archivo para tu clave APIREADME.md: Documentación para el proyectoconfig.yaml: Archivo de configuración para la optimización de promptsdata/dataset.json: Conjunto de datos de ejemplo para evaluación y optimizaciónprompts/prompt.txt: Prompt de sistema de ejemplo para optimizar
Examinemos el archivo de configuración:
!cat my-notebook-project/config.yaml
El archivo de configuración especifica:
- El prompt del sistema a optimizar
- El conjunto de datos a usar para evaluación y optimización
- El modelo a usar para optimización y evaluación
- La métrica a usar para la evaluación
- La estrategia de optimización a usar
Veamos también el prompt y el conjunto de datos de ejemplo:
!cat my-notebook-project/prompts/prompt.txt
!head -n 20 my-notebook-project/data/dataset.json
4. Ejecución de la optimización de prompts
Ahora que tenemos nuestro proyecto de ejemplo configurado, ejecutemos el proceso de optimización de prompts. Usaremos el comando migrate, que toma un archivo de configuración como entrada y produce un prompt optimizado.
# Run prompt optimization
!cd my-notebook-project && prompt-ops migrate
El proceso de optimización tardará unos minutos en completarse. Implica:
- Cargar tu prompt de sistema y tu conjunto de datos
- Analizar la estructura y el contenido del prompt
- Aplicar técnicas de optimización específicas para los modelos Llama
- Evaluar el prompt optimizado frente al prompt original
- Guardar el prompt optimizado en el directorio
results/
Verifiquemos el directorio de resultados para ver el prompt optimizado. Si el optimizador encontró con éxito un prompt mejor, se guardará en el directorio results/. Es posible que debas ejecutar el proceso de optimización nuevamente con diferentes parámetros o un conjunto de datos más grande si el prompt es el mismo que el original.
!ls -la my-notebook-project/results/
El prompt optimizado se guarda como un archivo YAML con una marca de tiempo. Examinemos el contenido del prompt optimizado:
import glob
import yaml
# Find the most recent result file
result_files = glob.glob('my-notebook-project/results/*.yaml')
if result_files:
latest_result = max(result_files, key=os.path.getctime)
print(f"Latest result file: {latest_result}")
# Load and display the optimized prompt
with open(latest_result, 'r') as f:
result = yaml.safe_load(f)
print("\nOptimized System Prompt:")
print(result.get('system', 'No system prompt found'))
else:
print("No result files found. Make sure the optimization process completed successfully.")
5. Análisis de los resultados
Comparemos el prompt original con el prompt optimizado para entender los cambios realizados durante la optimización.
# Load the original prompt
with open('my-notebook-project/prompts/prompt.txt', 'r') as f:
original_prompt = f.read()
# Find the most recent result file again
result_files = glob.glob('my-notebook-project/results/*.yaml')
if result_files:
latest_result = max(result_files, key=os.path.getctime)
# Load the optimized prompt
with open(latest_result, 'r') as f:
result = yaml.safe_load(f)
optimized_prompt = result.get('system', 'No system prompt found')
# Print the comparison
print("Original Prompt:")
print("-" * 80)
print(original_prompt)
print("\n" + "-" * 80)
print("\nOptimized Prompt:")
print("-" * 80)
print(optimized_prompt)
print("-" * 80)
else:
print("No result files found. Make sure the optimization process completed successfully.")
Diferencias clave en el prompt optimizado
El prompt optimizado suele incluir varias mejoras:
- Mejor estructura: Los modelos Llama responden mejor a instrucciones claras y estructuradas
- Formato específico de Llama: Formato que funciona mejor con los patrones de entrenamiento de Llama
- Ejemplos de pocas tomas (Few-Shot Examples): Ejemplos que ayudan al modelo a entender el formato de salida esperado
- Expectativas de salida claras: Instrucciones más explícitas sobre cómo debe ser la salida
Estos cambios pueden mejorar significativamente el rendimiento del modelo en tu tarea específica.
6. Uso avanzado y personalización
Uso de tus propios datos
Para usar tus propios datos con Prompt ops, necesitarás:
- Preparar tu conjunto de datos en formato JSON
- Crear un archivo de prompt del sistema
- Crear un archivo de configuración
Consulta la guía completa aquí para obtener más información.
Ahora, veamos cómo crear un archivo de configuración personalizado:
%%writefile custom_config.yaml
system_prompt:
file: "path/to/your/prompt.txt"
inputs: ["question"]
outputs: ["answer"]
# Dataset configuration
dataset:
path: "path/to/your/dataset.json"
input_field: "question" # or ["fields", "input"] for nested fields
golden_output_field: "answer"
# Model configuration
model:
task_model: "openrouter/meta-llama/llama-3.3-70b-instruct"
proposer_model: "openrouter/meta-llama/llama-3.3-70b-instruct"
# Metric configuration
metric:
class: "prompt_ops.core.metrics.StandardJSONMetric"
strict_json: false
output_field: "answer"
# Optimization settings
optimization:
strategy: "llama"
Overwriting custom_config.yaml
Uso de diferentes métricas
Prompt ops admite diferentes métricas para evaluar el rendimiento del prompt. El valor predeterminado es StandardJSONMetric, pero puedes usar otras métricas como FacilityMetric para casos de uso específicos.
Aquí tienes un ejemplo de cómo usar el FacilityMetric para el caso de uso del analizador de soporte de instalaciones:
%%writefile facility_config.yaml
system_prompt:
file: "prompts/facility_prompt.txt"
inputs: ["question"]
outputs: ["answer"]
# Dataset configuration
dataset:
path: "data/facility_dataset.json"
input_field: ["fields", "input"]
golden_output_field: "answer"
# Model configuration
model:
name: "openrouter/meta-llama/llama-3.3-70b-instruct"
task_model: "openrouter/meta-llama/llama-3.3-70b-instruct"
proposer_model: "openrouter/meta-llama/llama-3.3-70b-instruct"
# Metric configuration
metric:
class: "prompt_ops.core.metrics.FacilityMetric"
strict_json: false
output_field: "answer"
# Optimization settings
optimization:
strategy: "llama"
Uso de diferentes modelos
Prompt ops admite diferentes modelos a través de varios proveedores de inferencia. Puedes usar OpenRouter, vLLM o NVIDIA NIMs, según tus necesidades de infraestructura.
Aquí tienes un ejemplo de cómo usar un modelo diferente a través de OpenRouter:
%%writefile different_model_config.yaml
system_prompt:
file: "prompts/prompt.txt"
inputs: ["question"]
outputs: ["answer"]
# Dataset configuration
dataset:
path: "data/dataset.json"
input_field: "question"
golden_output_field: "answer"
# Model configuration
model:
name: "openrouter/meta-llama/llama-3.1-8b-instruct"
task_model: "openrouter/meta-llama/llama-3.1-8b-instruct"
proposer_model: "openrouter/meta-llama/llama-3.1-8b-instruct"
# Metric configuration
metric:
class: "prompt_ops.core.metrics.StandardJSONMetric"
strict_json: false
output_field: "answer"
# Optimization settings
optimization:
strategy: "llama"
Conclusión
En este notebook, hemos cubierto:
- Introducción a Prompt ops y sus beneficios
- Creación de un proyecto de ejemplo
- Configuración de tu entorno y clave API
- Ejecución de la optimización de prompts
- Análisis de los resultados
- Opciones de uso avanzado y personalización
Prompt ops proporciona una forma potente de optimizar tus prompts para los modelos Llama, mejorando el rendimiento y la fiabilidad. Siguiendo los pasos de este notebook, puedes empezar a optimizar tus propios prompts y construir aplicaciones LLM más efectivas.
Para obtener más información, consulta la documentación de prompt-ops y explora los casos de uso de ejemplo en el repositorio.
