<?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[Julie Tibshirani - 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[Julie Tibshirani - 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/julie-tibshirani</link>
    </image>
    <link>https://www.elastic.co/fr/search-labs/author/julie-tibshirani</link>
    <atom:link href="https://www.elastic.co/fr/search-labs/rss/author/julie-tibshirani.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[fr]]></language>
    <lastBuildDate>Mon, 21 Sep 2026 17:50:41 GMT</lastBuildDate>
  <item>
    <title><![CDATA[Recherche de similitudes textuelles à l'aide de champs vectoriels]]></title>
    <description><![CDATA[Ce billet explore comment les text embeddings et le nouveau type dense_vector d'Elasticsearch pourraient être utilisés pour soutenir la recherche de similarité.]]></description>
    <content:encoded><![CDATA[<p>Depuis ses débuts en tant que <a href="https://www.elastic.co/about/history-of-elasticsearch">moteur de recherche de recettes</a>, Elasticsearch a été conçu pour fournir une recherche plein texte rapide et puissante. Compte tenu de ces racines, l'amélioration de la recherche de texte a été une motivation importante pour nos travaux en cours sur les vecteurs. Dans Elasticsearch 7.0, nous avons introduit des types de champs expérimentaux pour les vecteurs à haute dimension, et maintenant la version 7.3 apporte la prise en charge de l'utilisation de ces vecteurs dans l'évaluation des documents.</p><p>Ce billet se concentre sur une technique particulière appelée recherche par similarité de texte. Dans ce type de recherche, l'utilisateur saisit une courte requête en texte libre et les documents sont classés en fonction de leur similarité avec la requête. La similarité des textes peut être utile dans divers cas d'utilisation :</p><ul><li><p><strong>Réponse aux questions :</strong> À partir d'une collection de questions fréquemment posées, trouver des questions similaires à celle que l'utilisateur a saisie.</p></li><li><p><strong>Recherche d'articles :</strong> Dans une collection d'articles de recherche, renvoyer les articles dont le titre est étroitement lié à la requête de l'utilisateur.</p></li><li><p><strong>Recherche d'images :</strong> Dans un ensemble de données d'images légendées, trouver les images dont la légende est similaire à la description de l'utilisateur.</p></li></ul><p>Une approche simple de la recherche par similarité consisterait à classer les documents en fonction du nombre de mots qu'ils partagent avec la requête. Mais un document peut être similaire à la requête même s'ils n'ont que très peu de mots en commun - une notion plus robuste de similarité prendrait également en compte son contenu syntaxique et <a href="https://en.wikipedia.org/wiki/Semantic_similarity">sémantique</a>.</p><p>La communauté du traitement du langage naturel (NLP) a mis au point une technique appelée "text embedding" qui code les mots et les phrases sous forme de vecteurs numériques. Ces représentations vectorielles sont conçues pour capturer le contenu linguistique du texte et peuvent être utilisées pour évaluer la similarité entre une requête et un document.</p><p>Ce billet explore comment les text embeddings et le type dense_vector d'Elasticsearch pourraient être utilisés pour soutenir la recherche de similarité. Nous donnerons d'abord un aperçu des techniques d'intégration, puis nous présenterons un prototype simple de recherche par similarité à l'aide d'Elasticsearch.</p><strong>Remarque :</strong> l'utilisation des enchâssements de texte dans la recherche est un domaine complexe et en pleine évolution. Ce blog n'est pas une recommandation pour une architecture ou une mise en œuvre particulière. Commencez ici pour découvrir comment vous pouvez améliorer votre expérience de recherche grâce à la puissance de la <a href="https://www.elastic.co/what-is/vector-search">recherche vectorielle</a>.<h2>Qu'est-ce qu'un encartage de texte ?</h2><p>Examinons de plus près les différents types d'enchâssement de texte et leur comparaison avec les méthodes de recherche traditionnelles.</p><h3>Les enchâssements de mots</h3><p>Un modèle d'<a href="https://en.wikipedia.org/wiki/Word_embedding">intégration de mots</a> représente un mot sous la forme d'un vecteur numérique dense. Ces vecteurs visent à capturer les propriétés sémantiques du mot - les mots dont les vecteurs sont proches les uns des autres devraient être similaires en termes de signification sémantique. Dans une bonne intégration, les directions dans l'espace vectoriel sont liées à différents aspects de la signification du mot. Par exemple, le vecteur pour "Canada" peut être proche de "France" dans une direction, et proche de "Toronto" dans une autre.</p><p>Les communautés de recherche et de traitement de texte s'intéressent depuis longtemps aux représentations vectorielles des mots. L'intégration de mots a connu un regain d'intérêt au cours des dernières années, lorsque de nombreuses tâches traditionnelles ont été revues à l'aide de réseaux neuronaux. Certains algorithmes d'intégration de mots ont été développés avec succès, notamment <a href="https://papers.nips.cc/paper/5021-distributed-representations-of-words-and-phrases-and-their-compositionality.pdf">word2vec</a> et <a href="https://nlp.stanford.edu/pubs/glove.pdf">GloVe</a>. Ces approches utilisent de grandes collections de textes et examinent le contexte dans lequel chaque mot apparaît pour déterminer sa représentation vectorielle :</p><ul><li><p>Le modèle word2vec Skip-gram entraîne un réseau neuronal à prédire les mots du contexte autour d'un mot dans une phrase. Les poids internes du réseau donnent l'enchâssement des mots.</p></li><li><p>Dans GloVe, la similarité des mots dépend de leur fréquence d'apparition avec d'autres mots du contexte. L'algorithme entraîne un modèle linéaire simple sur les comptes de cooccurrence des mots.</p></li></ul><p>De nombreux groupes de recherche distribuent des modèles qui ont été pré-entraînés sur de grands corpus de textes tels que Wikipedia ou Common Crawl, ce qui permet de les télécharger et de les intégrer dans des tâches en aval. Bien que des versions pré-entraînées soient parfois utilisées directement, il peut être utile d'adapter le modèle à l'ensemble de données et à la tâche spécifiques. Cela se fait souvent en exécutant une étape de "réglage fin" sur le modèle pré-entraîné.</p><p>Les mots intégrés se sont révélés très robustes et efficaces, et il est désormais courant d'utiliser les mots intégrés à la place des mots individuels dans les tâches de TAL telles que la traduction automatique et la classification des sentiments.</p><h3>Enchâssement de phrases</h3><p>Plus récemment, les chercheurs ont commencé à s'intéresser aux techniques d'intégration qui représentent non seulement des mots, mais aussi des sections de texte plus longues. La plupart des approches actuelles sont basées sur des architectures de réseaux neuronaux complexes et intègrent parfois des données étiquetées lors de la formation afin de faciliter la capture des informations sémantiques.</p><p>Une fois entraînés, les modèles sont capables de prendre une phrase et de produire un vecteur pour chaque mot dans son contexte, ainsi qu'un vecteur pour la phrase entière. Comme pour l'intégration de mots, des versions pré-entraînées de nombreux modèles sont disponibles, ce qui permet aux utilisateurs d'éviter le processus d'entraînement coûteux. Alors que le processus d'apprentissage peut être très gourmand en ressources, l'utilisation du modèle est beaucoup plus légère - les modèles d'intégration de phrases sont généralement assez rapides pour être utilisés dans le cadre d'applications en temps réel.</p><p>Parmi les techniques courantes d'intégration de phrases, on peut citer <a href="https://arxiv.org/abs/1705.02364">InferSent</a>, <a href="https://arxiv.org/abs/1803.11175">Universal Sentence Encoder</a>, <a href="https://arxiv.org/abs/1802.05365">ELMo</a> et <a href="https://arxiv.org/abs/1810.04805">BERT</a>. L'amélioration de l'intégration des mots et des phrases est un domaine de recherche actif, et il est probable que d'autres modèles forts seront introduits.</p><h3>Comparaison avec les méthodes de recherche traditionnelles</h3><p>Dans la recherche d'informations traditionnelle, une façon courante de représenter un texte sous forme de vecteur numérique consiste à attribuer une dimension à chaque mot du vocabulaire. Le vecteur d'un texte est alors basé sur le nombre d'occurrences de chaque terme du vocabulaire. Cette façon de représenter un texte est souvent appelée "bag of words," parce que nous comptons simplement les occurrences de mots sans tenir compte de la structure de la phrase.</p><p>Les text embeddings diffèrent des représentations vectorielles traditionnelles sur certains points importants :</p><ul><li><p>Les vecteurs encodés sont denses et relativement peu dimensionnés, avec souvent entre 100 et 1 000 dimensions. En revanche, les vecteurs de sacs de mots sont peu nombreux et peuvent comporter plus de 50 000 dimensions. Les algorithmes d'intégration codent le texte dans un espace de dimension inférieure dans le cadre de la modélisation de sa signification sémantique. Idéalement, les mots et expressions synonymes se retrouvent avec une représentation similaire dans le nouvel espace vectoriel.</p></li><li><p>Les encastrements de phrases peuvent prendre en compte l'ordre des mots lors de la détermination de la représentation vectorielle. Par exemple, la phrase "tune in" peut être représentée par un vecteur très différent de "in tune".</p></li><li><p>Dans la pratique, les enchâssements de phrases ne s'appliquent pas toujours bien à de grandes parties de texte. Ils ne sont pas couramment utilisés pour représenter un texte plus long qu'un court paragraphe.</p></li></ul><h2>Utilisation des embeddings pour la recherche de similitudes</h2><p>Supposons que nous disposions d'une vaste collection de questions et de réponses. Un utilisateur peut poser une question et nous voulons retrouver la question la plus similaire dans notre collection pour l'aider à trouver une réponse.</p><p>Nous pourrions utiliser des enchâssements de texte pour permettre de retrouver des questions similaires :</p><ul><li><p>Lors de l'indexation, chaque question est traitée par un modèle d'intégration de phrases afin de produire un vecteur numérique.</p></li><li><p>Lorsqu'un utilisateur saisit une requête, celle-ci est traitée par le même modèle d'intégration de phrases pour produire un vecteur. Pour classer les réponses, nous calculons la similarité vectorielle entre chaque question et le vecteur de la requête. Pour comparer les vecteurs d'intégration, il est courant d'utiliser la <a href="https://en.wikipedia.org/wiki/Cosine_similarity">similitude cosinus</a>.</p></li></ul><p><a href="https://github.com/jtibshirani/text-embeddings">Ce dépôt</a> donne un exemple simple de la façon dont cela pourrait être réalisé dans Elasticsearch. Le script principal indexe environ 20 000 questions de l'<a href="https://github.com/elastic/rally-tracks/tree/master/so">ensemble de données StackOverflow</a>, puis permet à l'utilisateur de saisir des requêtes en texte libre dans l'ensemble de données.</p><p>Nous verrons bientôt chaque partie du script en détail, mais voyons d'abord quelques exemples de résultats. Dans de nombreux cas, la méthode est capable de capturer la similarité même lorsqu'il n'y a pas de fort chevauchement de mots entre la requête et la question indexée :</p><ul><li><p>"zippage des fichiers" retours "Compression / décompression des dossiers &amp; Fichiers"</p></li><li><p>"déterminer si quelque chose est une IP" renvoie "Comment déterminer si une chaîne de caractères est une IP ou un nom d'hôte ?"</p></li><li><p>"traduire des octets en doubles" returns "Convertir des octets en nombres à virgule flottante en Python"</p></li></ul><h3>Détails de la mise en œuvre</h3><p><a href="https://github.com/jtibshirani/text-embeddings/blob/blog/src/main.py">Le script</a> commence par télécharger et créer le modèle d'intégration dans TensorFlow. Nous avons choisi l'encodeur universel de phrases de Google, mais il est possible d'utiliser de nombreuses autres méthodes d'intégration. Le script utilise le modèle d'intégration tel quel, sans aucune formation ou mise au point supplémentaire.</p><p>Ensuite, nous créons l'index Elasticsearch, qui comprend des correspondances pour le titre de la question, les balises et le titre de la question encodé sous forme de vecteur :</p>"mappings": {
"properties": {
"title": {
"type": "text"
},
"title_vector": {
"type": "dense_vector",
"dims": 512
}
"tags": {
"type": "keyword"
},
...
}
}
<p>Dans le mapping pour dense_vector, nous devons spécifier le nombre de dimensions que les vecteurs contiendront. Lors de l'indexation d'un champ title_vector, Elasticsearch vérifiera qu'il possède le même nombre de dimensions que celui spécifié dans le mapping.</p><p>Pour indexer les documents, nous faisons passer le titre de la question par le modèle d'intégration afin d'obtenir un tableau numérique. Ce tableau est ajouté au document dans le champ title_vector.</p><p>Lorsqu'un utilisateur saisit une requête, le texte passe d'abord par le même modèle d'intégration et est stocké dans le paramètre query_vector. Depuis la version 7.3, Elasticsearch propose une <a href="https://www.elastic.co/guide/en/elasticsearch/reference/7.6/query-dsl-script-score-query.html#vector-functions">fonction cosineSimilarity</a> dans son langage de script natif. Pour classer les questions en fonction de leur similitude avec la requête de l'utilisateur, nous utilisons donc une requête script_score :</p>{
"script_score": {
"query": {"match_all": {}},
"script": {
"source": "cosineSimilarity(params.query_vector, 'title_vector') + 1.0",
"params": {"query_vector": query_vector}
}
}
}
<p>Nous veillons à transmettre le vecteur de requête en tant que paramètre de script afin d'<a href="https://www.elastic.co/guide/en/elasticsearch/reference/7.6/modules-scripting-using.html#prefer-params">éviter de recompiler le script</a>() à chaque nouvelle requête. Elasticsearch n'autorisant pas les scores négatifs, il est nécessaire d'en ajouter un à la similarité cosinus.</p><p>| <strong>Note :</strong> ce billet de blog utilisait à l'origine une <a href="https://www.elastic.co/guide/en/elasticsearch/reference/7.3/query-dsl-script-score-query.html#vector-functions">syntaxe différente pour les fonctions vectorielles</a> qui était disponible dans Elasticsearch 7.3, mais qui a été supprimée dans la version 7.6.
|</p><h3>Limites importantes</h3><p>La requête script_score est conçue pour envelopper une requête restrictive et modifier les scores des documents qu'elle renvoie. Cependant, nous avons fourni une requête match_all, ce qui signifie que le script sera exécuté sur tous les documents de l'index. Il s'agit d'une limitation actuelle de la similarité vectorielle dans Elasticsearch - les vecteurs peuvent être utilisés pour évaluer les documents, mais pas dans l'étape de recherche initiale. L'aide à la recherche basée sur la similarité des vecteurs est un domaine important des <a href="https://github.com/elastic/elasticsearch/issues/42326">travaux en cours.</a></p><p>Pour éviter de parcourir tous les documents et maintenir des performances élevées, la requête match_all peut être remplacée par une requête plus sélective. La bonne requête à utiliser pour la recherche dépend probablement du cas d'utilisation spécifique.</p><p>Bien que nous ayons vu quelques exemples encourageants ci-dessus, il est important de noter que les résultats peuvent également être bruyants et non intuitifs. Par exemple, "zippant les fichiers" attribue également des scores élevés à "Partiel .csproj Fichiers" et "Comment éviter .pyc fichiers ?". Et lorsque la méthode renvoie des résultats surprenants, il n'est pas toujours évident de déboguer le problème - la signification de chaque composante du vecteur est souvent opaque et ne correspond pas à un concept interprétable. Avec les techniques de notation traditionnelles basées sur le chevauchement des mots, il est souvent plus facile de répondre à la question suivante : "pourquoi ce document est-il bien classé ?"</p><p>Comme indiqué précédemment, ce prototype est conçu comme un exemple de la manière dont les modèles d'intégration peuvent être utilisés avec les champs vectoriels, et non comme une solution prête à l'emploi. Lors de l'élaboration d'une nouvelle stratégie de recherche, il est essentiel de tester les performances de l'approche sur vos propres données, en veillant à les comparer à une base de référence solide telle qu'une requête de correspondance. Il peut s'avérer nécessaire d'apporter des modifications majeures à la stratégie avant qu'elle n'obtienne des résultats solides, notamment en affinant le modèle d'intégration pour l'ensemble de données cible ou en essayant différentes manières d'intégrer les intégrations, telles que l'expansion des requêtes au niveau des mots.</p><h2>Conclusions</h2><p>Les techniques d'intégration constituent un moyen puissant de capturer le contenu linguistique d'un texte. En indexant les enchâssements et en attribuant des notes basées sur la distance vectorielle, nous pouvons comparer les documents en utilisant une notion de similarité qui va au-delà de leur chevauchement au niveau des mots.</p><p>Nous sommes impatients d'introduire davantage de fonctionnalités basées sur le type de champ vectoriel. L'utilisation des vecteurs pour la recherche est un domaine nuancé et en développement - comme toujours, nous serions ravis de connaître vos cas d'utilisation et vos expériences sur <a href="https://github.com/elastic/elasticsearch">Github</a> et les <a href="https://discuss.elastic.co/">forums de discussion</a>!</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/text-similarity-search-with-vectors-in-elasticsearch</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/text-similarity-search-with-vectors-in-elasticsearch</guid>
    <category><![CDATA[Base vectorielle]]></category>
    <dc:creator><![CDATA[Julie Tibshirani]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt91384bd99b05cd28/6a17e7e01d1b835cc593e467/c633ed737add7d22a7d65b3ca5c56480ef3d8b2c-720x420.jpg" length="0" type="image/jpeg"/>
    <pubDate>Thu, 06 Oct 2022 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Mise en œuvre de documents universitaires : Leçons tirées d'Elasticsearch et Lucene]]></title>
    <description><![CDATA[Découvrez des stratégies pour intégrer des documents de recherche dans une application logicielle, en vous appuyant sur nos expériences avec Elasticsearch et Lucene.]]></description>
    <content:encoded><![CDATA[<p>Cet article présente des stratégies pour intégrer des documents académiques dans une application logicielle. Il s'appuie sur des exemples tirés d'Elasticsearch et de Lucene dans l'espoir d'aider d'autres ingénieurs à tirer parti de nos expériences. En lisant ces stratégies, vous vous dites peut-être "mais ce n'est que du développement logiciel !". Et ce serait en effet vrai : en tant qu'ingénieurs, nous disposons déjà des bonnes pratiques et des bons outils, il suffit de les adapter à un nouveau défi.</p><h2>Arrière-plan</h2><p>Lors du développement d'Elasticsearch, nous rencontrons parfois un problème important pour lequel il n'existe pas d'approche simple ou établie. Il est naturel de se demander s'il existe un document universitaire traitant de cette question. D'autres fois, le travail universitaire est une source d'inspiration. Nous tombons sur un article proposant un nouvel algorithme ou une nouvelle structure de données et nous nous disons "ce serait tellement utile !". Voici quelques exemples de la façon dont Elasticsearch et Apache Lucene intègrent des travaux universitaires :</p><ul><li><p><a href="https://research.google/pubs/pub40671/">HyperLogLog++</a> pour les <a href="https://www.elastic.co/guide/en/elasticsearch/reference/7.15/search-aggregations-metrics-cardinality-aggregation.html">agrégations de cardinalité</a></p></li><li><p><a href="https://www.usenix.org/system/files/conference/nsdi15/nsdi15-paper-suresh.pdf">Algorithme C3</a> pour la <a href="https://www.elastic.co/blog/improving-response-latency-in-elasticsearch-with-adaptive-replica-selection">sélection adaptative des répliques</a></p></li><li><p><a href="https://arxiv.org/abs/1603.09320">Graphes hiérarchiques navigables du petit monde (HNSW)</a> pour la recherche du vecteur le plus proche dans Lucene</p></li><li><p><a href="https://jmlr.csail.mit.edu/papers/volume17/15-308/15-308.pdf">Statistique MIC</a> pour <a href="https://github.com/elastic/ml-cpp/pull/488">améliorer la classification par apprentissage automatique</a></p></li><li><p><a href="http://engineering.nyu.edu/~suel/papers/bmw.pdf">Block-max WAND</a> pour une <a href="https://www.elastic.co/blog/faster-retrieval-of-top-hits-in-elasticsearch-with-block-max-wand">recherche plus rapide des meilleurs résultats dans Lucene</a></p></li><li><p>... et <a href="https://www.elastic.co/guide/en/elasticsearch/reference/7.15/query-dsl-combined-fields-query.html">bien d'</a> <a href="https://github.com/elastic/elasticsearch/blob/b2a9328890b23e7ccf6c66a3b13d6d65e453a3dd/server/src/main/java/org/elasticsearch/search/sort/BucketedSort.java#L302-L323">autres encore</a></p></li></ul><p>Les articles universitaires constituent une ressource inestimable pour les ingénieurs qui développent des systèmes à forte intensité de données. Mais leur mise en œuvre peut être intimidante et sujette à des erreurs - les descriptions d'algorithmes sont souvent complexes et des détails pratiques importants sont omis. Les tests constituent un véritable défi : par exemple, comment tester de manière approfondie un algorithme d'apprentissage automatique dont le résultat dépend étroitement de l'ensemble de données ?</p><h2>Évaluez le document comme vous le feriez pour une dépendance logicielle.</h2><p>L'ajout d'une nouvelle dépendance logicielle nécessite une évaluation minutieuse : si l'autre paquet est incorrect, lent ou peu sûr, notre projet pourrait l'être aussi. Avant d'intégrer une dépendance, les développeurs veillent à en évaluer la qualité.</p><p>Il en va de même pour les travaux universitaires que vous envisagez de mettre en œuvre. On peut penser que parce qu'un algorithme a été publié dans un article, il doit être correct et performant. Mais même s'il a été soumis à un processus d'examen, un document universitaire peut présenter des problèmes. Peut-être que la preuve d'exactitude repose sur des hypothèses qui ne sont pas réalistes. Il se peut aussi que la section "expériences" montre des performances nettement supérieures à celles de la ligne de base, mais que cela ne soit valable que pour un ensemble de données spécifique. Même si le document est de grande qualité, son approche peut ne pas convenir à votre projet.</p><p>Lorsque l'on se demande si l'on doit accepter une "dépendance" à l'égard d'un document universitaire, il est utile de se poser les mêmes questions que celles que l'on se poserait à l'égard d'un logiciel :</p><ul><li><p>La bibliothèque est-elle largement utilisée et "testée au combat" ? → D'autres paquets ont-ils mis en œuvre ce document, et cela a-t-il bien fonctionné pour eux ?</p></li><li><p>Existe-t-il des critères de performance ? Ces données vous semblent-elles exactes et équitables ? → L'article comporte-t-il des expériences réalistes ? Sont-ils bien conçus ?</p></li><li><p>L'amélioration des performances est-elle suffisamment importante pour justifier la complexité ? → Le document est-il comparable à une approche de référence solide ? Dans quelle mesure la performance est-elle supérieure à celle de la base de référence ?</p></li><li><p>L'approche s'intégrera-t-elle bien à notre système ? → Les hypothèses et les compromis de l'algorithme sont-ils adaptés à notre cas d'utilisation ?</p></li></ul><p>D'une manière ou d'une autre, lorsqu'un logiciel publie une comparaison de ses performances avec celles de ses concurrents, c'est toujours le logiciel qui est le plus rapide ! Si une tierce partie a conçu les critères de référence, ils peuvent être plus équilibrés. Le même phénomène s'applique aux travaux universitaires. Si un algorithme donne de bons résultats non seulement dans l'article original, mais apparaît également dans d'autres articles comme une référence solide, il est très probable qu'il soit solide.</p><h2>Soyez créatifs avec les tests</h2><p>Les algorithmes tirés d'articles universitaires ont souvent un comportement plus sophistiqué que les types d'algorithmes que nous rencontrons couramment. Il s'agit peut-être d'un algorithme d'approximation qui troque la précision contre une plus grande rapidité. Il peut aussi s'agir d'une méthode d'apprentissage automatique qui prend en compte un vaste ensemble de données et produit des résultats (parfois inattendus). Comment pouvons-nous écrire des tests pour ces algorithmes si nous ne pouvons pas caractériser leur comportement de manière simple ?</p><h3>Focus sur les invariants</h3><p>Lors de la conception des tests unitaires, il est courant de penser en termes d'exemples : si nous donnons à l'algorithme cet exemple d'entrée, il devrait produire cette sortie. Malheureusement, pour la plupart des algorithmes mathématiques, les tests basés sur des exemples ne couvrent pas suffisamment leur comportement.</p><p>Considérons l'algorithme C3, qu'Elasticsearch utilise pour déterminer quel nœud doit traiter une requête de recherche. Il classe chaque nœud à l'aide d'une formule nuancée qui incorpore le service précédent et les temps de réponse du nœud, ainsi que la taille de sa file d'attente. Tester quelques exemples ne permet pas vraiment de vérifier que nous avons compris la formule correctement. Il est utile de prendre du recul et de réfléchir au test des invariants : si le temps de service augmente, le rang du nœud diminue-t-il ? Si la taille de la file d'attente est de 0, le rang est-il déterminé par le temps de réponse, comme le prétend le document ?</p><p>Se concentrer sur les invariants peut s'avérer utile dans un certain nombre de cas courants :</p><ul><li><p>La méthode est-elle censée ne pas tenir compte de l'ordre ? Si c'est le cas, le fait de passer les données d'entrée dans un ordre différent devrait produire le même résultat.</p></li><li><p>Certaines étapes de l'algorithme produisent-elles des probabilités de classe ? Si c'est le cas, la somme de ces probabilités doit être égale à 1.</p></li><li><p>La fonction est-elle symétrique par rapport à l'origine ? Si c'est le cas, l'inversion du signe de l'entrée devrait simplement inverser le signe de la sortie.</p></li></ul><p>Lorsque nous avons mis en œuvre C3 pour la première fois, nous avons eu un problème dans la formule où nous avons accidentellement utilisé l'inverse du temps de réponse à la place du temps de réponse. Cela signifie que les nœuds les plus lents peuvent être mieux classés ! Lors de la correction du problème, nous avons veillé <a href="https://github.com/elastic/elasticsearch/pull/70283">à ajouter des vérifications invariantes</a> afin d'éviter de nouvelles erreurs.</p><h3>Comparer avec une implémentation de référence</h3><p>Parallèlement à l'article, les auteurs ont publié une mise en œuvre de l'algorithme. (Cela est particulièrement probable si l'article contient des expériences, car de nombreuses revues exigent que les auteurs publient le code permettant de reproduire les résultats). Vous pouvez tester votre approche par rapport à cette implémentation de référence pour vous assurer que vous n'avez pas oublié des détails importants de l'algorithme.</p><p>Lors du développement de l'implémentation HNSW de Lucene pour la recherche du plus proche voisin, nous avons <a href="https://issues.apache.org/jira/browse/LUCENE-9937">testé une bibliothèque de référence</a> créée par les auteurs de l'article. Nous avons testé Lucene et la bibliothèque sur le même ensemble de données, en comparant la précision de leurs résultats et le nombre de calculs qu'ils ont effectués. Lorsque ces nombres correspondent étroitement, nous savons que Lucene met fidèlement en œuvre l'algorithme.</p><p>Lors de l'intégration d'un algorithme dans un système, il est souvent nécessaire de procéder à des modifications ou à des extensions, comme l'adaptation à plusieurs cœurs ou l'ajout d'heuristiques pour améliorer les performances. Il est préférable de commencer par mettre en œuvre une version "vanilla", de la tester par rapport à la référence, puis d'y apporter des modifications incrémentielles. Vous pouvez ainsi être sûr d'avoir capturé tous les éléments clés avant de procéder à des personnalisations.</p><h3>Duel contre un algorithme existant</h3><p>La dernière section propose une autre idée d'invariant de test : comparer le résultat de l'algorithme à celui d'un algorithme plus simple et mieux compris. Prenons l'exemple de l'algorithme WAND block-max de Lucene, qui accélère la recherche de documents en ignorant ceux qui ne peuvent pas figurer dans les premiers résultats. Il est difficile de décrire exactement le comportement de l'outil WAND block-max dans tous les cas, mais nous savons que son application ne devrait pas modifier les premiers résultats ! Nos tests peuvent donc générer plusieurs requêtes de recherche aléatoires, puis <a href="https://github.com/apache/lucene/blob/main/lucene/core/src/test/org/apache/lucene/search/TestWANDScorer.java#L669">les exécuter avec et sans l'optimisation WAND</a> et vérifier que les résultats correspondent toujours.</p><p>Un aspect important de ces tests est qu'ils <a href="https://www.elastic.co/blog/elasticsearch-testing-qa-increasing-coverage-randomizing-test-runs">génèrent des entrées aléatoires</a> sur lesquelles la comparaison est effectuée. Cela peut permettre de mettre en œuvre des cas auxquels vous n'auriez pas pensé et de mettre en évidence des problèmes inattendus. Par exemple, le test de comparaison aléatoire de Lucene pour la notation BM25F a permis de <a href="https://issues.apache.org/jira/browse/LUCENE-10039">détecter des bogues dans des cas subtils</a>. L'idée d'alimenter un algorithme avec des entrées aléatoires est étroitement liée au concept de <a href="https://en.wikipedia.org/wiki/Fuzzing">fuzzing</a>, une technique de test courante dans le domaine de la sécurité informatique.</p><p>Elasticsearch et Lucene utilisent fréquemment cette approche de test. Si vous voyez un test qui mentionne un duel "" entre deux algorithmes (TestDuelingAnalyzers, testDuelTermsQuery...), vous savez que cette stratégie est en action.</p><h2>Utiliser la terminologie du document</h2><p>Lorsqu'un autre développeur travaillera avec votre code, il devra consulter le document pour en suivre les détails. Le <a href="https://github.com/elastic/elasticsearch/blob/4f22f437ee50cacb94b37b457be1da0b8ba0e8ce/server/src/main/java/org/elasticsearch/search/aggregations/metrics/HyperLogLogPlusPlus.java#L24-L39">commentaire sur l'implémentation HyperLogLog++ d'Elasticsearch</a> le dit bien : "Essayer de comprendre ce que fait cette classe sans avoir lu le document est considéré comme aventureux." Ce commentaire de méthode constitue également un bon exemple. Elle comprend un lien vers l'article universitaire et met en évidence les modifications apportées à l'algorithme tel qu'il a été décrit à l'origine.</p><p>Étant donné que les développeurs fonderont leur compréhension du code sur le document, il est utile d'utiliser exactement la même terminologie. La notation mathématique étant laconique, il peut en résulter des noms qui ne seraient pas habituellement considérés comme "de bon style", mais qui sont très clairs dans le contexte de l'article. Les formules tirées d'articles universitaires sont l'une des rares occasions où vous rencontrerez des noms de variables cryptiques dans Elasticsearch, comme <a href="https://github.com/elastic/elasticsearch/blob/4f22f437ee50cacb94b37b457be1da0b8ba0e8ce/server/src/main/java/org/elasticsearch/node/ResponseCollectorService.java#L151">rS et muBarSInverse</a>.</p><p>
<em>La façon recommandée par l'auteur pour lire un article : avec un grand café.</em></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt12d81453c706f7cb/6a17d80e0b0bede6badd3424/d03a8e2a50e173b15a4ec3732810c63ff53321f6-1440x1081.jpg" alt="elastic-blog-academicpaper.jpg" /><h2>Vous pouvez envoyer un courriel à l'auteur</h2><p>Lorsque vous travaillez sur un document difficile, vous pouvez passer des heures à réfléchir à une formule, sans savoir si vous avez mal compris ou s'il s'agit simplement d'une erreur de frappe. S'il s'agissait d'un projet open source, vous pourriez poser une question sur GitHub ou StackOverflow. Mais à qui s'adresser pour obtenir un travail universitaire ? Les auteurs semblent occupés et pourraient être ennuyés par vos courriels.</p><p>Au contraire, de nombreux universitaires aiment entendre que leurs idées sont mises en pratique et sont heureux de répondre à des questions par courrier électronique. Si vous travaillez sur un produit qu'ils connaissent bien, il se peut même qu'ils listent l'application sur leur site web !</p><p>Les universitaires ont également de plus en plus tendance à discuter de leurs articles en public, en utilisant les mêmes outils que ceux utilisés pour le développement de logiciels. Si un article est accompagné d'un logiciel, vous pouvez trouver des réponses aux <a href="https://github.com/facebookresearch/faiss/issues/1928">questions les plus courantes sur Github</a>. Les communautés Stack Exchange telles que "Theoretical Computer Science" et "Cross Validated" contiennent également des <a href="https://cstheory.stackexchange.com/questions/49296/problem-in-the-paper-stable-minimum-space-partitioning-in-linear-time">discussions détaillées sur les articles les plus populaires</a>. Certaines conférences ont commencé à publier en ligne tous les comptes rendus d'articles. Ces revues contiennent des <a href="https://openreview.net/forum?id=H1eA7AEtvS">discussions</a> avec les auteurs qui peuvent apporter des informations utiles sur l'approche.</p><h2>A suivre</h2><p>Cet article se concentre sur les bases du choix d'un document académique et sur la manière de le choisir. </p><p>L'algorithme doit être mis en œuvre correctement, mais il ne couvre pas tous les aspects du déploiement réel de l'algorithme. Par exemple, si l'algorithme n'est qu'un élément d'un système complexe, comment s'assurer que les modifications apportées à cet élément conduisent à des améliorations de bout en bout ? Et que se passe-t-il si l'intégration de l'algorithme nécessite des modifications ou des extensions substantielles que l'article original ne couvre pas ? Il s'agit là de sujets importants sur lesquels nous espérons revenir dans de prochains articles.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/implementing-academic-papers-lessons-learned-from-elasticsearch-and-lucene</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/implementing-academic-papers-lessons-learned-from-elasticsearch-and-lucene</guid>
    <category><![CDATA[Recherche ML]]></category>
    <category><![CDATA[Lucene]]></category>
    <dc:creator><![CDATA[Julie Tibshirani]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltbd7e961f594005e7/6a17d80f033c8d981f6bb009/d240bfef29e9d432069059b312dd044eb76eec6c-1440x840.png" length="0" type="image/png"/>
    <pubDate>Wed, 29 Sep 2021 00:00:00 GMT</pubDate>
  </item>
  </channel>
</rss>