AI Prompt Engineering · Lección

Estrategias de registro y documentación

Registre las versiones de los prompts, las entradas y las salidas para depurar de forma reproducible.

Lección 4 de 413 pasos

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

Por qué es importante registrar los prompts

Sin registros, los fallos de los prompts permanecen invisibles hasta que un usuario los notifica. Con registros, puede:

  • Detectar regresiones en el momento en que ocurren
  • Reproducir exactamente cualquier fallo anterior
  • Medir la mejora con el tiempo a medida que evolucionan los prompts
  • Auditar el comportamiento del modelo para verificar el cumplimiento o la seguridad

El registro no es opcional en los sistemas de prompts en producción: es la base de unas aplicaciones LLM fiables.

La entrada de registro mínima viable

Cada interacción con un prompt debería registrar, como mínimo, estos campos:

  • timestamp: UTC en formato ISO 8601
  • prompt_id: qué plantilla de prompt se utilizó
  • model: nombre y versión exactos del modelo
  • temperature: parámetro de muestreo
  • input: el mensaje del usuario (o un hash si contiene PII)
  • output: la respuesta del modelo
  • latency_ms: tiempo de respuesta
  • tokens_used: tokens de entrada + salida
import time, json
from datetime import datetime, timezone

def logged_call(prompt_id, system_prompt, user_message, model='gpt-4o', temperature=0.7):
    start = time.time()
    resp = client.chat.completions.create(
        model=model,
        messages=[
            {'role': 'system', 'content': system_prompt},
            {'role': 'user', 'content': user_message}
        ],
        temperature=temperature
    )
    latency = int((time.time() - start) * 1000)
    output = resp.choices[0].message.content
    log_entry = {
        'timestamp': datetime.now(timezone.utc).isoformat(),
        'prompt_id': prompt_id,
        'model': model,
        'temperature': temperature,
        'input': user_message,
        'output': output,
        'latency_ms': latency,
        'input_tokens': resp.usage.prompt_tokens,
        'output_tokens': resp.usage.completion_tokens
    }
    append_log(log_entry)
    return output

Formato de registro estructurado

Utilice JSON delimitado por saltos de línea (JSONL) para los archivos de registro. Cada línea es un objeto JSON completo y válido. Este formato es:

  • Fácil de ampliar sin bloqueos
  • Legible para jq, pandas y todos los agregadores de registros
  • Adecuado para streaming: cada línea se puede procesar a medida que llega
import json

LOG_FILE = 'prompt_logs.jsonl'

def append_log(entry):
    with open(LOG_FILE, 'a') as f:
        f.write(json.dumps(entry) + '\n')

def read_logs():
    with open(LOG_FILE) as f:
        return [json.loads(line) for line in f if line.strip()]

# Query: all entries for prompt_id 'summarize_v3'
logs = read_logs()
summarize_logs = [e for e in logs if e['prompt_id'] == 'summarize_v3']
print(f'Total calls to summarize_v3: {len(summarize_logs)}')

Control de versiones de prompts

Los prompts cambian con el tiempo. Sin control de versiones, no puede reproducir el comportamiento anterior ni comparar las salidas del modelo entre distintas versiones del prompt. Utilice un identificador de versión en cada entrada del registro.

Control de versiones sencillo: una cadena de versión semántica (por ejemplo, v1.2.3) o un hash de confirmación de git. Almacene las versiones de los prompts en un archivo específico para poder recuperar cualquier versión y reproducirla.

PROMPTS = {
    'summarize': {
        'v1': 'Summarize the following text.',
        'v2': 'Summarize the following text in 3 sentences.',
        'v3': 'Summarize the following text in exactly 3 sentences. '
              'Start each sentence on a new line. No bullet points.'
    }
}

CURRENT_VERSIONS = {'summarize': 'v3'}

def get_prompt(prompt_id):
    version = CURRENT_VERSIONS[prompt_id]
    return version, PROMPTS[prompt_id][version]

version, prompt = get_prompt('summarize')
log_entry['prompt_version'] = version

Gestión de PII en los registros

