Introducción a la búsqueda de similitud vectorial
En los tutoriales anteriores, echamos un vistazo a los datos no estructurados, las bases de datos vectoriales y Milvus, la base de datos vectorial de código abierto más popular del mundo utilizada para la búsqueda por similitud. También abordamos brevemente la idea de los embeddings, vectores de alta dimensión que sirven como representaciones semánticas excelentes de los datos no estructurados. Una nota clave para recordar: los embeddings y las representaciones vectoriales que están "cerca" entre sí representan piezas de datos semánticamente similares.
En esta introducción a la búsqueda vectorial (también conocida como búsqueda por similitud), definiremos qué es y responderemos algunas preguntas fundamentales al respecto. Luego, ampliaremos ese conocimiento revisando un ejemplo de embedding de palabras y viendo cómo las piezas de datos no estructurados semánticamente similares están "cerca" unas de otras, mientras que las piezas de datos no estructurados disímiles están "lejos" unas de otras. Esto nos llevará a una descripción general de alto nivel de la búsqueda de vecinos más cercanos, un problema computacional que implica encontrar el/los vector(es) más cercano(s) a un vector de consulta basándose en una métrica de distancia unificada. Revisaremos algunos métodos conocidos (algoritmos de búsqueda por similitud vectorial) para la búsqueda de vecinos más cercanos (incluido mi favorito: ANNOY), además de las métricas de distancia comúnmente utilizadas.
Vamos a sumergirnos.
¿Qué es la búsqueda vectorial o búsqueda por similitud vectorial?
La búsqueda vectorial, también conocida como búsqueda por similitud vectorial, búsqueda de vecinos más cercanos o búsqueda semántica, es una técnica utilizada en sistemas de recuperación de datos y recuperación de información para encontrar elementos o puntos de datos que sean similares o estén estrechamente relacionados con un vector de consulta dado. A diferencia de la búsqueda tradicional por palabras clave, que coincide con palabras o frases exactas, la búsqueda semántica entiende la intención y el significado contextual detrás de una consulta, lo que le permite devolver resultados más relevantes incluso cuando las palabras clave exactas no están presentes en el contenido. En la búsqueda vectorial, representamos puntos de datos, como imágenes, textos y audio, como vectores en un espacio de alta dimensión. El objetivo de la búsqueda vectorial es buscar y recuperar de manera eficiente los vectores más relevantes que sean similares o más cercanos a un vector de consulta.
Normalmente, las métricas de distancia como la distancia euclidiana o la similitud del coseno miden la similitud entre vectores. La proximidad del vector en el espacio vectorial determina cuán similar es. Para organizar y mostrar eficientemente los resultados de búsqueda de vectores, los algoritmos de búsqueda vectorial utilizan estructuras de indexación como estructuras basadas en árboles o técnicas de hashing.
La búsqueda vectorial es fundamental para las bases de datos vectoriales y tiene diversas aplicaciones, incluidos sistemas de recomendación, recuperación de imágenes y videos, procesamiento del lenguaje natural, detección de anomalías y chatbots de preguntas y respuestas. El uso de la búsqueda semántica permite encontrar elementos, patrones o relaciones relevantes dentro de datos de alta dimensión, lo que posibilita una recuperación de información más precisa y eficiente.
La búsqueda vectorial es un método poderoso para analizar y recuperar información de espacios de alta dimensión. Permite a los usuarios encontrar elementos similares o estrechamente relacionados con una consulta dada, lo que la hace crucial en diversos dominios. Estos son los beneficios de la búsqueda vectorial:
Recuperación basada en similitud— La búsqueda semántica permite la recuperación basada en similitud, lo que posibilita a los usuarios encontrar elementos similares o estrechamente relacionados con una consulta dada. La recuperación basada en similitud es crucial en diversos dominios, como los sistemas de recomendación, donde los usuarios esperan recomendaciones personalizadas basadas en sus preferencias o similitudes con otros usuarios.
Análisis de datos de alta dimensionalidad — Con la creciente disponibilidad de datos de alta dimensionalidad, como imágenes, audio y datos textuales, los métodos de búsqueda tradicionales se vuelven menos efectivos. La búsqueda vectorial proporciona una forma poderosa de analizar y recuperar información de espacios de alta dimensionalidad, lo que permite una exploración de datos más precisa y eficiente.
Búsqueda de vecinos más cercanos — Los algoritmos eficientes de búsqueda de vecinos más cercanos encuentran los vecinos más cercanos a un vector de consulta determinado. La búsqueda de vecinos más cercanos es útil para tareas críticas como la búsqueda de similitud de imágenes o documentos, la recuperación basada en contenido o la detección de anomalías que requieren encontrar las coincidencias más cercanas o elementos similares.
Experiencia de usuario mejorada— Al aprovechar la búsqueda semántica, las aplicaciones pueden proporcionar a los usuarios resultados más relevantes y personalizados. Ya sea entregando recomendaciones relevantes, recuperando imágenes visualmente similares o encontrando documentos con contenido similar, la búsqueda vectorial mejora la experiencia general del usuario al proporcionar resultados más específicos y significativos.
Escalabilidad — Los algoritmos de búsqueda vectorial y las estructuras de indexación manejan de manera eficiente conjuntos de datos a gran escala y espacios de alta dimensionalidad. Permiten operaciones rápidas de búsqueda y recuperación, lo que hace viable realizar consultas basadas en similitud en tiempo real, incluso en conjuntos de datos masivos.
¿Cómo funciona un motor de búsqueda vectorial?
Con la popularidad de la IA y los LLMs, cada herramienta para desarrolladores, motor de búsqueda y base de datos está añadiendo capacidades de búsqueda vectorial a su conjunto de funciones, y debido a esto, el término motor vectorial y motores de búsqueda vectorial se usan a menudo indistintamente con bases de datos vectoriales. Los motores de búsqueda vectorial realizarán una búsqueda semántica vectorial (a veces denominada búsqueda vectorial). La búsqueda vectorial es una técnica para encontrar elementos o puntos de datos similares en un conjunto de datos en función de su representación como vectores en un espacio de alta dimensionalidad. Cada elemento se asigna a un punto en este espacio, y cada dimensión del vector representa una característica específica. El proceso de búsqueda vectorial implica indexación, consulta, clasificación y recuperación.
Para realizar una búsqueda vectorial, primero representas tus elementos de datos como vectores, utilizando técnicas como Word2Vec o para datos de texto. Una estructura de datos de índice almacena eficientemente estos vectores para una recuperación rápida, utilizando métodos como árboles KD o tablas hash. Cuando un usuario envía un elemento de consulta, se convierte en una representación vectorial, se compara con los vectores indexados utilizando métricas de similitud como la similitud del coseno o la distancia euclidiana, y se recuperan y clasifican los elementos más similares.
Casos de uso de la búsqueda vectorial
- Búsqueda de similitud de imágenes, video y audio
- Descubrimiento de fármacos con IA
- Motor de búsqueda semántica
- Clasificación de secuencias de ADN
- Sistema de respuesta a preguntas
- Sistema de recomendación
- Detección de anomalías
- Generación aumentada por recuperación (RAG)
Ahora que hemos cubierto los conceptos básicos de la búsqueda vectorial, veamos los detalles más técnicos observando un ejemplo de incrustación de palabras y terminemos con una visión general de alto nivel de la búsqueda de vecinos más cercanos.
Comparación de incrustaciones
Una vez que los usuarios deciden que quieren embarcarse en la creación de búsqueda vectorial en su solución, la siguiente pregunta que suelen hacer es “¿Qué modelo de aprendizaje automático debo usar para crear incrustaciones vectoriales.” Antes de poder elegir un modelo, es importante entender las incrustaciones vectoriales comparando algunos ejemplos. Veamos un par de ejemplos de incrustaciones de palabras. Para simplificar, usaremos word2vec, un modelo antiguo que utiliza una metodología de entrenamiento basada en skipgrams. BERT y otros modelos modernos basados en transformers podrán proporcionarte incrustaciones de palabras más contextualizadas, pero nos quedaremos con word2vec por simplicidad. Jay Alammar proporciona un excelente tutorial sobre word2vec, si estás interesado en usar modelos de aprendizaje automático un poco más.
Algo de preparación
Antes de comenzar, necesitaremos instalar la biblioteca gensim y cargar un modelo word2vec.
% pip install gensim --disable-pip-version-check
% wget https://s3.amazonaws.com/dl4j-distribution/GoogleNews-vectors-negative300.bin.gz
% gunzip GoogleNews-vectors-negative300.bin
Requirement already satisfied: gensim in /Users/fzliu/.pyenv/lib/python3.8/site-packages (4.1.2)
Requirement already satisfied: smart-open>=1.8.1 in /Users/fzliu/.pyenv/lib/python3.8/site-packages (from gensim) (5.2.1)
Requirement already satisfied: numpy>=1.17.0 in /Users/fzliu/.pyenv/lib/python3.8/site-packages (from gensim) (1.19.5)
Requirement already satisfied: scipy>=0.18.1 in /Users/fzliu/.pyenv/lib/python3.8/site-packages (from gensim) (1.7.3)
--2022-02-22 00:30:34-- https://s3.amazonaws.com/dl4j-distribution/GoogleNews-vectors-negative300.bin.gz
Resolving s3.amazonaws.com (s3.amazonaws.com)... 52.216.20.165
Connecting to s3.amazonaws.com (s3.amazonaws.com)|52.216.20.165|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1647046227 (1.5G) [application/x-gzip]
Saving to: GoogleNews-vectors-negative300.bin.gz
GoogleNews-vectors- 100%[===================>] 1.53G 2.66MB/s in 11m 23s
2022-02-22 00:41:57 (2.30 MB/s) - GoogleNews-vectors-negative300.bin.gz saved [1647046227/1647046227]
gunzip: GoogleNews-vectors-negative300.bin: unknown suffix -- ignored
Ahora que hemos hecho todo el trabajo de preparación necesario para generar incrustaciones de palabras a vectores, carguemos el modelo word2vec entrenado.
>>> from gensim.models import KeyedVectors
>>> model = KeyedVectors.load_word2vec_format('GoogleNews-vectors-negative300.bin', binary=True)
Ejemplo 0: Marlon Brando
Echemos un vistazo a cómo word2vec interpreta al famoso actor Marlon Brando.
>>> print(model.most_similar(positive=['Marlon_Brando']))
[('Brando', 0.757453978061676), ('Humphrey_Bogart', 0.6143958568572998), ('actor_Marlon_Brando', 0.6016287207603455), ('Al_Pacino', 0.5675410032272339), ('Elia_Kazan', 0.5594002604484558), ('Steve_McQueen', 0.5539456605911255), ('Marilyn_Monroe', 0.5512186884880066), ('Jack_Nicholson', 0.5440199375152588), ('Shelley_Winters', 0.5432392954826355), ('Apocalypse_Now', 0.5306933522224426)]
Marlon Brando trabajó con Al Pacino en El padrino y con Elia Kazan en Un tranvía llamado Deseo. También protagonizó Apocalypse Now.
Ejemplo 1: Si todos los reyes tuvieran a sus reinas en el trono
Los vectores pueden sumarse y restarse entre sí para demostrar cambios semánticos subyacentes.
>>> print(model.most_similar(positive=['king', 'woman'], negative=['man'], topn=1))
[('queen', 0.7118193507194519)]
¿Quién dice que los ingenieros no pueden disfrutar de un poco de dance-pop de vez en cuando?
Ejemplo 2: Apple, la empresa, la fruta, ... ¿o ambas?
La palabra "apple" puede referirse tanto a la empresa como a la deliciosa fruta roja. En este ejemplo, podemos ver que Word2Vec conserva ambos significados.
>>> print(model.most_similar(positive=['samsung', 'iphone'], negative=['apple'], topn=1))
>>> print(model.most_similar(positive=['fruit'], topn=10)[9:])
[('droid_x', 0.6324754953384399)]
[('apple', 0.6410146951675415)]
"Droid" se refiere al primer smartphone 4G LTE de Samsung ("Samsung" + "iPhone" - "Apple" = "Droid"), mientras que "apple" es la 10.ª palabra más cercana a "fruit".
Estrategias de búsqueda vectorial
Ahora que hemos visto el poder de las incrustaciones vectoriales, echemos un breve vistazo a algunas de las formas en que podemos realizar búsquedas de vecinos más cercanos. Esta no es una lista exhaustiva; solo repasaremos brevemente algunos métodos comunes para proporcionar una visión general de alto nivel de cómo se realiza la búsqueda vectorial a escala. Ten en cuenta que algunos de estos métodos no son excluyentes entre sí: es posible, por ejemplo, usar cuantización junto con particionamiento del espacio.
(También analizaremos cada uno de estos métodos en detalle en futuros tutoriales, así que mantente atento para más.)
Búsqueda lineal
El algoritmo de búsqueda de vecinos más cercanos más simple, pero también el más ingenuo, es la clásica búsqueda lineal: calcular la distancia desde un vector de consulta hasta todos los demás vectores en la base de datos vectorial.
Por razones obvias, la búsqueda ingenua no funciona cuando se intenta escalar nuestra base de datos vectorial a decenas o cientos de millones de vectores. Pero cuando el número total de elementos en la base de datos es pequeño, esta puede ser en realidad la forma más eficiente de realizar una búsqueda vectorial, ya que no se requiere una estructura de datos separada para el índice, mientras que las inserciones y eliminaciones pueden implementarse con bastante facilidad.
Debido a la falta de complejidad espacial, así como a la sobrecarga de espacio constante asociada con la búsqueda ingenua, este método a menudo puede superar a la partición espacial incluso al consultar un número moderado de vectores.
Partición espacial
La partición espacial no es un único algoritmo, sino más bien una familia de algoritmos que utilizan todos el mismo concepto.
Los árboles k-dimensionales (kd-trees) son quizá los más conocidos de esta familia, y funcionan dividiendo continuamente el espacio de búsqueda (separando los vectores en grupos “izquierdo” y “derecho”) de manera similar a los árboles de búsqueda binaria.
El índice de archivo invertido (IVF) también es una forma de partición espacial, y funciona asignando cada vector a su centroide más cercano: las búsquedas se realizan entonces determinando primero el centroide más cercano del vector de consulta y realizando la búsqueda alrededor de él, reduciendo significativamente el número total de vectores que deben buscarse. IVF es una estrategia de indexación bastante popular y suele combinarse con otros algoritmos de indexación para mejorar el rendimiento.
Cuantización
La cuantización es una técnica para reducir el tamaño total de la base de datos reduciendo la precisión de los vectores.
La cuantización escalar (SQ), por ejemplo, funciona multiplicando vectores de punto flotante de alta precisión por un valor escalar y luego convirtiendo los elementos del vector resultante a sus enteros más cercanos. Esto no solo reduce el tamaño efectivo de toda la base de datos (por ejemplo, por un factor de ocho para la conversión de float64_t a int8_t), sino que también tiene el efecto secundario positivo de acelerar los cálculos de distancia vectorial entre vectores.
La cuantización de producto (PQ) es otra técnica de cuantización que funciona de manera similar a la compresión por diccionario. En PQ, todos los vectores se dividen en subvectores de igual tamaño, y cada subvector se reemplaza luego por un centroide.
Hierarchical Navigable Small Worlds (HNSW)
Hierarchical Navigable Small Worlds es un algoritmo de indexación y recuperación basado en grafos.
Esto funciona de manera diferente a la cuantización de producto: en lugar de mejorar la capacidad de búsqueda de la base de datos reduciendo su tamaño efectivo, HNSW crea un grafo multicapa a partir de los datos originales. Las capas superiores contienen solo "conexiones largas", mientras que las capas inferiores contienen solo "conexiones cortas" entre vectores en la base de datos (consulta la siguiente sección para obtener una descripción general de las métricas de distancia vectorial). Las conexiones individuales del grafo se crean al estilo de las skip lists.
Con esta arquitectura en funcionamiento, la búsqueda se vuelve bastante sencilla: recorremos de forma codiciosa el grafo superior (el que tiene las conexiones entre vectores más largas) en busca del vector más cercano a nuestro vector de consulta. Luego hacemos lo mismo para la segunda capa, utilizando el resultado de la búsqueda de la primera capa como punto de partida. Esto continúa hasta que completamos la búsqueda en la capa más inferior, cuyo resultado se convierte en el vecino más cercano del vector de consulta.
HNSW, visualizado. Fuente de la imagen: https://arxiv.org/abs/1603.09320
Approximate Nearest Neighbors Oh Yeah
Este es probablemente mi algoritmo ANN favorito simplemente por su nombre juguetón y poco intuitivo. Approximate Nearest Neighbors Oh Yeah (ANNOY) es un algoritmo basado en árboles popularizado por Spotify (se utiliza en su sistema de recomendación de música). A pesar del nombre extraño, el concepto subyacente detrás de ANNOY es en realidad bastante simple: árboles binarios.
ANNOY funciona seleccionando primero aleatoriamente dos vectores en la base de datos y bisecando el espacio de búsqueda a lo largo del hiperplano que separa esos dos vectores. Esto se hace iterativamente hasta que hay menos de algún parámetro predefinido NUM_MAX_ELEMS por nodo. Dado que el índice resultante es esencialmente un árbol binario, esto nos permite realizar nuestra búsqueda con una complejidad O(log n).
ANNOY, visualizado. Fuente de la imagen: https://github.com/spotify/annoy
Métricas de similitud comúnmente utilizadas
Las mejores bases de datos vectoriales son inútiles sin métricas de similitud: métodos para calcular la distancia entre dos vectores. Existen numerosas métricas, por lo que aquí discutiremos solo el subconjunto más comúnmente utilizado.
Métricas de similitud de vectores de punto flotante
Las métricas de similitud de vectores de punto flotante más comunes son, sin ningún orden en particular, distancia L1, distancia L2 y similitud coseno. Los dos primeros valores son métricas de distancia (valores más bajos implican mayor similitud, mientras que valores más altos implican menor similitud), mientras que la similitud coseno es una métrica de similitud (valores más altos implican mayor similitud).
La distancia L1 también se conoce comúnmente como distancia Manhattan, acertadamente llamada así por el hecho de que ir del punto A al punto B en Manhattan requiere moverse a lo largo de una de dos direcciones perpendiculares. La segunda ecuación, la distancia L2, es simplemente la distancia entre dos vectores en el espacio euclidiano. La tercera y última ecuación es la distancia coseno, equivalente al coseno del ángulo entre dos vectores. Observa que la ecuación de la similitud coseno resulta ser el producto punto entre versiones normalizadas de los vectores de entrada a y b.
Con un poco de matemáticas, también podemos mostrar que la distancia L2 y la similitud coseno son efectivamente equivalentes cuando se trata de la clasificación por similitud para vectores de norma unitaria:
Recuerda que los vectores de norma unitaria tienen una magnitud de 1:
Con esto, obtenemos:
Dado que tenemos vectores de norma unitaria, la distancia coseno resulta ser el producto punto entre a y b (el denominador en la ecuación 3 anterior resulta ser 1):
En esencia, para vectores de norma unitaria, ¡la distancia L2 y la similitud coseno son funcionalmente equivalentes! Recuerda siempre normalizar tus embeddings.
Métricas de similitud de vectores binarios
Los vectores binarios, como su nombre sugiere, no tienen métricas basadas en aritmética al estilo de los vectores de punto flotante. En cambio, las métricas de similitud para vectores binarios se basan en matemáticas de conjuntos, manipulación de bits o una combinación de ambas (está bien, yo también odio la matemática discreta). Aquí están las fórmulas de dos métricas de similitud de vectores binarios comúnmente utilizadas:
La primera ecuación se llama distancia de Tanimoto/Jaccard, y es esencialmente una medida de la cantidad de solapamiento entre dos vectores binarios. La segunda ecuación es la distancia de Hamming, y es un recuento del número de elementos vectoriales en a y b que difieren entre sí.
Lo más probable es que puedas ignorar con seguridad estas métricas de similitud, ya que la mayoría de las aplicaciones usan la similitud del coseno sobre embeddings de punto flotante.
Conclusión
En este tutorial, echamos un vistazo a la búsqueda vectorial, junto con algunos algoritmos comunes de búsqueda vectorial y métricas de distancia. Estas son algunas conclusiones clave:
Los vectores de embedding son representaciones potentes, tanto en términos de distancia entre los vectores como en términos de aritmética vectorial. Al aplicar una cantidad generosa de álgebra vectorial a los embeddings, podemos realizar análisis semántico escalable usando solo operadores matemáticos básicos.
La búsqueda vectorial semántica supera la limitación de la búsqueda por palabras clave al permitirte buscar en función del significado de tu consulta. Permite recuperar respuestas rápidamente mediante la realización de búsquedas vectoriales.
Hay una amplia variedad de algoritmos de búsqueda aproximada de vecinos más cercanos y/o tipos de índice para elegir. El más utilizado hoy en día es HNSW, pero un algoritmo de indexación diferente puede funcionar mejor para tu aplicación particular, dependiendo del número total de embeddings vectoriales que tengas además de la longitud de cada vector individual.
Las dos métricas de distancia principales que se usan hoy en día son la distancia L2/euclidiana y la distancia del coseno. Estas dos métricas, cuando se usan en embeddings normalizados, son funcionalmente equivalentes.
¡Gracias por acompañarnos en este tutorial! La búsqueda vectorial es una parte esencial de Milvus, y seguirá siéndolo. En futuros tutoriales, profundizaremos más en los algoritmos ANNS más utilizados: HNSW y ScaNN.
Echa otro vistazo a los cursos Vector Database 101
- Introducción a los datos no estructurados
- ¿Qué es una base de datos vectorial?
- Comparación de bases de datos vectoriales, bibliotecas de búsqueda vectorial y plugins de búsqueda vectorial
- Introducción a Milvus
- Inicio rápido de Milvus
- Introducción a la búsqueda de similitud vectorial
- Conceptos básicos de los índices vectoriales y el índice de archivo invertido
- Cuantización escalar y cuantización de producto
- Hierarchical Navigable Small Worlds (HNSW)
- Approximate Nearest Neighbors Oh Yeah (ANNOY)
- Cómo elegir el índice vectorial adecuado para tu proyecto
- DiskANN y el algoritmo Vamana
Sigue leyendo

Notion's Vector Search Is Excellent. Their Next Problem Is Harder.
Notion solved vector search scaling in two years. The next bottleneck — offline context engineering, unified data, and the real-time/offline gap — is harder.

Introducing Zilliz CLI and Agent Skills for Zilliz Cloud
Manage your vector database from your terminal or AI coding agent. Zilliz CLI and Agent Skills work with Claude Code, Cursor, Codex, and Copilot.

Creating Collections in Zilliz Cloud Just Got Way Easier
We've enhanced the entire collection creation experience to bring advanced capabilities directly into the interface, making it faster and easier to build production-ready schemas without switching tools.



