2026-07-30
La recuperación de información (IR) es la disciplina que estudia cómo encontrar información relevante en grandes colecciones de datos, ganado relevancia con la aparición de modelos de lenguaje y sistemas de Recuperación aumentada por generación (RAG).
La búsqueda por similitud es un problema algorítmico que esta detrás de la IR eficiente; a su vez, la búsqueda métrica es una formalización matemática que permite construir algoritmos de búsqueda robustos y escalables.
Imagen generada por Gemini AI (Google)
Imagen generada por Gemini AI (Google)
Tenemos un paquete sobre el tema llamado SimilaritySearch.jl que implementa los algoritmos de búsqueda por similitud y recuperación de información.
Espacios métricos como un marco de trabajo para búsqueda por similitud.
Búscar elementos similares ahora se convierte en elementos cercanos bajo una función de distancia métrica \(d(x, y)\).
Habitualmente se asume que la función de distancia cumple con las propiedades de un espacio métrico:
Dado un espacio métrico \((U, d)\), un subconjunto finito \(S \subset U\) y un punto de consulta \(q \in U\), queremos encontrar los elementos más cercanos a \(q\) en \(S\).
Para resolverlo de manera eficiente se preprocesa \(S\) de tal forma que \(q\in U\) sea evaluado de manera rápida y con un costo computacional bajo.
Dado un punto de consulta \(q\) y un radio \(r\), recuperar todos los objetos \(u\) tales que: \[d(q, u) \le r\]

Dado \(q\) y un entero \(k\), recuperar los \(k\) objetos más cercanos a \(q\) en el dataset.

Un pivote \(p\) es un elemento seleccionado del dataset para precalcular distancias a todos los demás elementos. Al recibir la consulta \(q\), medimos \(d(p, q)\).
Podemos evitar calcular la distancia real a un objeto \(x\) usando: \[|d(p, x) - d(p, q)| > r \implies x \notin B(q, r)\]

Al usar un conjunto de pivotes \(\{p_1, p_2, \dots, p_k\}\), cada uno define un anillo de búsqueda permitido. Un elemento \(x\) solo se evalúa si sobrevive a la regla de descarte para todos los pivotes:
\[\bigcap_{i=1}^k [d(p_i, q) - r, d(p_i, q) + r]\]


En el peor caso, los índices de búsqueda se reducen a una búsqueda sequencial. Por lo tanto, se han desarrollado métodos aproximados que sacrifican la exactitud por velocidad y eficiencia de memoria.



Los datos se indexan como nodos en un grafo. Dos nodos están conectados si son espacialmente vecinos según un criterio de proximidad.
Se basan en un concepto que aparece llamado monotonía.






El ajuste fino de los índices métricos es una tarea computacionalmente costosa que requiere de un experto en la técnica para ejecutar el trabajo; mencionando las dificultades para lograr índices de alta calidad con búsquedas de alta velocidad mientras se mantienen bajos los requisitos de memoria.
Nuestra investigación en este ámbito va sobre algoritmos eficientes pero también que se autoconfiguran.

En esta tarea de optimización, el grafo de hiperparámetros es \(H=(C, \mathcal{M})\) donde \(C\subset\mathbb{N} \times \mathbb{R}^+\) es el dominio de \(\beta\) y \(\Delta\), y el conjunto de aristas \(\mathcal{M}\) es la unión de todos los vecinos de cualquier configuración dada \(c\), es decir, \(\{ c \leftrightarrow c' \mid c' \in \mathcal{N}(c) \}\). El grafo \(H\) no se almacena de forma explícita y se genera con reglas simples basadas en algoritmos evolutivos; consulte y . En este sentido, definimos tres operadores genéticos diferentes que trabajan en el espacio de configuración \(C\):
Primero definamos la función \(\textsf{recall}\) que mide la calidad de una solución de consultas de una recuperación de \(k\) vecinos cercanos.
\[\begin{align*} \textsf{recall}(q_i) &= \frac{\# \text{ of real } k \text{ nearest neighbors for } q_i}{k} \\ &= \frac{|\text{gold result } q_i \cap \text{result } q_i |}{|\text{gold result } q_i|} \end{align*}\]
y definimos como \[\textsf{recall}(Q) = \frac{1}{\#Q}\sum_{q \in Q} \textsf{recall}(q)\]
El recall entonces varia entre 0 y 1
Ahora sí, dada una muestra de consultas \(Q\), un grafo \(G\)
\[\begin{equation} \textsf{error}(G, (\beta, \Delta), Q) = \\ \begin{cases} 1 + (\text{min-r} - r) & \text{if } r < \text{min-r} \\ \frac{cost}{\# \text{ of metric objects}} & \text{otherwise} \end{cases} \end{equation}\]
Nuestro análisis es más detallado ya que no supone una \(n\) o \(\mathcal{N}\) fijas; aunque también hay algunas consideraciones:
Por lo que los costos de búsqueda quedan como:
\[\begin{equation} \textsf{search-cost}(n) = O(\log n) + \sum_{u\in P} |\mathcal{N}(u)|; \label{eq/search-cost} \end{equation}\]
donde \(P\) es el camino recorrido para resolver una consulta y \(\mathcal{N}(u)\) es la vecindad conectada al nodo \(u\).
Otro punto importante es que no vemos el recall como una constante natural al índice.
Dado que tenemos muchos datos, podemos determinar de manera experimental los costos suponiendo que \(\textsf{search-cost}(n)=\log_2^\alpha(n)\) para un \(\alpha\); para esto usaremos ajuste a la siguiente expresión de costo:
\[\begin{equation} \textsf{search-cost}(n) = \log_2^\alpha(n) = \log(n) + \sum_{u\in P} |\mathcal{N}(u)| \label{eq/fit-cost}. \end{equation}\]
También buscamos caracterizar \(P\) por lo que suponemos \(|P| = \log_2^\gamma(n)\).








| b | tcost | coef | stderror | margin of error |
|---|---|---|---|---|
| 1.3000 | \(\alpha\) | 1.1575 | 0.0097 | 0.0192 |
| 1.3000 | \(\gamma\) | 0.2352 | 0.0135 | 0.0268 |


Ajuste para recall \(\log_2^{c+recall}(n)\)


La elección del índice depende del balance entre memoria, tiempo de consulta y recall (exactitud). En la actualidad, los grafos de proximidad jerárquicos combinados con cuantización constituyen el estado del arte para sistemas de búsqueda vectorial de alto rendimiento.
Eric S. Tellez SECIHTI-INFOTEC mailto:eric.tellez@infotec.mx