Las entradas de los usuarios pueden contener información de identificación personal (PII). Registrar las entradas sin modificar puede infringir el RGPD o la CCPA. Opciones:

  • Hash: almacene el SHA-256 de la entrada; permite la reproducibilidad para la deduplicación, pero no para la reproducción
  • Redacción: utilice una expresión regular o un modelo NER para sustituir la PII antes de registrarla
  • Almacenamiento separado: registre la PII en un almacén cifrado con controles de acceso; registre solo un ID de referencia en el registro principal
import hashlib, re

def redact_pii(text):
    # Redact email addresses
    text = re.sub(r'[\w.-]+@[\w.-]+\.\w+', '[EMAIL]', text)
    # Redact phone numbers (US format)
    text = re.sub(r'\b\d{3}[-.]\d{3}[-.]\d{4}\b', '[PHONE]', text)
    return text

def hash_input(text):
    return hashlib.sha256(text.encode()).hexdigest()[:16]

log_entry['input'] = redact_pii(user_message)
log_entry['input_hash'] = hash_input(user_message)

Seguimiento de latencia y costes

Los registros permiten crear paneles de costes y latencia. Realice un seguimiento de las métricas por versión del prompt para detectar regresiones de rendimiento o de costes después de un cambio en el prompt:

def compute_cost(entry, price_per_1m_input=5.0, price_per_1m_output=15.0):
    input_cost = entry['input_tokens'] / 1_000_000 * price_per_1m_input
    output_cost = entry['output_tokens'] / 1_000_000 * price_per_1m_output
    return input_cost + output_cost

def prompt_stats(prompt_id, version):
    logs = [e for e in read_logs()
            if e['prompt_id'] == prompt_id and e.get('prompt_version') == version]
    if not logs:
        return
    avg_latency = sum(e['latency_ms'] for e in logs) / len(logs)
    total_cost = sum(compute_cost(e) for e in logs)
    print(f'{prompt_id} {version}: {len(logs)} calls, avg {avg_latency:.0f}ms, total ${total_cost:.4f}')

Registro de evaluación de salidas

Además de los registros sin procesar, almacene las puntuaciones de evaluación junto a cada entrada del registro. Esto permite analizar tendencias: ¿está mejorando la calidad de la salida entre las distintas versiones del prompt?

def evaluated_call(prompt_id, system_prompt, user_message, evaluator_fn):
    output = logged_call(prompt_id, system_prompt, user_message)
    score = evaluator_fn(user_message, output)
    # Update the last log entry with the evaluation score
    logs = read_logs()
    last = logs[-1]
    last['eval_score'] = score
    last['eval_pass'] = score >= 0.8
    # Rewrite the last line
    with open(LOG_FILE, 'a') as f:
        # In practice, use a DB or separate eval log
        pass
    return output, score

Documentación de prompts

Cada plantilla de prompt debería tener una entrada de documentación complementaria que incluya:

  • Propósito: qué tarea realiza este prompt
  • Variables: qué marcadores de posición existen y qué esperan
  • Limitaciones conocidas: entradas con las que se sabe que falla
  • Historial de versiones: qué cambió en cada versión y por qué
  • Casos de prueba: enlace al conjunto de pruebas de este prompt
PROMPT_DOCS = {
    'summarize': {
        'purpose': 'Summarize a single text passage into 3 sentences.',
        'variables': {'text': 'The passage to summarize (max 2000 tokens)'},
        'known_limitations': [
            'Fails to preserve numbers accurately for texts with many statistics',
            'May not summarize correctly for non-English text'
        ],
        'versions': {
            'v1': 'Initial version — vague length instruction',
            'v2': 'Added 3-sentence limit',
            'v3': 'Added line-break and no-bullet formatting fix'
        },
        'test_suite': 'tests/test_summarize.py'
    }
}

Uso de servicios centralizados de registro

