Saltar al contenido principal
Volver a todos los artículos
Búsqueda Semántica5 min de lectura

Deja de Buscar por Keywords: Búsqueda Semántica con Embeddings, Fácil y Barato

Descubre cómo los embeddings pueden transformar la búsqueda en tu aplicación. Aprende a implementar una búsqueda semántica potente que realmente entiende la intención del usuario, sin gastar una fortuna.

Como desarrollador y fundador, he pasado incontables horas frustrado con la búsqueda en mis propias aplicaciones. Sabes a qué me refiero: esa barra de búsqueda que solo funciona si el usuario escribe la palabra exacta. Si buscan "portátil para jugar" y tú lo tienes como "laptop gamer", mala suerte. Es una experiencia rota que nos hace perder usuarios y ventas.

Durante años, la solución era compleja y cara: motores de búsqueda como Elasticsearch o Algolia, que son geniales, pero requieren configuración, mantenimiento y un presupuesto considerable. Pero eso ha cambiado. Hoy te voy a contar el "secreto" que las grandes tecnológicas usaban y que ahora está a nuestro alcance: los embeddings.

¿Qué diablos son los Embeddings y por qué deberían importarte?

Olvida las definiciones académicas. Piensa en los embeddings como coordenadas GPS para el significado. Son una forma de convertir cualquier pieza de texto (una palabra, una frase, un documento entero) en una lista de números (un vector).

La magia está en que los textos con significados similares terminan con "coordenadas" muy cercanas en un espacio matemático imaginario. Así, la frase "coche rápido y deportivo" estará muy cerca de "automóvil de alta velocidad", pero muy lejos de "receta de pastel de chocolate".

Esto nos permite hacer algo que la búsqueda por palabra clave no puede: buscar por intención y significado, no por coincidencia de caracteres.

Manos a la Obra: Construyendo tu Búsqueda Semántica en 3 Pasos

Aquí no hay teoría vacía. Te mostraré el plan de acción exacto para implementarlo. Es sorprendentemente sencillo.

Paso 1: Generar los Embeddings

Primero, necesitas convertir tu contenido (descripciones de productos, artículos de blog, lo que sea que quieras que se pueda buscar) en estos vectores numéricos.

Mi recomendación para empezar es usar la API de OpenAI. Su modelo `text-embedding-3-small` es increíblemente bueno y ridículamente barato. Cuesta $0.02 por cada millón de tokens. Sí, has leído bien.

El proceso es simple:

1. Elige tu contenido: Por ejemplo, todos los nombres y descripciones de tus productos. 2. Llama a la API: Envías cada texto al modelo de embeddings. 3. Guarda el vector: La API te devuelve un vector (una lista de números) para cada texto. Debes guardar este vector junto a la referencia de tu producto (su ID).

Así se ve en Python, es casi trivial:


from openai import OpenAI

client = OpenAI() # Asume que tienes tu API key configurada como variable de entorno

def get_embedding(text, model="text-embedding-3-small"): text = text.replace("\n", " ") response = client.embeddings.create(input = [text], model=model) return response.data[0].embedding

print(f"Vector generado de {len(vector_producto)} dimensiones.") # Deberías guardar este 'vector_producto' en tu base de datos ```

Paso 2: Almacenar los Vectores

No puedes simplemente tirar estos vectores en una columna `TEXT` de tu base de datos relacional y esperar que funcione. Para comparar la "cercanía" entre vectores de manera eficiente, necesitas una base de datos de vectores.

Aquí tienes varias opciones, de más fácil a más complejo:

* pgvector (Mi favorita): Si ya usas PostgreSQL, esta es una extensión gratuita que añade soporte para vectores. Es la forma más rápida y barata de empezar, porque se integra con tu base de datos existente. Creas una columna de tipo `vector` y listo. * Bases de datos de vectores dedicadas: Servicios como Pinecone, Weaviate o ChromaDB están optimizados para esto. Son increíblemente potentes y escalables, pero introducen otra pieza en tu infraestructura. Chroma es una buena opción open-source para empezar.

Para el 90% de los casos, `pgvector` es más que suficiente y te evita dolores de cabeza.

Paso 3: Realizar la Búsqueda

Aquí es donde ocurre la magia:

1. El usuario escribe una consulta: Por ejemplo, "un ordenador para trabajar desde casa que sea rápido". 2. Generas el embedding de la consulta: Usas la misma función del Paso 1 para convertir la búsqueda del usuario en un vector. 3. Buscas en tu base de datos de vectores: Le pides a tu base de datos (por ejemplo, a `pgvector`) que te devuelva los 10 vectores de productos más "cercanos" al vector de la consulta. La operación matemática que se usa se llama "similitud de coseno".

En SQL con `pgvector`, la consulta se vería algo así:


-- Supongamos que :query_vector es el vector que generaste
-- a partir de la búsqueda del usuario.

SELECT product_id, product_name, 1 - (embedding <=> :query_vector) AS similarity FROM products ORDER BY similarity DESC LIMIT 10; ```

El operador `<=>` calcula la distancia del coseno. ¡Y ya está! Acabas de realizar una búsqueda semántica.

¿Por qué esto es un cambio de juego?

* Es barato: El coste de generar embeddings con OpenAI es marginal. `pgvector` es gratis. El coste de infraestructura es casi nulo si ya usas Postgres. * Mejora brutalmente la experiencia de usuario: Los usuarios encuentran lo que quieren, incluso si no usan las palabras exactas. Esto se traduce en mayor engagement, más conversiones y clientes más felices. * Es accesible: Ya no necesitas un equipo de data scientists. Con unas pocas llamadas a una API y una extensión de base de datos, puedes tener una funcionalidad que hasta hace poco era exclusiva de Google o Amazon.

No te quedes atrás

La IA no es solo sobre chatbots y generación de imágenes. Herramientas como los embeddings nos dan superpoderes prácticos que podemos integrar en nuestros productos *hoy*.

Deja de pelearte con sentencias `LIKE` y empieza a experimentar. Te garantizo que una vez que pruebes la búsqueda semántica, no querrás volver atrás. Es una de las mejoras con mayor retorno de inversión que puedes hacer en tu aplicación ahora mismo.

Escrito por Samuel Moreno

Socio y Desarrollador en Sinergia Barcelona.