{
 "nbformat": 4,
 "nbformat_minor": 4,
 "metadata": {
  "colab": {
   "name": "transformers_hf.ipynb",
   "provenance": []
  },
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "name": "python"
  }
 },
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {"id": "intro"},
   "source": [
    "# Transformers con Hugging Face\n",
    "\n",
    "Este notebook recorre los conceptos básicos de los modelos Transformer y muestra cómo usarlos con la librería `transformers`: desde un pipeline de una sola línea hasta cargar un tokenizer y un modelo a bajo nivel."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {"id": "arquitectura"},
   "source": [
    "## ¿Qué es un Transformer?\n",
    "\n",
    "Un Transformer es una arquitectura de red neuronal que procesa secuencias (texto, audio, imágenes en forma de parches) usando **atención**: cada elemento de la entrada puede \"mirar\" a todos los demás a la vez para decidir qué información es relevante.\n",
    "\n",
    "Según cómo se combinan sus bloques, se suelen agrupar en tres familias:\n",
    "\n",
    "- **Encoder** (entiende el texto, p. ej. BERT).\n",
    "- **Decoder** (genera texto, p. ej. GPT-2).\n",
    "- **Encoder-decoder** (transforma una secuencia en otra, p. ej. T5)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {"id": "instalacion"},
   "source": [
    "## Instalación\n",
    "\n",
    "En Colab, instala las librerías una sola vez por sesión."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {"id": "celda-instalacion"},
   "outputs": [],
   "source": [
    "!pip install -q transformers torch"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {"id": "pipelines"},
   "source": [
    "## Pipelines\n",
    "\n",
    "`pipeline` es la forma más rápida de usar un modelo: descarga el modelo y su tokenizer por defecto, y los envuelve en una función lista para usar."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {"id": "celda-pipeline"},
   "outputs": [],
   "source": [
    "from transformers import pipeline\n",
    "\n",
    "# Modelo por defecto para análisis de sentimiento\n",
    "clasificador = pipeline(\"sentiment-analysis\")\n",
    "clasificador(\"I love learning about transformers\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {"id": "zero-shot"},
   "source": [
    "## Clasificación zero-shot\n",
    "\n",
    "Con un modelo de *natural language inference* puedes clasificar texto en etiquetas que tú defines, sin entrenar nada adicional."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {"id": "celda-zero-shot"},
   "outputs": [],
   "source": [
    "from transformers import pipeline\n",
    "\n",
    "clasificador_zs = pipeline(\"zero-shot-classification\", model=\"facebook/bart-large-mnli\")\n",
    "\n",
    "clasificador_zs(\n",
    "    \"El equipo ganó el campeonato anoche\",\n",
    "    candidate_labels=[\"deportes\", \"política\", \"tecnología\"],\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {"id": "generacion"},
   "source": [
    "## Generación de texto\n",
    "\n",
    "Los modelos decoder predicen el siguiente token una y otra vez. Con `set_seed` los resultados son reproducibles."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {"id": "celda-generacion"},
   "outputs": [],
   "source": [
    "from transformers import pipeline, set_seed\n",
    "\n",
    "generador = pipeline(\"text-generation\", model=\"gpt2\")\n",
    "set_seed(42)\n",
    "\n",
    "generador(\"Hugging Face makes it easy to\", max_new_tokens=25)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {"id": "tokenizers"},
   "source": [
    "## Tokenizers y modelos\n",
    "\n",
    "Por debajo de cada pipeline hay dos piezas: un **tokenizer** que convierte texto en IDs numéricos, y el **modelo** que procesa esos IDs. Aquí las usamos directamente."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {"id": "celda-tokenizer"},
   "outputs": [],
   "source": [
    "from transformers import AutoTokenizer, AutoModelForSequenceClassification\n",
    "import torch\n",
    "\n",
    "nombre = \"distilbert-base-uncased-finetuned-sst-2-english\"\n",
    "tokenizer = AutoTokenizer.from_pretrained(nombre)\n",
    "modelo = AutoModelForSequenceClassification.from_pretrained(nombre)\n",
    "\n",
    "entradas = tokenizer(\"Transformers are amazing!\", return_tensors=\"pt\")\n",
    "print(entradas[\"input_ids\"])\n",
    "\n",
    "with torch.no_grad():\n",
    "    logits = modelo(**entradas).logits\n",
    "\n",
    "print(modelo.config.id2label, torch.softmax(logits, dim=-1))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {"id": "modelos"},
   "source": [
    "## Explorar modelos\n",
    "\n",
    "Algunos modelos populares del Hub de Hugging Face, agrupados por arquitectura. Cada identificador se puede buscar en https://huggingface.co/models.\n",
    "\n",
    "- **Encoder:** `bert-base-uncased`, `roberta-base`, `distilbert-base-uncased-finetuned-sst-2-english`.\n",
    "- **Decoder:** `gpt2`, `Qwen/Qwen2.5-0.5B`.\n",
    "- **Encoder-decoder:** `t5-small`, `facebook/bart-large-cnn`.\n",
    "- **Visión:** `google/vit-base-patch16-224`.\n",
    "- **Audio:** `openai/whisper-small`."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {"id": "siguientes"},
   "source": [
    "## Siguientes pasos\n",
    "\n",
    "- Prueba otros pipelines: `\"summarization\"`, `\"translation\"`, `\"automatic-speech-recognition\"`.\n",
    "- Revisa la documentación de `transformers` y el curso gratuito de Hugging Face.\n",
    "- Para entrenar o ajustar un modelo, usa la librería `datasets` y `Trainer`."
   ]
  }
 ]
}