En los sistemas en producción, escriba los registros en un servicio centralizado en lugar de utilizar archivos locales:

  • LangSmith: plataforma nativa de trazas y evaluación de LangChain
  • Weights and Biases Prompts: seguimiento de experimentos para prompts
  • Datadog / Grafana: paneles operativos estándar con métricas personalizadas
  • Supabase / PostgreSQL: consulte los registros con SQL para realizar análisis ad hoc

El esquema es el mismo; solo cambia el destino.

# Example: writing to Supabase
from supabase import create_client

supabase = create_client('https://xxx.supabase.co', 'your-anon-key')

def log_to_supabase(entry):
    supabase.table('prompt_logs').insert(entry).execute()

# Now query with SQL:
# SELECT prompt_id, prompt_version, AVG(latency_ms), COUNT(*)
# FROM prompt_logs
# WHERE timestamp > NOW() - INTERVAL '7 days'
# GROUP BY prompt_id, prompt_version
# ORDER BY COUNT(*) DESC;

Alertas ante picos de fallos

Configure alertas cuando las tasas de fallos superen un umbral. Por ejemplo: si más del 10 % de las llamadas a un prompt devuelven JSON no válido en un intervalo de 5 minutos, envíe una alerta.

from collections import deque
from datetime import datetime, timezone, timedelta

recent_results = deque(maxlen=100)  # sliding window

def track_and_alert(prompt_id, success, alert_fn, threshold=0.10):
    recent_results.append({'success': success, 'time': datetime.now(timezone.utc)})
    window = [
        r for r in recent_results
        if r['time'] > datetime.now(timezone.utc) - timedelta(minutes=5)
    ]
    if not window:
        return
    fail_rate = sum(1 for r in window if not r['success']) / len(window)
    if fail_rate > threshold:
        alert_fn(f'ALERT: {prompt_id} failure rate {fail_rate:.0%} in last 5 min')

Retención y archivado

Defina una política de retención de logs:

  • Logs sin procesar de las llamadas: 30 días (rotativos): gran volumen, necesarios para depurar problemas recientes
  • Métricas agregadas: 1 año: necesarias para analizar tendencias y prever costes
  • Logs de fallos: indefinidamente: necesarios para identificar patrones de causas raíz

Comprima y archive los logs sin procesar después de 30 días. Nunca elimine los logs de fallos: son su memoria institucional para la ingeniería de prompts.

Comprobación de conocimientos

¿Cuál es la principal ventaja de utilizar el formato JSON delimitado por saltos de línea (JSONL) para los logs de prompts frente a un único array JSON de gran tamaño?

Resumen: registro y documentación

Prácticas clave para el registro y la documentación de prompts:

  • Registre cada llamada: marca de tiempo, prompt_id, versión, modelo, temperatura, entrada, salida, latencia y tokens
  • Utilice el formato JSONL: permite añadir registros fácilmente y hacer consultas con herramientas estándar
  • Versione los prompts: cada cambio obtiene una nueva versión; los logs hacen referencia a ella
  • Gestione la PII: oculte o aplique un hash a las entradas sensibles antes de registrarlas
  • Realice un seguimiento del coste y la latencia: detecte regresiones después de actualizar los prompts
  • Genere alertas ante picos de fallos: supervise la tasa de fallos en una ventana deslizante

Con esto concluye el Curso 17 sobre depuración de fallos de prompts. A continuación: inyección de prompts y defensa.

Gratis para empezar

Aprende AI Prompt Engineering con un tutor de IA — gratis

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

Cursos
53
Lecciones
199

Preguntas frecuentes

¿La lección «Estrategias de registro y documentación» es gratis?

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

¿Qué aprenderé en «Estrategias de registro y documentación»?

Registre las versiones de los prompts, las entradas y las salidas para depurar de forma reproducible. Practicas AI Prompt Engineering con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar AI Prompt Engineering?

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

¿Cuánto tiempo toma la lección «Estrategias de registro y documentación»?

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

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

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

Todas las lecciones de este curso

  1. Diagnóstico de resultados inesperados
  2. Análisis de causa raíz de prompts
  3. Enfoque sistemático para depurar
  4. Estrategias de registro y documentación
← Volver a AI Prompt Engineering