<?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[Valentin Crettaz - 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[Valentin Crettaz - 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/valentin-crettaz</link>
    </image>
    <link>https://www.elastic.co/fr/search-labs/author/valentin-crettaz</link>
    <atom:link href="https://www.elastic.co/fr/search-labs/rss/author/valentin-crettaz.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[fr]]></language>
    <lastBuildDate>Mon, 28 Sep 2026 04:51:14 GMT</lastBuildDate>
  <item>
    <title><![CDATA[Une introduction rapide à la recherche vectorielle]]></title>
    <description><![CDATA[Cet article est le premier d'une série de trois qui se pencheront sur les subtilités de la recherche vectorielle, également connue sous le nom de recherche sémantique, et sur la manière dont elle est mise en œuvre dans Elasticsearch.]]></description>
    <content:encoded><![CDATA[<p>Cet article est le premier d'une série de trois qui se pencheront sur les subtilités de la recherche vectorielle, également connue sous le nom de recherche sémantique, et sur la manière dont elle est mise en œuvre dans Elasticsearch.</p><p>Cette première partie se concentre sur une introduction générale aux bases de l'intégration des vecteurs et au fonctionnement de la recherche vectorielle.</p><p>Armé de toutes les connaissances acquises dans le premier article, la <a href="https://www.elastic.co/search-labs/blog/vector-search-set-up-elasticsearch">deuxième partie</a> vous guidera dans les méandres de la mise en place de la recherche vectorielle dans Elasticsearch.</p><p>Dans la <a href="https://www.elastic.co/search-labs/blog/hybrid-search-elasticsearch">troisième partie</a>, nous tirerons parti de ce que nous avons appris dans les deux premières parties, nous nous appuierons sur ces connaissances et nous nous pencherons sur la manière de créer de puissantes requêtes de recherche hybrides dans Elasticsearch.</p><p>Avant d'entrer dans le vif du sujet de cet article, remontons dans le temps et passons en revue l'histoire des vecteurs, un concept clé de la recherche sémantique.</p><h2>Les vecteurs ne sont pas nouveaux</h2><p>Tout le monde s'accorde à dire que depuis l'avènement de ChatGPT en novembre 2022, il ne se passe pas un jour sans que l'on entende ou lise parler de "recherche vectorielle". Elle est omniprésente et si répandue que nous avons souvent l'impression qu'il s'agit d'une nouvelle technologie de pointe qui vient de voir le jour, alors que la vérité est que cette technologie existe depuis plus de six décennies ! Les recherches sur le sujet ont commencé au milieu des années 1960 et les premiers documents de recherche ont été publiés en 1978 par Gerard Salton, un spécialiste de la recherche d'informations, et ses collègues de l'université de Cornell. Les travaux de Salton sur les modèles de vecteurs denses et épars constituent la base de la technologie moderne de recherche vectorielle.</p><p>Au cours des 20 dernières années, de nombreux <a href="https://db-engines.com/en/ranking/vector+dbms/all">SGBD vectoriels</a> différents basés sur ses recherches ont été créés et mis sur le marché. Il s'agit notamment d'Elasticsearch alimenté par le projet Apache Lucene, qui a commencé à <a href="https://issues.apache.org/jira/browse/LUCENE-9004">travailler sur la recherche vectorielle</a> en 2019.</p><p>Les vecteurs sont aujourd'hui omniprésents et si répandus qu'il est important de bien comprendre leur théorie sous-jacente et leur fonctionnement interne avant de les utiliser. Avant de nous y plonger, examinons rapidement les différences entre la recherche lexicale et la recherche vectorielle afin de mieux comprendre en quoi elles diffèrent et comment elles peuvent se compléter l'une l'autre.</p><h2>Recherche vectorielle vs. recherche lexicale</h2><p>Une façon simple de présenter la recherche vectorielle est de la comparer à la recherche lexicale plus conventionnelle à laquelle vous êtes probablement habitué. La recherche vectorielle, également connue sous le nom de recherche sémantique, et la recherche lexicale fonctionnent de manière très différente. La recherche lexicale est le type de recherche que nous utilisons tous depuis des années dans Elasticsearch. Pour résumer très brièvement, il n'essaie pas de comprendre le sens réel de ce qui est indexé et interrogé, mais fait un gros effort pour faire correspondre <strong>lexicalement</strong> le littéral des mots ou de leurs variantes (pensez à l'extraction, aux synonymes, etc.) que l'utilisateur tape dans une requête avec tous les littéraux qui ont été précédemment indexés dans la base de données à l'aide d'algorithmes de similarité, tels que le TF-IDF.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfbb8e150865a5ec8/6a17e0c725daab50f408a16e/a4f3eba19599e5330e9b0d29ecdbbeac211cdab0-1600x583.png" alt="Exemple de recherche lexicale" /><p>Comme nous pouvons le voir, les trois documents en haut à gauche sont codés et analysés. Les termes obtenus sont ensuite indexés dans un index inversé, qui associe simplement les termes analysés aux identifiants des documents qui les contiennent. Notez que tous les termes ne sont présents qu'une seule fois et qu'aucun n'est partagé par un document. La recherche de "gentil professeur d'allemand" aboutira à trois documents avec des scores variables, même si aucun d'entre eux ne reflète réellement le sens de la requête.</p><p>Comme le montre la figure 2 ci-dessous, la situation devient encore plus délicate lorsqu'il s'agit de polysémie ou d'homographes, c'est-à-dire de mots qui s'écrivent de la même façon mais qui ont des <strong>sens différents</strong> (droite, paume, bat, signifie, etc.) Prenons le mot "droite", qui peut avoir trois sens différents, et voyons ce qu'il en est.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltea0cc829ff2c8029/6a17e0c92f4a5c8107fa8811/ebb9cc1be03475bbf68269a8dcea5f08bcda0b64-1594x754.png" alt="Recherche d'homographes avec la recherche lexicale" /><p>La recherche de <em>"I'm not right"</em> renvoie à un document dont la signification est exactement opposée à celle du premier résultat obtenu. Si vous recherchez exactement les mêmes termes mais que vous les ordonnez différemment pour produire un sens différent, par exemple <em>"tourner à droite"</em> et <em>"tourner à droite",</em> vous obtiendrez exactement le même résultat (c'est-à-dire le troisième document "Prendre un virage à droite"). Certes, nos requêtes sont trop simplifiées et n'utilisent pas les requêtes plus avancées telles que la correspondance des phrases, mais cela illustre le fait que la recherche lexicale ne comprend pas la véritable signification de ce qui est indexé et de ce qui est recherché. Si cela n'est pas clair, ne vous inquiétez pas, nous reviendrons sur cet exemple dans le troisième article pour voir comment la recherche vectorielle peut être utile dans ce cas.</p><p>Pour rendre justice à la recherche lexicale, lorsque vous avez le contrôle sur la façon dont vous indexez vos données <strong>structurées</strong> (pensez aux mappings, à l'analyse de texte, aux pipelines d'acquisition, etc.) et sur la façon dont vous élaborez vos requêtes (pensez aux requêtes DSL intelligemment conçues, à l'analyse des termes de la requête, etc. Les résultats d'Elasticsearch concernant ses capacités de recherche lexicale sont tout simplement stupéfiants. Ce qu'il a réalisé et à quel point il a popularisé et amélioré le domaine de la recherche lexicale au cours des dernières années est vraiment remarquable.</p><p>Cependant, lorsqu'il s'agit de fournir une assistance pour l'interrogation <a href="https://www.elastic.co/what-is/unstructured-data"><strong>de</strong></a><a href="https://www.elastic.co/what-is/unstructured-data"> données</a> non structurées (images, vidéos, audios, texte brut, etc.) à des utilisateurs qui ont besoin de poser des questions en texte libre, la recherche lexicale n'est pas à la hauteur. De plus, il arrive que la requête ne soit même pas un texte, mais une image, comme nous le verrons bientôt. La principale raison pour laquelle la recherche lexicale est inadéquate dans de telles situations est que les données non structurées ne peuvent être ni indexées ni interrogées de la même manière que les données structurées. Lorsqu'il s'agit de données non structurées, la <strong>sémantique</strong> entre en jeu. Que signifie la sémantique ? Tout simplement, le sens !</p><p>Prenons l'exemple simple d'un moteur de recherche d'images (par exemple, Google Image Search ou Lens). Vous glissez et déposez une image, et le moteur de recherche sémantique de Google trouvera et renverra les images les plus similaires à celle que vous avez interrogée. Dans la figure 3 ci-dessous, on peut voir à gauche la photo d'un berger allemand et à droite toutes les photos similaires qui ont été recherchées, le premier résultat étant la même photo que celle qui a été fournie (c'est-à-dire la plus similaire).</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt3e0a0fb3c300537a/6a17e0cbe8fbce69d13a185d/c0dff24d4379141abd1038c9c4b5577fd2dca802-1600x657.png" alt="Exemple de recherche sémantique : Recherche d'une image" /><p>Même si cela semble simple et logique pour nous, les humains, c'est une toute autre histoire pour les ordinateurs. C'est ce que la recherche vectorielle permet et contribue à réaliser. Le pouvoir libéré par la recherche vectorielle est énorme, comme le monde l'a récemment constaté. Soulevons maintenant le capot et découvrons ce qui s'y cache.</p><h2>Vecteurs d'intégration</h2><p>Comme nous l'avons vu précédemment, avec les moteurs de recherche lexicaux, les données structurées telles que le texte peuvent facilement être transformées en termes qui peuvent être comparés au moment de la recherche, quelle que soit la signification réelle des termes. Les données non structurées, quant à elles, peuvent prendre différentes formes, telles que des objets binaires de grande taille (images, vidéos, audios, etc.), et ne se prêtent pas du tout au même processus de tokénisation. En outre, l'objectif de la recherche sémantique est d'indexer les données de manière à ce qu'elles puissent être recherchées sur la base de la signification qu'elles représentent. Comment y parvenir ? La réponse tient en deux mots : <strong>Apprentissage automatique</strong>! Ou plus précisément l'apprentissage en profondeur (Deep Learning) !</p><p>L'<strong>apprentissage profond</strong> est un domaine spécifique de l'apprentissage automatique qui repose sur des modèles basés sur des réseaux neuronaux artificiels composés de plusieurs couches de traitement qui peuvent progressivement extraire le véritable sens des données. Le fonctionnement de ces modèles de réseaux neuronaux s'inspire fortement du cerveau humain. La figure 4, ci-dessous, montre à quoi ressemble un réseau neuronal, avec ses couches d'entrée et de sortie ainsi que ses multiples couches cachées :</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt8ca5fd8f0e61d939/6a17e0cd7f6f152a67c09a53/aeea3bab3c29e1c591a9c9082f2e73e7d3990ef1-1600x1116.png" alt="Couches de réseaux neuronaux dans la recherche vectorielle" /><p>La véritable prouesse des réseaux neuronaux est qu'ils sont capables de transformer une simple donnée non structurée en une séquence de valeurs à virgule flottante, connues sous le nom de <strong>vecteurs d'intégration</strong> ou simplement d'<strong>intégration</strong>. En tant qu'êtres humains, nous comprenons assez bien ce que sont les vecteurs à condition de les visualiser dans un espace à deux ou trois dimensions. Chaque composante du vecteur représente une coordonnée dans un plan 2D x-y ou un espace 3D x-y-z.</p><p>Cependant, les vecteurs d'intégration sur lesquels fonctionnent les modèles de réseaux neuronaux peuvent avoir plusieurs centaines, voire des milliers de dimensions et représentent simplement un point dans un espace multidimensionnel. Chaque dimension vectorielle représente une <strong>caractéristique</strong> des données non structurées. Illustrons cela avec un modèle d'apprentissage profond qui transforme les images en vecteurs d'intégration de 2048 dimensions. Ce modèle transformerait l'image du berger allemand que nous avons utilisée dans la figure 3 en un vecteur d'intégration présenté dans le tableau ci-dessous. Notez que nous ne montrons que les trois premiers et derniers éléments, mais qu'il y aurait 2 042 colonnes/dimensions supplémentaires dans le tableau.</p><p></p><p>est_rouge</p><p>est_chien</p><p>ciel bleu</p><p>…</p><p>no_gras</p><p>berger allemand</p><p>est_arbre</p><p>Berger allemand embeddings</p><p>0.0121</p><p>0.9572</p><p>0.8735</p><p>…</p><p>0.1198</p><p>0.9712</p><p>0.0512</p><p>Chaque colonne est une dimension du modèle et représente une caractéristique que le réseau neuronal sous-jacent cherche à modéliser. Chaque entrée donnée au modèle sera caractérisée en fonction de sa similarité avec chacune des 2048 dimensions. Par conséquent, la valeur de chaque élément du vecteur d'intégration indique la <strong>similarité</strong> de cette entrée avec une dimension spécifique. Dans cet exemple, nous pouvons voir que le modèle a détecté une grande similarité entre les chiens et les bergers allemands ainsi que la présence d'un peu de ciel bleu.</p><p>Contrairement à la recherche lexicale, où un terme peut correspondre ou non, la recherche vectorielle permet d'avoir une bien meilleure idée de la <em>similitude</em> d'un élément de données non structurées avec chacune des dimensions prises en charge par le modèle. En tant que tels, les vecteurs d'intégration constituent une formidable représentation sémantique des données non structurées.</p><h2>La sauce secrète</h2><p>Maintenant que nous savons comment les données non structurées sont découpées par les réseaux neuronaux d'apprentissage profond en vecteurs d'intégration qui capturent la similarité des données selon un grand nombre de dimensions, nous devons comprendre comment fonctionne la mise en correspondance de ces vecteurs. Il s'avère que la réponse est assez simple. Les vecteurs d'intégration qui sont <strong>proches</strong> les uns des autres représentent des éléments de données <strong>sémantiquement similaires</strong>. Ainsi, lorsque nous interrogeons une base de données vectorielles, l'entrée de recherche (image, texte, etc.) est d'abord transformée en un vecteur d'intégration à l'aide du même modèle que celui utilisé pour l'indexation de toutes les données non structurées, et l'objectif final est de trouver les <strong>vecteurs voisins les plus proches</strong> de ce vecteur d'interrogation. Par conséquent, tout ce que nous avons à faire est de trouver comment mesurer la "distance" ou la "similarité" entre le vecteur de la requête et tous les vecteurs existants indexés dans la base de données, c'est à peu près tout.</p><h3>Distance et similarité</h3><p>Heureusement pour nous, la mesure de la distance entre deux vecteurs est un problème facile à résoudre grâce à l'arithmétique vectorielle. Examinons donc les fonctions de distance et de similarité les plus populaires qui sont prises en charge par les bases de données de recherche vectorielle modernes, telles qu'Elasticsearch. Attention, mathématiques en perspective !</p><h4>Distance L1</h4><p>La distance L1, également appelée distance de Manhattan, de deux vecteurs x et y est mesurée en additionnant la différence absolue par paire de tous leurs éléments. Il est évident que plus la distance d est petite, plus les deux vecteurs sont proches. La formule est assez simple, comme on peut le voir ci-dessous :</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2df2e9bc20883491/6a17e0ce033c8d006a6bb0bf/2b17bcedfbedde61117a3e7970af55bc62318c6c-312x102.png" alt="Formule de distance L1 dans la recherche vectorielle" /><p>Visuellement, la distance L1 peut être illustrée comme le montre la figure 5 ci-dessous :</p><p></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltb90a33e6b1cbe00b/6a17e0d0414c64eb76945096/52075441892151536ed216081817a8e852566daa-474x464.png" alt="Visualisation de la distance L1 entre deux vecteurs" /><p>Prenons deux vecteurs x et y, tels que x = (1, 2) et y = (4, 3), la distance L1 des deux vecteurs serait alors | 1 - 4 | + | 2 - 3 | = 4.</p><h4>Distance L2</h4><p>La distance L2, également appelée distance euclidienne, de deux vecteurs x et y est mesurée en additionnant d'abord le carré de la différence par paire de tous leurs éléments, puis en prenant la racine carrée du résultat. Il s'agit du chemin le plus court entre deux points (également appelé hypoténuse). Comme pour L1, plus la distance d est petite, plus les deux vecteurs sont proches :</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltae9b63fb593ae225/6a17e0d1af47b68379cddea8/b7675aa41f4f381e954c21dacd23a51a2dde6780-384x112.png" alt="Distance L2 dans la recherche vectorielle" /><p>La distance L2 est indiquée dans la figure 6 ci-dessous :</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt32d913b46e07e79d/6a17e0d27f6f1582f7c09a57/bac99d08d6cf8a3a387a8acdc2e8f67357dad235-448x456.png" alt="Visualisation de la distance L2 entre deux vecteurs" /><p>Réutilisons les deux mêmes vecteurs d'échantillonnage x et y que nous avons utilisés pour la distance L1, et nous pouvons maintenant calculer la distance L2 comme  En prenant la racine carrée de 10, on obtient 3,16.</p><p></p><h4>Distance Linf</h4><p>La distance Linf (pour L infini), également appelée distance de Tchebychev ou distance de l'échiquier, de deux vecteurs x et y est simplement définie comme la plus longue distance entre deux de leurs éléments ou la plus longue distance mesurée le long de l'un des axes/dimensions. La formule est très simple et est illustrée ci-dessous :</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt863411e15de16fa3/6a17e0d4505ac30939ad8a48/179ea6c6520a59acd97638313a2fb1b105e2ffed-436x82.png" alt="Formule de distance de Linf dans la recherche vectorielle" /><p>Une représentation de la distance Linf est présentée dans la figure 7 ci-dessous :</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt863ee7b51fd5fc15/6a17e0d56864a4772db686af/b75540d793cdc0645244d77dc36da9d5734ccbac-548x560.png" alt="Distance Linf entre deux vecteurs" /><p>De nouveau, en prenant les deux mêmes vecteurs d'échantillonnage x et y, nous pouvons calculer la distance à l'infini comme suit : max ( | 1 - 4 | , | 2 - 3 | ) = max (3, 1) = 3.</p><h4>Similitude du cosinus</h4><p>Contrairement à L1, L2 et Linf, la similarité en cosinus ne mesure pas la distance entre deux vecteurs x et y, mais plutôt leur angle relatif, c'est-à-dire s'ils pointent tous deux à peu près dans la même direction. Plus la similarité s est élevée, plus les deux vecteurs sont "proches". La formule est à nouveau très simple et illustrée ci-dessous :</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt61d55341a6457ab7/6a17e0d7e9ea872b4ea9c4e2/931b6b90f0ee83e63a66496d06d6b4cef3affddd-304x72.png" alt="Formule de similarité cosinus dans la recherche vectorielle" /><p>La figure 8 ci-dessous présente une façon de représenter la similarité cosinus entre deux vecteurs :</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt50eb6399510b5380/6a17e0d83e9e45302cba139a/52092e8b5d366178e50a35f8c954ee8eaca76965-582x586.png" alt="similarité en cosinus entre deux vecteurs" /><p>En outre, comme les valeurs du cosinus sont toujours comprises dans l'intervalle [-1, 1], -1 signifie une similarité opposée (c'est-à-dire un angle de 180° entre les deux vecteurs), 0 signifie une similarité sans rapport (c'est-à-dire un angle de 90°) et 1 signifie une similarité identique (c'est-à-dire un angle de 0°), comme le montre la figure 9 ci-dessous :</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt785e195c75a5089e/6a17e0da1d1b8355bc93e398/fd2690a845b89b69ff202bd04192893638538aec-1600x456.png" alt="Le spectre de similarité cosinus dans la recherche vectorielle" /><p>
Réutilisons à nouveau les mêmes vecteurs d'échantillons x et y et calculons la similitude en cosinus à l'aide de la formule ci-dessus. Tout d'abord, nous pouvons calculer le produit en points des deux vecteurs comme suit : . Ensuite, nous multiplions la longueur (également appelée magnitude) des deux vecteurs :  + (4^2 + 3^2)^{1/2} = 11,18034. Enfin, nous divisons le produit en points par la longueur multipliée 10 / 11,18034 = 0,894427 (c'est-à-dire un angle de 26°), qui est assez proche de 1, de sorte que les deux vecteurs peuvent être considérés comme assez similaires.</p><h4>Similitude du produit de points</h4><p>L'un des inconvénients de la similitude en cosinus est qu'elle ne prend en compte que l'angle entre deux vecteurs et non leur magnitude (c'est-à-dire leur longueur), ce qui signifie que si deux vecteurs pointent à peu près dans la même direction mais que l'un est beaucoup plus long que l'autre, les deux seront tout de même considérés comme similaires. La similarité par produit de points, également appelée produit scalaire ou produit intérieur, améliore cette situation en tenant compte à la fois de l'angle et de la magnitude des vecteurs, ce qui permet d'obtenir une mesure de similarité beaucoup plus précise.</p><p>Deux formules équivalentes sont utilisées pour calculer la similitude du produit de points. La première est la même que celle que nous avons vue plus haut dans le numérateur de la similitude du cosinus :</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt7f1c3369f8628457/6a17e0db1d1b832a1893e39c/52e2723926ab27cd96b688e805fae15f607073c8-482x104.png" alt="Formule de similarité du produit de points dans la recherche vectorielle" /><p>La deuxième formule multiplie simplement la longueur des deux vecteurs par le cosinus de l'angle qui les sépare :</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt136dd2a749c2398a/6a17e0dc6df73108a80a0e1f/dc9b11fc67dd748d9f1f29b735f4726138cb7d39-452x70.png" alt="Simplification de la formule de similarité du produit de points dans la recherche vectorielle" /><p>La similitude du produit des points est illustrée dans la figure 10 ci-dessous :</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltb2c095e1c1948752/6a17e0dd6df731e30b0a0e23/1bda38cf82a1e1037f44b6e9657602c9efe1c0a6-558x574.png" alt="similitude du produit de points entre deux vecteurs" /><p>Une dernière fois, nous prenons les vecteurs x et y de l'échantillon et calculons leur produit en points en utilisant la première formule, comme nous l'avons fait pour la similitude du cosinus plus tôt, soit (1 ) + (2 ) = 10.</p><p>En utilisant la deuxième formule, nous multiplions la longueur des deux vecteurs :  + (4^2 + 3^2)^{1/2} = 11,18034 et multiplions ce résultat par le cosinus de l'angle de 26° entre les deux vecteurs, et nous obtenons 11,18034 (26°) = 10.</p><p>Il convient de noter que si tous les vecteurs sont d'abord <strong>normalisés</strong> (c'est-à-dire que leur longueur est égale à 1), la similitude du produit de points devient exactement la même que la similitude du cosinus (parce que |x| |y| = 1), c'est-à-dire le cosinus de l'angle entre les deux vecteurs. Comme nous le verrons plus loin, la normalisation des vecteurs est une bonne pratique à adopter afin de rendre la magnitude du vecteur non pertinente, de sorte que la similitude se concentre simplement sur l'angle. Il accélère également le calcul de la distance au moment de l'indexation et de l'interrogation, ce qui peut s'avérer problématique lorsque l'on travaille sur des milliards de vecteurs.</p><h3>Récapitulatif rapide</h3><p>Nous avons parcouru beaucoup d'informations jusqu'à présent, alors arrêtons-nous un instant et faisons un rapide récapitulatif de notre situation. Nous avons appris que...</p><ul><li><p>...la recherche sémantique est basée sur des modèles de réseaux neuronaux d'apprentissage profond qui excellent dans la transformation de données non structurées en vecteurs d'intégration multidimensionnels.</p></li><li><p>...chaque dimension du modèle représente une caractéristique des données non structurées.</p></li><li><p>...un vecteur d'intégration est une séquence de valeurs de similarité (une pour chaque dimension) qui représente le degré de similarité d'un élément donné de données non structurées par rapport à chaque dimension.</p></li><li><p>...plus deux vecteurs sont "proches" (c'est-à-dire les plus proches voisins), plus ils représentent des concepts sémantiquement similaires.</p></li><li><p>...les fonctions de distance (L1, L2, Linf) nous permettent de mesurer la proximité de deux vecteurs.</p></li><li><p>...les fonctions de similitude (cosinus et produit de points) nous permettent de mesurer à quel point deux vecteurs se dirigent dans la même direction.</p></li></ul><p></p><p>Le dernier élément qu'il nous reste à examiner est le moteur de recherche vectoriel lui-même. Lorsqu'une requête arrive, elle est d'abord vectorisée, puis le moteur de recherche vectorielle trouve les vecteurs voisins les plus proches du vecteur de la requête. L'approche brute consistant à mesurer la distance ou la similarité entre le vecteur de la requête et tous les vecteurs de la base de données peut fonctionner pour de petits ensembles de données, mais s'avère rapidement insuffisante lorsque le nombre de vecteurs augmente. En d'autres termes, comment pouvons-nous indexer des millions, des milliards, voire des trillions de vecteurs et trouver les plus proches voisins du vecteur interrogé dans un délai raisonnable ? C'est là que nous devons faire preuve d'intelligence et trouver des moyens optimaux d'indexer les vecteurs de manière à ce que nous puissions trouver les plus proches voisins aussi rapidement que possible sans trop dégrader la précision.</p><h3>Algorithmes et techniques de recherche vectorielle</h3><p>Au fil des ans, de nombreuses équipes de recherche ont investi beaucoup d'efforts dans le développement d'algorithmes de recherche vectorielle très intelligents. Nous allons ici présenter brièvement les principaux d'entre eux. Selon le cas d'utilisation, certains sont mieux adaptés que d'autres.</p><h4>Recherche linéaire</h4><p>Nous avons brièvement abordé la recherche linéaire, ou indexation plate, lorsque nous avons mentionné l'approche brute consistant à comparer le vecteur de la requête à tous les vecteurs présents dans la base de données. Bien qu'elle puisse donner de bons résultats sur de petits ensembles de données, les performances diminuent rapidement lorsque le nombre de vecteurs et de dimensions augmente (complexité O(n)).</p><p>Heureusement, il existe des approches plus efficaces, appelées <strong>approximation du plus proche voisin</strong> (ANN), dans lesquelles les distances entre les vecteurs d'intégration sont calculées à l'avance et les vecteurs similaires sont stockés et organisés de manière à rester proches les uns des autres, par exemple à l'aide de grappes, d'arbres, de hachages ou de graphes. Ces approches sont dites "approximatives" car elles ne garantissent généralement pas une précision de 100%. L'objectif final est de <strong>réduire l'étendue de la recherche</strong> autant et aussi rapidement que possible afin de se concentrer uniquement sur les zones les plus susceptibles de contenir des vecteurs similaires ou de <strong>réduire la dimensionnalité des vecteurs</strong>.</p><h4>Arbres à K dimensions</h4><p>Un arbre à K dimensions, ou arbre KD, est une généralisation d'un arbre de recherche binaire qui stocke des points dans un espace à k dimensions et fonctionne en divisant continuellement l'espace de recherche en arbres plus petits à gauche et à droite où les vecteurs sont indexés. Au moment de la recherche, l'algorithme doit simplement visiter quelques branches de l'arbre autour du vecteur de la requête (le point rouge dans la figure 11) afin de trouver le plus proche voisin (le point vert dans la figure 11). Si plus de k voisins sont demandés, la zone jaune est étendue jusqu'à ce que l'algorithme trouve d'autres voisins.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt55e01707cd9fca57/6a17e0dfbe60866a90004653/e21af2d613112279089b6fa2166359233b10019d-829x860.png" alt="Algorithme de l'arbre KD dans la recherche vectorielle" /><p>Le principal avantage de l'algorithme de l'arbre KD est qu'il nous permet de nous concentrer rapidement sur certaines branches localisées de l'arbre, éliminant ainsi la plupart des vecteurs. Toutefois, l'efficacité de cet algorithme diminue à mesure que le nombre de dimensions augmente, car il faut visiter beaucoup plus de branches que dans les espaces de dimensions inférieures.</p><h4>Index de fichier inversé</h4><p>L'approche de l'index inversé des fichiers (IVF) est également un algorithme de <strong>partitionnement de l'espace</strong> qui affecte les vecteurs proches les uns des autres à leur centroïde commun. Dans l'espace 2D, le diagramme de Voronoï, comme le montre la figure 12, permet de mieux visualiser ce phénomène :</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt7b7e4fe6deff5ef3/6a17e0e17b54f940eb8b381c/33ddaaa818ab2f2a5fc87982c82c2a34cb849e33-640x640.png" alt="Représentation de Voronoï d'un index de fichier inversé dans l'espace 2D " /><p>Nous pouvons voir que l'espace 2D ci-dessus est divisé en 20 groupes, chacun ayant son centroïde représenté par des points noirs. Tous les vecteurs d'intégration dans l'espace sont affectés au groupe dont le centroïde est le plus proche. Au moment de la recherche, l'algorithme détermine d'abord le groupe sur lequel il doit se concentrer en trouvant le centroïde le plus proche du vecteur de la requête, puis il peut simplement se concentrer sur cette zone, ainsi que sur les zones environnantes si nécessaire, afin de trouver les voisins les plus proches.</p><p>Cet algorithme souffre du même problème que les arbres KD lorsqu'il est utilisé dans des espaces à haute dimension. C'est ce qu'on appelle la malédiction de la dimensionnalité, qui se produit lorsque le volume de l'espace augmente tellement que toutes les données semblent éparses et que la quantité de données nécessaires pour obtenir des résultats plus précis croît de manière exponentielle. Lorsque les données sont éparses, il est plus difficile pour ces algorithmes de partitionnement de l'espace d'organiser les données en grappes. Heureusement pour nous, il existe d'autres algorithmes et techniques qui atténuent ce problème, comme indiqué ci-dessous.</p><h4>Quantification</h4><p>La quantification est une approche <strong>basée sur la compression</strong>qui nous permet de réduire la taille totale de la base de données en diminuant la précision des vecteurs d'intégration. Ceci peut être réalisé en utilisant la <strong>quantification scalaire (SQ)</strong> en convertissant les valeurs vectorielles à virgule flottante en valeurs entières. Cela permet non seulement de réduire la taille de la base de données d'un facteur 8, mais aussi de diminuer la consommation de mémoire et d'accélérer le calcul de la distance entre les vecteurs au moment de la recherche.</p><p>Une autre technique, appelée <strong>quantification par produit (PQ),</strong> divise d'abord l'espace en sous-espaces de dimensions inférieures, puis les vecteurs proches les uns des autres sont regroupés dans chaque sous-espace à l'aide d'un algorithme de regroupement (similaire aux k-moyennes).</p><p>Il convient de noter que la quantification diffère de la <strong>réduction de la dimensionnalité</strong>, où le nombre de dimensions est réduit, c'est-à-dire que les vecteurs deviennent simplement plus courts.</p><h4>Petits mondes navigables hiérarchiques (PMNH)</h4><p>Si le nom semble complexe, ne vous inquiétez pas, ce n'est pas vraiment le cas ! En résumé, Hierarchical Navigable Small Worlds est un algorithme basé sur un graphe multicouche qui est très populaire et efficace. Il est utilisé par de nombreuses bases de données vectorielles, dont Apache Lucene. La figure 13 ci-dessous présente une représentation conceptuelle de HNSW.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt7f4f4a8e393c8d53/6a17e0e3e8fbcefa193a1861/189ef9a8bec476e379222c454644ba4c1f952085-1400x840.png" alt="Petits mondes navigables hiérarchiques (PMNH)" /><p>Sur la couche supérieure, nous pouvons voir un graphique de très peu de vecteurs qui ont les liens les plus longs entre eux, c'est-à-dire un graphique de vecteurs connectés avec le moins de similarité. Plus nous plongeons dans les couches inférieures, plus nous trouvons de vecteurs et plus le graphique devient dense, avec de plus en plus de vecteurs proches les uns des autres. Dans la couche la plus basse, on trouve tous les vecteurs, les plus similaires étant les plus proches les uns des autres.</p><p>Au moment de la recherche, l'algorithme part de la couche supérieure à un point d'entrée arbitraire et trouve le vecteur le plus proche du vecteur de la requête (représenté par le point gris). Ensuite, il se déplace d'une couche à l'autre et répète le même processus, en partant du même vecteur que celui qu'il a laissé dans la couche précédente, et ainsi de suite, une couche après l'autre, jusqu'à ce qu'il atteigne la couche la plus basse et trouve le voisin le plus proche du vecteur de la requête.</p><h4>Hachage sensible à la localité (LSH)</h4><p>Dans la même veine que toutes les autres approches présentées jusqu'à présent, le hachage sensible à la localité vise à réduire considérablement l'espace de recherche afin d'augmenter la vitesse d'extraction. Avec cette technique, les vecteurs d'intégration sont transformés en valeurs de hachage, tout en préservant les informations de similarité, de sorte que l'espace de recherche devient finalement une simple table de hachage qui peut être consultée au lieu d'un graphe ou d'un arbre qui doit être parcouru. Le principal avantage des méthodes basées sur les hachages est que les vecteurs contenant un nombre arbitraire (important) de dimensions peuvent être mis en correspondance avec des hachages de taille fixe, ce qui accélère considérablement le temps de recherche sans sacrifier trop de précision.</p><p>Il existe de nombreuses façons de hacher les données en général, et d'intégrer des vecteurs en particulier, mais cet article n'entrera pas dans les détails de chacune d'entre elles. Les méthodes de hachage conventionnelles produisent généralement des hachages très différents pour des données qui semblent très similaires. Les vecteurs d'intégration étant composés de valeurs flottantes, prenons deux exemples de valeurs flottantes considérées comme très proches l'une de l'autre dans l'arithmétique vectorielle (par exemple, 0,73 et 0,74) et soumettons-les à quelques fonctions de hachage courantes. En regardant les résultats ci-dessous, il est évident que les fonctions de hachage courantes ne conservent pas la similarité entre les entrées.</p><p>Fonction de hachage</p><p>0.73</p><p>0.74</p><p>MD5</p><p>1342129d04cd2924dd06cead4cf0a3ca</p><p>0aec1b15371bd979cfa66b0a50ebecc5</p><p>SHA1</p><p>49d2c3e0e44bff838e1db571a121be5ea874e8d9</p><p>a534e76482ade9d9fe4bff3035a7f31f2f363d77</p><p>SHA256</p><p>99d03fc3771fe6848d675339fc49eeb1cb8d99a12e6358173336b99a2ec530ea</p><p>5ecbc825ba5c16856edfdaf0abc5c6c41d0d8a9c508e34188239521dc7645663</p><p>Alors que les méthodes de hachage classiques tentent de <em>minimiser les collisions de hachage</em> entre des données similaires, l'objectif principal du hachage sensible à la localité est de faire exactement le contraire, c'est-à-dire de <em>maximiser les collisions de hachage</em> afin que des données similaires tombent dans le même bac avec une forte probabilité. Ainsi, les vecteurs d'intégration qui sont proches les uns des autres dans un espace multidimensionnel seront hachés en une valeur de taille fixe tombant dans le même panier. Comme LSH permet à ces vecteurs hachés de conserver leur proximité, cette technique s'avère très pratique pour le regroupement de données et la recherche du voisin le plus proche.</p><p>Tout le travail se fait au moment de l'indexation, lorsque les hachages doivent être calculés, tandis qu'au moment de la recherche, il suffit de hacher le vecteur de la requête pour rechercher le seau contenant les vecteurs d'intégration les plus proches. Une fois le seau candidat trouvé, un deuxième tour a généralement lieu pour identifier les vecteurs voisins les plus proches du vecteur d'interrogation.</p><h2>Concluons</h2><p>Pour présenter la recherche vectorielle, nous avons dû couvrir un certain nombre de points dans cet article. Après avoir comparé les différences entre la recherche lexicale et la recherche vectorielle, nous avons appris comment les modèles de réseaux neuronaux d'apprentissage profond parviennent à capturer la sémantique des données non structurées et à transcoder leur signification en vecteurs d'intégration à haute dimension, une séquence de nombres à virgule flottante représentant la similarité des données selon chacune des dimensions du modèle. Il convient également de noter que la recherche vectorielle et la recherche lexicale ne sont pas des techniques de recherche d'informations concurrentes mais complémentaires (comme nous le verrons dans la troisième partie de cette série, lorsque nous nous pencherons sur la recherche hybride).</p><p>Nous avons ensuite présenté un élément fondamental de la recherche vectorielle, à savoir les fonctions de distance (et de similarité) qui nous permettent de mesurer la proximité de deux vecteurs et d'évaluer la similarité des concepts qu'ils représentent.</p><p>Enfin, nous avons passé en revue les différentes variantes des algorithmes et techniques de recherche vectorielle les plus populaires, qui peuvent être basés sur des arbres, des graphes, des grappes ou des hachages, et dont l'objectif est de se concentrer rapidement sur une zone spécifique de l'espace multidimensionnel afin de trouver les voisins les plus proches sans avoir à visiter l'ensemble de l'espace comme le ferait une recherche linéaire par force brute.</p><p>Si vous aimez ce que vous lisez, n'hésitez pas à consulter les autres parties de cette série :</p><ul><li><p><a href="https://www.elastic.co/search-labs/blog/vector-search-set-up-elasticsearch">Partie 2 : Comment configurer la recherche vectorielle dans Elasticsearch</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/hybrid-search-elasticsearch">Partie 3 : Recherche hybride avec Elasticsearch</a></p></li></ul>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/introduction-to-vector-search</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/introduction-to-vector-search</guid>
    <category><![CDATA[Base vectorielle]]></category>
    <dc:creator><![CDATA[Valentin Crettaz]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt70da374b8dc0c490/6a17e0e46864a473aab686b3/63eea8ea95b49e7241e539f65bf5aa3bb8823fff-1200x628.png" length="0" type="image/png"/>
    <pubDate>Thu, 06 Feb 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Mesures de similarité vectorielle et notation]]></title>
    <description><![CDATA[Explorez les mesures de similarité vectorielle et la notation dans Elasticsearch, y compris la distance L1 &amp; L2, la similarité de cosinus, la similarité de produit de point et la similarité de produit intérieur maximal.]]></description>
    <content:encoded><![CDATA[<p>Lorsque le besoin de rechercher un texte libre se fait sentir et que les touches Ctrl+F / Cmd+F ne suffisent plus, l'utilisation d'un moteur de recherche lexicale est généralement le choix logique qui vient à l'esprit. Les moteurs de recherche lexicale excellent dans l'analyse et la symbolisation du texte à rechercher en termes qui peuvent être mis en correspondance au moment de la recherche, mais ils ne parviennent généralement pas à comprendre et à donner un sens au texte indexé et recherché.</p><p>C'est précisément là que les moteurs de recherche vectoriels brillent. Ils peuvent indexer le même texte de manière à ce qu'il puisse être recherché sur la base du sens qu'il représente et de ses relations avec d'autres concepts ayant un sens similaire ou apparenté.</p><p>Dans ce blog, nous aborderons brièvement la façon dont les vecteurs sont un concept mathématique idéal pour transmettre le sens d'un texte. Nous approfondirons ensuite les différentes techniques de similarité prises en charge par Elasticsearch lorsqu'il s'agit de rechercher des vecteurs voisins, c'est-à-dire de rechercher des vecteurs ayant une signification similaire, et la manière de les classer.</p><h2>Que sont les plongements vectoriels ?</h2><p>Cet article n'aborde pas en profondeur les subtilités des encastrements vectoriels. Si vous souhaitez approfondir ce sujet ou si vous avez besoin d'une introduction avant de poursuivre, nous vous recommandons de consulter le <a href="https://www.elastic.co/fr/what-is/vector-embedding">guide suivant.</a></p><p>En bref, les encastrements vectoriels sont obtenus par un processus d'apprentissage automatique (par ex. réseaux neuronaux d'apprentissage profond) qui transforme tout type de données d'entrée non structurées (texte brut, image, vidéo, son, etc.) en données numériques porteuses de sens et de relations. Les différents types de données non structurées nécessitent différents types de modèles d'apprentissage automatique qui ont été formés pour "comprendre" chaque type de données.</p><p>Chaque vecteur localise un élément spécifique des données en tant que point dans un espace multidimensionnel et cette localisation représente un ensemble de caractéristiques que le modèle utilise pour caractériser les données. Le nombre de dimensions dépend du modèle d'apprentissage automatique, mais il varie généralement de quelques centaines à quelques milliers. Par exemple, les <a href="https://platform.openai.com/docs/guides/embeddings">modèles OpenAI Embeddings</a> peuvent se vanter d'avoir 1536 dimensions, tandis que <a href="https://docs.cohere.com/reference/embed">les modèles Cohere Embeddings</a> peuvent avoir entre 382 et 4096 dimensions. Le type de champ Elasticsearch dense_vector prend en charge jusqu'à 4096 dimensions depuis la dernière version.</p><p>La véritable prouesse des encastrements vectoriels réside dans le fait que les points de données qui partagent une signification similaire sont proches les uns des autres dans l'espace. Un autre aspect intéressant est que l'intégration vectorielle permet également de saisir les relations entre les points de données.</p><h2>Comment comparer les vecteurs ?</h2><p>Sachant que les données non structurées sont découpées en tranches par des modèles d'apprentissage automatique sous forme de vecteurs qui capturent la similarité des données selon un grand nombre de dimensions, nous devons maintenant comprendre comment fonctionne la mise en correspondance de ces vecteurs. Il s'avère que la réponse est assez simple.</p><p>Les vecteurs intégrés qui sont <strong>proches</strong> les uns des autres représentent des éléments de données <strong>sémantiquement similaires</strong>. Ainsi, lorsque nous interrogeons une base de données vectorielle, l'entrée de recherche (image, texte, etc.) est d'abord transformée en un vecteur intégré à l'aide du même modèle d'apprentissage automatique que celui utilisé pour l'indexation de toutes les données non structurées, et l'objectif final est de trouver les <strong>vecteurs voisins les plus proches</strong> de ce vecteur d'interrogation. Par conséquent, tout ce que nous avons à faire est de trouver comment mesurer la distance "" ou la similarité "" entre le vecteur de la requête et tous les vecteurs existants indexés dans la base de données - c'est aussi simple que cela.</p><h2>Distance, similarité et notation</h2><p>Heureusement pour nous, la mesure de la distance ou de la similarité entre deux vecteurs est un problème facile à résoudre grâce à l'arithmétique vectorielle. Examinons donc les fonctions de distance et de similarité les plus populaires prises en charge par Elasticsearch. Attention, mathématiques en perspective !</p><p>Avant d'entrer dans le vif du sujet, jetons un coup d'œil rapide au système de notation. En réalité, Lucene n'autorise que les scores positifs. Toutes les fonctions de distance et de similarité que nous présenterons prochainement donnent une mesure de la proximité ou de la similarité de deux vecteurs, mais ces chiffres bruts sont rarement adaptés à une utilisation en tant que score car ils peuvent être négatifs. C'est pourquoi la note finale doit être dérivée de la distance ou de la valeur de similarité de manière à ce que la note soit positive et qu'une note plus élevée corresponde à un meilleur classement (c'est-à-dire à des vecteurs plus proches).</p><h3>Distance L1</h3><p>La distance L1, également appelée distance de Manhattan, de deux vecteurs  et  est mesurée en additionnant la différence absolue par paire de tous leurs éléments. Il est évident que plus la distance  est faible, plus les deux vecteurs sont proches. La formule de la distance L1 (1) est assez simple, comme on peut le voir ci-dessous :</p><p>Visuellement, la distance L1 peut être illustrée comme le montre l'image ci-dessous (en rouge) :</p><p>Le calcul de la distance L1 des deux vecteurs suivants : \vec   .</p><p><strong>Important :</strong> il convient de noter que la fonction de distance L1 n'est prise en charge que pour <a href="https://www.elastic.co/fr/guide/en/elasticsearch/reference/current/query-dsl-script-score-query.html#vector-functions-l1">la recherche vectorielle exacte</a> (également appelée recherche par force brute) à l'aide de la <code>script_score</code> requête DSL, mais pas pour <a href="https://www.elastic.co/fr/guide/en/elasticsearch/reference/8.11/dense-vector.html#dense-vector-params"></a> la <a href="https://www.elastic.co/fr/guide/en/elasticsearch/reference/8.11/knn-search.html#approximate-knn"><code>knn</code></a><a href="https://www.elastic.co/fr/guide/en/elasticsearch/reference/8.11/knn-search.html#approximate-knn"> recherche approximative kNN à l'aide de l' option</a> de recherche ou de la <a href="https://www.elastic.co/fr/guide/en/elasticsearch/reference/current/query-dsl-knn-query.html"><code>knn</code></a><a href="https://www.elastic.co/fr/guide/en/elasticsearch/reference/current/query-dsl-knn-query.html"> requête</a> DSL.</p><h3>Distance L2</h3><p>La distance L2, également appelée distance euclidienne, de deux vecteurs  et  est mesurée en additionnant d'abord le carré de la différence par paire de tous leurs éléments, puis en prenant la racine carrée du résultat. Il s'agit en fait du chemin le plus court entre deux points. Comme pour L1, plus la distance  est faible, plus les deux vecteurs sont proches :</p><p>La distance L2 est indiquée en rouge dans l'image ci-dessous :</p><p>Réutilisons les deux mêmes vecteurs d'échantillonnage  et  que nous avons utilisés pour la distance , et nous pouvons maintenant calculer la distance  comme \sqrt \approxeq  1,803.</p><p>En ce qui concerne la notation, plus la distance entre deux vecteurs est faible, plus ils sont proches (c'est-à-dire plus ils se ressemblent). Pour obtenir un score, nous devons donc inverser la mesure de la distance, de sorte que la distance la plus faible donne le score le plus élevé. La façon dont le score est calculé en utilisant la distance L2 est présentée dans la formule (3) ci-dessous :</p><p>En réutilisant les vecteurs d'échantillonnage de l'exemple précédent, leur score serait \frac   0,2352. Deux vecteurs très proches l'un de l'autre auront un score proche de 1, tandis que le score de deux vecteurs très éloignés l'un de l'autre tendra vers 0.</p><p>Pour conclure sur les fonctions de distance L1 et L2, une bonne analogie pour les comparer est de considérer A et B comme deux bâtiments à Manhattan, NYC. Un taxi se rendant de A à B devrait emprunter le chemin L1 (rues et avenues), tandis qu'un oiseau utiliserait probablement le chemin L2 (ligne droite).</p><h3>Similitude du cosinus</h3><p>Contrairement à L1 et L2, la similarité en cosinus ne mesure pas la distance entre deux vecteurs  et , mais plutôt leur angle relatif, c'est-à-dire s'ils pointent tous deux à peu près dans la même direction. Plus la similarité  est élevée, plus l'angle  entre les deux vecteurs est faible et, par conséquent, plus "" ils sont proches et plus "" leur signification est similaire.</p><p>Pour illustrer cela, imaginons deux personnes dans la nature qui regardent dans des directions différentes. Dans la figure ci-dessous, la personne en bleu regarde dans la direction symbolisée par le vecteur  et la personne en rouge dans la direction du vecteur . Plus ils orienteront leur regard dans la même direction (c'est-à-dire plus leurs vecteurs se rapprochent), plus leur champ de vision symbolisé par les zones bleues et rouges se chevauchera. Le degré de chevauchement de leur champ de vision correspond à leur similarité cosinusoïdale. Notez toutefois que la personne B regarde plus loin que la personne A (le vecteur  est plus long). La personne B peut regarder une montagne au loin à l'horizon, tandis que la personne A peut regarder un arbre à proximité. Pour la similitude du cosinus, cela ne joue aucun rôle puisqu'il s'agit uniquement de l'angle.</p><p>Calculons maintenant la similitude en cosinus. La formule (4) est assez simple : le numérateur est le produit de points des deux vecteurs et le dénominateur est le produit de leur magnitude (c'est-à-dire de leur longueur) :</p><p>La similarité en cosinus entre  et  est représentée dans l'image ci-dessous comme une mesure de l'angle qui les sépare (en rouge) :</p><p>Faisons un petit détour pour expliquer ce que signifient concrètement ces valeurs de similitude cosinusoïdale. Comme le montre l'image ci-dessous représentant la fonction cosinus, les valeurs oscillent toujours dans l'intervalle </p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc0e4eb98ebb64cf3/6a17da287b54f983818b3783/e31145284b8c27d0bd9e3d2831f811388134fd83-1188x272.png" alt="fonction cos" /><p>Rappelons que pour que deux vecteurs soient considérés comme similaires, leur angle doit être le plus aigu possible, idéalement proche de , ce qui revient à une similitude parfaite de  En d'autres termes, lorsque les vecteurs sont...</p><ol><li><p>..<strong>.proches</strong> l'un de l'autre, le cosinus de leur angle est proche de  (c'est-à-dire proche de )</p></li></ol><ol><li><p>..<strong>.sans rapport</strong>, le cosinus de leur angle est proche de  (c'est-à-dire proche de )</p></li></ol><ol><li><p>..<strong>.opposé</strong>, le cosinus de leur angle est proche de  (c'est-à-dire proche de )</p></li></ol><p>Maintenant que nous savons comment calculer la similitude en cosinus entre deux vecteurs et que nous avons une bonne idée de la manière d'interpréter la valeur obtenue, nous pouvons réutiliser les mêmes vecteurs échantillons  et  et calculer leur similitude en cosinus à l'aide de la formule (4) que nous avons vue précédemment.</p><p>Nous obtenons un cosinus similaire de , qui est plus proche de  que de . Cela signifie que les deux vecteurs sont <strong>quelque peu similaires</strong>, c'est-à-dire qu'ils ne sont pas parfaitement similaires, mais qu'ils ne sont pas non plus complètement sans rapport, et qu'ils n'ont certainement pas de signification opposée.</p><p>Pour obtenir un score positif à partir de n'importe quelle valeur de similarité en cosinus, nous devons utiliser la formule suivante (5), qui transforme les valeurs de similarité en cosinus oscillant dans l'intervalle  en scores dans l'intervalle </p><p>Le score pour les vecteurs échantillons  et  serait donc : \frac   0.8253.</p><h3>Similitude du produit de points</h3><p>L'un des inconvénients de la similitude en cosinus est qu'elle ne prend en compte que l'angle entre deux vecteurs et non leur magnitude, ce qui signifie que si deux vecteurs pointent à peu près dans la même direction mais que l'un est beaucoup plus long que l'autre, les deux seront tout de même considérés comme similaires. La similarité du produit de points, également appelée similarité scalaire ou produit intérieur, améliore cette situation en tenant compte à la fois de l'angle et de la magnitude des vecteurs, ce qui permet d'obtenir une mesure de similarité plus précise. Pour que la magnitude des vecteurs n'ait pas d'importance, la similitude du produit de points exige que les vecteurs soient d'abord normalisés, de sorte que nous ne comparons finalement que des vecteurs de longueur unitaire 1.</p><p>Essayons à nouveau d'illustrer cela avec les deux mêmes personnes que précédemment, mais cette fois-ci, nous les plaçons au milieu d'une pièce circulaire, de sorte que leur portée visuelle soit exactement la même (c.-à-d. le rayon de la pièce). De la même manière que pour la similarité cosinus, plus ils tournent dans la même direction (c'est-à-dire plus leurs vecteurs se rapprochent), plus leur champ de vision se chevauche. Cependant, contrairement à la similitude de cosinus, les deux vecteurs ont la même longueur et les deux aires ont la même surface, ce qui signifie que les deux personnes regardent exactement la même image située à la même distance. Le degré de chevauchement de ces deux zones correspond à la similitude de leur produit de point.</p><p>Avant d'introduire la formule de similarité du produit de points, voyons rapidement comment un vecteur peut être normalisé. C'est assez simple et peut être réalisé en deux étapes triviales :</p><ol><li><p>calculer la magnitude du vecteur</p></li><li><p>diviser chaque composante par la valeur obtenue en 1.</p></li></ol><p>Prenons par exemple le vecteur \vec  Nous pouvons calculer sa magnitude \Vert  \Vert comme nous l'avons vu précédemment lors de l'examen de la similitude du cosinus, c'est-à-dire \sqrt . Ensuite, en divisant chaque composante du vecteur par sa magnitude, on obtient le vecteur normalisé suivant :</p><p>En procédant de la même manière pour le deuxième vecteur \vec  :</p><p>Afin de dériver la formule de similarité du produit en points, nous pouvons calculer la similarité en cosinus entre nos vecteurs normalisés  et  en utilisant la formule (4), comme indiqué ci-dessous :</p><p>Et comme la magnitude des deux vecteurs normalisés est maintenant de , la formule de similitude du produit par points (6) devient simplement... vous l'avez deviné, un produit par points des deux vecteurs normalisés :</p><p>Dans l'image ci-dessous, nous montrons les vecteurs normalisés  et  et nous pouvons illustrer la similarité de leur produit de point comme la projection d'un vecteur sur l'autre (en rouge).</p><p>En utilisant notre nouvelle formule (6), nous pouvons calculer la similarité du produit de points de nos deux vecteurs normalisés, ce qui, sans surprise, donne exactement la même valeur de similarité que celle du cosinus :</p><p>Lorsque l'on utilise la similarité du produit de points, le score est calculé différemment selon que les vecteurs contiennent des valeurs flottantes ou des valeurs d'octets. Dans le premier cas, le score est calculé de la même manière que pour la similarité en cosinus en utilisant la formule (7) ci-dessous :</p><p>Toutefois, lorsque le vecteur est composé de valeurs d'octets, la notation est calculée un peu différemment, comme le montre la formule (8) ci-dessous, où  est le nombre de dimensions du vecteur :</p><p>En outre, pour obtenir des résultats précis, il faut que tous les vecteurs, y compris le vecteur d'interrogation, aient la même longueur, mais pas nécessairement la même longueur (1).</p><h3>Similitude maximale du produit intérieur</h3><p>Depuis la version 8.11, il existe une nouvelle fonction de similarité qui est moins contraignante que la similarité par produit de points, dans la mesure où les vecteurs n'ont pas besoin d'être normalisés. La raison principale est expliquée en détail dans l'<a href="https://www.elastic.co/fr/search-labs/blog/lucene-bringing-maximum-inner-product-to-lucene">article suivant</a>, mais pour résumer très brièvement, certains ensembles de données ne sont pas très bien adaptés à la normalisation de leurs vecteurs (par exemple, <a href="https://www.elastic.co/fr/search-labs/blog/elasticsearch-cohere-embeddings-support">Cohere embeddings</a>) et cette normalisation peut entraîner des problèmes de pertinence.</p><p>La formule de calcul de la similarité maximale du produit intérieur est exactement la même que celle du produit de points (6). Ce qui change, c'est la manière dont le score est calculé en mettant à l'échelle la similarité maximale du produit intérieur à l'aide d'une fonction par morceaux dont la formule dépend du fait que la similarité est positive ou négative, comme le montre la formule (9) ci-dessous :</p><p>Cette fonction par morceaux met à l'échelle toutes les valeurs négatives du produit intérieur maximal dans l'intervalle  et toutes les valeurs positives dans l'intervalle </p><h2>En résumé</h2><p>C'était un sacré parcours, mathématiquement parlant, mais voici quelques enseignements qui pourraient vous être utiles.</p><p>La fonction de similarité que vous pouvez utiliser dépend en fin de compte de la normalisation ou non de vos encastrements vectoriels. Si vos vecteurs sont déjà normalisés ou si votre ensemble de données ne dépend pas de la normalisation des vecteurs (c'est-à-dire que la pertinence n'en souffrira pas), vous pouvez aller de l'avant et normaliser vos vecteurs et utiliser la similarité par produit de points, car elle est beaucoup plus rapide à calculer que celle par cosinus, puisqu'il n'est pas nécessaire de calculer la longueur de chaque vecteur. Lorsque l'on compare des millions de vecteurs, ces calculs peuvent s'avérer très lourds.</p><p>Si vos vecteurs ne sont pas normalisés, vous avez deux possibilités :</p><ol><li><p>utiliser la similarité en cosinus si la normalisation des vecteurs n'est pas possible</p></li><li><p>utiliser le nouveau produit intérieur maximal de similarité si vous souhaitez que la magnitude de vos vecteurs contribue à la notation parce qu'elle est porteuse de sens (par exemple, Cohere embeddings).</p></li></ol><p>À ce stade, le calcul de la distance ou de la similarité entre les intégrations vectorielles et la manière de dériver leurs scores devraient vous sembler évidents. Nous espérons que cet article vous a été utile.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/vector-similarity-measures-and-scoring</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/vector-similarity-measures-and-scoring</guid>
    <category><![CDATA[Base vectorielle]]></category>
    <dc:creator><![CDATA[Valentin Crettaz]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte5a3e9d39849d3ed/6a17da31a2929960a3d02b3f/4d9e89678798b9de68357b5cc06dbbd8b9c6e5e8-1440x823.webp" length="0" type="image/webp"/>
    <pubDate>Mon, 13 May 2024 00:00:00 GMT</pubDate>
  </item>
  </channel>
</rss>