Lección 12 · 5 min · Gratis

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.

Meta---Logo@1x.jpg

Open In Colab

Este notebook te guiará a través del proceso de usar prompt-ops para optimizar tus prompts para los modelos Llama. Cubriremos:

  1. Introducción a prompt-ops
  2. Configuración de tu entorno
  3. Creación de un proyecto de ejemplo
  4. Ejecución de la optimización de prompts
  5. Análisis de los resultados
  6. 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:

  1. Tu prompt de sistema existente
  2. Un conjunto de datos de pares consulta-respuesta para evaluación y optimización
  3. 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 API
  • README.md: Documentación para el proyecto
  • config.yaml: Archivo de configuración para la optimización de prompts
  • data/dataset.json: Conjunto de datos de ejemplo para evaluación y optimización
  • prompts/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:

  1. Cargar tu prompt de sistema y tu conjunto de datos
  2. Analizar la estructura y el contenido del prompt
  3. Aplicar técnicas de optimización específicas para los modelos Llama
  4. Evaluar el prompt optimizado frente al prompt original
  5. 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:

  1. Mejor estructura: Los modelos Llama responden mejor a instrucciones claras y estructuradas
  2. Formato específico de Llama: Formato que funciona mejor con los patrones de entrenamiento de Llama
  3. Ejemplos de pocas tomas (Few-Shot Examples): Ejemplos que ayudan al modelo a entender el formato de salida esperado
  4. 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:

  1. Preparar tu conjunto de datos en formato JSON
  2. Crear un archivo de prompt del sistema
  3. 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:

  1. Introducción a Prompt ops y sus beneficios
  2. Creación de un proyecto de ejemplo
  3. Configuración de tu entorno y clave API
  4. Ejecución de la optimización de prompts
  5. Análisis de los resultados
  6. 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.

Lección del curso «Llama Cookbook (getting started)» de Meta, publicado con licencia MIT. Traducción y adaptación al español de IA con Clase. IA con Clase no está afiliado a Meta. Ver el original · Licencia
Esta lección es gratuita. El resto del curso se abre con la Membresía de IA con Clase, que incluye todos los cursos del catálogo. Ver precios