<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
  <channel>
    <title><![CDATA[Jessica Garson - Elasticsearch Labs]]></title>
    <description><![CDATA[Articles and tutorials from the Search team at Elastic]]></description>
    <copyright><![CDATA[© 2026. Elasticsearch B.V. All Rights Reserved]]></copyright>
    <image>
      <title><![CDATA[Jessica Garson - Elasticsearch Labs]]></title>
      <url>https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1121c0bf0e8a6e65/6a88da6340a1841030ef456f/search-labs-thumbnail.png</url>
      <link>https://www.elastic.co/es/search-labs/author/jessica-garson</link>
    </image>
    <link>https://www.elastic.co/es/search-labs/author/jessica-garson</link>
    <atom:link href="https://www.elastic.co/es/search-labs/rss/author/jessica-garson.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[es]]></language>
    <lastBuildDate>Tue, 15 Sep 2026 05:40:00 GMT</lastBuildDate>
  <item>
    <title><![CDATA[Cómo implementar una Mejor Cuantización Binaria (BBQ) en tu caso de uso]]></title>
    <description><![CDATA[Explora por qué implementarías Better Binary Quantization (BBQ) en tu caso de uso y cómo hacerlo.]]></description>
    <content:encoded><![CDATA[<p>La búsqueda vectorial proporciona la base al implementar la búsqueda semántica de texto o la búsqueda de similitud de imágenes, videos o audio. Con la búsqueda vectorial, los vectores son representaciones matemáticas de datos que pueden ser enormes y, a veces, lentos. Better Binary Quantization (en lo sucesivo, BBQ) funciona como un método de compresión para vectores. Le permite encontrar las coincidencias correctas mientras reduce los vectores para que sean más rápidos de buscar y procesar. Este artículo cubrirá BBQ y rescore_vector, un campo solo disponible para índices cuantificados que vuelve a calificar automáticamente los vectores.</p><p>Todas las consultas y salidas completas mencionadas en este artículo se pueden encontrar en nuestro <a href="https://github.com/elastic/elasticsearch-labs/tree/main/supporting-blog-content/how-and-why-bbq">repositorio de código de Elasticsearch Labs</a>.</p><h2>¿Por qué implementar Better Binary Quantization (BBQ) en tu caso de uso?</h2>Nota: para una comprensión profunda de cómo funcionan las matemáticas detrás del asado, consulte la <a href="https://www.elastic.co/es/search-labs/blog/bbq-implementation-into-use-case#further-learning">sección "Aprendizaje adicional"</a> a continuación. Para los propósitos de este blog, la atención se centra en la implementación.<p>Aunque las matemáticas son interesantes, son cruciales si quieres comprender completamente por qué tus búsquedas vectoriales siguen siendo precisas. En última instancia, todo esto se reduce a la compresión, ya que resulta que con los algoritmos actuales de búsqueda vectorial estás limitado por la velocidad de lectura de los datos. Por lo tanto, si puedes meter todos esos datos en la memoria, obtienes un aumento significativo de velocidad en comparación con leer desde el almacenamiento (<a href="https://sre.google/static/pdf/rule-of-thumb-latency-numbers-letter.pdf">la memoria es aproximadamente 200 veces más rápida que los SSD</a>).</p><p>Hay algunas cosas a tener en cuenta:</p><ul><li><p>Los índices basados en gráficos como <a href="https://arxiv.org/pdf/1603.09320">HNSW</a> (Hierarchical Navigable Small World) son los más rápidos para la recuperación de vectores.</p><ul><li><p>HNSW: Un algoritmo de búsqueda aproximado del vecino más cercano que construye una estructura de gráficos multicapa para permitir búsquedas eficientes de similitud de alta dimensión.</p></li></ul></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt760bd95c206bfa8f/6a17e2ad505ac393f7ad8a95/590f3b3c72a76023a38a0436cd9ff90a9f80e936-1964x1262.png" alt="HNSW: Un algoritmo de búsqueda aproximado del vecino más cercano que construye una estructura de gráficos multicapa para permitir búsquedas eficientes de similitud de alta dimensión." /><ul><li><p>HNSW está fundamentalmente limitado en velocidad por la velocidad de lectura de datos de la memoria o, en el peor de los casos, del almacenamiento.</p><ul><li><p>Idealmente, desea poder cargar todos sus vectores almacenados en la memoria.</p></li></ul></li><li><p>Los modelos de incrustación generalmente producen vectores con precisión float32, 4 bytes por número de punto flotante.</p></li><li><p>Y finalmente, dependiendo de cuántos vectores y / o dimensiones tenga, puede quedar sin memoria muy rápidamente para mantener todos sus vectores.</p></li></ul><p>Dando esto por sentado, ve que surge un problema rápidamente una vez que comienza a ingerir millones o incluso miles de millones de vectores, cada uno con potencialmente cientos o incluso miles de dimensiones. La sección titulada "<a href="https://www.elastic.co/es/search-labs/blog/bbq-implementation-into-use-case#approximate-numbers-on-the-compression-ratios">Números aproximados en las relaciones de compresión</a>" proporciona algunos números aproximados.</p><h2>¿Qué necesitas para empezar?</h2><p>Para comenzar, necesitará lo siguiente:</p><ul><li><p>Si usas Elastic Cloud o en las instalaciones, necesitarás una versión de Elasticsearch superior a la 8.18. Si bien BBQ se introdujo en 8.16, en este artículo, usará <code>vector_rescore</code>, que se introdujo en 8.18.</p></li><li><p>Además, también deberá cerciorar de que haya un <a href="https://www.elastic.co/es/guide/en/elasticsearch/reference/8.18/ml-settings.html">nodo de aprendizaje automático (ML)</a> en el clúster. (Nota: se necesita un nodo de ML con un mínimo de 4 GB para cargar el modelo, pero es probable que necesite nodos mucho más grandes para cargas de trabajo de producción completas).</p></li><li><p>Si emplea Serverless, deberá seleccionar una instancia optimizada para vectores.</p></li><li><p>También necesitará un nivel básico de conocimiento sobre bases de datos vectoriales. Si aún no estás familiarizado con los conceptos de búsqueda vectorial en Elastic, es posible que desees consultar primero los siguientes recursos:</p><ul><li><p><a href="https://www.elastic.co/es/search-labs/blog/elastic-vector-database-practical-example">Navegación por una base de datos vectorial elástica</a></p></li><li><p><a href="https://www.elastic.co/es/blog/retrieval-augmented-generation-explained">Las grandes ideas detrás de la generación aumentada de recuperación</a></p></li></ul></li></ul><h2>Mejor implementación de cuantización binaria (BBQ)</h2><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt18df00df95ff2ca7/6a17e2af414c6411989450df/4d388078495566f0527e931e0c2e38facdce83c6-1503x748.png" alt="Implementación de asado con Elasticsearch." /><p>Para simplificar este blog, empleará funciones integradas cuando estén disponibles. En este caso, tienes el modelo de incrustación de vectores <a href="https://www.elastic.co/es/guide/en/machine-learning/8.17/ml-nlp-e5.html"><code>.multilingual-e5-small</code></a> que se ejecutará directamente dentro de Elasticsearch en un nodo de aprendizaje automático. Tenga en cuenta que puede reemplazar el modelo <code>text_embedding</code> con el incrustador de su elección (<a href="https://www.elastic.co/es/guide/en/elasticsearch/reference/8.18/infer-service-openai.html">OpenAI,</a> <a href="https://www.elastic.co/es/guide/en/elasticsearch/reference/8.18/infer-service-google-ai-studio.html">Google AI Studio</a>, <a href="https://www.elastic.co/es/guide/en/elasticsearch/reference/8.18/infer-service-cohere.html">Cohere</a> y muchos más). Si su modelo preferido aún no está integrado, también puede <a href="https://www.elastic.co/es/guide/en/elasticsearch/reference/8.18/bring-your-own-vectors.html">traer sus propias incrustaciones de vectores densos</a>).</p><p>En primer lugar, deberá crear un punto de enlace de inferencia para generar vectores para un fragmento de texto determinado. Ejecutarás todos estos comandos desde la <a href="https://www.elastic.co/es/guide/en/kibana/8.18/console-kibana.html">consola de herramientas de desarrollo de Kibana</a>. Este comando descargará el <code>.multilingual-e5-small</code>. Si aún no existe, configurará su punto final; Esto puede tardar un minuto en ejecutar. Puede ver la salida esperada en el <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/how-and-why-bbq/Outputs/01-create-an-inference-endpoint-output.json">archivo 01-create-an-inference-endpoint-output.json</a> en la carpeta Salidas. </p>PUT _inference/text_embedding/my_e5_model
{
  "service": "elasticsearch",
  "service_settings": {
    "num_threads": 1,
    "model_id": ".multilingual-e5-small",
    "adaptive_allocations": {
      "enabled": true,
      "min_number_of_allocations": 1
    }
  }
}<p>Una vez que esto regresó, su modelo se configurará y podrá probar que el modelo funciona como se espera con el siguiente comando. Puede ver el resultado esperado en el <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/how-and-why-bbq/Outputs/02-embed-text-output.json">archivo 02-embed-text-output.json</a> en la carpeta Salidas.</p>POST _inference/text_embedding/my_e5_model
{
  "input": "my awesome piece of text"
}<p>Si tiene problemas relacionados con el modelo capacitado que no se asigna a ningún nodo, es posible que deba iniciar el modelo manualmente.</p>POST _ml/trained_models/.multilingual-e5-small/deployment/_start<p>Ahora vamos a crear una nueva asignación con 2 propiedades, un campo de texto estándar (<code>my_field</code>) y un campo vectorial denso (<code>my_vector</code>) con 384 dimensiones para que coincida con la salida del modelo de incrustación. También anulará el <code>index_options.type to bbq_hnsw</code>. Puede ver el resultado esperado en el <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/how-and-why-bbq/Outputs/03-create-byte-qauntized-index-output.json">archivo 03-create-byte-qauntized-index-output.json</a> en la carpeta Salidas.</p>PUT bbq-my-byte-quantized-index
{
  "mappings": {
    "properties": {
      "my_field": {
        "type": "text"
      },
      "my_vector": {
        "type": "dense_vector",
        "dims": 384,
        "index_options": {
          "type": "bbq_hnsw"
        }
      }
    }
  }
}<p>Para cerciorarte de que Elasticsearch genere tus vectores, puedes usar una <a href="https://www.elastic.co/es/guide/en/elasticsearch/reference/8.18/ingest.html">canalización de ingesta</a>. Esta canalización requerirá 3 cosas: el punto final, (<code>model_id</code>), el <code>input_field</code> para el que desea crear vectores y el <code>output_field</code> en el que almacenar esos vectores. El primer comando siguiente creará una canalización de ingesta de inferencia, que usa el <a href="https://www.elastic.co/es/guide/en/elasticsearch/reference/current/inference-apis.html">servicio de inferencia </a>en segundo plano, y el segundo probará que la canalización funciona correctamente. Puede ver la salida esperada en el <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/how-and-why-bbq/Outputs/04-create-and-simulate-ingest-pipeline-output.json">archivo 04-create-and-simulate-ingest-pipeline-output.json</a> en la carpeta Salidas. </p>PUT _ingest/pipeline/my_inference_pipeline
{
  "processors": [
    {
      "inference": {
        "model_id": "my_e5_model",
        "input_output": [
          {
            "input_field": "my_field",
            "output_field": "my_vector"
          }
        ]
      }
    }
  ]
}

POST _ingest/pipeline/my_inference_pipeline/_simulate
{
  "docs": [
    {
      "_source": {
        "my_field": "my awesome text field"
      }
    }
  ]
}<p>Ahora está listo para agregar algunos documentos con los primeros 2 comandos a continuación y para probar que sus búsquedas funcionan con el 3er comando. Puede desproteger el resultado esperado en el <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/how-and-why-bbq/Outputs/05-bbq-index-output.json">archivo 05-bbq-index-output.json</a> en la carpeta Salidas. </p>PUT bbq-my-byte-quantized-index/_doc/1?pipeline=my_inference_pipeline
{
    "my_field": "my awesome text field"
}

PUT bbq-my-byte-quantized-index/_doc/2?pipeline=my_inference_pipeline
{
    "my_field": "some other sentence"
}

GET bbq-my-byte-quantized-index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "knn": {
            "field": "my_vector",
            "query_vector_builder": {
              "text_embedding": {
                "model_id": "my_e5_model",
                "model_text": "my awesome search field"
              }
            },
            "k": 10,
            "num_candidates": 100
          }
        }
      ]
    }
  },
  "_source": [
    "my_field"
  ]
}<p>Como se recomienda en <a href="https://www.elastic.co/es/search-labs/blog/better-binary-quantization-lucene-elasticsearch#lucene-benchmarking">esta publicación</a>, se recomienda volver a puntuar y sobremuestrear cuando se escala a cantidades no triviales de datos porque ayudan a mantener una alta precisión de recuperación mientras se benefician de los beneficios de la compresión. A partir de la versión 8.18 de Elasticsearch, puedes hacerlo de esta manera usando <a href="https://www.elastic.co/es/guide/en/elasticsearch/reference/8.18/knn-search.html#dense-vector-knn-search-rescoring">rescore_vector</a>. La salida esperada se encuentra en el <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/how-and-why-bbq/Outputs/06-bbq-search-8-18-output.json">archivo 06-bbq-search-8-18-output.json</a> en la carpeta Outputs.</p>GET bbq-my-byte-quantized-index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "knn": {
            "field": "my_vector",
            "query_vector_builder": {
              "text_embedding": {
                "model_id": "my_e5_model",
                "model_text": "my awesome search field"
              }
            },
            "rescore_vector": {
              "oversample": 3
            },
            "k": 10,
            "num_candidates": 100
          }
        }
      ]
    }
  },
  "_source": [
    "my_field"
  ]
}<p>¿Cómo se comparan estos puntajes con los que obtendría por los datos sin procesar? Si vuelves a hacer todo lo anterior pero con <code>index_options.type: hnsw</code>, verás que los puntajes son muy comparables. Puede ver el resultado esperado en el <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/how-and-why-bbq/Outputs/07-raw-vector-output.json">archivo 07-raw-vector-output.json</a> en la carpeta Salidas.</p>PUT my-raw-vector-index
{
  "mappings": {
    "properties": {
      "my_field": {
        "type": "text"
      },
      "my_vector": {
        "type": "dense_vector",
        "dims": 384,
        "index_options": {
          "type": "hnsw"
        }
      }
    }
  }
}

