Estrategias de registro y documentación
Registre las versiones de los prompts, las entradas y las salidas para depurar de forma reproducible.
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 8601prompt_id: qué plantilla de prompt se utilizómodel: nombre y versión exactos del modelotemperature: parámetro de muestreoinput: el mensaje del usuario (o un hash si contiene PII)output: la respuesta del modelolatency_ms: tiempo de respuestatokens_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 outputFormato 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'] = versionGestió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, scoreDocumentació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.
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
- Diagnóstico de resultados inesperados
- Análisis de causa raíz de prompts
- Enfoque sistemático para depurar
- Estrategias de registro y documentación