LECCIÓN 2 · BLOQUE 1

Inferencia lista para usar

Cuando no necesitas entrenar nada: pipeline() envuelve tokenizer + modelo + interpretación en una sola llamada. El 80% de los casos de uso comunes ya están resueltos.

Recuerda de la lección anterior: HuggingFace tiene el Model Hub (tienda de modelos), la librería transformers y datasets. Un modelo preentrenado ya tiene los pesos ajustados. El proceso básico es: cargar tokenizer + cargar modelo + tokenizar texto + pasar por el modelo. Hoy simplificamos todo eso con pipeline().

1. Inferencia vs entrenamiento — la diferencia clave

Hasta ahora en el laboratorio entrenaste modelos: ajustabas los pesos calculando gradientes y actualizándolos. Pero hay otro modo de usar una red neuronal — simplemente pasar datos por ella y obtener una respuesta, sin cambiar ningún peso. Eso se llama inferencia (del latín inferre: deducir, concluir).

ENTRENAMIENTO vs INFERENCIA
Diferencia entre entrenamiento e inferencia El entrenamiento actualiza pesos; la inferencia solo lee los pesos para producir una respuesta. ENTRENAMIENTO Datos + etiquetas → red → error → gradientes → actualizar pesos Los pesos CAMBIAN INFERENCIA Datos nuevos → red (fija) → predicción / respuesta Los pesos NO cambian

En inferencia los pesos son de solo lectura — el modelo ya aprendió todo lo que necesita.

Cuando usas ChatGPT o cualquier asistente de IA, lo que ocurre es inferencia: el modelo ya está entrenado y solo "lee" tu pregunta para producir una respuesta. No aprende nada nuevo de tu conversación (al menos no en tiempo real).

¿Por qué importa la distinción? La inferencia es mucho más barata que el entrenamiento: no necesitas calcular gradientes ni guardarlos en memoria. Por eso es posible correr inferencia en una laptop con CPU, mientras que el entrenamiento requería GPUs costosas. En PyTorch, la inferencia siempre va dentro de with torch.no_grad(): — le decimos al sistema que no guarde información para calcular gradientes, ahorrando memoria y tiempo.

2. pipeline() — todo en una línea

En la lección anterior viste que usar un modelo requería 3 pasos: cargar tokenizer, cargar modelo, y tokenizar + pasar. Para muchas tareas comunes, HuggingFace envolvió esos 3 pasos en una sola función: pipeline().

✍️ Qué hace pipeline() por dentro — sin saltarse nada
pipeline("text-classification")   equivale a:

1) Elige automáticamente un modelo bueno para esa tarea
   (si no se lo dices, usa el recomendado en el Model Hub)

2) Descarga y carga el tokenizer de ese modelo

3) Descarga y carga el modelo con sus pesos

4) Cuando lo llamas con texto:
   a) text → tokenizer → input_ids + attention_mask
   b) input_ids → model → logits
   c) logits → softmax → probabilidades
   d) probabilidades → etiqueta + score (resultado legible)

Todo eso ocurre automáticamente. Tú solo ves el resultado final.
from transformers import pipeline

# Una sola línea reemplaza los 3 pasos de la lección 1
clasificador = pipeline("text-classification")

resultado = clasificador("I absolutely love this product!")
print(resultado)
salida real[{'label': 'POSITIVE', 'score': 0.9998669624328613}]

El resultado es una lista con un diccionario. Dentro del diccionario:

El resultado viene en lista aunque sea un solo texto — porque puedes pasar una lista de textos y te devuelve una lista de resultados, procesándolos de forma más eficiente que uno a uno.

3. Las tareas disponibles — el catálogo

pipeline() soporta decenas de tareas. Las más usadas en la práctica:

Tarea (string)Qué haceEjemplo de uso
"text-classification"Clasifica texto en categorías (sentimiento, spam, tema)Moderar comentarios, analizar reseñas
"token-classification"Clasifica cada palabra (nombres, lugares, fechas)Extraer entidades de documentos
"question-answering"Responde preguntas sobre un texto dadoChatbot sobre documentos internos
"summarization"Resume un texto largo en uno cortoResumir artículos, informes, correos
"translation"Traduce texto entre idiomasTraducción automática
"text-generation"Genera texto continuando un promptAutocompletado, generación de contenido
"fill-mask"Rellena una palabra faltante marcada con [MASK]Explorar qué "sabe" el modelo
"zero-shot-classification"Clasifica en categorías que no vio en entrenamientoClasificar sin datos etiquetados
Cuándo usar pipeline() vs el código manual: usa pipeline() cuando quieres resultados rápidos y no necesitas personalizar nada. Usa el código manual (AutoTokenizer + AutoModel) cuando quieres extraer los embeddings intermedios, modificar el proceso, o integrarlo en un sistema más complejo. En las próximas lecciones pasaremos al código manual para poder hacer fine-tuning.

4. Ejemplos concretos con salidas reales

Veamos cuatro tareas distintas con sus outputs exactos:

Clasificación de sentimiento

