¡Última oportunidad! 50 % de descuento en todo
La oferta termina dentro de
Hasta hace poco, los ordenadores funcionaban como bibliotecarios eficientes pero literales. Si buscabas "batallas de robots gigantes", solo encontraban títulos con esas palabras exactas. Un ajuste perfecto como "Kaiju Mech Warfare" pasaría desapercibido. Los ordenadores reconocían palabras pero se perdían la música: les faltaban comprensión, matiz y contexto. Era la era de la búsqueda por palabras clave, nuestra mejor opción durante muchos años.
Luego llegó una revolución. Inspirándose en el cerebro humano, la inteligencia artificial desarrolló una nueva forma de aprender. En lugar de memorizar palabras, la IA empezó a comprender las relaciones entre ellas. Entiende que "rey" se relaciona con "hombre" igual que "reina" con "mujer". Reconoce que "feliz", "alegre" y "eufórico" comparten un territorio emocional, mientras que "sombrío" vive en un mundo completamente distinto.
¿Cómo lo consiguió la IA? Creando un mapa del significado.
Imagina una vasta galaxia multidimensional donde cada concepto—una palabra, una frase, una imagen, una canción—es una estrella. En esta galaxia, las estrellas con significados similares se agrupan, mientras que las no relacionadas están a años luz de distancia.
Un vector embedding no es más que la coordenada de una estrella en esta galaxia. Es una lista de números (p. ej., [0.12, -0.45, 0.89, ...]) que sitúa con precisión un concepto en este mapa del significado.
La búsqueda vectorial es la capacidad revolucionaria de navegar por este mapa. Cuando preguntas "una película sobre un niño huérfano que descubre que es mago", no buscamos esas palabras exactas. En su lugar:
Las estrellas más próximas representan los resultados semánticamente más similares. Así pasó la IA de ser una bibliotecaria literal a una sabia que entiende qué quieres decir de verdad.
Buscar por significado en lugar de por palabras clave impulsa aplicaciones modernas de IA en todos los sectores. Esta capacidad permite:
La búsqueda vectorial conecta la intención humana con los datos digitales, transformando de raíz cómo interactuamos con la información. Hace que los sistemas digitales se sientan menos mecánicos y más como colaboradores intuitivos.
¡Bienvenido a la nueva frontera de la búsqueda! MongoDB incorporó Vector Search en Atlas. Te permite almacenar y consultar embeddings vectoriales (de texto, imágenes o audio) directamente en MongoDB, sin necesidad de una base de datos vectorial aparte como Pinecone o Weaviate.
En este tutorial, crearemos un sencillo pero potente motor de recomendaciones de zapatillas usando Python y MongoDB Atlas. Aprenderás a convertir texto en representaciones numéricas con significado (vectores) y luego usar la Vector Search integrada de Atlas para encontrar productos con descripciones similares.
pip install pymongo sentence-transformers numpy




vectorDemoitems
items.{
"fields": [
{
"type": "vector",
"path": "embedding",
"numDimensions": 768,
"similarity": "cosine"
}
]
}
Nota: 768 es el tamaño del embedding que usaremos con el modelo de sentence-transformers.


