Concepto clave
Los embeddings son representaciones vectoriales de datos (texto, imágenes, audio) que capturan su significado semántico en un espacio multidimensional. Imagina que cada palabra o documento es un punto en un mapa, donde palabras similares (como "perro" y "can") están cerca, y palabras diferentes (como "perro" y "computadora") están lejos. En sistemas RAG, los embeddings convierten consultas y documentos en vectores para buscar información relevante.
La similitud vectorial mide cuán cercanos están dos vectores en este espacio. Métricas como cosine similarity (similitud del coseno) calculan el ángulo entre vectores: un valor de 1 indica vectores idénticos, 0 vectores ortogonales (sin relación), y -1 vectores opuestos. En la práctica, esto permite encontrar documentos relevantes para una consulta sin coincidencias exactas de palabras.
"Los embeddings transforman el lenguaje humano en matemáticas que las máquinas pueden comparar."
Cómo funciona en la práctica
Veamos un ejemplo paso a paso para buscar documentos en una base de datos vectorial:
- Generar embeddings: Usa un modelo como Sentence-BERT para convertir documentos y consultas en vectores de 384 dimensiones.
- Almacenar vectores: Inserta los vectores de documentos en Chroma, Pinecone o pgvector con metadatos (ej., título, fuente).
- Consultar: Convierte la pregunta del usuario en un vector y busca los k vecinos más cercanos usando cosine similarity.
- Recuperar: Devuelve los documentos originales asociados a los vectores más similares.
Ejemplo con datos:
| Documento | Embedding (primeras 3 dimensiones) | Similitud con consulta |
|---|---|---|
| "Python es un lenguaje de programación" | [0.2, -0.1, 0.5] | 0.85 |
| "Java se usa para aplicaciones empresariales" | [-0.3, 0.4, 0.1] | 0.45 |
| "Programar en Python es fácil" | [0.25, -0.05, 0.55] | 0.92 |
La consulta "¿Cómo aprender Python?" tiene embedding [0.22, -0.08, 0.52] y mayor similitud con el tercer documento.
Caso de estudio
Una empresa de e-commerce implementa un sistema RAG para responder preguntas sobre productos. Usan pgvector con PostgreSQL para almacenar embeddings de descripciones de 10,000 productos. Cuando un usuario pregunta "¿Qué laptop tiene mejor batería?":
- El sistema genera un embedding de la consulta con el modelo all-MiniLM-L6-v2.
- Ejecuta una consulta SQL en pgvector:
SELECT product_id, description FROM products ORDER BY embedding <=> query_embedding LIMIT 5(<=> calcula distancia). - Recupera las 5 descripciones más similares, como "Laptop X con batería de 12 horas".
- Un modelo LLM como GPT-4 sintetiza una respuesta natural: "La Laptop X ofrece hasta 12 horas de batería, según nuestras descripciones."
Resultado: Respuestas precisas sin necesidad de etiquetar manualmente cada producto.
Errores comunes
- Usar embeddings de baja dimensión: Modelos con menos de 100 dimensiones pueden perder matices. Solución: Emplea modelos modernos como OpenAI text-embedding-3-large (3072 dimensiones) o ajusta según tu caso.
- Ignorar normalización: No normalizar vectores antes de calcular similitud lleva a resultados inconsistentes. Solución: Siempre normaliza a longitud 1 para cosine similarity.
- No indexar vectores eficientemente: Buscar en vectores sin índices (como HNSW en Pinecone) es lento con millones de documentos. Solución: Configura índices apropiados en tu base de datos vectorial.
- Olvidar metadatos: Almacenar solo vectores sin metadatos (ej., ID, fecha) impide filtrar resultados. Solución: Incluye metadatos clave en cada vector.
- Asumir que más dimensiones siempre es mejor: Dimensiones excesivas aumentan costo y ruido. Solución: Prueba con 384-768 dimensiones para texto y evalúa rendimiento.
Checklist de dominio
- Puedo explicar qué es un embedding y cómo representa significado semántico.
- Sé calcular similitud vectorial usando cosine similarity en código (ej., Python con numpy).
- He generado embeddings para al menos 100 documentos usando un modelo como Sentence-BERT o OpenAI.
- Puedo configurar una base de datos vectorial (Chroma, Pinecone o pgvector) para almacenar y consultar embeddings.
- Entiendo cómo la elección de modelo de embeddings afecta la precisión de recuperación en RAG.
- Sé normalizar vectores y aplicar métricas de distancia apropiadas (cosine, euclidiana).
- Puedo integrar embeddings en un flujo de trabajo RAG completo, desde ingesta hasta respuesta.
Implementa una búsqueda semántica con embeddings en Python
En este ejercicio, crearás un sistema básico de búsqueda semántica usando embeddings y similitud vectorial. Sigue estos pasos:
- Prepara los datos: Crea una lista de 5-10 documentos cortos (ej., frases sobre tecnología) en un archivo
documents.txt. - Genera embeddings: Usa la biblioteca
sentence-transformersen Python para cargar el modeloall-MiniLM-L6-v2y convertir cada documento en un vector de 384 dimensiones. Almacena los embeddings en una lista. - Calcula similitud: Escribe una función que tome una consulta de usuario, genere su embedding, y calcule la similitud del coseno con cada documento usando
numpyoscipy. Fórmula:cosine_similarity(A, B) = dot(A, B) / (norm(A) * norm(B)). - Recupera resultados: Ordena los documentos por similitud (de mayor a menor) y muestra los 3 más relevantes con sus puntajes.
- Prueba el sistema: Ejecuta consultas como "lenguaje de programación" y verifica que devuelva documentos relacionados (ej., sobre Python o Java).
Entrega un script Python funcional con comentarios explicando cada paso.
Pistas- Recuerda instalar las bibliotecas necesarias:
pip install sentence-transformers numpy. - Normaliza los vectores antes de calcular similitud para mayor precisión.
- Usa
model.encode()para generar embeddings de texto.
Evalua tu comprension
Completa el quiz interactivo de arriba para ganar XP.