<?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[Sachin Frayne - 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[Sachin Frayne - Elasticsearch Labs]]></title>
      <url>https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1121c0bf0e8a6e65/6a88da6340a1841030ef456f/search-labs-thumbnail.png</url>
      <link>https://www.elastic.co/fr/search-labs/author/sachin-frayne</link>
    </image>
    <link>https://www.elastic.co/fr/search-labs/author/sachin-frayne</link>
    <atom:link href="https://www.elastic.co/fr/search-labs/rss/author/sachin-frayne.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[fr]]></language>
    <lastBuildDate>Wed, 16 Sep 2026 11:05:50 GMT</lastBuildDate>
  <item>
    <title><![CDATA[La recherche vectorielle Elasticsearch est jusqu'à 8 fois plus rapide qu'OpenSearch]]></title>
    <description><![CDATA[Exploration des benchmarks de recherche vectorielle filtrée entre OpenSearch et Elasticsearch et pourquoi la performance de la recherche vectorielle est critique pour les systèmes d’ingénierie de contexte.]]></description>
    <content:encoded><![CDATA[<h2>Pourquoi la vitesse de recherche est importante pour les agents IA et l'ingénierie du contexte</h2><p>Sur un corpus de 20 millions de documents, nos benchmarks révèlent qu’Elasticsearch multiplie par 8 le débit d’OpenSearch en recherche vectorielle filtrée, avec un Recall@100 supérieur dans toutes les configurations évaluées. L’ingénierie de contexte va au-delà de la performance brute de la récupération vectorielle. Une pertinence maîtrisée (recherche hybride, filtrage), une exploitation simplifiée et des performances constantes sont tout aussi essentielles pour les équipes lors de l’évolution de leurs workflows. Comme les agents effectuent fréquemment des cycles itératifs de récupération et de raisonnement pour chaque demande, la latence de recherche agit comme un facteur multiplicatif. Toute optimisation ici améliore donc instantanément la réactivité de bout en bout et diminue les coûts d’exploitation.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt9daec868eed84658/6a170bef6234e0c322db1a19/d5a52a07773f0942c2baa732dacfe782aac0f415-1600x683.png" alt="OpenSearch vs Elasticsearch : Benchmark du débit pour la recherche vectorielle filtrée" /><p>Pour l'ingénierie du contexte, la récupération n'est pas une étape unique. Les agents et les applications effectuent de manière répétée des exécutions de boucles, telles que récupérer → raisonner → récupérer, pour affiner les requêtes, vérifier les faits, assembler un contexte étayé et accomplir les tâches. Ce schéma est courant dans les workflows d'agents et la Retrieval-Augmented Generation (RAG) itérative. Comme la récupération peut être sollicitée de nombreuses fois pour une seule requête utilisateur, elle ajoute un délai à la réponse et/ou augmente les coûts d’infrastructure.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt718c72fb858e4c98/6a170bf00e2e496e7241a132/54ac476ff20a3cf93484298c9ae47612c12fc110-800x417.png" alt="L’ingénierie de contexte transforme un vaste ensemble de données contextuelles en une fenêtre de contexte limitée pour le LLM." /><h2>Pourquoi la performance de la recherche vectorielle est-elle critique ?</h2><p></p><p>Imaginez la réponse d’un assistant d’achat à cette requête : « Il me faut un sac à dos de type bagage à main à moins de 60 $, adapté à un ordinateur de 15 pouces, résistant à l’eau et disponible en livraison d’ici vendredi. »</p><p>Dans un environnement de production, il est rare que l’assistant lance une unique recherche vectorielle et en reste là. L’assistant lance une boucle de recherche afin d’élaborer le bon contexte, chaque phase étant soumise à des filtres précis : disponibilité, zone géographique, délais de livraison, image de marque ou encore conformité aux politiques internes.</p><p><strong>Étape 1 : interpréter l'intention et traduire en contraintes.</strong></p><p>L’agent transforme la requête en filtres structurés et en une recherche sémantique, comme suit :</p><ul><li><p>Filtres : en stock, livrable à l'utilisateur à son code postal, livraison avant vendredi, prix inférieur à 60 $, annonce valide</p></li><li><p>Requête vectorielle : « Sac à dos cabine ordinateur 15 pouces résistant à l’eau »</p></li></ul><p><strong>Étape 2 : récupérer les candidats, puis affiner.</strong></p><p>Elle répète souvent la récupération avec des variantes afin de ne pas manquer de bonnes correspondances :</p><ul><li><p>« sac à dos de voyage cabine compartiment ordinateur »</p></li><li><p>« sac à dos de trajet quotidien, résistant à l’eau, ordinateur 15 pouces »</p></li><li><p>« sac à dos de cabine léger »</p></li></ul><p>Chaque requête utilise les mêmes filtres d’éligibilité, car récupérer des éléments non pertinents ou indisponibles constitue un gaspillage de contexte.</p><p><strong>Étape 3 : Élargir la recherche pour confirmer les détails et réduire les risques.</strong></p><p>L’agent effectue une récupération supplémentaire pour valider les attributs déterminants du résultat final :</p><ul><li><p>Formulation concernant les matériaux et la résistance à l’eau</p></li><li><p>Dimensions et compatibilité du compartiment pour ordinateur portable</p></li><li><p>Modalités de retour et clauses de garantie</p></li><li><p>Options alternatives en cas de stock faible</p></li></ul><p>Ceci est l'ingénierie contextuelle en plusieurs étapes : Récupérer, raisonner, récupérer, assembler.</p><h2>L’importance de la latence et du rappel dans l’ingénierie de contexte</h2><p>Ces interactions peuvent impliquer des dizaines d’appels de récupération filtrés par session utilisateur. La latence par appel est donc un multiplicateur direct du temps de réponse de bout en bout, et un faible taux de rappel oblige à des tentatives supplémentaires ou amène l'agent à manquer des éléments éligibles, ce qui dégrade la qualité de la réponse.</p><p>À retenir : Dans les systèmes d’ingénierie de contexte, la recherche filtrée des plus proches voisins (ANN) n’est pas une simple requête unique. C’est une suite d’opérations sous contraintes : la performance de la recherche vectorielle se traduit donc directement en termes de latence, de débit et de coûts, alors même que le LLM capte toute l’attention en surface.</p><h2>Évaluation comparative</h2><h3>Résultats</h3><p>Dans le graphe 2, chaque point représente une configuration de test. Les performances optimales apparaissent dans le coin supérieur gauche : c’est là que le rappel est le plus important et la latence la plus réduite. Les données d’Elasticsearch se rapprochent davantage du coin supérieur gauche que celles d’OpenSearch, signe d’une vitesse et d’une précision accrues pour une même charge de travail.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltb562b30a600cc8e1/6a170bf2cf4f253582b2d1b2/c50d1df00968cac18149a2799e6242fbe49b66a0-1600x990.png" alt=" Graphe 2 : rappel contre latence moyenne (rescore 1)." /><h4>Quelques informations clés</h4><ul><li><p><code>s_n_r_value</code>: Abréviation pour <code>size_numCandidates_rescoreOversample</code> (k et numCandidates sont égaux à numCandidates dans ces tests) ; par exemple, <code>100_500_1</code> signifie taille=100, candidats=500 et k=500, rescore oversample=1</p></li><li><p>Rappel : Mesure du Rappel@100 pour cette configuration spécifique</p></li><li><p>Latence moyenne (ms) : Temps de réponse moyen de bout en bout par requête</p></li><li><p>Débit : requêtes par seconde (QPS)</p></li><li><p>Pourcentage de rappel : Amélioration relative du rappel pour Elasticsearch comparativement à OpenSearch ((Elasticsearch - OpenSearch) / OpenSearch)</p></li><li><p>Latence Xs : latence moyenne d'OpenSearch divisée par la latence moyenne d'Elasticsearch</p></li><li><p>Débit Xs : débit Elasticsearch divisé par le débit OpenSearch</p></li></ul><p>Moteur</p><p>`s_n_r_value`</p><p>Rappel</p><p>Latence moyenne (ms)</p><p>Débit</p><p>Rappel %</p><p>Latence Xs</p><p>Débit Xs</p><p>Elasticsearch</p><p>100_250_1</p><p>0,7704</p><p>25</p><p>534,75</p><p>9,70 %</p><p>2,28</p><p>1,91</p><p>OpenSearch</p><p>100_250_1</p><p>0,7023</p><p>57,08</p><p>279,58</p><p></p><p></p><p></p><p>Elasticsearch</p><p>100_500_1</p><p>0,8577</p><p>25,42</p><p>524,14</p><p>7,20 %</p><p>2.4</p><p>2</p><p>OpenSearch</p><p>100_500_1</p><p>0,8001</p><p>60,9</p><p>262,12</p><p></p><p></p><p></p><p>Elasticsearch</p><p>100_750_1</p><p>0,8947</p><p>29,67</p><p>528,09</p><p>5,72 %</p><p>2,25</p><p>2,21</p><p>OpenSearch</p><p>100_750_1</p><p>0,8463</p><p>66,76</p><p>239,11</p><p></p><p></p><p></p><p>Elasticsearch</p><p>100_1000_1</p><p>0,9156</p><p>29,65</p><p>534,5</p><p>4,66 %</p><p>2,46</p><p>2,44</p><p>OpenSearch</p><p>100_1000_1</p><p>0,8748</p><p>72,88</p><p>219,01</p><p></p><p></p><p></p><p>Elasticsearch</p><p>100_1500_1</p><p>0,9386</p><p>31,84</p><p>497,3</p><p>3,38 %</p><p>2,71</p><p>2,68</p><p>OpenSearch</p><p>100_1500_1</p><p>0,9079</p><p>86,16</p><p>185,4</p><p></p><p></p><p></p><p>Elasticsearch</p><p>100_2000_1</p><p>0,9507</p><p>34,69</p><p>457,2</p><p>2,57 %</p><p>2,98</p><p>2,96</p><p>OpenSearch</p><p>100_2000_1</p><p>0,9269</p><p>103,36</p><p>154,55</p><p></p><p></p><p></p><p>Elasticsearch</p><p>100_2500_1</p><p>0,9582</p><p>37,9</p><p>418,43</p><p>1,99 %</p><p>3,28</p><p>3,26</p><p>OpenSearch</p><p>100_2500_1</p><p>0,9395</p><p>124,29</p><p>128,53</p><p></p><p></p><p></p><p>Elasticsearch</p><p>100_3000_1</p><p>0,9636</p><p>41,86</p><p>379,4</p><p>1,62 %</p><p>3,46</p><p>3,44</p><p>OpenSearch</p><p>100_3000_1</p><p>0,9482</p><p>144,67</p><p>110,34</p><p></p><p></p><p></p><p>Elasticsearch</p><p>100_4000_1</p><p>0,9705</p><p>50,28</p><p>316,21</p><p>1,06 %</p><p>3,87</p><p>3,85</p><p>OpenSearch</p><p>100_4000_1</p><p>0,9603</p><p>194,36</p><p>82,22</p><p></p><p></p><p></p><p>Elasticsearch</p><p>100_5000_1</p><p>0,9749</p><p>58,77</p><p>270,91</p><p>0,73 %</p><p>4,43</p><p>4,41</p><p>OpenSearch</p><p>100_5000_1</p><p>0,9678</p><p>260,33</p><p>61,38</p><p></p><p></p><p></p><p>Elasticsearch</p><p>100_6000_1</p><p>0,9781</p><p>66,75</p><p>238,59</p><p>0,52 %</p><p>4,91</p><p>4,89</p><p>OpenSearch</p><p>100_6000_1</p><p>0,973</p><p>327,44</p><p>48,81</p><p></p><p></p><p></p><p>Elasticsearch</p><p>100_7000_1</p><p>0,9804</p><p>74,64</p><p>213,49</p><p>0,38 %</p><p>5,28</p><p>5,27</p><p>OpenSearch</p><p>100_7000_1</p><p>0,9767</p><p>394,24</p><p>40,53</p><p></p><p></p><p></p><p>Elasticsearch</p><p>100_8000_1</p><p>0,9823</p><p>82,28</p><p>193,59</p><p>0,27 %</p><p>6,86</p><p>6,83</p><p>OpenSearch</p><p>100_8000_1</p><p>0,9797</p><p>564,14</p><p>28,33</p><p></p><p></p><p></p><p>Elasticsearch</p><p>100_9000_1</p><p>0,9837</p><p>90,08</p><p>176,96</p><p>0,16 %</p><p>7,63</p><p>7,61</p><p>OpenSearch</p><p>100_9000_1</p><p>0,9821</p><p>687,25</p><p>23,25</p><p></p><p></p><p></p><p>Elasticsearch</p><p>100_10000_1</p><p>0,9848</p><p>97,64</p><p>163,31</p><p>0,08 %</p><p>8,38</p><p>8,36</p><p>OpenSearch</p><p>100_10000_1</p><p>0,984</p><p>818,64</p><p>19,53</p><p></p><p></p><p></p><p>Par exemple, à <code>100_9000_1</code>, OpenSearch enregistre en moyenne 687 millisecondes par extraction, contre 90 millisecondes pour Elasticsearch, et dans une boucle de récupération en 10 étapes, cela représente environ 10 × (687 - 90) = six secondes de temps d’attente supplémentaire. </p><p>Découvrez les <a href="https://github.com/elastic/competitive-benchmarking-studies/tree/main/es-9.3-vs-os-3.5-vector-search/jingra/results/20260220">résultats complets</a>.</p><h3>Méthodologie</h3><p>À l’aide de Python pour l’envoi des requêtes et le suivi de la latence ainsi que des données statistiques, nous avons soumis les requêtes suivantes aux moteurs. N’oubliez pas que l’efficacité d’un moteur vectoriel repose sur l’ajustement de ses paramètres clés : le nombre de candidats analysés, le niveau d’agressivité du score de pertinence et la quantité de contexte fournie en retour. Ces configurations agissent directement sur le rappel (l’assurance de ne pas manquer la réponse adéquate) et sur la latence (la vélocité du traitement).</p><p>Pour nos tests, nous avons conservé les mêmes réglages de sélection de candidats, de nouveau calcul de score et de dimension de contexte que ceux d’un cycle de récupération itératif, puis nous avons mesuré l’efficacité d’Elasticsearch face à ce volume de données. Par la suite, nous avons testé OpenSearch avec une configuration identique afin d’établir un point de comparaison.</p><p>OpenSearch</p>GET &lt;INDEX_NAME&gt;/_search
{
  "query": {
    "knn": {
      "&lt;DENSE_VECTOR_FIELD_NAME&gt;": {
        "vector": [...],
        "k": &lt;NUMBER_OF_CANDIDATES&gt;,
        "method_parameters": {
          "ef_search": &lt;NUMBER_OF_CANDIDATES&gt;
        },
        "rescore": {
          "oversample_factor": &lt;OVERSAMPLE&gt;
        },
        "filter": {
          &lt;SOME_FILTER&gt;
        }
      }
    }
  },
  "size": &lt;RESULT_SIZE&gt;,
  "_source": {
    "excludes": [
      "&lt;DENSE_VECTOR_FIELD_NAME&gt;"
    ]
  }
}<ul><li><p><code>"size": &lt;RESULT_SIZE&gt;</code>: Nombre de résultats renvoyés au client. Pour ce benchmark, nous avons défini une taille de résultat de 100 pour l’évaluation du Rappel@100.</p></li><li><p><code>"k": &lt;NUMBER_OF_CANDIDATES&gt;</code>: Le nombre de candidats voisins les plus proches.</p></li><li><p><code>"ef_search": &lt;NUMBER_OF_CANDIDATES&gt;</code>: Lle nombre de vecteurs à examiner.</p></li><li><p><code>"oversample_factor": &lt;OVERSAMPLE&gt;</code>: Combien de vecteurs candidats sont récupérés avant réévaluation.</p></li></ul><p>Elasticsearch</p>GET &lt;INDEX_NAME&gt;/_search
{
  "query": {
    "knn": {
      "field": "&lt;DENSE_VECTOR_FIELD_NAME&gt;",
      "query_vector": [...],
      "k": &lt;NUMBER_OF_CANDIDATES&gt;,
      "num_candidates": &lt;NUMBER_OF_CANDIDATES&gt;,
      "rescore_vector": {
        "oversample": &lt;OVERSAMPLE&gt;
      },
      "filter": {
        &lt;SOME_FILTER&gt;
      }
    }
  },
  "size": &lt;RESULT_SIZE&gt;,
  "_source": {
    "excludes": [
      "&lt;DENSE_VECTOR_FIELD_NAME&gt;"
    ]
  }
}<ul><li><p><code>"size": &lt;RESULT_SIZE&gt;</code>: Nombre de résultats renvoyés au client. Pour ce benchmark, nous avons défini une taille de résultat de 100 pour l’évaluation du Rappel@100.</p></li><li><p><code>"k": &lt;NUMBER_OF_CANDIDATES&gt;</code>: Nombre de voisins les plus proches à renvoyer de chaque partition.</p></li><li><p><code>"num_candidates": &lt;NUMBER_OF_CANDIDATES&gt;</code>: Nombre de candidats au plus proche voisin à considérer par partition lors d'une opération de recherche <code>knn</code>.</p></li><li><p><code>"oversample": &lt;OVERSAMPLE&gt;</code>: Combien de vecteurs candidats sont récupérés avant réévaluation.</p></li></ul><p>Exemple</p><p><code>Knn</code> la requête, (<code>100_500_1</code>), serait la suivante :</p><p>OpenSearch</p>GET search_catalog_128/_search
{
  "query": {
    "knn": {
      "search_catalog_embedding": {
        "vector": [...],
        "k": 500,
        "method_parameters": {
          "ef_search": 500
        },
        "rescore": {
          "oversample_factor": 1
        },
        "filter": {
          "term": {
            "valid": true
          }
        }
      }
    }
  },
  "size": 100,
  "_source": {
    "excludes": [
      "search_catalog_embedding"
    ]
  }
}<p>Elasticsearch</p>GET search_catalog_128/_search
{
  "query": {
    "knn": {
      "field": "search_catalog_embedding",
      "query_vector": [...],
      "k": 500,
      "num_candidates": 500,
      "rescore_vector": {
        "oversample": 1
      },
      "filter": {
        "term": {
          "valid": true
        }
      }
    }
  },
  "size": 100,
  "_source": {
    "excludes": [
      "search_catalog_embedding"
    ]
  }
}<p>La configuration complète, ainsi que les scripts Terraform, les manifestes Kubernetes et le code de test de performance, sont disponibles dans ce <a href="https://github.com/elastic/competitive-benchmarking-studies">dépôt</a> dans le dossier <a href="https://github.com/elastic/competitive-benchmarking-studies/tree/main/es-9.3-vs-os-3.5-vector-search">es-9.3-vs-os-3.5-vector-search</a>.</p><h3>Configuration du clustering</h3><p>Nous avons utilisé six instances cloud de type e2-standard-16 pour nos tests, chacune équipée de 16 vCPUs et de 64 Go de mémoire vive. Nous avons configuré chaque pod Kubernetes hébergeant un node du moteur avec 15 vCPUs et 56 Go de RAM, en réservant 28 Go pour la mémoire de la JVM.</p><p>Les tests ont été effectués sur les versions 9.3.0 d’Elasticsearch et 3.5.0 d’OpenSearch. (Lucene 10,3,2). Comme les deux solutions reposent sur la même version de Lucene pour ce test, les écarts de performance constatés au niveau du débit et de la latence ne s’expliquent pas par le moteur de base, mais par la façon dont chaque plateforme orchestre la recherche kNN filtrée et les étapes de calcul de score. Pour ce test, nous avons configuré un index unique comportant trois shards primaires et une réplique (ce qui donne 6 partitions au total, soit 1 par node).</p><p>Nous avons par ailleurs mobilisé un serveur séparé, situé dans la même région, afin de faire tourner le client de test et de compiler les données de performance.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt7c7bdd567395d5b7/6a170bf3c1e8a56ee2f882f6/f81002c9186e4c2d3e92f49d72418fee9860fc5e-761x401.png" alt="Configuration de clustering pour Elasticsearch et pour les benchmarks OpenSearch" /><h3>L’ensemble de données</h3><p></p><p>Pour ce test de performance, nous avons exploité un catalogue e-commerce de 20 millions de documents (embeddings), afin de simuler une recherche vectorielle avec filtres à l’échelle d’une application de production.</p><p></p><p>Chaque document représente un élément de catalogue et comprend :</p><p></p><ul><li><p>Un vecteur dense à 128 dimensions utilisé pour la recherche approximative par kNN.</p></li><li><p>Champs de métadonnées structurés servant au filtrage (disponibilité, validité des produits, etc.), afin de simuler la récupération de vecteurs voisins restreinte à une sélection de données qualifiées, comme c’est souvent le cas en environnement réel.</p></li></ul><p></p><p>Nous avons opté pour ces données car elles reflètent la problématique critique des systèmes de production actuels : le besoin de filtrage systématique qui vient s’ajouter à la recherche vectorielle, exigeant une efficacité maximale tant en termes de précision que de rapidité. Par rapport à des bases de données de petite taille, l’utilisation de 20 millions de documents permet de mieux simuler la charge de travail et la complexité de sélection des candidats rencontrées par les moteurs de recherche vectorielle filtrée dans un environnement réel.</p><h2>Conclusion</h2><p>Pour les systèmes d’IA de nouvelle génération, notamment ceux qui reposent sur la gestion dynamique du contexte, la performance brute de la recherche par vecteurs est un élément structurant de l’expérience utilisateur. C’est un facteur multiplicateur. Dans les architectures où les agents enchaînent les étapes de recherche et de réflexion, l’efficacité de la récupération détermine non seulement la rapidité de la réponse finale, mais aussi la pertinence des informations transmises au LLM.</p><p>Elasticsearch a fait preuve d’une supériorité constante lors de nos tests, affichant un meilleur rappel et une latence réduite par rapport à OpenSearch, particulièrement lorsque la précision de la recherche repose sur l’identification du document spécifique plutôt que sur une vague ressemblance vectorielle. Sur un ensemble de données contrôlé, la différence est nette, et en production, ces gains s’accumulent au fil de volumes massifs d’appels de récupération, améliorant la réactivité, augmentant la marge de capacité et réduisant les coûts d’infrastructure.</p><h3>Lecture complémentaire</h3><ol><li><p><a href="https://www.elastic.co/search-labs/blog/context-engineering-overview">Qu'est-ce que l'ingénierie contextuelle ?</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/series/context-engineering-hybrid-search-evolution">L'évolution du rechercher hybride et de l'ingénierie contextuelle</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/context-engineering-relevance-ai-agents-elasticsearch">L'impact de la pertinence dans l'ingénierie du contexte pour les agents IA</a></p></li></ol>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/opensearch-vs-elasticsearch-filtered-vector-search</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/opensearch-vs-elasticsearch-filtered-vector-search</guid>
    <category><![CDATA[Base vectorielle]]></category>
    <dc:creator><![CDATA[Sachin Frayne]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4b38e5114bbf098c/6a170bf560084b3a6c3c459d/fb7ee623925ca6696d643e437ce8efe5fe749079-1280x720.png" length="0" type="image/png"/>
    <pubDate>Wed, 25 Feb 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Comment mettre en œuvre une meilleure quantification binaire (BBQ) dans votre cas d'utilisation ?]]></title>
    <description><![CDATA[Expliquez pourquoi vous devriez mettre en œuvre une meilleure quantification binaire (BBQ) dans votre cas d'utilisation et comment le faire.]]></description>
    <content:encoded><![CDATA[<p>La recherche vectorielle constitue la base de la mise en œuvre d'une recherche sémantique pour le texte ou d'une recherche de similarité pour les images, les vidéos ou les fichiers audio. Dans le cas de la recherche vectorielle, les vecteurs sont des représentations mathématiques de données qui peuvent être énormes et parfois lentes. La meilleure quantification binaire (ci-après dénommée BBQ) est une méthode de compression pour les vecteurs. Il vous permet de trouver les bonnes correspondances tout en réduisant les vecteurs pour les rendre plus rapides à rechercher et à traiter. Cet article traite de BBQ et de rescore_vector, un champ disponible uniquement pour les indices quantifiés et qui permet de rescorer automatiquement les vecteurs.</p><p>Toutes les requêtes complètes et les résultats mentionnés dans cet article peuvent être trouvés dans notre <a href="https://github.com/elastic/elasticsearch-labs/tree/main/supporting-blog-content/how-and-why-bbq">dépôt de code Elasticsearch Labs</a>.</p><h2>Pourquoi mettre en œuvre une meilleure quantification binaire (BBQ) dans votre cas d'utilisation ?</h2>Remarque : pour une compréhension approfondie du fonctionnement mathématique du BBQ, veuillez consulter la <a href="https://www.elastic.co/fr/search-labs/blog/bbq-implementation-into-use-case#further-learning">section "Apprentissage complémentaire"</a> ci-dessous. Dans le cadre de ce blog, l'accent est mis sur la mise en œuvre.<p>Bien que les mathématiques soient intrigantes, elles sont essentielles si vous voulez comprendre pourquoi vos recherches vectorielles restent précises. En fin de compte, il s'agit d'une question de compression, car il s'avère qu'avec les algorithmes actuels de recherche vectorielle, vous êtes limité par la vitesse de lecture des données. Par conséquent, si vous pouvez placer toutes ces données dans la mémoire, vous bénéficiez d'un gain de vitesse significatif par rapport à la lecture à partir du stockage<a href="https://sre.google/static/pdf/rule-of-thumb-latency-numbers-letter.pdf">(la mémoire est environ 200 fois plus rapide que les disques SSD</a>).</p><p>Il y a quelques points à garder à l'esprit :</p><ul><li><p>Les indices basés sur les graphes, tels que <a href="https://arxiv.org/pdf/1603.09320">HNSW</a> (Hierarchical Navigable Small World), sont les plus rapides pour la recherche vectorielle.</p><ul><li><p>HNSW : un algorithme de recherche approximative du plus proche voisin qui construit une structure de graphe multicouche pour permettre des recherches de similarité efficaces en haute dimension.</p></li></ul></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt760bd95c206bfa8f/6a17e2ad505ac393f7ad8a95/590f3b3c72a76023a38a0436cd9ff90a9f80e936-1964x1262.png" alt="HNSW : un algorithme de recherche approximative du plus proche voisin qui construit une structure de graphe multicouche pour permettre des recherches de similarité efficaces en haute dimension." /><ul><li><p>La vitesse de HNSW est fondamentalement limitée par la vitesse de lecture des données à partir de la mémoire ou, dans le pire des cas, à partir du stockage.</p><ul><li><p>L'idéal est de pouvoir charger tous les vecteurs stockés dans la mémoire.</p></li></ul></li><li><p>Les modèles d'intégration produisent généralement des vecteurs avec une précision float32, soit 4 octets par nombre à virgule flottante.</p></li><li><p>Enfin, selon le nombre de vecteurs et/ou de dimensions que vous avez, vous pouvez très rapidement manquer de mémoire pour conserver tous vos vecteurs.</p></li></ul><p>Si l'on prend cela pour acquis, on constate qu'un problème se pose rapidement dès que l'on commence à ingérer des millions, voire des milliards de vecteurs, chacun ayant potentiellement des centaines, voire des milliers de dimensions. La section intitulée "<a href="https://www.elastic.co/fr/search-labs/blog/bbq-implementation-into-use-case#approximate-numbers-on-the-compression-ratios">Chiffres approximatifs sur les taux de compression</a>" fournit quelques chiffres approximatifs.</p><h2>De quoi avez-vous besoin pour commencer ?</h2><p>Pour commencer, vous aurez besoin des éléments suivants :</p><ul><li><p>Si vous utilisez Elastic Cloud ou on-prem, vous aurez besoin d'une version d'Elasticsearch supérieure à 8.18. Alors que BBQ a été introduit dans la version 8.16, dans cet article, vous utiliserez <code>vector_rescore</code>, qui a été introduit dans la version 8.18.</p></li><li><p>En outre, vous devrez également vous assurer qu'il existe un <a href="https://www.elastic.co/fr/guide/en/elasticsearch/reference/8.18/ml-settings.html">nœud d'apprentissage automatique (ML)</a> dans votre cluster. (Remarque : un nœud ML doté d'un minimum de 4 Go est nécessaire pour charger le modèle, mais vous aurez probablement besoin de nœuds beaucoup plus grands pour des charges de travail de production complètes).</p></li><li><p>Si vous utilisez Serverless, vous devrez sélectionner une instance optimisée pour les vecteurs.</p></li><li><p>Vous aurez également besoin d'une connaissance de base des bases de données vectorielles. Si vous n'êtes pas encore familiarisé avec les concepts de recherche vectorielle dans Elastic, vous pouvez consulter les ressources suivantes :</p><ul><li><p><a href="https://www.elastic.co/fr/search-labs/blog/elastic-vector-database-practical-example">Naviguer dans une base de données vectorielle élastique</a></p></li><li><p><a href="https://www.elastic.co/fr/blog/retrieval-augmented-generation-explained">Les grandes idées derrière la génération augmentée de recherche</a></p></li></ul></li></ul><h2>Meilleure implémentation de la quantification binaire (BBQ)</h2><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt18df00df95ff2ca7/6a17e2af414c6411989450df/4d388078495566f0527e931e0c2e38facdce83c6-1503x748.png" alt="Mise en œuvre d'Elasticsearch bbq." /><p>Pour que ce blog reste simple, vous utiliserez les fonctions intégrées lorsqu'elles sont disponibles. Dans ce cas, vous disposez du modèle d'intégration vectorielle <a href="https://www.elastic.co/fr/guide/en/machine-learning/8.17/ml-nlp-e5.html"><code>.multilingual-e5-small</code></a> qui s'exécutera directement dans Elasticsearch sur un nœud d'apprentissage automatique. Notez que vous pouvez remplacer le modèle <code>text_embedding</code> par l'intégrateur de votre choix<a href="https://www.elastic.co/fr/guide/en/elasticsearch/reference/8.18/infer-service-openai.html">(OpenAI</a>, <a href="https://www.elastic.co/fr/guide/en/elasticsearch/reference/8.18/infer-service-google-ai-studio.html">Google AI Studio</a>, <a href="https://www.elastic.co/fr/guide/en/elasticsearch/reference/8.18/infer-service-cohere.html">Cohere</a> et bien d'autres). Si le modèle que vous préférez n'est pas encore intégré, vous pouvez également <a href="https://www.elastic.co/fr/guide/en/elasticsearch/reference/8.18/bring-your-own-vectors.html">apporter vos propres encastrements vectoriels denses</a>).</p><p>Tout d'abord, vous devrez créer un point final d'inférence pour générer des vecteurs pour un morceau de texte donné. Vous exécuterez toutes ces commandes à partir de la console Kibana <a href="https://www.elastic.co/fr/guide/en/kibana/8.18/console-kibana.html">Dev</a> Tools. Cette commande permet de télécharger le site <code>.multilingual-e5-small</code>. S'il n'existe pas encore, il configurera votre point d'accès ; cette opération peut prendre une minute. Vous pouvez voir le résultat attendu dans le fichier <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">01-create-an-inference-endpoint-output.json</a> dans le dossier Outputs. </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>Une fois qu'il est revenu, votre modèle est configuré et vous pouvez tester que le modèle fonctionne comme prévu à l'aide de la commande suivante. Vous pouvez voir le résultat attendu dans le fichier <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/how-and-why-bbq/Outputs/02-embed-text-output.json">02-embed-text-output.json</a> dans le dossier Outputs.</p>POST _inference/text_embedding/my_e5_model
{
  "input": "my awesome piece of text"
}<p>Si vous rencontrez des problèmes liés au fait que votre modèle formé n'est affecté à aucun nœud, il se peut que vous deviez démarrer votre modèle manuellement.</p>POST _ml/trained_models/.multilingual-e5-small/deployment/_start<p>Créons maintenant un nouveau mappage avec deux propriétés, un champ de texte standard (<code>my_field</code>) et un champ vectoriel dense (<code>my_vector</code>) avec 384 dimensions pour correspondre à la sortie du modèle d'intégration. Vous pouvez également passer outre l'adresse <code>index_options.type to bbq_hnsw</code>. Vous pouvez voir le résultat attendu dans le fichier <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">03-create-byte-qauntized-index-output.json</a> dans le dossier Outputs.</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>Pour s'assurer qu'Elasticsearch génère vos vecteurs, vous pouvez utiliser un <a href="https://www.elastic.co/fr/guide/en/elasticsearch/reference/8.18/ingest.html">pipeline d'ingestion</a>. Ce pipeline nécessite trois éléments : le point final (<code>model_id</code>), le site <code>input_field</code> pour lequel vous souhaitez créer des vecteurs et le site <code>output_field</code> dans lequel vous souhaitez stocker ces vecteurs. La première commande ci-dessous crée un pipeline d'ingestion d'inférence, qui utilise le <a href="https://www.elastic.co/fr/guide/en/elasticsearch/reference/current/inference-apis.html">service d'inférence </a>sous le capot, et la seconde teste le bon fonctionnement du pipeline. Vous pouvez voir le résultat attendu dans le fichier <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">04-create-and-simulate-ingest-pipeline-output.json</a> dans le dossier Outputs. </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>Vous êtes maintenant prêt à ajouter des documents à l'aide des deux premières commandes ci-dessous et à tester le fonctionnement de vos recherches à l'aide de la troisième commande. Vous pouvez vérifier le résultat attendu dans le fichier <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/how-and-why-bbq/Outputs/05-bbq-index-output.json">05-bbq-index-output.json</a> dans le dossier Outputs. </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>Comme nous l'avons recommandé dans <a href="https://www.elastic.co/fr/search-labs/blog/better-binary-quantization-lucene-elasticsearch#lucene-benchmarking">cet article</a>, le recalage et le suréchantillonnage sont conseillés lorsque vous passez à des quantités de données non triviales, car ils permettent de maintenir une précision de rappel élevée tout en bénéficiant des avantages de la compression. À partir de la version 8.18 d'Elasticsearch, vous pouvez le faire de cette façon en utilisant <a href="https://www.elastic.co/fr/guide/en/elasticsearch/reference/8.18/knn-search.html#dense-vector-knn-search-rescoring">rescore_vector.</a> Le résultat attendu se trouve dans le fichier <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">06-bbq-search-8-18-output.json</a> dans le dossier 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>Comment ces résultats se comparent-ils à ceux que vous obtiendriez avec des données brutes ? Si vous refaites tout ce qui précède mais avec <code>index_options.type: hnsw</code>, vous verrez que les scores sont très comparables. Vous pouvez voir le résultat attendu dans le fichier <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/how-and-why-bbq/Outputs/07-raw-vector-output.json">07-raw-vector-output.json</a> dans le dossier Outputs.</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>Chiffres approximatifs sur les taux de compression</h2><p>Les exigences en matière de stockage et de mémoire peuvent rapidement devenir un défi important lorsque l'on travaille avec la recherche vectorielle. La décomposition suivante illustre comment les différentes techniques de quantification réduisent considérablement l'empreinte mémoire des données vectorielles.</p><p>Vecteurs (V)</p><p>Dimensions (D)</p><p>brut (V x D x 4)</p><p>int8 (V x (D x 1 + 4))</p><p>int4 (V x (D x 0,5 + 4))</p><p>bbq (V x (D x 0,125 + 4))</p><p>10,000,000</p><p>384</p><p>14.31GB</p><p>3.61GB</p><p>1.83GB</p><p>0.58GB</p><p>50,000,000</p><p>384</p><p>71.53GB</p><p>18.07GB</p><p>9.13GB</p><p>2.89GB</p><p>100,000,000</p><p>384</p><p>143.05GB</p><p>36.14GB</p><p>18.25GB</p><p>5.77GB</p><h2>Conclusion</h2><p>BBQ est une optimisation que vous pouvez appliquer à vos données vectorielles pour les compresser sans sacrifier la précision. Il convertit les vecteurs en bits, ce qui vous permet d'effectuer des recherches efficaces dans les données et de faire évoluer vos flux de travail d'IA pour accélérer les recherches et optimiser le stockage des données.</p><h2>Poursuite de l'apprentissage</h2><p>Si vous souhaitez en savoir plus sur le barbecue, n'hésitez pas à consulter les ressources suivantes :</p><ul><li><p><a href="https://www.elastic.co/fr/search-labs/blog/better-binary-quantization-lucene-elasticsearch">Quantification binaire (BBQ) dans Lucene et Elasticsearch</a></p></li><li><p><a href="https://www.elastic.co/fr/search-labs/blog/bit-vectors-elasticsearch-bbq-vs-pq">Meilleure quantification binaire (BBQ) vs quantification par produit</a></p></li><li><p><a href="https://www.elastic.co/fr/search-labs/blog/optimized-scalar-quantization-elasticsearch">Quantification scalaire optimisée : Une quantification binaire encore meilleure</a></p></li><li><p><a href="https://www.youtube.com/watch?v=04NzMt2Nigc">Meilleure quantification binaire (BBQ) : De l'octet au BBQ, le secret d'une meilleure recherche vectorielle par 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 vectorielle]]></category>
    <category><![CDATA[Les bases]]></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>