{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Tarea: Embeddings, Búsqueda Semántica y Self-Query\n", "\n", "**Universidad Galileo — IA para Aplicaciones del Mundo Real**\n", "**Unidad 10 · Embeddings y Búsqueda Semántica**\n", "\n", "## Qué vas a construir\n", "\n", "Un buscador sobre un catálogo de películas que entiende lo que le pides **aunque no uses sus\n", "palabras**, y que además sabe separar la parte semántica de la parte que es un filtro.\n", "\n", "Al terminar vas a tener medido, con tus propios números:\n", "\n", "1. qué le pasa al coseno con textos parecidos, **opuestos** y sin relación,\n", "2. si los grupos semánticos aparecen solos al proyectar a 2D,\n", "3. cómo se busca por vecinos más cercanos,\n", "4. por qué el orden entre filtrar y buscar **cambia el resultado**,\n", "5. y cómo un LLM parte una pregunta en `query` + `filtros`.\n", "\n", "## Lo que ya está hecho (no lo toques)\n", "\n", "- El catálogo de películas con su metadata\n", "- La carga del modelo de embeddings y del LLM\n", "- Todas las gráficas\n", "- El reporte final\n", "\n", "## Lo que tienes que implementar\n", "\n", "Seis bloques marcados con `# TU CODIGO AQUI`. Cada uno va seguido de una celda de verificación\n", "con `assert`: si pasa, puedes seguir.\n", "\n", "## Cómo se entrega\n", "\n", "*Entorno de ejecución → Reiniciar y ejecutar todo*, y que corra de principio a fin sin errores.\n", "Las **tres preguntas escritas** cuentan igual que el código: se responden en la celda de texto que\n", "está debajo de cada una, con los números que tú mediste.\n", "\n", "> **El catálogo está en inglés a propósito.** El modelo `all-MiniLM-L6-v2` es un modelo de inglés y\n", "> queremos medir el comportamiento del embedding, no pelear con el idioma. Tu código, tus comentarios\n", "> y tus respuestas van en español.\n", "\n", "---" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 0. Preparación (dado)" ] }, { "cell_type": "code", "execution_count": 1, "id": "e945d710", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/usr/local/lib/python3.12/dist-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", " from .autonotebook import tqdm as notebook_tqdm\n", "/usr/local/lib/python3.12/dist-packages/torch/cuda/__init__.py:1007: UserWarning: Can't initialize NVML\n", " raw_cnt = _raw_device_count_nvml()\n", "Warning: You are sending unauthenticated requests to the HF Hub. Please set a HF_TOKEN to enable higher rate limits and faster downloads.\n", "Loading weights: 100%|██████████| 103/103 [00:00<00:00, 22767.50it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "modelo cargado · 384 dimensiones\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/tmp/ipykernel_304/1546073338.py:16: FutureWarning: The `get_sentence_embedding_dimension` method has been renamed to `get_embedding_dimension`.\n", " print(\"modelo cargado ·\", modelo.get_sentence_embedding_dimension(), \"dimensiones\")\n" ] } ], "source": [ "try:\n", " import sentence_transformers, sklearn # noqa: F401\n", "except ImportError:\n", " %pip install -q sentence-transformers scikit-learn\n", "\n", "import json, re, textwrap\n", "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "from sentence_transformers import SentenceTransformer\n", "\n", "OKABE = [\"#0072B2\", \"#D55E00\", \"#009E73\", \"#CC79A7\", \"#E69F00\", \"#56B4E9\", \"#F0E442\"]\n", "np.random.seed(0)\n", "\n", "modelo = SentenceTransformer(\"all-MiniLM-L6-v2\")\n", "print(\"modelo cargado ·\", modelo.get_sentence_embedding_dimension(), \"dimensiones\")" ] }, { "cell_type": "code", "execution_count": 2, "id": "63e59a8e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "45 películas · 5 géneros\n", "genero\n", "science fiction 9\n", "horror 9\n", "comedy 9\n", "documentary 9\n", "drama 9\n" ] }, { "data": { "text/html": [ "
| \n", " | titulo | \n", "genero | \n", "anio | \n", "calificacion | \n", "duracion_min | \n", "idioma | \n", "sinopsis | \n", "
|---|---|---|---|---|---|---|---|
| 0 | \n", "Echoes of Tomorrow | \n", "science fiction | \n", "2019 | \n", "7.8 | \n", "124 | \n", "English | \n", "A physicist discovers that every choice she ma... | \n", "
| 1 | \n", "The Last Signal | \n", "science fiction | \n", "2021 | \n", "8.1 | \n", "138 | \n", "English | \n", "Astronauts receive a transmission from a probe... | \n", "
| 2 | \n", "Silicon Dawn | \n", "science fiction | \n", "2016 | \n", "6.9 | \n", "111 | \n", "English | \n", "An engineer realizes the assistant she built h... | \n", "