PUT my-raw-vector-index/_doc/1?pipeline=my_inference_pipeline
{
    "my_field": "my awesome text field"
}

PUT my-raw-vector-index/_doc/2?pipeline=my_inference_pipeline
{
    "my_field": "some other sentence"
}

GET my-raw-vector-index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "knn": {
            "field": "my_vector",
            "query_vector_builder": {
              "text_embedding": {
                "model_id": "my_e5_model",
                "model_text": "my awesome search field"
              }
            },
            "k": 10,
            "num_candidates": 100
          }
        }
      ]
    }
  },
  "_source": [
    "my_field"
  ]
}<h2>Números aproximados en las relaciones de compresión</h2><p>Los requisitos de almacenamiento y memoria pueden convertir rápidamente en un desafío importante cuando se trabaja con la búsqueda vectorial. El siguiente desglose ilustra cómo las diferentes técnicas de cuantificación reducen significativamente la huella de memoria de los datos vectoriales.</p><p>Vectores (V)</p><p>Dimensiones (D)</p><p>sin procesar (V x P x 4)</p><p>int8 (V x (D x 1 + 4))</p><p>int4 (V x (D x 0.5 + 4))</p><p>asado (V x (D x 0.125 + 4))</p><p>10,000,000</p><p>384</p><p>14,31 GB</p><p>3,61 GB</p><p>1,83 GB</p><p>0,58 GB</p><p>50,000,000</p><p>384</p><p>71,53 GB</p><p>18,07 GB</p><p>9,13 GB</p><p>2,89 GB</p><p>100,000,000</p><p>384</p><p>143,05 GB</p><p>36,14 GB</p><p>18,25 GB</p><p>5,77 GB</p><h2>Conclusión</h2><p>BBQ es una optimización que puede aplicar a sus datos vectoriales para la compresión sin sacrificar la precisión. Funciona convirtiendo vectores en bits, lo que le permite buscar los datos de manera efectiva y le permite escalar sus flujos de trabajo de IA para acelerar las búsquedas y optimizar el almacenamiento de datos.</p><h2>Aprendizaje adicional</h2><p>Si está interesado en obtener más información sobre el asado, cerciorar de consultar los siguientes recursos:</p><ul><li><p><a href="https://www.elastic.co/es/search-labs/blog/better-binary-quantization-lucene-elasticsearch">Cuantificación binaria (BBQ) en Lucene y Elasticsearch</a></p></li><li><p><a href="https://www.elastic.co/es/search-labs/blog/bit-vectors-elasticsearch-bbq-vs-pq">Mejor cuantización binaria (BBQ) frente a cuantificación de productos</a></p></li><li><p><a href="https://www.elastic.co/es/search-labs/blog/optimized-scalar-quantization-elasticsearch">Cuantización escalar optimizada: cuantificación binaria aún mejor</a></p></li><li><p><a href="https://www.youtube.com/watch?v=04NzMt2Nigc">Mejor cuantificación binaria (BBQ): De bytes a BBQ, el secreto para una mejor búsqueda vectorial por Ben Trent</a></p></li></ul>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/bbq-implementation-into-use-case</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/bbq-implementation-into-use-case</guid>
    <category><![CDATA[Base de datos vectorial]]></category>
    <category><![CDATA[Conceptos básicos]]></category>
    <dc:creator><![CDATA[Sachin Frayne,Jessica Garson]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt3dd0495b536b2615/6a17e2b0414c6488459450e3/66842055367cdd795532b01c167f2a4b03dc65e3-1200x628.png" length="0" type="image/png"/>
    <pubDate>Wed, 23 Apr 2025 00:00:00 GMT</pubDate>
  </item>
  </channel>
</rss>