<?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[Thomas Veasey - 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[Thomas Veasey - 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/thomas-veasey</link>
    </image>
    <link>https://www.elastic.co/es/search-labs/author/thomas-veasey</link>
    <atom:link href="https://www.elastic.co/es/search-labs/rss/author/thomas-veasey.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[es]]></language>
    <lastBuildDate>Mon, 28 Sep 2026 08:09:50 GMT</lastBuildDate>
  <item>
    <title><![CDATA[Acelerar la fusión de gráficos HNSW]]></title>
    <description><![CDATA[Explore el trabajo que estuvimos haciendo para reducir la sobrecarga de crear varios gráficos HNSW, en individuo reducir el costo de fusionar gráficos.]]></description>
    <content:encoded><![CDATA[<p>En el pasado, <a href="https://www.elastic.co/es/search-labs/blog/multi-graph-vector-search">hablamos</a> de algunos de los retos de tener que buscar <a href="https://www.elastic.co/es/search-labs/blog/hnsw-graph">en varios gráficos HNSW</a> y cómo pudimos mitigarlos. En ese momento insinuamos algunas mejoras adicionales que planeamos. Esta publicación es la culminación de ese trabajo.</p><p>Podrías preguntarte, ¿por qué usar varios gráficos? Este es un efecto secundario de una elección arquitectónica en Lucene: segmentos inmutables. Como ocurre con la mayoría de las opciones arquitectónicas, hay pros y contras. Por ejemplo, recientemente lanzamos Elasticsearch sin servidor con GA. En este contexto, obtuvimos beneficios muy significativos de los segmentos inmutables, incluida la replicación eficiente de índices y la capacidad de desacoplar el índice y el proceso de consulta y escalarlos automáticamente de forma independiente. Para la cuantificación vectorial, las fusiones de segmentos nos dan la oportunidad de actualizar los parámetros para adaptarlos a las características de los datos. En este sentido, creemos que hay otros beneficios que ofrece tener oportunidades para medir las características de los datos y revisar las opciones de indexación.</p><p>En esta publicación, discutiremos el trabajo que estuvimos haciendo para reducir significativamente la sobrecarga de crear múltiples gráficos HNSW y, en individuo, para reducir el costo de fusionar gráficos.</p><h3>Fondo</h3><p>Para mantener un número manejable de segmentos, Lucene verifica periódicamente si debe fusionar segmentos. Esto equivale a comprobar si el recuento de segmentos actual supera un recuento de segmentos de destino, que está determinado por el tamaño del segmento base y la política de combinación. Si se supera el recuento, Lucene combina grupos de segmentos mientras se infringe la restricción. Este proceso se describió en detalle <a href="https://blog.mikemccandless.com/2011/02/visualizing-lucenes-segment-merges.html">en otra parte</a>.</p><p>Lucene elige fusionar segmentos de tamaño similar porque esto logra un crecimiento logarítmico en la amplificación de escritura. En el caso de un índice vectorial, la amplificación de escritura es el número de veces que se insertará un vector en un gráfico. Lucene intentará fusionar segmentos en grupos de aproximadamente 10. En consecuencia, los vectores se insertan en un gráfico aproximadamente veces, donde  es el recuento de vectores índice y  es el recuento de vectores de segmento base esperado. Debido al crecimiento logarítmico, la amplificación de escritura es de un solo dígito incluso para índices enormes. Sin embargo, el tiempo total dedicado a fusionar gráficos es linealmente proporcional a la amplificación de escritura.</p><p>Al fusionar gráficos HNSW ya hacemos una pequeña optimización: retener el gráfico para el segmento más grande e insertar vectores de los otros segmentos en él. Esta es la razón del factor 9/10 anterior. A continuación, mostramos cómo podemos hacerlo significativamente mejor empleando información de todos los gráficos que estamos fusionando.</p><h3>Fusión de grafos HNSW</h3><p>Antes conservábamos el grafo más grande e insertábamos vectores de los otros ignorando los gráficos que los contenían. La idea clave que aprovechamos a continuación es que cada grafo HNSW que descartamos contiene información importante de proximidad sobre los vectores que contiene. Nos gustaría usar esta información para acelerar la inserción, al menos algunos, de los vectores.</p><p>Nos enfocamos en el problema de insertar un gráfico más pequeño  en un gráfico más grande , ya que esta es una operación atómica que podemos usar para construir cualquier política de combinación.</p><p>La estrategia consiste en encontrar un subconjunto de vértices de  insertarlos en el gráfico grande. Luego usamos la conectividad de estos vértices en el gráfico pequeño para acelerar la inserción de los vértices restantes . A continuación, usamos  y  para denotar los vecinos de un vértice  en el grafo pequeño y grande, respectivamente. Esquemáticamente, el proceso es el siguiente.</p><p><code>MERGE-HNSW</code></p><p><code>Inputs </code><code> and </code></p><p><code>1</code><code>Find </code><code> to insert into </code><code> using COMPUTE-JOIN-SET</code>
<code>2</code><code>Insert each vertex </code><code> into </code>
<code>3</code><code>for </code><code> do</code>
<code>4</code>
<code>5</code>
<code>6</code><code>FAST-SEARCH-LAYER</code>
<code>7</code><code>SELECT-NEIGHBORS-HEURISTIC</code>
<code>8</code></p><p>Calculamos el conjunto  empleando un procedimiento que discutimos a continuación (línea 1). Luego insertamos cada vértice en  en el gráfico grande usando el procedimiento de inserción HNSW estándar (línea 2). Para cada vértice que no insertamos encontramos sus vecinos que insertamos y sus vecinos en el gráfico grande (líneas 4 y 5). Usamos un procedimiento <code>FAST-SEARCH-LAYER</code> sembrado con este conjunto (línea 6) para encontrar los candidatos para el <code>SELECT-NEIGHBORS-HEURISTIC</code> del <a href="https://arxiv.org/pdf/1603.09320">artículo</a> HNSW (línea 7). En efecto, estamos reemplazando <code>SEARCH-LAYER</code> para encontrar el conjunto candidato en el método <code>INSERT</code> (Algoritmo 1 del artículo), que de lo contrario no cambia. Finalmente, agregamos el vértice que acabamos de insertar en  (línea 8).</p><p>Está claro que para que esto funcione, cada vértice en  debe tener al menos un vecino en . De hecho, requerimos que para cada vértice en  que  para algunos , la máxima conectividad de capa. Observamos que en los gráficos reales de HNSW vemos una gran dispersión de grados de vértice. La siguiente figura muestra una función de densidad acumulativa típica del grado de vértice para la capa inferior de un gráfico HNSW de Lucene.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc815e1a9c3bb0d06/6a17e178ec0f89308a5a6564/44f001b3a1bc6627e172fed5c52a02cfdcb4cd66-1324x898.png" alt="Grafo HNSW: Ejemplo de distribución de grados de vértices" /><p>Exploramos el uso de un valor fijo para  así como convertirlo en una función del grado del vértice. Esta segunda opción conduce a mayores aceleramientos con un impacto mínimo en la calidad del gráfico, por lo que optó por lo siguiente</p><p>Tenga en cuenta que | es igual al grado del vértice  en el gráfico pequeño por definición. Tener un límite inferior de dos significa que insertaremos cada vértice cuyo grado sea menor que dos.</p><p>Un argumento de conteo simple sugiere que si elegimos  con cuidado, solo necesitamos insertar alrededor  en  directamente. Específicamente, coloreamos una arista del grafo si insertamos exactamente uno de sus vértices finales en . Entonces sabemos que para que cada vértice en  tenga al menos  vecinos en  , necesitamos colorear al menos  aristas. Además, esperamos que</p><p>Aquí,  es el grado medio del vértice en la gráfica pequeña. Para cada vértice  coloreamos como máximo  Bordes. Por lo tanto, el número total de bordes que esperamos colorear es como máximo . Esperamos que al elegir  con cuidado coloreemos cerca de este número de aristas y así cubrir todos los vértices  necesidades para satisfacer</p><p>Esto implica que .</p><p>Siempre que <code>SEARCH-LAYER</code> domine el tiempo de ejecución, esto sugiere que podríamos lograr un aceleramiento de hasta  en el tiempo de fusión. Dado el crecimiento logarítmico de la amplificación de escritura, esto significa que incluso para índices muy grandes, normalmente solo duplicaríamos el tiempo de construcción en comparación con la construcción de un gráfico.</p><p>El riesgo en esta estrategia es que dañamos la calidad del gráfico. Inicialmente lo intentamos con un <code>FAST-SEARCH-LAYER</code>sin operación. Descubrimos que esto degrada la calidad del gráfico en la medida en que la recuperación en función de la latencia se vio afectada, particularmente cuando se fusiona en un solo segmento. Luego exploramos varias alternativas empleando una búsqueda limitada del gráfico. Al final, la elección más efectiva fue la más simple. Usar <code>SEARCH-LAYER</code> pero con un <code>ef_construction</code>bajo. Con esta parametrización pudimos lograr gráficos de excelente calidad y aún así disminuir el tiempo de fusión en un poco más del 30% en promedio.</p><h3>Cálculo del conjunto de unión</h3><p>Encontrar un buen conjunto de unión puede formular como un problema de cobertura de grafos HNSW. Una heurística codiciosa es una heurística simple y efectiva para aproximar cubiertas óptimas de grafos. El enfoque que tomamos elige vértices uno a uno para sumar a  en orden decreciente de ganancia. La ganancia se define de la siguiente manera:</p><p>Aquí,  denota el recuento de vecinos de un vector  en  y  es la función indicadora. La ganancia incluye el cambio en el recuento del vértice que agregamos a , es decir,  ya que nos acercamos a nuestro objetivo al agregar un vértice menos cubierto. El cálculo de la ganancia se ilustra en la siguiente figura para el vértice naranja central.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt7a353d56fa09af5f/6a17e17a2f4a5c33f7fa8825/fe11cd55a7d94d9e0b0f4d47ea309a99075c355d-540x474.png" alt="Ganancia de vértices para agregar al conjunto de unión J en el grafo HNSW" /><p>Mantenemos el siguiente estado para cada vértice :</p><ol><li><p>Ya sea rancio,</p></li><li><p>Su ganancia </p></li><li><p>El recuento de vértices adyacentes en  denotado </p></li><li><p>Un número aleatorio en el rango [0,1] que se usa para el desempate.</p></li></ol><p>El pseudocódigo para calcular el conjunto de combinaciones es el siguiente.</p><p><code>COMPUTE-JOIN-SET</code></p><p><code>Inputs </code></p><p><code>1</code>
<code>2</code>
<code>3</code><code>for </code><code> do</code>
<code>4</code>
<code>5</code>
<code>6</code>
<code>7</code><code>while </code><code> do
8</code><code> maximum gain vertex in </code>
<code>9</code><code>Remove the state for </code><code> from </code>
<code>10</code><code>if </code><code> is not stale then</code>
<code>11</code>
<code>12</code>
<code>13</code><code>for </code><code> do</code>
<code>14</code><code>mark </code><code> as stale if </code>
<code>15</code><code>mark neighbors of </code><code> stale if </code><code>
16</code><code>
17</code><code>else
18</code><code>
19</code><code>if </code><code> then
20</code><code>
21</code><code>return </code></p><p>Primero inicializamos el estado en las líneas 1-5.</p><p>En cada iteración del bucle principal extraemos inicialmente el vértice de ganancia máxima (línea 8), rompiendo los empates al azar. Antes de realizar cualquier cambio, debemos verificar si la ganancia del vértice está obsoleta. En individuo, cada vez que agregamos un vértice a  afectamos la ganancia de otros vértices:</p><ol><li><p>Dado que todos sus vecinos tienen un vecino adicional en  , sus ganancias pueden cambiar (línea 14)</p></li><li><p>Si alguno de sus vecinos ahora está completamente cubierto, todas las ganancias de sus vecinos pueden cambiar (líneas 14-16)</p></li></ol><p>Recalculamos las ganancias de manera perezosa, por lo que solo recalculamos la ganancia de un vértice si queremos insertarlo en  (líneas 18-20). Dado que las ganancias solo disminuyen, nunca podemos perder un vértice que debamos insertar.</p><p>Tenga en cuenta que simplemente necesitamos realizar un seguimiento de la ganancia total de vértices que agregamos a  para determinar cuándo salir. Además,  al menos un vértice tendrá una ganancia distinta de cero, por lo que siempre progresamos.</p><h3>Resultados</h3><p>Realizamos experimentos en cuatro conjuntos de datos que juntos cubren nuestras tres métricas de distancia admitidas (euclidiana, coseno y producto interno):</p><ol><li><p>quora-E5-small: 522931 documentos, 384 dimensiones y emplea la similitud del coseno,</p></li><li><p>cohe-wikipedia-v2: 1M de documentos, 768 dimensiones y emplea similitud de coseno,</p></li><li><p>gist: 1M documentos, 960 dimensiones y emplea la distancia euclidiana, y</p></li><li><p>cohe-wikipedia-v3: 1M de documentos, 1024 dimensiones y emplea el máximo producto interno.</p></li></ol><p>Para cada conjunto de datos evaluamos dos niveles de cuantificación:</p><ol><li><p>int8: que emplea un entero de 1 byte por dimensión y</p></li><li><p>BBQ: que emplea un solo bit por dimensión.</p></li></ol><p>Finalmente, para cada experimento evaluamos la calidad de la búsqueda a dos profundidades de recuperación y examinamos luego de construir el índice y luego luego de forzar la fusión en un solo segmento.</p><p>En resumen, logramos aceleramientos sustanciales consistentes en la indexación y la fusión mientras mantenemos la calidad del gráfico y, por lo tanto, el rendimiento de búsqueda en todos los casos.</p><h4>Experimento 1: cuantización int8</h4><p>Los aceleramientos promedio desde la línea de base hasta el candidato, los cambios propuestos, son:</p><p>Aceleramiento del tiempo del índice: <strong>1.28</strong></p><p>Forzar la velocidad de combinación: <strong>1.72</strong></p><p>Esto corresponde al siguiente desglose en tiempos de ejecución</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt8422be122ef1a9c9/6a17e17bbe6086522e00467d/5f9f6d487b4c74c4998aa47465912c1a9743e928-734x479.png" alt="Indexar y fusionar tiempos para las estrategias de fusión de línea base y candidatas" /><p>Para completar, los tiempos exactos son</p><p></p><p>Índice</p><p></p><p>Fusionar</p><p></p><p>Conjunto de datos</p><p>referencia</p><p>candidato</p><p>Desarrolla</p><p>candidato</p><p>quora-E5-pequeño</p><p>112.41s</p><p>81.55s</p><p>113.81s</p><p>70.87s</p><p>wiki-cohesión-v2</p><p>158.1s</p><p>122,95 segundos</p><p>425.20s</p><p>239.28s</p><p>quid</p><p>141.82s</p><p>119.26s</p><p>536.07s</p><p>279.05s</p><p>wiki-cohesión-v3</p><p>211.86s</p><p>168.22s</p><p>654,97 segundos</p><p>414.12s</p><p>A continuación, mostramos los gráficos de recuperación frente a latencia que comparan el candidato (líneas discontinuas) con la línea de base en dos profundidades de recuperación: recall@10 y recall@100 para índices con múltiples segmentos (el resultado final de nuestra estrategia de fusión predeterminada luego de indexar todos los vectores) y luego de forzar la fusión en un solo segmento. Una curva más alta y más a la izquierda es mejor, lo que significa una mayor recuperación con una latencia más baja.</p><p>Como puede ver, para índices de múltiples segmentos, el candidato es mejor para el conjunto de datos Cohere v3 y un poco peor, pero casi comparable, para todos los demás conjuntos de datos. Luego de fusionar en un solo segmento, las curvas de recuperación son casi idénticas para todos los casos.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf674622469bf6a90/6a17e17dfbc5f874a84919c9/9195297f19f90b172d832ba56bdada7b0d8a768b-985x392.png" alt="Recuperar @10 y @100 frente a la latencia luego de crear el índice" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltde89f7e94ac823f4/6a17e17fe9ea876429a9c507/c866f32d579ae2b841e92ca733dd29c0e214ac6b-986x386.png" alt="Recuperar @10 y @100 frente a la latencia luego de fusionar en un solo segmento" /><h4>Experimento 2: Cuantización de asado</h4><p>Los aceleramientos promedio desde la línea de base hasta el candidato son:</p><p>Aceleramiento del tiempo de índice: <strong>1.33</strong></p><p>Forzar la velocidad de combinación: <strong>1.34</strong></p><p>Esto corresponde al siguiente desglose en tiempos de ejecución</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5b0eb305222fa5c2/6a17e18125daab514f08a18c/11be0cf6b63480dc703409329357ea4847b55051-740x415.png" alt="Indexar y fusionar el tiempo para las estrategias de fusión de línea base y candidatas" /><p>Para completar, los tiempos exactos son</p><p></p><p>Índice</p><p></p><p>Fusionar</p><p></p><p>Conjunto de datos</p><p>referencia</p><p>candidato</p><p>Desarrolla</p><p>candidato</p><p>quora-E5-pequeño</p><p>70.71s</p><p>58.25s</p><p>59.38s</p><p>40.15s</p><p>wiki-cohesión-v2</p><p>203.08s</p><p>142.27s</p><p>107.27s</p><p>85.68s</p><p>quid</p><p>110.35s</p><p>105,52 segundos</p><p>323,66 segundos</p><p>202.2s</p><p>wiki-cohesión-v3</p><p>313.43s</p><p>190.63s</p><p>165,98 segundos</p><p>159,95 segundos</p><p>Para índices de segmentos múltiples, el candidato es mejor para casi todos los conjuntos de datos, excepto cohere v2, donde la línea de base es ligeramente mejor. Para los índices de un solo segmento, las curvas de recuperación son casi idénticas para todos los casos.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltb12174abeadbcdd1/6a17e1822f4a5c4cc2fa8829/7da1be27bab5a7f5f9c9a1882ea35761a4a0ba5c-973x383.png" alt="Recuperar @10 y @100 frente a la latencia luego de crear el índice" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf1b88d4f7fec9905/6a17e184414c64a8de9450b4/a26af30a56c55a12addee7e4fb7e8f606f366668-979x386.png" alt="Recordar @10 y @100 frente a la latencia que se fusionó en un solo segmento" /><h3>Conclusión</h3><p>El algoritmo discutido en este blog estará disponible en el próximo Lucene 10.2 y en la versión de Elasticsearch que se basa en él. Los usuarios podrán aprovechar el rendimiento mejorado de la combinación y el tiempo de compilación de índices reducido en estas nuevas versiones. Este cambio es parte de nuestro esfuerzo continuo para hacer que Lucene y Elasticsearch sean rápidos y eficientes para la búsqueda vectorial e híbrida.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/hnsw-graphs-speed-up-merging</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/hnsw-graphs-speed-up-merging</guid>
    <category><![CDATA[Base de datos vectorial]]></category>
    <category><![CDATA[Lucene]]></category>
    <dc:creator><![CDATA[Thomas Veasey,Mayya Sharipova]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt9fca6a01d0541cfb/6a17e187033c8d46486bb0e1/49a6c880f5dedd0fa502ece5be124824ee218cc0-1792x1024.png" length="0" type="image/png"/>
    <pubDate>Mon, 07 Apr 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Evaluación de la relevancia en búsquedas, parte 1: el índice de referencia BEIR]]></title>
    <description><![CDATA[Aprende a evaluar tu sistema de búsqueda en el contexto de una mejor comprensión del índice de referencia BEIR, con consejos y técnicas para mejorar tus procesos de evaluación de búsquedas.]]></description>
    <content:encoded><![CDATA[<p>Esta es la primera de una serie de publicaciones del blog que analizan cómo evaluar tus propios sistemas de búsqueda en el contexto de una mejor comprensión del índice de referencia BEIR. Presentaremos consejos y técnicas específicas para mejorar tus procesos de evaluación de búsqueda en el contexto de una mejor comprensión de BEIR. También presentaremos errores comunes que hacen que la evaluación sea menos confiable. Finalmente, notamos que los LLM ofrecen una poderosa nueva herramienta en el repositorio de los ingenieros de búsqueda por lo que mostraremos, con un ejemplo, cómo se pueden usar para ayudar a evaluar la búsqueda.</p><h2>Comprender el índice de referencia BEIR en la evaluación de la relevancia de búsqueda</h2><p>Para mejorar cualquier sistema, debes poder medir su eficacia. En el contexto de una búsqueda, <a href="https://arxiv.org/abs/2104.08663">BEIR</a> (o, de manera equivalente, la sección de recuperación de la tabla de clasificación de <a href="https://huggingface.co/spaces/mteb/leaderboard">MTEB</a>) se considera el “santo grial” para la comunidad de recuperación de información, y no es de extrañar. Es un índice de referencia muy bien estructurado con sets de datos variados para diferentes tareas. Más específicamente, se cubren las siguientes áreas:</p><ul><li><p>Recuperación de argumentos (ArguAna, Touche2020)</p></li><li><p>QA de dominio abierto (HotpotQA, Natural Questions, FiQA)</p></li><li><p>Recuperación de pasajes (MSMARCO)</p></li><li><p>Recuperación de preguntas duplicadas (Quora, CQADupstack)</p></li><li><p>Verificación de hechos (FEVER, Climate-FEVER, Scifact)</p></li><li><p>Recuperación de información biomédica (TREC-COVID, NFCorpus, BioASQ)</p></li><li><p>Recuperación de entidades (DBPedia)</p></li><li><p>Predicción de citas (SCIDOCS)</p></li></ul><p>Ofrece una única estadística, nDCG@10, relacionada con la capacidad de un sistema para encontrar los documentos más relevantes para cada ejemplo de tarea en los primeros resultados que devuelve. Para un sistema de búsqueda con el que interactúa un ser humano, la relevancia de los resultados principales es fundamental. Sin embargo, hay muchos matices a la hora de evaluar las búsquedas que una sola estadística resumida no refleja.</p><h2>Estructura de un set de datos BEIR</h2><p>Cada benchmark tiene tres artefactos:</p><ul><li><p>el corpus o los documentos que se van a recuperar</p></li><li><p>las búsquedas</p></li><li><p>los juicios de relevancia para las búsquedas (también conocidos como <code>qrels</code>).</p></li></ul><p>Las evaluaciones de relevancia se ofrecen como una puntuación que es igual a cero o mayor. Las puntuaciones no nulas indican que el documento está algo relacionado con la búsqueda.</p><p>Set de datos</p><p>Tamaño del corpus</p><p>#Búsquedas en el conjunto de pruebas</p><p>#qrels etiquetados positivamente</p><p>#qrels igual a cero</p><p>#duplicados en el corpus</p><p>Arguana</p><p>8,674</p><p>1,406</p><p>1,406</p><p>0</p><p>96</p><p>Climate-FEVER</p><p>5,416,593</p><p>1,535</p><p>4,681</p><p>0</p><p>0</p><p>DBPedia</p><p>4,635,922</p><p>400</p><p>15,286</p><p>28,229</p><p>0</p><p>FEVER</p><p>5,416,568</p><p>6,666</p><p>7,937</p><p>0</p><p>0</p><p>FiQA-2018</p><p>57,638</p><p>648</p><p>1,706</p><p>0</p><p>0</p><p>HotpotQA</p><p>5,233,329</p><p>7,405</p><p>14,810</p><p>0</p><p>0</p><p>Preguntas naturales</p><p>2,681,468</p><p>3,452</p><p>4,021</p><p>0</p><p>16,781</p><p>NFCorpus</p><p>3,633</p><p>323</p><p>12,334</p><p>0</p><p>80</p><p>Quora</p><p>522,931</p><p>10,000</p><p>15,675</p><p>0</p><p>1,092</p><p>SCIDOCS</p><p>25,657</p><p>1000</p><p>4,928</p><p>25,000</p><p>2</p><p>SciFact</p><p>5,183</p><p>300</p><p>339</p><p>0</p><p>0</p><p>Touche2020</p><p>382,545</p><p>49</p><p>932</p><p>1,982</p><p>5,357</p><p>TREC-COVID</p><p>171,332</p><p>50</p><p>24,763</p><p>41,663</p><p>0</p><p>MSMARCO</p><p>8,841,823</p><p>6,980</p><p>7,437</p><p>0</p><p>324</p><p>CQADupstack (suma)</p><p>457,199</p><p>13 145</p><p>23,703</p><p>0</p><p>0</p><p><strong>Tabla 1</strong>: Estadísticas de los sets de datos. Los números se calcularon en la parte de prueba de los sets de datos (<code>dev</code> para <code>MSMARCO</code>).</p><p>La <strong>Tabla 1</strong> presenta algunas estadísticas para los sets de datos que comprenden el índice de referencia <code>BEIR</code>, como la cantidad de documentos en el corpus, la cantidad de búsquedas en el set de datos de prueba y la cantidad de pares positivos/negativos (búsqueda, documento) en el archivo <code>qrels</code>. Con una rápida mirada a los datos podemos inferir inmediatamente lo siguiente:</p><ul><li><p>La mayoría de los sets de datos no contienen relaciones negativas en el archivo <code>qrels</code>, es decir, puntuaciones cero, lo que indicaría explícitamente que los documentos son irrelevantes para la búsqueda dada.</p></li><li><p>La cantidad promedio de relaciones de documentos por búsqueda (<code>#qrels</code> / <code>#queries</code>) varía desde 1.0 en el caso de <code>ArguAna</code> hasta 493.5 (<code>TREC-COVID</code>), pero con un valor de <code>&lt;</code>5 para la mayoría de los casos.</p></li><li><p>Algunos sets de datos tienen documentos duplicados en el corpus, lo que en algunos casos puede conducir a una evaluación incorrecta, es decir, cuando un documento se considera relevante para una búsqueda, pero su duplicado no lo es. Por ejemplo, en <code>ArguAna</code> hemos identificado 96 casos de pares de documentos duplicados con solo un documento por par marcado como relevante para una búsqueda. Al “expandir” la lista inicial de qrels para incluir también los duplicados, hemos observado un aumento relativo de ~1 % en la puntuación <code>nDCG@10</code> en promedio.</p></li></ul>{
  "_id": "test-economy-epiasghbf-pro02b",
  "title": "economic policy international africa society gender house believes feminisation",
  "text": "Again employment needs to be contextualised with …",
  "metadata": {}
}
{
  "_id": "test-society-epiasghbf-pro02b",
  "title": "economic policy international africa society gender house believes feminisation",
  "text": "Again employment needs to be contextualised with …",
  "metadata": {}
}
<p><strong>Ejemplo de pares duplicados en ArguAna. En el archivo qrels solo el primero parece ser relevante (como contra-argumento) para la búsqueda (“test-economy-epiasghbf-pro02a”)</strong></p><p>Al comparar modelos en la tabla de líderes de MTEB, es tentador centrarse en la calidad promedio de recuperación. Es un buen indicador de la calidad general del modelo, pero no necesariamente te dice cómo se aplicará en tu caso. Dado que los resultados se reportan por conjunto de datos, vale la pena entender hasta qué punto los diferentes conjuntos de datos se relacionan con tu tarea de búsqueda y volver a calificar modelos usando solo los más relevantes. Si quieres profundizar más, también puedes verificar si hay superposición de temas con los diversos conjuntos de datos. Estratificar las medidas de calidad por tema ofrece una evaluación mucho más detallada de sus fortalezas y debilidades específicas.</p><p>Una nota importante aquí es que cuando un documento no está marcado en el archivo <code>qrels</code>, por defecto, se considera irrelevante para la búsqueda. Nos adentramos un poco más en esta área y recopilamos algunas pruebas para aclarar la siguiente pregunta: “¿Con qué frecuencia se presentan pares al evaluador (búsqueda, documento) para los cuales no hay información fidedigna?”. La razón por la que esto es importante es que cuando solo se dispone de marcado superficial (y, por lo tanto, no todos los documentos relevantes están etiquetados como tales), un sistema de recuperación de información puede ser juzgado como peor que otro simplemente porque "elige" mostrar diferentes documentos relevantes (pero no marcados). Este es un problema habitual a la hora de crear conjuntos de evaluación de alta calidad, especialmente en el caso de sets de datos de gran tamaño. Para ser factible, el etiquetado manual generalmente se enfoca en los principales resultados devueltos por el sistema actual, por lo que potencialmente se pierden documentos relevantes en sus puntos ciegos. Por lo tanto, generalmente es preferible enfocar más recursos en un marcado más completo de menos búsquedas que en un marcado amplio y superficial.</p><h2>Aprovechar el índice de referencia BEIR para la evaluación de relevancia en búsquedas</h2><p>Para iniciar nuestro análisis implementamos el siguiente escenario (ver el <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/evaluating-search-relevance-part-1/retrieve-and-rerank.ipynb">cuaderno</a>):</p><ol><li><p>En primer lugar, cargamos el corpus de cada set de datos en un índice de Elasticsearch.</p></li><li><p>Para cada búsqueda en el conjunto de pruebas, recuperamos los 100 documentos principales con BM25.</p></li><li><p>Volvemos a clasificar los documentos recuperados utilizando una variedad de modelos de reclasificación SOTA.</p></li><li><p>Finalmente, presentamos el reporte de la “tasa de evaluación” para los 10 documentos principales que provienen de los pasos 2 (después de la recuperación) y 3 (después de la reclasificación). En otras palabras, calculamos el porcentaje promedio de los 10 documentos principales que tienen una puntuación en el archivo <code>qrels</code>.</p></li></ol><p>La lista de reclasificación de modelos que utilizamos es la siguiente:</p><ul><li><p><code>rerank-english-v2.0</code> de <a href="https://docs.cohere.com/reference/rerank">Cohere</a> y <code>rerank-english-v3.0</code></p></li><li><p><a href="https://huggingface.co/BAAI/bge-reranker-base">BGE-base</a></p></li><li><p><a href="https://huggingface.co/mixedbread-ai/mxbai-rerank-xsmall-v1">mxbai-rerank-xsmall-v1</a></p></li><li><p><a href="https://huggingface.co/cross-encoder/ms-marco-MiniLM-L-6-v2">MiniLM-L-6-v2</a></p></li></ul><p></p><p>Recuperación</p><p>Reclasificación</p><p></p><p></p><p></p><p></p><p>Set de datos</p><p>BM25 (%)</p><p>Cohere Rerank v2 (%)</p><p>Cohere Rerank v3 (%)</p><p>BGE-base (%)</p><p>mxbai-rerank-xsmall-v1 (%)</p><p>MiniLM-L-6-v2 (%)</p><p>Arguana</p><p>7.54</p><p>4.87</p><p>7.87</p><p>4.52</p><p>4.53</p><p>6.84</p><p>Climate-FEVER</p><p>5.75</p><p>6.24</p><p>8.15</p><p>9.36</p><p>7.79</p><p>7.58</p><p>DBPedia</p><p>61.18</p><p>60.78</p><p>64.15</p><p>63.9</p><p>63.5</p><p>67.62</p><p>FEVER</p><p>8.89</p><p>9.97</p><p>10.08</p><p>10.19</p><p>9.88</p><p>9.88</p><p>FiQA-2018</p><p>7.02</p><p>11.02</p><p>10.77</p><p>8.43</p><p>9.1</p><p>9.44</p><p>HotpotQA</p><p>12.59</p><p>14.5</p><p>14.76</p><p>15.1</p><p>14.02</p><p>14.42</p><p>Preguntas naturales</p><p>5.94</p><p>8.84</p><p>8.71</p><p>8.37</p><p>8.14</p><p>8.34</p><p>NFCorpus</p><p>31.67</p><p>32.9</p><p>33.91</p><p>30.63</p><p>32.77</p><p>32.45</p><p>Quora</p><p>12.2</p><p>10.46</p><p>13.04</p><p>11.26</p><p>12.58</p><p>12.78</p><p>SCIDOCS</p><p>8.62</p><p>9.41</p><p>9.71</p><p>8.04</p><p>8.79</p><p>8.52</p><p>SciFact</p><p>9.07</p><p>9.57</p><p>9.77</p><p>9.3</p><p>9.1</p><p>9.17</p><p>Touche2020</p><p>38.78</p><p>30.41</p><p>32.24</p><p>33.06</p><p>37.96</p><p>33.67</p><p>TREC-COVID</p><p>92.4</p><p>98.4</p><p>98.2</p><p>93.8</p><p>99.6</p><p>97.4</p><p>MSMARCO</p><p>3.97</p><p>6.00</p><p>6.03</p><p>6.07</p><p>5.47</p><p>6.11</p><p>CQADupstack (promedio)</p><p>5.47</p><p>6.32</p><p>6.87</p><p>5.89</p><p>6.22</p><p>6.16</p><p><strong>Tabla 2</strong>: Tasa de evaluación por pares (set de datos, reclasificador) calculada en los 10 primeros documentos recuperados/reclasificados</p><p>Desde <strong>Tabla 2</strong>, con la excepción de <code>TREC-COVID</code> (&gt;90 % de cobertura), <code>DBPedia</code> (~65 %), <code>Touche2020</code> y <code>nfcorpus</code> (~35 %), vemos que la mayoría de los sets de datos tienen una tasa de etiquetado entre el 5 % y un poco más del 10 % después de la recuperación o reclasificación. Esto no significa que todos estos documentos no marcados sean relevantes, pero podría haber un subconjunto de ellos, especialmente aquellos ubicados en las posiciones superiores, que podrían ser positivos.</p><p>Con la llegada de los modelos de lenguaje ajustados mediante instrucciones de propósito general, tenemos una nueva herramienta poderosa que potencialmente puede automatizar la evaluación de la relevancia. Estos métodos suelen ser demasiado costosos en cuanto a la complejidad de los procesos para ser utilizados en línea para la búsqueda, pero aquí nos preocupa la evaluación fuera de línea. A continuación, los usamos para explorar la evidencia de que algunos de los sets de datos BEIR tienen un marcado superficial.</p><p>Para investigar más a fondo esta hipótesis, decidimos centrarnos en MSMARCO y seleccionar un subconjunto de 100 búsquedas junto con los 5 principales documentos reclasificados (con Cohere v2) que actualmente no están marcados como relevantes. Seguimos dos caminos diferentes de evaluación: Primero, usamos un indicador cuidadosamente ajustado (veremos más sobre esto en una publicación posterior) para preparar el modelo <a href="https://huggingface.co/microsoft/Phi-3-mini-4k-instruct">Phi-3-mini-4k</a> recientemente lanzado para predecir la relevancia (o no) de un documento para la búsqueda. Paralelamente, estos casos también se etiquetaron manualmente para evaluar la tasa de concordancia entre el resultado del LLM y el juicio humano. En general, podemos extraer estas dos conclusiones:</p><ul><li><p>La tasa de acuerdo entre las respuestas de los LLM y los juicios humanos fue cercana al 80 %, lo que parece suficiente como punto de partida en esa dirección.</p></li><li><p>En el 57.6 % de los casos (basado en el juicio humano) se descubrió que los documentos devueltos eran realmente relevantes para la búsqueda. Para decirlo de otra manera: Para 100 búsquedas tenemos 107 documentos considerados relevantes, ¡pero al menos 0.576 x 5 x 100 = 288 documentos adicionales que son realmente relevantes!</p></li></ul><p>Aquí, algunos ejemplos extraídos del set de datos <code>MSMARCO</code>/<code>dev</code> que contienen la búsqueda, el documento positivo anotado (de <code>qrels</code>) y un documento falso negativo debido a un marcado incompleto:</p><p>Ejemplo 1:</p>{
  "query":
    {
        "_id": 155234,
        "text": "do bigger tires affect gas mileage"
    },
  "positive_doc":
    {
        "_id": 502713,
        "text": "Tire Width versus Gas Mileage. Tire width is one of the only tire size factors that can influence gas mileage in a positive way. For example, a narrow tire will have less wind resistance, rolling resistance, and weight; thus increasing gas mileage.",
    },
    "negative_doc":
    {
        "_id": 7073658,
        "text": "Tire Size and Width Influences Gas Mileage. There are two things to consider when thinking about tires and their effect on gas mileage; one is wind resistance, and the other is rolling resistance. When a car is driving at higher speeds, it experiences higher wind resistance; this means lower fuel economy."
    }
}
<p>Ejemplo 2:</p>{
  "query":
    {
        "_id": 300674,
        "text": "how many years did william bradford serve as governor of plymouth colony?"
    },
  "positive_doc":
    {
        "_id": 7067032,
        "text": "http://en.wikipedia.org/wiki/William_Bradford_(Plymouth_Colony_governor) William Bradford (c.1590 \u00e2\u0080\u0093 1657) was an English Separatist leader in Leiden, Holland and in Plymouth Colony was a signatory to the Mayflower Compact. He served as Plymouth Colony Governor five times covering about thirty years between 1621 and 1657."
    },
    "negative_doc":
    {
        "_id": 2495763,
        "text": "William Bradford was the governor of Plymouth Colony for 30 years. The colony was founded by people called Puritans. They were some of the first people from England to settle in what is now the United States. Bradford helped make Plymouth the first lasting colony in New England."
    }
}
<p>La evaluación manual de búsquedas específicas como esta es una técnica generalmente útil para comprender la calidad de la búsqueda que complementa las medidas cuantitativas como nDCG@10. Si tienes un conjunto representativo de búsquedas que siempre ejecutas al hacer cambios en la búsqueda, te proporciona información cualitativa importante sobre cómo cambia el rendimiento, lo cual es invisible en las estadísticas. Por ejemplo, te da mucha más información sobre los resultados falsos que devuelve la búsqueda: puede ayudarte a detectar errores evidentes en los resultados recuperados, clases de errores relacionados, como malinterpretar terminología específica de un dominio, y así sucesivamente.</p><p>Nuestro resultado concuerda con la investigación relevante sobre la evaluación de <code>MSMARCO</code>. Por ejemplo, <a href="https://arxiv.org/pdf/2109.00062">Arabzadeh et al.</a> siguen un procedimiento similar en el que emplean trabajadores de crowdsourcing para hacer juicios de preferencia: entre otros puntos, muestran que en muchos casos se prefieren los documentos devueltos por los módulos de reclasificación en comparación con los documentos del archivo MSMARCO <code>qrels</code>. Otra evidencia proviene de los autores del reclasificador <a href="https://arxiv.org/pdf/2010.08191">RocketQA</a> quienes en su reporte indican que más del 70 % de los documentos reclasificados se consideraron relevantes luego de la inspección manual.</p><p> Actualización - 9 de septiembre: Tras una cuidadosa reevaluación del set de datos, identificamos 15 casos más de documentos relevantes, lo que aumenta el total de 273 a 288</p><h2>Principales puntos clave y próximos pasos</h2><ul><li><p>La búsqueda de mejores datos fidedignos es interminable, ya que es de vital importancia para la evaluación comparativa y la comparación de modelos. Los LLM pueden ayudar en algunas áreas de evaluación si se usan con precaución y se ajustan con las instrucciones adecuadas.</p></li><li><p>De forma más general, dado que los índices de referencia nunca serán perfectos, podría ser preferible pasar de una comparación pura de puntaje a técnicas más sólidas que capturen diferencias estadísticamente significativas. El trabajo de <a href="https://arxiv.org/pdf/2109.00062">Arabzadeh et al.</a> ofrece un buen ejemplo de esto, donde, basándose en sus hallazgos, crean intervalos de confianza del 95 % que indican diferencias significativas (o no) entre las distintas secuencias. En el <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/evaluating-search-relevance-part-1/retrieve-and-rerank.ipynb">cuaderno</a> adjunto se encuentra una implementación de intervalos de confianza usando <a href="https://en.wikipedia.org/wiki/Bootstrapping_(statistics)">bootstrapping</a>.</p></li><li><p>Desde la perspectiva del usuario final, es útil pensar en la alineación de tareas al leer los resultados de los índices de referencia. Por ejemplo, para un ingeniero de IA que crea una pipeline RAG y sabe que el caso de uso más típico implica ensamblar múltiple información de diferentes fuentes, sería más significativo evaluar el rendimiento de su modelo de recuperación en sets de datos de QA multisaltos, como HotpotQA, en lugar de la media global de todo el índice de referencia BEIR</p></li></ul><p>En la <a href="https://www.elastic.co/search-labs/blog/evaluating-search-relevance-part-2">próxima publicación del blog</a> profundizaremos en el uso de Phi-3 como juez de LLM y en el proceso de ajustarlo para predecir su relevancia.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/evaluating-search-relevance-part-1</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/evaluating-search-relevance-part-1</guid>
    <category><![CDATA[Investigación en ML]]></category>
    <category><![CDATA[Python]]></category>
    <dc:creator><![CDATA[Thanos Papaoikonomou,Thomas Veasey]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt9d9912c8d4187096/6a1704f5b0367d30e672bc17/54a6e5197f5721b36fc65f27387d29803ed35589-721x420.jpg" length="0" type="image/jpeg"/>
    <pubDate>Tue, 16 Jul 2024 00:00:00 GMT</pubDate>
  </item>
  </channel>
</rss>