Entendiendo la definición del índice:
"type": "vector": Indica a MongoDB Atlas que es un índice vectorial."path": "embedding": Señala el campo de nuestros documentos que contiene los vectores."numDimensions": 768: Debe coincidir con la dimensión de los vectores que genera nuestro modelo."similarity": "cosine": El algoritmo para medir la "cercanía" de los vectores. Es excelente para similitud basada en texto.Obtén tu cadena de conexión de MongoDB Atlas:
<username>, <password> y <cluster-url> en el fragmento siguiente.from pymongo import MongoClient
# Replace with your Atlas connection string
uri = "mongodb+srv://<username>:<password>@<cluster-url>/vectorDemo?retryWrites=true&w=majority"
client = MongoClient(uri)
db = client["vectorDemo"]
collection = db["items"]
print("Connected to MongoDB Atlas")
# Clear existing
collection.delete_many({})
print("Cleared collection.")
Usaremos SentenceTransformers para convertir texto en embeddings.
from sentence_transformers import SentenceTransformer
# Choose model: higher-quality for search -> "sentence-transformers/all-mpnet-base-v2" (768-d)
# If you need faster/smaller: "all-MiniLM-L6-v2" (384-d)
MODEL_NAME = "sentence-transformers/all-mpnet-base-v2"
# MODEL_NAME = "all-MiniLM-L6-v2"
# Note: if you use all-mpnet-base-v2, your Atlas vector index must use numDimensions: 768
# If you use all-MiniLM-L6-v2, index numDimensions: 384
model = SentenceTransformer(MODEL_NAME)
def embed_text(text: str):
return model.encode(text).tolist()
Vamos a guardar algunas descripciones de producto en MongoDB junto con sus embeddings.
# Each product includes name, description, list of features, use_cases and tags.
products = [
# Marathon / long-distance running (explicit!)
{
"name": "MarathonPro 3000",
"description": "Designed specifically for marathon and ultra distance running: maximum cushioning, breathable knit upper, responsive midsole and engineered heel support for long-run comfort.",
"features": ["marathon", "long-distance", "max cushioning", "breathable", "support"],
"category": "shoes",
"use_cases": ["marathon", "long-distance running", "road running"],
"tags": ["running", "endurance", "comfort"]
},
{
"name": "Enduro LongRun",
"description": "Lightweight long-run trainer optimized for marathon pacing with added cushioning, stable platform, and enhanced forefoot energy return for hours of comfortable running.",
"features": ["long-run", "lightweight", "energy return", "cushioning"],
"category": "shoes",
"use_cases": ["marathon", "road running"],
"tags": ["running","marathon","comfort"]
},
# Road running / neutral
{
"name": "Red Road Runner",
"description": "Neutral road running shoe for daily training: breathable mesh, moderate cushioning and responsive ride; suitable for tempo runs and long easy runs.",
"features": ["road running", "breathable", "moderate cushioning"],
"category": "shoes",
"use_cases": ["training", "road running", "tempo runs"],
"tags": ["running","training"]
},
# Trail running (explicit trail)
{
"name": "TrailMaster RidgeGrip",
"description": "Trail-running shoe with aggressive outsole, rock plate for protection, waterproof upper, designed for technical trails and rugged terrain.",
"features": ["trail", "high grip", "rock plate", "waterproof"],
"category": "shoes",
"use_cases": ["trail running", "hiking", "off-road"],
"tags": ["trail","outdoors"]
},
# Tennis & court
{
"name": "CourtPro Tennis",
"description": "Court shoe with lateral support, non-marking sole and reinforced toe; built for tennis footwork and short intense bursts, not for long-distance running.",
"features": ["court", "lateral support", "non-marking sole"],
"category": "shoes",
"use_cases": ["tennis","court sports"],
"tags": ["tennis","sport"]
},
# Formal
{
"name": "Oxford Leather Formal",
"description": "Classic leather formal shoe for office and events: polished leather, sturdy sole, refined silhouette.",
"features": ["formal", "leather", "office"],
"category": "shoes",
"use_cases": ["formal wear","office"],
"tags": ["formal","leather"]
},
# Hiking
{
"name": "Alpine Trek Boots",
"description": "High-ankle hiking boots with waterproof membrane, ankle support and durable lugged outsole for mountain treks.",
"features": ["hiking", "waterproof", "ankle support", "lugged outsole"],
"category": "shoes",
"use_cases": ["hiking","trekking","outdoor"],
"tags": ["outdoors","hiking"]
},
# Casual sneakers
{
"name": "Classic Canvas Sneaker",
"description": "Casual everyday canvas sneaker with rubber sole, comfortable fit for daily wear and walking.",
"features": ["casual","canvas", "everyday"],
"category": "shoes",
"use_cases": ["casual","walking"],
"tags": ["casual"]
},
# Cross-trainer
{
"name": "CrossFit Trainer",
"description": "Stable cross-trainer shoe engineered for gym workouts, short sprints, and lateral movements; flexible yet supportive.",
"features": ["cross-train","stable","gym"],
"category": "shoes",
"use_cases": ["gym","cross-training"],
"tags": ["training","gym"]
},
# Cleats
{
"name": "Pro Soccer Cleats",
"description": "Low-profile football/soccer cleats with studded outsole; optimized for grip on grass and agility.",
"features": ["cleats","studs","agility"],
"category": "shoes",
"use_cases": ["soccer","football"],
"tags": ["sports","cleats"]
}
]
# ---------- Create 'canonical_text' to improve embedding quality for better scoring ----------
for p in products:
# join features and others into one rich text blob
features = ", ".join(p["features"])
uses = ", ".join(p["use_cases"])
tags = ", ".join(p["tags"])
canonical = f"{p['name']}. {p['description']}. Features: {features}. Use cases: {uses}. Tags: {tags}."
p["canonical_text"] = canonical
# ---------- Embed canonical_text----------
print("Embedding items...")
for p in products:
p["embedding"] = embed_text(p["canonical_text"])
# ---------- Insert into MongoDB ----------
collection.insert_many(products)
Usando insert_many, realizamos una única operación de escritura en bloque eficiente en nuestra base de datos.
¡Es hora del último y más emocionante paso! Usaremos el framework de agregación de MongoDB y $vectorSearch—un operador para encontrar las mejores zapatillas según la consulta.
query_text = "25k long running best shoes"
query_embedding = embed_text(query_text)
pipeline = [
{
"$vectorSearch": {
"index": "vector_index", # Use the vector search index you created
"path": "embedding",
"queryVector": query_embedding,
"numCandidates": 100,
"limit": 3
}
},
{
"$project": {
"name": 1,
"description":1,
"score": {"$meta": "vectorSearchScore"}
}
}
]
results = collection.aggregate(pipeline)
print(f"\nSearch results for: '{query_text}'\n")
for r in results:
print(f"- {r['name']} (score: {r['score']:.4f})")
Destripando la canalización de $vectorSearch:
$vectorSearch: Es el operador central. Compara eficientemente nuestro queryVector con el campo indexado plot_embedding de todos los documentos.$project: Esta etapa reestructura la salida. Incluimos name y description, excluimos el ruidoso _id y otros campos, y lo más importante: añadimos un campo score usando $meta: "vectorSearchScore". Esta puntuación, de 0 a 1, indica cuán similar es el resultado a nuestra consulta.Si todo está bien configurado, verás algo como esto:
Search results for: '25k long running best shoes'
- MarathonPro 3000 (score: 0.7980)
- Red Road Runner (score: 0.7479)
- Enduro LongRun (score: 0.7389)
Observa que “MarathonPro 3000” aparece en primer lugar—exactamente lo esperado.
Enhorabuena. Has creado desde cero una aplicación de búsqueda vectorial. Has aprendido a conectarte a una base de datos, crear y validar datos, generar embeddings vectoriales y aprovechar la potencia de MongoDB Atlas para encontrar información de forma realmente inteligente. Bienvenido al futuro de la interacción con los datos.
En este tutorial has aprendido a:
Experimenta con diferentes métricas de similitud (dotProduct, euclidean).
canonical_text incluye características, casos de uso y etiquetas para aportar más contexto a los embeddings, ayudando al modelo a captar mejor la intención del usuario en la búsqueda vectorial.
all-mpnet-base-v2 (768 dim) ofrece representaciones semánticas más potentes para similitud solo de texto frente a modelos ligeros (384 dim). CLIP destaca en tareas multimodales pero es menos preciso para consultas de texto con matices.
¡Sí! MongoDB Atlas admite índices vectoriales con millones de documentos. Para un uso a gran escala, ajustar parámetros del índice (p. ej., numCandidates) y aplicar re-ranking solo a los top-N mantiene un rendimiento alto.
Puedes pasar a un modelo de embeddings multimodal (como CLIP o alternativas open source), normalizar los embeddings, almacenarlos de forma similar y usar la misma estrategia de búsqueda vectorial + re-ranking para búsqueda mixta.
Dimensiones mayores (p. ej., 512, 768, 1024, 2056) suelen capturar mejor la semántica, pero requieren más almacenamiento y cómputo. Usa modelos más pequeños (384) para velocidad o pruebas, y sube a 768 cuando la precisión importe.
Por supuesto. MongoDB Atlas te permite combinar una etapa $search usando consultas compound—mezclando filtros de texto completo BM25 con knnBeta o $vectorSearch—para experiencias híbridas ricas de búsqueda.

Ingeniero de software sénior en Uber
Top DataCamp Courses
Curso
Curso
Curso

Tutorial
Moez Ali
10 min
Tutorial
Nic Raboy

Tutorial
Kevin Babitz
8 min
Tutorial
Joleen Bothma
9 min
Tutorial
Abid Ali Awan
13 min
Tutorial
Abid Ali Awan
14 min