Introducción
En el panorama de los Large Language Models (LLMs), el uso de demostraciones few-shot es una práctica consolidada para obtener resultados de alta calidad sin entrenar el modelo desde cero. Sin embargo, una dependencia excesiva de ejemplos no seleccionados correctamente puede llevar a unaderiva semánticay a unadilución de las capacidades, especialmente cuando el modelo se aplica a dominios diferentes a los de entrenamiento. En este artículo analizamos de manera técnica y práctica cómoauditaryrecalibrarla selección de los ejemplos de forma sistemática, garantizando una generalización in-context eficaz incluso bajo un cambio de dominio.
1. Mapa mecánico entre orden de las demos, densidad semántica y activación del prior latente
1.1. Modelo de atención de los transformers
Cada capa de un transformer contiene una matriz de atención “QK” que calcula la similitud entre tokens query y key. Cuando insertamos una demo, el modelo tiende adesplazarla atención hacia patrones ya presentes en el prompt. Si la demo está demasiado concentrada en un subconjunto de conceptos, ladensidad semánticaaumenta, pero el modelo puede sobrecargar los priors latentes asociados.
1.2. Efecto del orden de los ejemplos
El orden determina qué prior latente se activa primero. Los ejemplos altamente correlacionados deben ir primero para evitar que el modelo “interprete mal” el contexto. Un orden aleatorio puede desencadenar unaderiva semánticacuando el modelo pasa de un dominio a otro sin una transición guiada.
1.3. Código de ejemplo: cálculo de densidad semántica
import torch
from transformers import AutoModel, AutoTokenizer
model_name = "gpt-2"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModel.from_pretrained(model_name, output_attentions=True)
# Prompt con 3 demos
prompt = "\nDemo 1: " + "Hola, ¿cómo estás?" + "\nDemo 2: " + "Estoy bien, gracias!" + "\nDemo 3: " + "¿Y tú?" + "\nPregunta: " + "¿Cómo va?"
inputs = tokenizer(prompt, return_tensors='pt')
outputs = model(**inputs)
attentions = outputs.attentions # tuple of (layers, heads, seq, seq)
# Cálculo media activación por head
head_means = [att.mean().item() for att in attentions]
print("Media de atención por head:", head_means)2. Protocolo diagnóstico: activación de la atención y probing del espacio latente
2.1. Entropía de atención
Una medida dedistribución uniformede la atención es la entropía. Una entropía baja indica que el modelo se concentra en pocos tokens, señal de posibleoverfittinga la demo.
2.2. Probing del espacio latente
Utilizamosprobeslineales para verificar si las representaciones latentes mantienen la información deseada. Si la clase de salida cambia drásticamente con respecto a la demo, es probable que se esté verificando una deriva semántica.
2.3. Código de ejemplo: entropía de atención
import math
def attention_entropy(attention):
# attention: (heads, seq, seq)
probs = torch.softmax(attention, dim=-1)
log_probs = torch.log(probs + 1e-12)
entropy = -torch.sum(probs * log_probs, dim=-1) / math.log(2)
return entropy.mean().item()
# Cálculo entropía para la capa más profunda
entropy = attention_entropy(attentions[-1])
print("Entropía media (capa más profunda):", entropy)3. Selección de ejemplos guiada por el currículum
3.1. Cobertura, Contraste y Alineación Causal
- Cobertura: cubrir todo el espectro de variables de entrada.
- Contraste: incluir ejemplos que difieran claramente entre sí para evitarconfusión.
- Alineación Causal: asegurar que la demo refleje la causalidad deseada entre entrada y salida.
3.2. Algoritmo de selección de currículum
# Pseudocódigo para la selección de currículum
from collections import Counter
def curriculum_selection(dataset, k):
# dataset: lista de (input, output)
# k: número de demos a seleccionar
# 1. Extrae características (ej. embedding BERT)
embeddings = [bert_embed(inp) for inp, _ in dataset]
# 2. Clustering K-means para Cobertura
clusters = kmeans(embeddings, k)
# 3. Selecciona un ejemplo por cluster
selected = []
for cluster in clusters:
# 4. Dentro del cluster elige ejemplo con contraste máximo
example = max(cluster, key=lambda x: contrast_score(x))
selected.append(example)
return selected4. Ciclos de gobernanza para la auditoría continua
4.1. Aumento Contrafactual
Generamos versionescontrafactualesde las demos para probar la robustez del modelo. Si el modelo reacciona de manera incoherente, el conjunto de ejemplos es demasiado frágil.
4.2. Recuperación basada en bias-constrained
Implementamos un motor de búsqueda interno que filtra las demos en base a los sesgos conocidos, manteniendo lafidelidad a la tareaincluso a escala.
4.3. Código de ejemplo: bucle de auditoría
def audit_loop(model, prompt_set):
for prompt in prompt_set:
outputs = model(prompt)
# 1. Verifica deriva
if semantic_drift_detected(outputs):
print("Deriva detectada en prompt:", prompt)
# 2. Actualiza conjunto de demos
update_demo_set(prompt)
# 3. Scheduler para ejecución periódica
schedule.every(24).hours.do(audit_loop, model, prompt_set)5. Conclusiones y Puntos Clave
- Diagnóstico atento:usa entropía de atención y probing para detectar deriva.
- Selección de currículum:equilibra cobertura, contraste y alineación causal.
- Auditoría continua:implementa aumento contrafactual y recuperación bias-constrained.
- Documentación:guarda versiones de los prompts para trazabilidad.
- Iteración rápida:actualiza el conjunto de demos en base a los resultados de las pruebas.
Preguntas Frecuentes
P1: ¿Con qué frecuencia debo ejecutar la auditoría?
Idealmente cada 24-48 horas si el modelo está en producción, de lo contrario al menos una vez a la semana.
P2: ¿Puedo automatizar la generación de las demos?
Sí, usando técnicas de few-shot generation basadas en reinforcement learning o prompt tuning, pero siempre es recomendable un control humano para evitar sesgos.
Preguntas Frecuentes
¿Con qué frecuencia debo ejecutar la auditoría?
Idealmente cada 24-48 horas si el modelo está en producción, de lo contrario al menos una vez a la semana.
¿Puedo automatizar la generación de las demos?
Sí, usando técnicas de few-shot generation basadas en reinforcement learning o prompt tuning, pero siempre es recomendable un control humano para evitar sesgos.