clasificador = pipeline("text-classification")
print(clasificador([
    "Me encanta este producto",
    "Pésima experiencia, nunca más"
]))
salida real[{'label': 'POSITIVE', 'score': 0.9997}, {'label': 'NEGATIVE', 'score': 0.9993}]

Extracción de entidades (NER — Named Entity Recognition)

NER (se lee como las letras N-E-R) son las siglas de Named Entity Recognition — Reconocimiento de Entidades Nombradas. "Entidad nombrada" es cualquier cosa con nombre propio: una persona, una organización, un lugar, una fecha.

ner = pipeline("token-classification", aggregation_strategy="simple")
texto = "Apple was founded by Steve Jobs in Cupertino in 1976."
print(ner(texto))
salida real[{'entity_group': 'ORG', 'word': 'Apple', 'score': 0.9991, 'start': 0, 'end': 5}, {'entity_group': 'PER', 'word': 'Steve Jobs', 'score': 0.9998, 'start': 19, 'end': 29}, {'entity_group': 'LOC', 'word': 'Cupertino', 'score': 0.9976, 'start': 33, 'end': 42}]

ORG = organización · PER = persona · LOC = lugar. El parámetro aggregation_strategy="simple" junta tokens del mismo tipo en una sola entidad (en vez de mostrar "Steve" y "Jobs" por separado).

Preguntas y respuestas sobre un contexto

qa = pipeline("question-answering")
respuesta = qa(
    question="¿Cuántos parámetros tiene GPT-3?",
    context="GPT-3 es un modelo de lenguaje creado por OpenAI con 175 mil millones de parámetros, entrenado en 2020 sobre una gran cantidad de texto de internet."
)
print(respuesta)
salida real{'score': 0.9876, 'start': 65, 'end': 95, 'answer': '175 mil millones de parámetros'}

El modelo no "inventa" la respuesta — la extrae del texto de contexto que le diste (marcando el inicio y fin con start y end en el texto). Si la respuesta no está en el contexto, no puede responder correctamente.

Generación de texto

generador = pipeline("text-generation", model="gpt2")
resultado = generador(
    "The future of artificial intelligence",
    max_new_tokens=40,   # cuántas palabras nuevas generar como máximo
    num_return_sequences=1
)
print(resultado[0]["generated_text"])
salida realThe future of artificial intelligence depends on the development of systems that can handle complex tasks, understand context and nuance, and work collaboratively with humans to solve real-world problems.

max_new_tokens=40 limita cuántos tokens se generan a partir del prompt inicial. El resultado puede variar porque hay aleatoriedad en la generación (cada vez que lo corres puede dar un texto diferente).

5. Elegir el modelo que quieres (no el predeterminado)

Cuando usas pipeline("text-classification") sin especificar modelo, HuggingFace elige uno predeterminado. Pero puedes elegir exactamente cuál quieres — pasando el nombre:

# Usar un modelo específico de sentimiento en español
clf_es = pipeline(
    "text-classification",
    model="lxyuan/distilbert-base-multilingual-cased-sentiments-student"
)
print(clf_es("Me encanta este curso, lo recomiendo"))

# Usar un modelo de resumen en inglés
resumen = pipeline("summarization", model="facebook/bart-large-cnn")
texto_largo = """
Artificial intelligence has transformed many industries in recent years.
From healthcare diagnostics to autonomous vehicles, AI systems are now
capable of performing tasks that previously required human intelligence.
However, challenges remain in areas such as bias, interpretability, and
the energy consumption of large models.
"""
print(resumen(texto_largo, max_length=50, min_length=20))
salida real[{'label': 'positive', 'score': 0.9827}] [{'summary_text': 'AI has transformed many industries. From healthcare to autonomous vehicles, AI systems perform tasks that required human intelligence. Challenges remain in bias, interpretability and energy.'}]
✍️ Parámetros clave de pipeline() que usarás frecuentemente
pipeline(
  "text-classification",      # ← la tarea (obligatorio)
  model="ruta/nombre",        # ← modelo específico (opcional, usa default si no)
  device=0,                   # ← 0 = primera GPU, -1 = CPU (default)
  batch_size=16,              # ← cuántos textos procesar a la vez (más rápido con lotes)
  truncation=True,            # ← cortar textos demasiado largos (True = sí)
  max_length=512,             # ← longitud máxima de entrada en tokens
)

🎮 Pruébalo: simula distintas tareas de pipeline()

Elige una tarea, escribe un texto y mira cómo respondería el pipeline correspondiente:

7. Lo que aprendiste

Lo que aprendiste hoy: la inferencia es usar una red neuronal sin modificar sus pesos — solo leer y predecir. pipeline() envuelve los 3 pasos (tokenizar + modelo + interpretar) en una sola llamada. Soporta decenas de tareas: clasificación, NER, preguntas y respuestas, resumen, traducción, generación. Puedes elegir el modelo específico pasando su nombre de HuggingFace. Usa with torch.no_grad(): para la inferencia — le dice a PyTorch que no guarde gradientes, ahorrando memoria.

En la próxima lección vemos en detalle cómo funcionan los tokenizers modernos reales — los que usan GPT y LLaMA — y qué es la attention mask que siempre aparece en los outputs.