{"id":340,"date":"2026-06-19T18:07:38","date_gmt":"2026-06-19T22:07:38","guid":{"rendered":"https:\/\/juredev.com\/blog\/?p=340"},"modified":"2026-06-19T18:07:40","modified_gmt":"2026-06-19T22:07:40","slug":"como-funciona-una-base-de-datos-vectorial","status":"publish","type":"post","link":"https:\/\/juredev.com\/blog\/2026\/06\/como-funciona-una-base-de-datos-vectorial\/","title":{"rendered":"C\u00f3mo funciona una base de datos vectorial"},"content":{"rendered":"\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Si alguna vez te has preguntado c\u00f3mo una aplicaci\u00f3n de IA encuentra resultados \u00abcon sentido similar\u00bb en lugar de coincidencias exactas de palabras, la respuesta vive en este tipo de base de datos.<\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">El problema que resuelven<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Las bases de datos relacionales son brillantes para lo que fueron dise\u00f1adas: buscar filas exactas en tablas bien definidas. \u00bfQuieres todos los usuarios con <code>pa\u00eds = 'M\u00e9xico'<\/code>? Perfecto. \u00bfQuieres todos los art\u00edculos que hablen sobre el mismo tema que esta pregunta, aunque usen palabras distintas? Ah\u00ed el modelo relacional empieza a fallar.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Una <strong>base de datos vectorial<\/strong> naci\u00f3 precisamente para resolver ese problema. En lugar de buscar coincidencias de texto, busca <em>similitud de significado<\/em>, y lo hace de manera eficiente incluso con millones de registros.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u00bfQu\u00e9 hay dentro de cada registro?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A diferencia de una fila tradicional con columnas de texto o n\u00fameros, cada elemento en una base de datos vectorial combina tres partes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>El vector (embedding)<\/strong>: una lista de n\u00fameros de coma flotante que codifica el significado conceptual del elemento. Un fragmento de texto sobre \u00abperros\u00bb y otro sobre \u00abcachorros\u00bb tendr\u00e1n vectores matem\u00e1ticamente cercanos entre s\u00ed.<\/li>\n\n\n\n<li><strong>Los datos originales<\/strong>: el contenido real que se quiere mostrar al usuario \u2014 el texto, la URL de una imagen, el fragmento de audio.<\/li>\n\n\n\n<li><strong>Los metadatos<\/strong>: campos estructurados adicionales (categor\u00eda, fecha, autor, idioma) que permiten combinar la b\u00fasqueda sem\u00e1ntica con filtros tradicionales.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Los tres viajan juntos. Sin los datos originales no puedes mostrar nada; sin los metadatos no puedes filtrar; sin el vector no puedes buscar por significado.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">El rol de los embeddings<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Los datos no estructurados no pueden entrar directamente a una base de datos vectorial \u2014 primero hay que convertirlos en n\u00fameros. Ese proceso lo realizan <strong>modelos de Machine Learning<\/strong> (como los de la familia de OpenAI, Cohere o sentence-transformers) que aprenden a representar el significado en un espacio multidimensional.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La intuici\u00f3n clave es esta: en ese espacio de cientos o miles de dimensiones, los elementos con significados parecidos quedan <strong>geom\u00e9tricamente cerca<\/strong>. \u00abRey\u00bb y \u00abmonarca\u00bb estar\u00e1n cerca. \u00abRey\u00bb y \u00abpizza\u00bb estar\u00e1n lejos. La b\u00fasqueda sem\u00e1ntica es, en el fondo, una b\u00fasqueda de vecinos cercanos en ese espacio.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">El algoritmo de b\u00fasqueda: HNSW<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Aqu\u00ed est\u00e1 el reto de ingenier\u00eda real. Si tienes diez millones de vectores y recibes una consulta, calcular la distancia exacta hacia cada uno de ellos ser\u00eda computacionalmente inviable en producci\u00f3n.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La soluci\u00f3n son los algoritmos de <strong>B\u00fasqueda de Vecinos M\u00e1s Cercanos Aproximados (ANN)<\/strong>. El m\u00e1s extendido en las bases de datos vectoriales modernas es <strong>HNSW<\/strong> (Hierarchical Navigable Small World), y funciona con una estructura de capas jer\u00e1rquicas:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Capa superior: saltos largos<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">La capa m\u00e1s alta contiene muy pocos nodos distribuidos de forma dispersa. Al recibir una consulta, el algoritmo entra por aqu\u00ed y da saltos grandes hacia el nodo m\u00e1s cercano, cubriendo mucha distancia r\u00e1pidamente con muy pocas comparaciones.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Capas intermedias: refinamiento progresivo<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Desde el nodo alcanzado en la capa superior se baja de nivel. En cada capa hay m\u00e1s densidad de puntos, y el algoritmo navega hacia vecinos cada vez m\u00e1s cercanos al vector de consulta.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Capa inferior: precisi\u00f3n fina<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">La capa base tiene la densidad total de puntos. Aqu\u00ed se realizan desplazamientos cortos y precisos hasta localizar el vecino \u00f3ptimo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El resultado es una b\u00fasqueda que se aproxima al resultado exacto en una fracci\u00f3n del tiempo que requerir\u00eda una comparaci\u00f3n exhaustiva. Es el equilibrio perfecto entre velocidad y precisi\u00f3n que hace viable el uso en producci\u00f3n.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Implementaci\u00f3n pr\u00e1ctica con FAISS<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Una de las bibliotecas de referencia para trabajar con \u00edndices vectoriales es <strong>FAISS<\/strong> (Facebook AI Similarity Search). El flujo est\u00e1ndar tiene cuatro pasos:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. Crear e inicializar el \u00edndice<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Se define la dimensi\u00f3n de los vectores y la m\u00e9trica de distancia a utilizar. <code>IndexFlatL2<\/code> aplica distancia euclidiana (L2), la m\u00e1s com\u00fan para embeddings de texto:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import faiss\nimport numpy as np\n\ndimension = 768  # dimensi\u00f3n del modelo de embeddings\nindex = faiss.IndexFlatL2(dimension)<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">2. A\u00f1adir los vectores al \u00edndice<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Una vez que los embeddings est\u00e1n generados, se a\u00f1aden al \u00edndice para su almacenamiento y b\u00fasqueda posterior:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># vectors: array de shape (N, dimension) con dtype float32\nindex.add(vectors.astype(\"float32\"))\nprint(f\"Vectores indexados: {index.ntotal}\")<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">3. Convertir la consulta en un vector<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">La consulta del usuario pasa por el mismo modelo de embeddings que gener\u00f3 los vectores del \u00edndice:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>query_text = \"\u00bfC\u00f3mo funcionan los transformers?\"\n# Suponiendo un modelo previamente cargado (ej. de sentence-transformers)\nquery_vector = modelo.encode(&#91;query_text]).astype(\"float32\")<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">4. Ejecutar la b\u00fasqueda<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Se recuperan los <em>K<\/em> vecinos m\u00e1s cercanos. FAISS devuelve tanto las distancias como los \u00edndices de los elementos m\u00e1s similares:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>k = 5  # n\u00famero de resultados\ndistances, indices = index.search(query_vector, k)\n\nfor i, idx in enumerate(indices&#91;0]):\n    print(f\"Resultado {i+1}: ID={idx}, distancia={distances&#91;0]&#91;i]:.4f}\")<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">En resumen<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><th>Concepto<\/th><th>Funci\u00f3n<\/th><\/tr><tr><td>Embedding<\/td><td>Transforma datos en vectores num\u00e9ricos con significado<\/td><\/tr><tr><td>\u00cdndice vectorial<\/td><td>Estructura que permite buscar entre millones de vectores<\/td><\/tr><tr><td>HNSW<\/td><td>Algoritmo jer\u00e1rquico para b\u00fasqueda aproximada r\u00e1pida<\/td><\/tr><tr><td>Metadatos<\/td><td>Permiten combinar b\u00fasqueda sem\u00e1ntica con filtros exactos<\/td><\/tr><tr><td>FAISS<\/td><td>Biblioteca de referencia para crear y consultar \u00edndices<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Las bases de datos vectoriales son la infraestructura silenciosa detr\u00e1s de los chatbots con memoria, los motores de b\u00fasqueda sem\u00e1ntica, los sistemas de recomendaci\u00f3n y las aplicaciones RAG (<em>Retrieval-Augmented Generation<\/em>). Entender c\u00f3mo funcionan es entender uno de los bloques fundamentales del stack de IA moderno.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Si alguna vez te has preguntado c\u00f3mo una aplicaci\u00f3n de IA encuentra resultados \u00abcon sentido similar\u00bb en lugar de coincidencias exactas de palabras, la respuesta vive en este tipo de base de datos. El problema que resuelven Las bases de datos relacionales son brillantes para lo que fueron dise\u00f1adas: buscar filas exactas en tablas bien [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[134],"class_list":["post-340","post","type-post","status-publish","format-standard","hentry","category-nota","tag-ia"],"_links":{"self":[{"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/posts\/340","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/comments?post=340"}],"version-history":[{"count":0,"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/posts\/340\/revisions"}],"wp:attachment":[{"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/media?parent=340"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/categories?post=340"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/tags?post=340"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}