<?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[Recherche ML - 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[Recherche ML - 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/blog/category/ml-research</link>
    </image>
    <link>https://www.elastic.co/fr/search-labs/blog/category/ml-research</link>
    <atom:link href="https://www.elastic.co/fr/search-labs/rss/category/ml-research.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[fr]]></language>
    <lastBuildDate>Tue, 22 Sep 2026 01:53:56 GMT</lastBuildDate>
  <item>
    <title><![CDATA[Clustering de documents non supervisé avec Elasticsearch + Jina embeddings]]></title>
    <description><![CDATA[Une approche pratique et reproductible pour le clustering non supervisé de documents avec Elasticsearch et les embeddings Jina.]]></description>
    <content:encoded><![CDATA[<p>La recherche vectorielle s’appuie sur une requête, mais qu’en est-il si vous n’en avez aucune ?</p><p>Les organisations amassent d’importantes quantités de documents, tels que des tickets d’assistance, des documents juridiques, des flux de nouvelles et des travaux de recherche ; elles doivent comprendre ce qu’ils contiennent avant d’être en mesure de poser les questions pertinentes. Sans libellés ni données d’entraînement, il est impossible de passer en revue manuellement des milliers de documents. La recherche classique n’est d’aucun secours lorsque vous ne savez pas quoi chercher.</p><p>Cet article explore une approche native d’Elasticsearch pour le partitionnement de documents sans supervision et le suivi d’histoires temporelles permettant de pallier ce problème de découverte. Au terme de cette lecture, vous pourrez suivre l’évolution de récits de ce type au fil des jours :</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta8c243e0c5773440/6a17093fa6c2b98c86e7968c/100a60a7fb85da8ab3813fd071a82c93f2c3f318-1300x650.png" alt="Chaînes narratives temporelles s’étalant sur février 2025 — chaque tracé de couleur est une histoire qui perdure dans le temps, tandis que l’épaisseur du lien illustre la force de l’ajustement kNN" /><p><strong>Ce que vous découvrirez :</strong></p><ul><li><p>Pourquoi le recours aux <strong>plongements dédiés au clustering</strong> (plutôt qu’à la recherche d’information) est crucial pour identifier des thématiques en l’absence de requête explicite.</p></li><li><p>Comment la classification centroïde par densité regroupe les documents par sujet en utilisant Elasticsearch k-nearest neighbor (kNN) et par lots <code>msearch</code>.</p></li><li><p>Comment <a href="https://www.elastic.co/docs/reference/aggregations/search-aggregations-bucket-significanttext-aggregation"><code>significant_text</code></a> peut étiqueter automatiquement les clusters pour que les thèmes soient lisibles sans avoir à créer de modèle.</p></li><li><p>Comment les chaînes d'histoires temporelles relient le clustering quotidien pour montrer comment les thèmes évoluent de jour en jour.</p></li></ul><p>Le pipeline utilise environ 8 500 articles de février 2025 provenant de BBC News et du Guardian comme corpus de test. Le secteur des informations est idéal car il possède une dynamique temporelle explicite, mais ce schéma s’adapte à tout processus de découverte documentaire : audit juridique, contrôle de conformité, synthèse documentaire, triage du support technique.</p><p><strong>Pile :</strong></p><ul><li><p><a href="https://www.elastic.co/search-labs/blog/jina-embeddings-v5-text"><strong>Jina v5</strong></a> <strong>Plongements de regroupement :</strong> des adaptateurs LoRA (Low-Rank Adaptation) spécifiques à la tâche pour le groupement thématique. <a href="https://www.elastic.co/blog/elastic-jina-ai">Jina a rejoint Elastic</a>, et ses modèles sont directement disponibles par le biais du <a href="https://www.elastic.co/docs/explore-analyze/elastic-inference/eis">Elastic Inference Service (EIS)</a>.</p></li><li><p><strong>Elasticsearch :</strong> Scalable <a href="https://www.elastic.co/docs/solutions/search/vector/knn">kNN</a>, étiquetage <code>significant_text</code> et stockage vectoriel.</p></li><li><p><a href="https://www.elastic.co/search-labs/blog/diskbbq-elasticsearch-introduction"><strong>DiskBBQ :</strong></a> format d'index vectoriel sur disque combinant une <a href="https://www.elastic.co/docs/reference/elasticsearch/index-settings/bbq">meilleure quantification binaire (BBQ)</a> et un partitionnement hiérarchique par k-means pour l'accélération de l'approximation des plus proches voisins (ANN). Ce partitionnement de l'index est interne à la recherche vectorielle et distinct de l'algorithme de clustering par densité utilisé dans ce billet. <code>bbq_disk</code> stocke les vecteurs quantifiés sur disque et ne conserve que les métadonnées de partition en tas, réduisant considérablement les besoins en ressources par rapport à <code>bbq_hnsw</code>, tout en maintenant un rappel élevé.</p></li><li><p><strong>Clustering global + liaison temporelle quotidienne :</strong> découverte et évolution des récits.</p></li></ul><p><strong>Ce dont vous aurez besoin :</strong></p><ul><li><p>Un déploiement Elasticsearch (Elastic Cloud, Elasticsearch Serverless, ou Elastic Self-Managed 8.18+/9.0+) : <code>bbq_disk</code> nécessite une version 8.18 ou plus récente. La partie optionnelle sur le récupérateur de diversité exige la version 9.3+ ou une solution sans serveur.</p></li><li><p>Une <a href="https://jina.ai/embeddings/">clé API Jina</a>: Le niveau gratuit comprend 10 millions de jetons, ce qui couvre le pipeline de clustering de noyau (~4,25 millions de jetons). La comparaison facultative entre la récupération et le clustering utilise un second passage de plongement.</p></li><li><p>Une <a href="https://bonobo.capi.gutools.co.uk/register/developer">clé API Guardian</a> (gratuite).</p></li></ul><h2>Configuration</h2><p>Installez les packs requis :</p>pip install elasticsearch pandas numpy plotly umap-learn python-dotenv pydantic-settings datasets requests<p>Facultatif (uniquement si vous exécutez des assistants de scraping depuis ce dépôt) :</p>pip install beautifulsoup4<p>Ensuite, configurez les clés API dans un fichier <code>.env</code> à la racine du projet :</p>ELASTIC_CLOUD_ID=your-cloud-id        # or ELASTIC_HOST=https://...
ELASTIC_API_KEY=your-api-key
JINA_API_KEY=your-jina-key
GUARDIAN_API_KEY=your-guardian-key<p>Ce bloc-notes appelle <code>load_dotenv(override=True)</code>, donc les valeurs locales <code>.env</code> ont la priorité.</p>Connected to Elasticsearch<h2>Partie 1 : Clustering de découverte — Pourquoi effectuer un clustering de plongements ?</h2><p>La plupart des recherches vectorielles utilisent des <strong>plongements de récupération</strong> entraînés pour associer une <em>requête</em> à des <em>documents</em> pertinents. C'est parfait pour les recherches, mais pas pour les découvertes. Lorsque vous souhaitez trouver les sujets qui existent dans un corpus sans aucune requête, vous avez besoin de plongements qui regroupent des documents similaires.</p><p>Jina v5 résout ce problème grâce à des <strong>adaptateurs LoRA (Low-Rank Adaptation) spécifiques à chaque tâche</strong>. Grâce à LoRA, des ajustements de rang réduit sont injectés dans des couches internes spécifiques tandis que le reste du modèle demeure figé, ce qui réaligne ses capacités sur une tâche donnée sans passer par un cycle de réentraînement complet. Le même modèle de base produit des plongements différents selon le paramètre <code>task</code> :</p><p>Tâche</p><p>Entraîné pour</p><p>Cas d'utilisation</p><p>retrieval.passage</p><p>Correspondance requête-document</p><p>Recherche, génération augmentée par récupération (RAG)</p><p>clustering</p><p>Regroupement de sujets (optimisé pour des clusters serrés)</p><p>Découverte, catégorisation</p><p>L'adaptateur de clustering est formé pour <em>rapprocher</em> les documents sur le même sujet dans l'espace d'intégration et <em>éloigner</em> les documents sur des sujets différents. La comparaison visuelle ci-dessous montre clairement la différence.</p><h3>Recherche et clustering : une comparaison visuelle</h3><p>Pour observer la différence, un échantillon de documents est intégré avec les deux types de tâches. Le clustering est effectué dans l'espace d'intégration original à 1024 dimensions ; l'approximation uniforme et la projection (UMAP) sont utilisées uniquement pour projeter ces intégrations en 2D à des fins de visualisation. L’UMAP conserve la structure de voisinage local, ce qui facilite la comparaison de la segmentation des clusters.</p><p>Ci-dessous, le même échantillon de 480 documents est intégré avec les deux types de tâches et projeté en 2D avec UMAP. Cherchez des groupes de couleurs plus serrés et plus séparés dans le panneau de clustering.</p>    Full dataset: 8,495 articles
    Sources: guardian: 5749, bbc: 2746
    Date range: 2025-02-01 to 2025-02-28


    Sample: 480 docs across 8 sections
    section
    Film              60
    World news        60
    Australia news    60
    Opinion           60
    Football          60
    US news           60
    Sport             60
    Business          60


    Clustering embeddings: 480
    Retrieval embeddings:  480


    UMAP projection complete<img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4b3733dccad212b6/6a1709407d8d67aaeb70e6a4/9bcf7a744900560c1c6c63a2dc3af2f9bfd33e11-1100x500.png" alt="Comparaison UMAP des plongements de recherche par rapport aux plongements de clustering" /><p><em>Les plongements de recherche (à gauche) répartissent les sujets de manière large ; les plongements de clustering (à droite) produisent des groupes plus serrés et mieux séparés à partir des mêmes documents.</em></p><p>Les plongements de clustering produisent des groupes plus serrés et plus distincts visuellement. Les plongements de recherche répartissent les sujets de manière plus uniforme, ce qui est idéal pour la recherche (similarité à grain fin) ; mais pour la découverte, ce sont les clusters thématiques serrés qui importent.</p><p>C’est pourquoi <code>task="clustering"</code> est utilisé pour le reste de cette explication.</p><h3>Chargement de l'ensemble de données</h3><p>Le corpus combine deux sources d'actualités pour février 2025 :</p><ul><li><p><strong>BBC News</strong> via l'ensemble de données <a href="https://huggingface.co/datasets/RealTimeData/bbc_news_alltime">RealTimeData/bbc_news_alltime</a> de HuggingFace.</p></li><li><p><strong>The Guardian</strong> via <a href="https://open-platform.theguardian.com/">l’API Open Platform de Guardian</a>.</p></li></ul><p>Le fait d'avoir plusieurs sources permet de vérifier que le clustering permet de trouver des <em>sujets</em> plutôt qu'un style spécifique à la <em>source.</em></p>    Total articles:  8,495
    
    Source breakdown:
    source
    guardian    5749
    bbc         2746
    
    Date range: 2025-02-01 → 2025-02-28
    Days covered: 28
    
    Sample article:
      Source:  guardian
      Title:   Carbon monoxide poisoning ruled out in death of Gene Hackman and wife, police sa
      Section: Film
      Text:    Authorities have ruled out that Gene Hackman and his wife, Betsy Arakawa, died from carbon monoxide poisoning earlier this week in their home in Santa Fe, New Mexico. The Santa Fe county sheriff, Adan...<h3>Intégration avec la tâche de clustering</h3><p>L’API de Jina v5 est sollicitée avec le paramètre <code>task="clustering"</code> pour l’ensemble des documents. Les plongements sont mis en cache sur le disque, de sorte que les exécutions ultérieures ignorent complètement l’API.</p><p>L'appel d'API est simple. Le paramètre <code>task</code> est la différence clé avec l’utilisation typique de l’intégration :</p>payload = {
    "model": "jina-embeddings-v5-text-small",
    "input": texts,
    "task": "clustering",  # ← This selects the clustering LoRA adapter
}<p>Le chronométrage ci-dessous correspond à un accès au cache. La première exécution de l'API prend plus de temps, en fonction de la taille du corpus.</p>    Embeddings ready: 8,495 vectors of dimension 1024
    Time: 0.6s<h3>Indexation dans un seul index Elasticsearch</h3><p>Pour le clustering de découverte, le mois entier est placé dans un seul index (<code>docs-clustering-all</code>). Le partitionnement journalier intervient plus tard, pour la liaison temporelle des articles.</p><p>Le mappage d'index utilise <a href="https://www.elastic.co/docs/reference/elasticsearch/index-settings/bbq"><code>bbq_disk</code></a> pour le champ vectoriel :</p>{
  "embedding": {
    "type": "dense_vector",
    "dims": 1024,
    "index": true,
    "similarity": "cosine",
    "index_options": {
      "type": "bbq_disk"        // hierarchical k-means partitioning for ANN index lookup; separate from this post's clustering algorithm
    }
  }
}<p>Un vecteur Float32 de 1024 dimensions représente 4 Ko. <a href="https://www.elastic.co/search-labs/blog/diskbbq-elasticsearch-introduction"><code>bbq_disk</code></a> utilise des k-moyens hiérarchiques pour partitionner les vecteurs en petits clusters, les quantifier en binaire et stocker les vecteurs en pleine précision sur disque pour les re-noter. Seules les métadonnées des partitions sont conservées en mémoire vive, ce qui permet de maintenir des exigences matérielles minimales, même avec des volumes de données importants. Pour les charges de travail qui peuvent se permettre plus de mémoire, <a href="https://www.elastic.co/docs/reference/elasticsearch/index-settings/bbq"><code>bbq_hnsw</code></a> construit un graphe Hierarchical Navigable Small World (HNSW) pour des recherches plus rapides à un coût de ressources plus élevé.</p><p>Le type de champ <a href="https://www.elastic.co/docs/reference/elasticsearch/mapping-reference/dense-vector"><code>dense_vector</code></a> prend en charge plusieurs stratégies de quantification : <code>bbq_disk</code> et <code>bbq_hnsw</code> sont les meilleurs ajustements pour les plongements de haute dimension comme les vecteurs 1024-dim utilisés ici.</p>    Indexed 8,495 documents into docs-clustering-all
    Time: 57.5s<h3>Clustering : classification de centroïdes par sondage de densité</h3><p>Les algorithmes de partitionnement classiques tels que HDBSCAN partent du principe que l’intégralité de la matrice vectorielle N×d est stockée en mémoire pour exécuter des cycles de mises à jour exhaustifs. Avec 8 495 documents et 1024 dimensions, la charge est supportable (~35 Mo), toutefois la méthode ne peut s’étendre à des millions de documents sans ressources d’infrastructure additionnelles.</p><p>Cet algorithme est conceptuellement proche de l’initialisation KMeans++ avec une affectation de Voronoï et un seuil de bruit, mais il utilise la <a href="https://www.elastic.co/docs/solutions/search/vector/knn">recherche kNN</a> d’Elasticsearch comme primitive de calcul, ce qui permet de réaliser la quasi-totalité du travail côté serveur :</p><ol><li><p><strong>Échantillonner 5 % des documents</strong> comme sondes de densité (échantillon aléatoire, minimum 50).</p></li><li><p><strong>Densité des sondes par lots via</strong> <a href="https://www.elastic.co/docs/api/doc/elasticsearch/operation/operation-msearch"><strong><code>msearch</code></strong></a> <strong>kNN.</strong> Chaque sonde lance une requête kNN et enregistre la similarité moyenne de ses voisins. Similarité moyenne élevée = zone dense de l'espace d'intégration. <a href="https://www.elastic.co/docs/api/doc/elasticsearch/operation/operation-msearch"><code>msearch</code></a> envoie plusieurs requêtes de recherche en un seul appel HTTP, ce qui est crucial ici : le sondage de densité génère des centaines de requêtes kNN, et leur regroupement par lots permet d’éviter la surcharge liée à chaque requête individuelle.</p></li><li><p><strong>Sélection de germes à haute densité avec diversification</strong> : les éléments dont la densité est supérieure à la médiane sont classés par ordre décroissant ; ils sont ensuite retenus selon un algorithme glouton, à condition que leur similarité cosinus par rapport aux germes déjà sélectionnés ne dépasse pas un seuil de séparation défini. C’est le seul calcul côté client (~0,01s pour 8k documents).</p></li><li><p><strong>Classez tous les documents par rapport aux centroïdes via</strong> <strong><code>msearch</code></strong> <strong>kNN</strong>: Chaque graine agit comme un centroïd  ; une recherche kNN permet d'extraire les documents proches au-dessus d'un seuil de similarité. Chaque document est affecté au centroïde qui l'a renvoyé avec le score le plus élevé. Les clusters de taille réduite sont dissous pour être classés comme du bruit.</p></li></ol><p>Elasticsearch s'occupe du gros du travail : <code>msearch</code> pour les sondes de densité, <code>msearch</code> pour la classification et <code>significant_text</code> pour l'étiquetage. Pour ce corpus (8 495 documents), l’échantillon de sonde à densité à 5 % lance des requêtes de sonde de 425 kNN, qui <code>msearch</code> se regroupent en neuf appels HTTP (à la taille de lot 50), évitant ainsi une requête par sonde. Combiné à la recherche <code>bbq_disk</code> ANN, cela permet de rendre la phase de clustering rapide et évolutive. Les requêtes kNN utilisent une valeur minimale <a href="https://www.elastic.co/docs/deploy-manage/production-guidance/optimize-performance/approximate-knn-search"><code>num_candidates</code></a> pour la vitesse lors de la passe de clustering ; les requêtes de recherche de production doivent utiliser des valeurs <code>num_candidates</code> plus élevées pour améliorer le rappel au prix de la latence.</p><p>Les tailles naturelles des clusters sont déterminées par la densité d'espace intégrée autour de chaque centroïde, et non par une limite <code>k</code> stricte. Les thématiques denses produisent des clusters plus importants ; les thématiques de niche produisent des clusters plus petits.</p><h4>Pourquoi pas KMeans ou HDBSCAN ?</h4><p>KMeans suppose des amas sphériques et nécessite la matrice complète N× en mémoire. Pour les corpus qui tiennent dans la mémoire, <a href="https://scikit-learn.org/stable/modules/generated/sklearn.cluster.HDBSCAN.html">HDBSCAN</a> est une alternative solide. Il gère des formes de clusters arbitraires et possède une sémantique de densité bien comprise.</p><p>L’approche par centroïdes par sondage de densité cible un créneau différent : les corpus pour lesquels vous souhaitez un système unique de stockage, de récupération et de clustering, ou lorsque l’échelle rend les opérations de matrice côté client peu pratiques. Cette approche emploie le kNN d’Elasticsearch en tant que primitive de calcul, prend en charge n’importe quelle taille de cluster et conserve presque tout le traitement côté serveur.</p>    Clustered global index in 31.6s
      Total clusters: 82
      Total noise:    2420 (28.5%)
      Density probes: 425 kNN queries via 9 _msearch HTTP calls<h4>Comprendre le taux de bruit</h4><p>Le taux de bruit de ~28% est le résultat d'une conception et non d'un mode de défaillance. Les documents qui ne correspondent à aucun cluster dense au <code>similarity_threshold</code> configuré ne sont pas attribués, plutôt que d’être forcés dans une mauvaise correspondance. Cela agit comme un filtre de qualité : les tribunes d’opinion, les articles courts et les articles ponctuels résistent naturellement au clustering, car ils n’ont pas la densité thématique qui définit un groupe cohérent.</p><p>Ce seuil peut être modulé : réduire <code>similarity_threshold</code> génère un clustering plus large (plus de documents intégrés, au prix d’une homogénéité moindre), tandis que son augmentation densifie les clusters et rejette davantage d’éléments comme bruit. Pour ce corpus composé de contenus d’actualité variés, un taux de bruit d’environ 30 % constitue un point de fonctionnement raisonnable. Pour les déploiements en production, il convient de régler le seuil selon les exigences de qualité spécifiques au secteur d’activité.</p><h3>Étiquettes automatiques avec significant_text</h3><p>Désormais, chaque cluster a besoin d'une étiquette facile à lire. L’agrégation <code>significant_text</code> d’Elasticsearch permet de trouver les termes dont la fréquence est anormalement élevée dans un groupe spécifique (le cluster) comparativement à l’ensemble du corpus.</p><p>Techniquement, il emploie une heuristique statistique (le score JLH par défaut) qui pondère les écarts de fréquence absolue et relative, le tout sans « machine learning » ni sollicitation de modèles de langage (LLM). Un groupe sur la politique britannique peut faire apparaître des termes tels que <code>starmer</code>, <code>labour</code>, <code>downing</code> parce que ces termes sont disproportionnellement fréquents dans ce groupe par rapport à l'ensemble du corpus d'actualités.</p><p>Pour ce traitement global, le calcul des étiquettes s’effectue directement face à <code>docs-clustering-all</code> ; ainsi, les données de premier plan et de référence sont extraites de la totalité du mois. Dans la partie 2, l’étiquetage utilise le modèle d’index quotidien (<code>docs-clustering-*</code>), un caractère générique (« wildcard ») qui permet aux requêtes de couvrir simultanément tous les index correspondants, afin d’offrir à <code>significant_text</code> un arrière-plan plus large pour un meilleur contraste.</p><p>Voici à quoi ressemble une requête minimale :</p>{
  "size": 0,
  "query": { "term": { "cluster_id": "72" } },
  "aggs": {
    "label_terms": {
      "significant_text": {
        "field": "text",
        "size": 5,
        "filter_duplicate_text": true
      }
    }
  }
}<p><code>significant_text</code> sert également de barrière de qualité : les clusters qui ne produisent aucun terme important n'ont pas de vocabulaire distinctif. Il s’agit de regroupements dépourvus de sens qui devraient être réintégrés au bruit de fond au lieu d’être identifiés par un label erroné.</p><p>Une étape de nettoyage déterministe légère supprime les termes d’étiquetage parasites (jetons numériques, mots génériques) et se rabat sur un titre représentatif en cas de besoin. Cela permet de conserver les labels Elasticsearch natifs tout en améliorant la lisibilité.</p>    Sample cluster labels:
      cluster   3  (200 docs)  arsenal | mikel | villa
      cluster   1  (198 docs)  volodymyr | ukrainian | kyiv
      cluster   0  (196 docs)  hostages | hamas | israeli
      cluster   4  (187 docs)  scrum | rugby | borthwick
      cluster  52  (185 docs)  fossil | renewable | renewables
      cluster  10  (156 docs)  labour | gwynne | mps
      cluster  40  (151 docs)  novel | novels | literary
      cluster  11  (149 docs)  mewis | sarina | wiegman
      cluster  44  (143 docs)  flooding | rainfall | rain
      cluster  13  (131 docs)  doge | musk | elon
      cluster  12  (128 docs)  murder | insp | knockholt
      cluster   5  (124 docs)  putin | backstop | starmer


    Reassigned 35 docs from incoherent clusters to noise
    Total docs: 8,495
    Clustered:  6,040 (71.1%)
    Noise:      2,455 (28.9%)<h3>Visualisation des clusters</h3><p>Les visualisations ci-dessous montrent ce que la passe de clustering global a découvert : une répartition par date des documents regroupés par rapport au bruit, une projection UMAP du mois complet et un graphique de mixité des sources confirmant que les clusters reflètent les sujets plutôt que les sources.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4ed087d8b6dac2a0/6a17094260084b44543c4501/99099f5adaa945ae4097c50b0d7151c7dd28872e-1000x400.png" alt="Distribution quotidienne de documents en cluster vs documents de bruit" /><p>Distribution quotidienne des documents regroupés par rapport aux documents parasites tout au long de février 2025.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf5ca320bc91131ab/6a17094366c4f95828f8bfbf/477c6c7177942955a942f85f5c881da50e517915-1100x700.png" alt="Projection UMAP pour le mois complet avec tous les documents" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5f554a6bc2bc367b/6a170945a929cfa7a1ae0947/4f4302556c8974c416842452cf33bca06e90b966-1100x700.png" alt="Projection UMAP montrant uniquement les documents regroupés" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt8e40c26f89ce5523/6a17094747d49c147d2d8974/327f96a79e382ef30614cb0570aa7fccd822b8f8-1100x700.png" alt="[Projection UMAP mettant en évidence un seul cluster" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf1dd2c19ae628f1d/6a1709481949f7a630e7a9a3/acfb1524a10e24d6ff2412e7c3ec0f2b3ac75193-900x600.png" alt="Mélange de sources par cluster montrant le regroupement thématique" /><p>Chaque îlot coloré dans l’UMAP représente un cluster : un groupe d’articles sur le même sujet découvert uniquement par similarité d’intégration. Les points gris de bruit correspondent aux articles qui ne s’intègrent pas clairement dans un cluster (souvent des articles courts, des tribunes libres ou des récits isolés).</p><p>Le graphique de répartition des sources confirme que les clusters contiennent des articles de <strong>BBC News et The Guardian</strong>. Le clustering est de trouver des <em>sujets</em> et non <em>des sources</em>, ce qui correspond exactement à ce que la découverte non supervisée devrait produire.</p><h3>Exploration de l’étendue des clusters avec le récupérateur de diversification</h3><p>Le kNN simple renvoie les documents les plus similaires au centroïde d'un cluster (le noyau dense). Mais les vrais clusters couvrent des sous-thèmes. Le <a href="https://www.elastic.co/docs/reference/elasticsearch/rest-apis/retrievers/diversify-retriever"><strong>récupérateur de diversité</strong></a> utilise la pertinence marginale maximale (MMR) pour faire remonter des documents qui sont à la fois pertinents pour le centroïde et <em>différents les uns des autres</em>.</p><p>Le paramètre clé est <strong>λ (lambda)</strong> :</p><ul><li><p>λ = 1,0 → pertinence pure (identique à la kNN simple).</p></li><li><p>λ = 0,0 → diversité pure (résultats à répartition maximale).</p></li><li><p>λ = 0,5 → équilibré : cela est pertinent pour le sujet, tout en couvrant différents aspects.</p></li></ul><p>La structure minimale d’une requête de récupérateur se présente comme suit :</p>{
  "size": 8,
  "retriever": {
    "diversify": {
      "type": "mmr",
      "field": "embedding",
      "lambda": 0.5,
      "query_vector": "&lt;cluster-centroid-vector&gt;",
      "retriever": {
        "knn": {
          "field": "embedding",
          "query_vector": "&lt;cluster-centroid-vector&gt;",
          "k": 50,
          "num_candidates": 100
        }
      }
    }
  }
}<p>Les paramètres <code>type</code>, <code>field</code>, <code>query_vector</code> sont requis au niveau de diversification : <code>field</code> indique à MMR quel champ dense_vector utiliser pour la similarité entre les résultats, et <code>query_vector</code> fournit le point de référence pour le score de pertinence.</p><p>Cela vous permet de répondre à la question : « Que couvre réellement ce groupe ? » au lieu de simplement « Quel est son centre ? »</p>    Exploring cluster 52 (185 docs)
    Label: fossil | renewable | renewables
    Centroid computed (dim=1024)


    ========================================================================
    Plain kNN (closest to centroid)
    ========================================================================
      1. [0.9738] Green campaigners fear ministers are poised to award billions of pounds in fresh subsidies to Drax power station, despite strong concerns...
      2. [0.9710] Thirteen more oil and gas licences could be cancelled as ministers decide new guidance for fossil fuel extraction after a landmark court...
      3. [0.9699] Experts have accused the fossil fuel industry of seeking special treatment after lobbyists argued greenhouse gas emissions from oilfields...
      4. [0.9681] Burning wood is a terrible way of producing electricity . Chopping down trees destroys habitats for wildlife, and growing new trees cannot...
      5. [0.9649] Keir Starmer will do huge damage to the global fight against climate change if he gives in to political pressure and allows the development...
      6. [0.9641] Labour will next week be confronted with stark policy choices that threaten to expose the fault lines between the Treasury and the...
      7. [0.9638] The Drax power station near Selby in north Yorkshire burns imported wood pellets  The government has agreed a new funding arrangement with...
      8. [0.9581] If you care about the world we are handing on to future generations, the news on Thursday morning was dramatic. This January was the...
    
    ========================================================================
    Diversify retriever (MMR, lambda=0.5)
    ========================================================================
      1. [0.9738] Green campaigners fear ministers are poised to award billions of pounds in fresh subsidies to Drax power station, despite strong concerns...
      2. [0.9434] Oil and gas interests have waged a coordinated campaign to kill pro-electrification policies that ban gas connections in new buildings ,...
      3. [0.9303] It was interesting to read that new licences for oil and gas production in the North Sea are being delayed by legal action ( Thirteen more...
      4. [0.9139] The US energy secretary, Chris Wright, has said he “would love to see Australia get in the game of supplying uranium and maybe going down...
      5. [0.9077] Rachel Reeves was facing criticism on Saturday night as it was confirmed that a report she cited as evidence that a third ­runway at...
      6. [0.8996] When Margaret Thatcher opened the Hadley Centre for Climate Change in 1990 journalists suggested she was attempting to appear to be doing...
      7. [0.8993] The vast majority of governments are likely to miss a looming deadline to file vital plans that will determine whether or not the world has...
      8. [0.8987] European imports of seaborne gas shipments fell by a fifth last year to their lowest level since the pandemic, according to a new report,...
    
    Overlap: 1/8 documents appear in both result sets
    
    Avg pairwise similarity (lower = more diverse):
      Plain kNN:          0.9057
      Diversify retriever: 0.6965<p>Les résultats simples kNN se regroupent autour d'un angle du sujet : les documents les plus similaires au centroïde et les uns aux autres. Le récupérateur de diversité fait ressortir différentes facettes d’un même cluster : des sous-thématiques, des sources distinctes et des perspectives variées.</p><p>La métrique de diversité valide ce point quantitativement : la similarité moyenne entre paires est plus basse avec le récupérateur de diversité, prouvant que les documents obtenus traitent d’un éventail de sujets plus vaste.</p><p>C'est utile pour :</p><ul><li><p><strong>Comprendre ce que recouvre réellement un groupe</strong>, pas seulement son centre mais aussi ses bords.</p></li><li><p><strong>Générer des résumés</strong>. Des documents représentatifs et variés offrent un meilleur matériel pour un LLM.</p></li><li><p><strong>Trouver des exemples représentatifs</strong> pour l'évaluation humaine ou l'étiquetage en aval.</p></li><li><p><strong>Contrôles qualité</strong>. Si les divers résultats semblent incohérents, il se peut que le groupe doive être scindé.</p></li></ul><h2>Partie 2 : chaînes d’histoires temporelles</h2><h3>Suivi des histoires au fil des jours</h3><p>La partie 1 a appliqué le clustering à l’ensemble du mois à l’échelle globale pour la découverte de thématiques. En ce qui concerne le flux temporel, le même processus de classification par centroïde avec sondage de densité est appliqué de manière autonome sur les <strong>index journaliers</strong>, les clusters étant ensuite mis en relation d’un jour à l’autre. Il est important de noter que les clusters journaliers sont distincts des clusters globaux présentés en partie 1 ; chaque jour produit ses propres attributions de groupes et des labels optimisés pour le contenu du jour même.</p><h4><strong>L'approche de liaison : échantillonnage et requête</strong></h4><p>Pour chaque cluster le jour A :</p><ol><li><p>Prenez quelques exemples de documents représentatifs.</p></li><li><p>Exécutez la recherche kNN sur l'index du jour B.</p></li><li><p>Comptez le nombre de visites par groupe B par jour.</p></li><li><p>Si la fraction de réussite dépasse un seuil (fraction kNN ≥ 0,4), enregistrez un lien.</p></li></ol><p>Cela est rapide (seuls quelques documents par cluster sont interrogés, pas tous) et utilise le kNN natif d'Elasticsearch, aucun outil externe n'est nécessaire.</p>Preparing daily indices for temporal linkage...


Indexed 8,495 docs into 28 daily indices


Temporal links found: 808 in 145.4s

Strongest links:
  2025.02.01 'league | arsenal | premier' -&gt; 2025.02.02 'league | season | striker'  (100%)
  2025.02.03 'league | striker | loan' -&gt; 2025.02.04 'league | striker | season'  (100%)
  2025.02.03 'score | operator | gedling' -&gt; 2025.02.04 'league | striker | season'  (100%)
  2025.02.12 'playoff | leg | bayern' -&gt; 2025.02.13 'league | players | injury'  (100%)
  2025.02.14 'league | injury | football' -&gt; 2025.02.15 'league | premier | football'  (100%)
  2025.02.18 'russia | ukraine | talks' -&gt; 2025.02.19 'saudi | russia | arabia'  (100%)
  2025.02.18 'football | league | bayern' -&gt; 2025.02.19 'league | manchester | players'  (100%)
  2025.02.21 'league | premier | manchester' -&gt; 2025.02.22 'game | players | defeat'  (100%)
  2025.02.21 'rugby | calcutta | brilliant' -&gt; 2025.02.22 'game | players | defeat'  (100%)
  2025.02.26 'metals | kyiv | ukrainian' -&gt; 2025.02.27 'ukraine | russia | talks'  (100%)<p>Une fraction kNN de 100 % signifie que chaque document échantillonné du cluster source s'est retrouvé dans le même cluster cible, ce qui constitue le lien inter-jours le plus fort possible. La plupart des liens ci-dessus concernent le football, ce qui est logique : la couverture de la Premier League est quotidienne et présente une grande cohérence thématique.</p><p>Le lien <code>score | operator | gedling</code> → <code>league | striker | season</code> est un exemple de cluster de football local de niche (Gedling étant un club amateur) absorbé par le cluster plus large de la Premier League le jour suivant, un effet naturel du reclustering quotidien à différents niveaux de granularité.</p><h3>Création de chaînes d’histoires</h3><p>Une chaîne d'histoires est une séquence de clusters liés sur des jours consécutifs.</p><p>Les liens individuels par paires vous indiquent que le cluster « politique britannique » du lundi est relié à celui du mardi. Les chaînes révèlent l’arc complet : une histoire qui commence le lundi, évolue tout au long de la semaine et s’estompe le vendredi.</p><p>Les chaînes sont élaborées selon un algorithme glouton à partir de liens présentant une fraction kNN ≥ 0,4 ; ainsi, au moins 40 % des documents du groupe d’origine se retrouvent dans un groupe de destination unique. En partant du cluster le plus ancien, l'algorithme suit toujours le lien sortant le plus fort.
</p>    Strong links (kNN fraction &gt;= 0.4): 244
    Story chains spanning 3+ days: 18
      Chain 1: 'ukrainian | kyiv | eastern' (19 days: Feb 3 → Feb 21)
      Chain 2: 'playing | opposition' (19 days: Feb 10 → Feb 28)
      Chain 3: 'tadhg | maro | cadan' (10 days: Feb 1 → Feb 10)
      Chain 4: 'invade | china | putin' (8 days: Feb 21 → Feb 28)
      Chain 5: 'elected | labour | leader' (7 days: Feb 12 → Feb 18)
      Chain 6: 'film | swift | awards' (6 days: Feb 2 → Feb 7)
      Chain 7: 'amendment | termination | reporting' (6 days: Feb 12 → Feb 17)
      Chain 8: 'officers | scene | police' (5 days: Feb 1 → Feb 5)<p>La chaîne la plus longue suit la couverture Ukraine-Russie pendant 19 jours consécutifs, ce qui n'est pas surprenant étant donné l'intensité géopolitique soutenue en février 2025. La deuxième plus longue suit le football de Premier League pendant 19 jours du mois. Des chaînes plus courtes couvrent la saison des récompenses (cinéma/prix, six jours), le rugby du Tournoi des Six Nations (10 jours) et la couverture du leadership politique au Royaume-Uni (sept jours). Chaque chaîne représente un arc narratif que l'algorithme a découvert uniquement à partir de la similarité des indices quotidiens.</p><h3>Sankey : Visualisation du flux narratif</h3><p>Un diagramme de Sankey est une visualisation de flux où la largeur des liens représente la force de la connexion. Ici, chaque bande verticale correspond à un jour, chaque nœud à un cluster quotidien (dimensionné selon le nombre de documents), et chaque chemin coloré suit une chaîne narrative au fil du temps. La largeur des liens encode la force du chevauchement kNN : des liens plus épais signifient qu'un plus grand nombre de documents échantillonnés se sont retrouvés dans le cluster cible. Les couleurs sont cohérentes pour chaque chaîne, de sorte qu'un chemin d'une même couleur de gauche à droite se lit comme la progression d'une histoire.</p><p>Par exemple, la chaîne Ukraine–Russie (visible comme l’un des parcours les plus longs) s’étend de façon continue du début du mois de février jusqu’à la troisième semaine, avec des liens constamment épais indiquant une forte continuité thématique d’un jour à l’autre.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta8c243e0c5773440/6a17093fa6c2b98c86e7968c/100a60a7fb85da8ab3813fd071a82c93f2c3f318-1300x650.png" alt="Des chaînes narratives temporelles se déroulant en février 2025" /><p><em>Des chaînes narratives temporelles se déroulant en février 2025. Chaque chemin coloré est une histoire qui persiste au fil des jours ; la largeur des liens indique la force de chevauchement en kNN.</em></p><h2>Ce que cette approche apporte</h2><p>Cette présentation couvre un pipeline complet de clustering de documents non supervisé construit sur Elasticsearch :</p><ol><li><p><strong>Clustering de plongements</strong> : les adaptateurs spécifiques aux tâches de Jina v5 produisent des plongements optimisés pour le regroupement thématique, et non seulement pour la correspondance requête-document.</p></li><li><p><strong>Regroupement global par clusters</strong> : en traitant le mois entier au sein d’un index unique, on optimise la détection de thèmes transversaux sur l’ensemble de la période.</p></li><li><p><strong>Classification des centroïdes sondés par densité</strong>: échantillon 5 %, densité de la sonde via <code>msearch</code> kNN, sélection de diverses graines à haute densité, classification de toutes les substances par rapport aux centroïdes. Elasticsearch gère la puissance de calcul lourde ; seule la sélection des graines s’exécute côté client (~0,01 s).</p></li><li><p><a href="https://www.elastic.co/docs/reference/aggregations/search-aggregations-bucket-significanttext-aggregation"><strong><code>significant_text</code></strong></a> <strong>Étiquetage par pertinence</strong> : les tests de signification produisent des étiquettes de clusters pertinentes sans aucun modèle de « machine learning » ni annotation manuelle. Les clusters qui ne produisent aucun terme significatif sont incohérents et sont relégués au rang de bruit : un portail de qualité intégré.</p></li><li><p><strong>Liaison temporelle d'histoires</strong> : Les indices quotidiens et l'index croisé kNN par échantillonnage et interrogation retracent l'évolution des articles dans le temps.</p></li></ol><p><strong>Points clés :</strong></p><ul><li><p>Le type de tâche de plongement est important : les plongements de clustering produisent des groupes thématiques sensiblement plus resserrés.</p></li><li><p>Elasticsearch peut servir à la fois de couche de stockage <em>et</em> de moteur de clustering via <a href="https://www.elastic.co/docs/solutions/search/vector/knn">kNN search</a>.</p></li><li><p>La classification par centroïde basée sur la densité conserve presque tous les calculs côté serveur et produit des clusters de tailles naturelles déterminées par la densité de l'espace de plongement.</p></li><li><p><code>significant_text</code> est rapide, interprétable et efficace pour le marquage automatique et le contrôle de la qualité.</p></li></ul><p><strong>Situations dans lesquelles cette approche est utile :</strong></p><ul><li><p>Vous disposez de texte horodaté et souhaitez effectuer une découverte de thématiques sans données d'entraînement étiquetées.</p></li><li><p>Vous voulez une seule pile pour le stockage, la recherche vectorielle, l’étiquetage et la liaison temporelle.</p></li></ul><p><strong>Extensions à explorer :</strong></p><ul><li><p>Clustering multi-période (cumuls hebdomadaires et mensuels).</p></li><li><p>Ingestion en temps réel avec attribution incrémentale de clusters.</p></li><li><p>Résumés de cluster générés par LLM en utilisant les termes significant_text comme germes.</p></li><li><p>À plus grande échelle, des centroïdes KMeans échantillonnés peuvent servir de points de départ pour le clustering basé sur la densité, réduisant ainsi le coût de la phase de sondage.</p></li></ul><h2>Essayez par vous-même</h2><p>Ajoutez votre propre corpus de documents horodatés ; toute collection de texte contenant des dates fonctionne avec ce pipeline. Le cahier complet et le code de support sont disponibles dans le <a href="https://github.com/elastic/elasticsearch-labs/tree/main/supporting-blog-content/unsupervised-document-clustering-elasticsearch-jina-embeddings">référentiel associé</a>.</p><ul><li><p><a href="https://cloud.elastic.co/registration?onboarding_token=vectorsearch&amp;cta=cloud-registration&amp;tech=trial&amp;plcmt=article%20content&amp;pg=search-labs"><strong>Démarrez un essai gratuit d’Elastic Cloud</strong></a>: Lancez un cluster géré avec <code>bbq_disk</code> support en quelques minutes.</p></li><li><p><a href="https://www.elastic.co/elasticsearch/serverless"><strong>Essayez Elasticsearch Serverless</strong></a> : aucune gestion de cluster, une mise à l’échelle automatique et une prise en charge de l’intégralité de ce guide.</p></li></ul>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/unsupervised-document-clustering-elasticsearch-jina-embeddings</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/unsupervised-document-clustering-elasticsearch-jina-embeddings</guid>
    <category><![CDATA[Base vectorielle]]></category>
    <category><![CDATA[Recherche ML]]></category>
    <category><![CDATA[Jina AI]]></category>
    <dc:creator><![CDATA[Matthew Adams]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4bd7dd10a7cd6dc8/6a17094a14b270581de3c5b6/662c00694c3e0c2fb2128098bdb6813df9e86a72-1280x720.png" length="0" type="image/png"/>
    <pubDate>Fri, 10 Apr 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Automatisation de l'analyse des logs dans Streams avec le ML]]></title>
    <description><![CDATA[Découvrez comment une approche hybride de ML a atteint une précision de 94 % pour l'analyse syntaxique des logs et 91 % pour le partitionnement des logs grâce à des expériences d’automatisation avec l’empreinte des formats de log dans Streams.]]></description>
    <content:encoded><![CDATA[<p>Dans les piles d'observabilité modernes, l'ingestion de logs non structurés provenant de divers fournisseurs de données dans des plateformes comme Elasticsearch reste un défi. La dépendance à des règles de traitement manuellement créées engendre des pipelines fragiles, où même des mises à jour mineures du code en amont entraînent des échecs de traitement et des données non indexées. Cette fragilité est aggravée par le défi de la scalabilité : dans les environnements de microservices dynamiques, l’ajout continu de nouveaux services transforme la maintenance manuelle des règles en un cauchemar opérationnel.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte8f5bd0e4986b04c/6a170e6acdacbf612e7d2a9e/9108ec303339dd091faa3c363c7cf5c228155f49-3840x2160.png" alt="" /><p>Notre objectif était de passer à une approche automatisée et adaptative capable de gérer à la fois l’analyse des logs (extraction de champs) et le partitionnement des logs (identification de la source). Nous avons émis l’hypothèse que les grands modèles de langage (LLM), grâce à leur compréhension inhérente de la syntaxe du code et des modèles sémantiques, pourraient automatiser ces tâches avec une intervention humaine minimale.</p><p>Nous sommes heureux d'annoncer que cette fonctionnalité est déjà disponible dans <a href="http://elastic.co/elasticsearch/streams"><u>Streams</u></a>.</p><h2>Description de l'ensemble de données</h2><p>Nous avons choisi une <a href="https://github.com/logpai/loghub"><strong>Loghub</strong></a>collection de logs à des fins de PoC. Pour notre enquête, nous avons sélectionné des échantillons représentatifs issus des domaines clés suivants :</p><ul><li><p>Systèmes distribués : nous avons utilisé le HDFS (Hadoop Distributed File System) et les ensembles de données Spark. Ils contiennent un mélange de messages d'information, de débogage et d'erreur typiques des plateformes de big data.</p></li><li><p>Applications serveur et web : les logs des serveurs web Apache et d’OpenSSH ont constitué une source précieuse d’informations sur les accès, les erreurs et les événements liés à la security. Ces éléments sont essentiels pour surveiller le trafic web et détecter les menaces potentielles.</p></li><li><p>Systèmes d'exploitation : nous avons inclus les logs de Linux et Windows. Ces ensembles de données représentent les événements communs et semi-structurés au niveau du système auxquels les équipes d’opérations sont confrontés quotidiennement.</p></li><li><p>Systèmes mobiles : pour garantir que notre modèle puisse gérer les logs provenant d'environnements mobiles, nous avons inclus l'ensemble de données Android. Ces logs sont souvent volumineux et capturent un large éventail d'activités au niveau de l'application et du système sur les appareils mobiles.</p></li><li><p>Superordinateurs : pour tester les performances sur des environnements de calcul haute performance (HPC), nous avons intégré l'ensemble de données BGL (Blue Gene/L), qui présente des logs très structurés avec une terminologie de domaine spécifique.</p></li></ul><p>L'un des principaux avantages de la collection Loghub est que les logs sont en grande partie non nettoyés et non étiquetés, reflétant un environnement de production en direct bruyant avec une architecture de microservices.</p><p>Exemples de logs :</p>[Sun Dec 04 20:34:21 2005] [notice] jk2_init() Found child 2008 in scoreboard slot 6
[Sun Dec 04 20:34:25 2005] [notice] workerEnv.init() ok /etc/httpd/conf/workers2.properties
[Mon Dec 05 11:06:51 2005] [notice] workerEnv.init() ok /etc/httpd/conf/workers2.properties
17/06/09 20:10:58 INFO output.FileOutputCommitter: Saved output of task 'attempt_201706092018_0024_m_000083_1138' to hdfs://10.10.34.11:9000/pjhe/test/1/_temporary/0/task_201706092018_0024_m_000083
17/06/09 20:10:58 INFO mapred.SparkHadoopMapRedUtil: attempt_201706092018_0024_m_000083_1138: Committed<p>De plus, nous avons créé un cluster Kubernetes avec une application web typique et une base de données pour extraire des logs supplémentaires dans le domaine le plus courant.</p><p>Exemple de champs de log communs : horodatage, niveau de log (INFO, AVERTISSEMENT, ERREUR), source, message.</p><h2>Analyse de logs en few-shot avec un LLM</h2><p>Notre premier ensemble d'expériences s'est concentré sur une question fondamentale : <strong>Un LLM peut-il identifier de manière fiable les champs clés et générer des règles de parsing cohérentes pour les extraire ?</strong></p><p>Nous avons demandé à un modèle d'analyser des échantillons de journaux bruts et de générer des règles d'analyse de journaux sous forme d'expressions régulières (regex) et de formats <a href="https://www.elastic.co/docs/explore-analyze/scripting/grok">Grok</a>. Nos résultats ont montré que cette approche présente beaucoup de potentiel, mais aussi des défis importants dans sa mise en œuvre.</p><h3>Confiance élevée et conscience du contexte</h3><p>Les premiers résultats étaient prometteurs. Le LLM a démontré une forte capacité à générer des règles d'analyse qui correspondaient aux exemples fournis avec une grande confiance. Outre la simple correspondance de modèles, le modèle a démontré une capacité de compréhension des logs — il pouvait identifier et nommer correctement la source du log (par exemple, application de suivi de santé, application web Nginx, base de données Mongo).</p><h3>Le dilemme des échantillons d'entrée « Boucles d'or »</h3><p>Nos expériences ont rapidement mis en évidence un manque important de robustesse en raison d'une<strong> sensibilité extrême à l'échantillon d'entrée.</strong> Les performances du modèle fluctuent considérablement en fonction des exemples de logs spécifiques inclus dans l'invite. Nous avons observé un problème de similitude des logs, dans lequel l'échantillon de log devait inclure <em>juste assez de logs diversifiés </em> :</p><ul><li><p>Trop homogène (surapprentissage)<strong> :</strong> si les logs d'entrée sont trop similaires, le LLM a tendance à <strong>surspécifier</strong>. Il traite les données variables — telles que des noms spécifiques de classes Java dans une trace de pile — comme des parties statiques du modèle. Il en résulte des règles fragiles qui ne couvrent qu'une infime partie des logs et extraient des champs inutilisables.</p></li><li><p>Trop hétérogène (confusion) : à l'inverse, si l'échantillon contient une variance de formatage significative, ou pire, des « logs poubelles » comme des barres de progression, des tableaux de mémoire ou de l'art ASCII, le modèle peine à trouver un dénominateur commun. Il en vient souvent à générer des regex complexes et cassés ou à généraliser paresseusement toute la ligne en un seul champ de bloc de message.</p></li></ul><h3>La contrainte de la fenêtre contextuelle</h3><p>Nous avons également rencontré un goulot d'étranglement au niveau de la fenêtre contextuelle. Lorsque les logs d'entrée étaient longs, hétérogènes, ou riches en champs extractibles, la sortie du modèle se détériorait souvent, devenant « désordonnée » ou trop longue pour s'intégrer dans la fenêtre de contexte de sortie. Bien entendu, le découpage aide dans ce cas. En divisant les logs à l'aide de délimiteurs basés sur les caractères et sur les entités, nous pourrions aider le modèle à se concentrer sur l'extraction des champs principaux sans être submergé par le bruit.</p><h3>L'écart de cohérence et de standardisation</h3><p>Même lorsque le modèle a généré des règles avec succès, nous avons noté de légères incohérences :</p><ul><li><p>Variantes de dénomination des services : le modèle propose différents noms pour une même entité (par exemple, en étiquetant la source « Spark », « Apache Spark » et « Spark Log Analytics » dans différentes exécutions).</p></li><li><p>Variations dans la dénomination des champs : les noms des champs n'étaient pas normalisés (par exemple, <code>id</code> vs. <code>service.id</code> vs. <code>device.id</code>). Nous avons normalisé les noms en utilisant une <a href="https://www.elastic.co/docs/reference/ecs/ecs-field-reference">nomenclature de champ Elastic standardisée</a>.</p></li><li><p>Variance de résolution : la résolution de l'extraction de champ variait en fonction de la similarité des logs d'entrée les uns avec les autres.</p></li></ul><h2>Empreinte de format de log</h2><p>Pour relever le défi de la similarité des logs, nous introduisons une heuristique haute performance : <strong>l'empreinte de format de log (LFF)</strong>.</p><p>Au lieu d'introduire des logs bruts et bruyants directement dans un LLM, nous appliquons d'abord une transformation déterministe pour révéler la structure sous-jacente de chaque message. Cette étape de pré-traitement rend abstraites les données variables, générant une « empreinte » simplifiée qui nous permet de regrouper les logs connexes.</p><p>La logique de mapping est simple pour garantir la vitesse et la cohérence :</p><ol><li><p>Abstraction des chiffres : toute séquence de chiffres (0-9) est remplacée par un simple ‘0’.</p></li><li><p>Abstraction du texte : toute séquence de caractères alphabétiques avec des espaces blancs est remplacée par un seul « a ».</p></li><li><p>Normalisation des espaces blancs : toutes les séquences d'espaces blancs (espaces, tabulations, nouvelles lignes) sont regroupées en un seul espace.</p></li><li><p>La préservation des symboles : la ponctuation et les caractères spéciaux (par exemple, :, [, ], /) sont préservés, car ils sont souvent les indicateurs les plus forts de la structure des logs.</p></li></ol><p>Nous introduisons l'approche de mapping des logs. Les modèles de mapping de base comprennent les éléments suivants :</p><ul><li><p>Chiffres 0 à 9, quelle que soit leur longueur, de &gt; à « 0 ».</p></li><li><p>Texte (caractères alphabétiques avec espaces) de n'importe quelle longueur -&gt; à 'a'.</p></li><li><p>Espaces blancs, onglets et nouvelles lignes : &gt; pour un seul espace.</p></li></ul><p>Examinons un exemple de la manière dont ce mapping nous permet de transformer les logs.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf91eebab0ad79ccd/6a170e6c67045ba94f45c29c/78fa2887486eb9417804354ee3bf2a4fdb0f6383-846x252.png" alt="" /><p>Par conséquent, nous obtenons les masques de log suivants :</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt438d74dcb921578b/6a170e6d1949f74aa0e7aae3/ec439a3d3a25002498b97defcff733ea5ebc6b55-826x94.png" alt="" /><p>Remarquez les empreintes digitales des deux premiers logs. Malgré des horodatages, des classes de sources et un contenu de message différents, leurs préfixes (<code>0/0/0 0:0:0 a a.a:</code>) sont identiques. Cet alignement structurel nous permet de regrouper automatiquement ces logs dans le même cluster.</p><p>Le troisième log, cependant, produit une empreinte digitale complètement divergente (<code>0-0-0...</code>). Cela nous permet de le séparer algorithmiquement du premier groupe <em>avant même d'</em> invoquer un LLM.</p><h2>Partie bonus : implémentation instantanée avec ES|QL</h2><p>C'est aussi simple que de passer cette requête dans Discover.</p><p><strong>Décomposition de la requête :</strong></p><p><strong>FROM</strong> loghub : cible notre index contenant les données de journal brut.</p><p><strong>EVAL</strong> pattern = ... : la logique du mapping de base. Nous enchaînons les fonctions REPLACE pour effectuer l'abstraction (par exemple, les chiffres en '0', le texte en 'a', etc.) et enregistrons le résultat dans un champ "pattern".</p><p><strong>STATS </strong>[column1 =] expression1, …<strong> BY </strong>SUBSTRING(pattern, 0, 15) :</p><p>Ceci est une étape du clustering. Nous regroupons les logs qui partagent les 15 premiers caractères de leur schéma et créons des champs agrégés tels que le nombre total de logs par groupe, la liste des sources de données des logs, le préfixe du schéma, 3 exemples de logs</p><p><strong>SORT</strong> total_count DESC | <strong>LIMIT</strong> 100 : affiche les 100 schémas de log les plus fréquents</p><p>Les résultats de la requête sur LogHub sont affichés ci-dessous :</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfa3960cf94ccf331/6a170e6fdc55decfa3e00e7c/b119498f124376c41d242a099bf9081fd6536be8-1600x394.png" alt="Résultats de la requête d'analyse des logs sur LogHub." /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2dbcde2a22e06367/6a170e71961e693a18c4cfb6/4dcfc0a5b7fa753497cc5def5ea3cd54449c0481-1600x719.png" alt="" /><p>Comme démontré dans la visualisation, cette approche « sans LLM » partitionne les logs avec une grande précision. Elle a réussi à clusterer complètement 10 sources de données sur 16 (basées sur les étiquettes LogHub) (&gt;90 %) et a atteint un clustering majoritaire dans 13 sources sur 16 (&gt;60 %) — le tout sans nécessiter de nettoyage, de prétraitement ou de réglage fin supplémentaire.</p><p>L'empreinte digitale du format du log offre une alternative pragmatique et à fort impact, ainsi qu'un complément aux solutions de ML sophistiquées telles que l'<a href="https://www.elastic.co/docs/reference/aggregations/search-aggregations-bucket-categorize-text-aggregation">analyse du modèle de log</a>. Il offre des informations immédiates sur les relations entre les logs et gère efficacement les grands ensembles de logs.</p><ul><li><p>Polyvalence en tant que primitif </p></li></ul><p>Grâce à la mise en œuvre d'<a href="https://www.elastic.co/blog/getting-started-elasticsearch-query-language">ES|QL</a>, LFF sert à la fois d'outil autonome pour des diagnostics/visualisations rapides des données, et d'élément de base dans les pipelines d'analyse des journaux pour les cas d'utilisation à grand volume. </p><ul><li><p>Flexibilité</p></li></ul><p>LFF est facile à personnaliser et à étendre pour capturer des modèles spécifiques, c'est-à-dire des nombres hexadécimaux et des adresses IP.</p><ul><li><p>Stabilité déterministe</p></li></ul><p>Contrairement aux algorithmes de clustering basés sur le ML, la logique LFF est simple et déterministe. Les nouveaux logs entrants n'affectent pas rétroactivement les clusters de logs existants.</p><ul><li><p>Performance et mémoire</p></li></ul><p>Il nécessite peu de mémoire, pas de formation ni de GPU, ce qui le rend idéal pour les environnements à haut débit et en temps réel.</p><h2>Combiner une empreinte digitale au format log avec un LLM</h2><p>Pour valider l'architecture hybride proposée, chaque expérience contenait un sous-ensemble aléatoire de 20 % des logs de chaque source de données. Cette contrainte simule un environnement de production réel où les logs sont traités par lots plutôt que comme un bloc monolithique de données historiques.</p><p>L’objectif était de démontrer que le LFF agit comme une couche de compression efficace. Nous avons cherché à prouver que des règles d’analyse à haute couverture pouvaient être générées à partir de petits échantillons sélectionnés et généralisées avec succès à l’ensemble de l’ensemble de données.</p><h2>Pipeline d'exécution</h2><p>Nous avons mis en œuvre un pipeline à plusieurs étapes qui filtre, regroupe et applique un échantillonnage stratifié aux données avant qu'elles n'atteignent le LLM.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt26635762891b3a41/6a170e73509168eea4e1bb91/b3f46ea471760b406a32fc7d4bc74cc03faaced2-3840x1660.png" alt="" /><p>1. clustering hiérarchique en deux étapes</p><ul><li><p>Sous-classes (correspondance exacte) : les logs sont agrégés par empreintes identiques. Tous les logs d'une sous-classe partagent exactement la même structure de format.</p></li><li><p>Nettoyage des aberrations. Nous écartons toutes les sous-classes qui représentent moins de 5 % du volume total des logs. Cela garantit que le LLM se concentre sur le signal dominant et ne sera pas distrait par le bruit ou les logs malformés.</p></li><li><p>Métaclasses (correspondance avec le préfixe) : les sous-classes restantes sont regroupées en métaclasses en fonction des N premiers caractères de l'empreinte digitale du format. Nous avons choisi N=5 pour le Log parsing et N=15 pour le Log partitioning lorsque les sources de données sont inconnues.</p></li></ul><p>2. Échantillonnage stratifié. Une fois l'arbre hiérarchique établit, nous construisons l'échantillon de log pour le LLM. L'objectif stratégique est de maximiser la couverture de variance tout en minimisant l'utilisation des jetons.</p><ul><li><p>Nous sélectionnons des logs représentatifs de <em>chaque</em> sous-classe valide au sein de la métaclasse plus large.</p></li><li><p>Pour gérer un cas limite de sous-classes trop nombreuses, nous appliquons un échantillonnage aléatoire pour s'adapter à la taille de la fenêtre cible.</p></li></ul><p>3. Génération de règles Finally, nous demandons au LLM de générer une règle d'analyse regex qui convient à tous les logs dans l'échantillon fourni pour chaque Métaclasse. Pour notre PoC, nous avons utilisé le mini-modèle GPT-4o.</p><h2>Résultats expérimentaux et observations</h2><p>Nous avons atteint une précision de parsing de 94 % et une précision de partitionnement de 91 % sur l'ensemble de données Loghub.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1b896b41b3b70e7e/6a170e757d8d67601a70e7d9/49b2b6a1401dd1f33951da68e5a3fac37d0b5aaa-1600x1506.png" alt="94 % de précision de parsing et 91 % de précision de partitionnement sur l’ensemble de données Loghub." /><p>La matrice de confusion ci-dessus illustre les résultats du partitionnement des logs. L’axe vertical représente les sources de données réelles, et l’axe horizontal représente les sources de données prédites. L'intensité de la carte thermique correspond au volume de logs, les vignettes plus claires indiquant un nombre plus élevé. L'alignement diagonal démontre la haute fidélité du modèle dans l'attribution des sources, avec un minimum de dispersion.</p><h2>Nos informations sur les benchmarks de performance :</h2><ul><li><p><strong>Base optimale :</strong> une fenêtre contextuelle de <strong>30 à 40 échantillons de logs</strong> par catégorie s'est avérée être le « point idéal », produisant régulièrement une analyse syntaxique robuste avec des motifs Regex et Grok.</p></li><li><p><strong>Minimisation de l'entrée :</strong> nous avons réduit la taille de l'entrée à 10 logs par catégorie pour les motifs Regex et n'avons observé qu'une baisse de 2 % des performances d'analyse, ce qui confirme que l'échantillonnage basé sur la diversité est plus critique que le volume brut.</p></li></ul>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/log-parsing-partitioning-automation-experiments-streams</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/log-parsing-partitioning-automation-experiments-streams</guid>
    <category><![CDATA[Recherche ML]]></category>
    <category><![CDATA[IA]]></category>
    <dc:creator><![CDATA[Nastia Havriushenko]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc1df5a7cae463d59/6a170e76a6c2b907d7e797ab/965c58f19742361160593c38fcaa8b2f4b0d6cc5-3838x2159.png" length="0" type="image/png"/>
    <pubDate>Fri, 02 Jan 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Générer des filtres et des facettes à l'aide de la ML]]></title>
    <description><![CDATA[Exploration des avantages et des inconvénients de l'automatisation de la création de filtres et de facettes dans une expérience de recherche à l'aide de modèles ML par rapport à l'approche classique codée en dur.]]></description>
    <content:encoded><![CDATA[<p>Les filtres et les facettes sont des mécanismes utilisés pour affiner les résultats de la recherche et aider les utilisateurs à trouver plus rapidement le contenu ou les produits pertinents. Dans l'approche classique, les règles sont définies manuellement. Par exemple, dans un catalogue de films, des attributs tels que le genre sont prédéfinis pour être utilisés dans les filtres et les facettes. D'autre part, les modèles d'intelligence artificielle permettent d'extraire automatiquement de nouveaux attributs à partir des caractéristiques des films, ce qui rend le processus plus dynamique et plus personnalisé. Dans ce blog, nous explorons les avantages et les inconvénients de chaque méthode, en mettant en évidence leurs applications et leurs défis.</p><h2>Filtres vs facettes</h2><p>Avant de commencer, définissons ce que sont les filtres et les facettes. Les <strong>filtres</strong> sont des attributs prédéfinis utilisés pour restreindre un ensemble de résultats. Sur une place de marché, par exemple, des filtres sont disponibles avant même qu'une recherche ne soit effectuée. L'utilisateur peut sélectionner une catégorie, telle que <strong>"Jeux vidéo"</strong>, avant de rechercher <strong>"PS5"</strong>, ce qui permet d'affiner la recherche à un sous-ensemble plus spécifique plutôt qu'à l'ensemble de la base de données. Cela augmente considérablement les chances d'obtenir des résultats plus pertinents.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0a77b38aae238938/6a170b821949f72a52e7aa51/5ed8868fa5017d034e1273e35c884a5430afdf3c-1600x937.png" alt="Filtres" /><p>Les <strong>facettes</strong> fonctionnent de la même manière que les filtres, mais elles ne sont disponibles qu'une fois la recherche effectuée. En d'autres termes, la recherche renvoie des résultats et, sur la base de ceux-ci, une nouvelle liste d'options d'affinage est générée. Par exemple, lors de la recherche d'une console PS5, des aspects tels que la <strong>capacité de</strong> stockage, les <strong>frais d'expédition</strong> et la <strong>couleur</strong> peuvent être affichés pour aider les utilisateurs à choisir le produit idéal.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt166e356b80d423ef/6a170b840e2e494ca341a10f/c5633fcc5b6fbb916110faf32144d8d43572e33a-1600x937.png" alt="Facettes " /><p>Maintenant que nous avons défini les filtres et les facettes, examinons l'impact de l'approche classique et de l'approche basée sur l'apprentissage automatique sur leur mise en œuvre et leur utilisation. Chaque méthode présente des avantages et des inconvénients qui influencent l'efficacité de la recherche.</p><h2>Approche classique des filtres et des facettes</h2><p>Dans cette approche, les filtres et les facettes sont définis manuellement sur la base de règles prédéfinies. Cela signifie que les attributs disponibles pour affiner la recherche sont fixés et planifiés à l'avance, en tenant compte de la structure du catalogue et des besoins de l'utilisateur.</p><p>Par exemple, sur une place de marché, les catégories telles que "Électronique" ou "Mode" peuvent avoir des filtres spécifiques tels que la marque, le format et la fourchette de prix. Ces règles sont créées de manière statique, ce qui garantit la cohérence de l'expérience de recherche, mais nécessite des ajustements manuels lorsque de nouveaux produits ou de nouvelles catégories apparaissent.</p><p>Bien que cette approche permette de prévoir et de contrôler les filtres et les facettes affichés, elle peut s'avérer limitée lorsque de nouvelles tendances apparaissent et exigent un affinement dynamique.</p><p><strong>Pour :</strong></p><ul><li><p><strong>Prévisibilité et contrôle :</strong> Les filtres et les facettes étant définis manuellement, la gestion devient plus facile.</p></li><li><p><strong>Faible complexité :</strong> Il n'est pas nécessaire de former des modèles.</p></li><li><p><strong>Facilité de maintenance :</strong> Les règles étant prédéfinies, les ajustements et les corrections peuvent être effectués rapidement.</p></li></ul><p><strong>Cons :</strong></p><ul><li><p><strong>Réindexation nécessaire pour les nouveaux filtres :</strong> Chaque fois qu'un nouvel attribut doit être utilisé comme filtre, l'ensemble du jeu de données doit être réindexé pour s'assurer que les documents contiennent cette information.</p></li><li><p><strong>Absence d'adaptation dynamique :</strong> Les filtres sont statiques et ne s'adaptent pas automatiquement aux changements de comportement des utilisateurs.</p></li></ul><h3>Mise en œuvre des filtres/facettes - Approche classique</h3><p>Dans <strong>Dev Tools, Kibana</strong>, nous allons créer une démonstration de filtres/facettes en utilisant l'<strong>approche classique.</strong></p><p>Tout d'abord, nous définissons la correspondance pour structurer l'index :</p>PUT videogames
{
  "mappings": {
    "properties": {
      "name": { "type": "text" },
      "brand": { "type": "keyword" },
      "storage": { "type": "keyword" },
      "price": { "type": "float" },
      "description": { "type": "text" }
    }
  }
}<p>Les champs <strong>marque</strong> et <strong>stockage</strong> sont définis comme des <strong>mots-clés</strong>, ce qui permet de les utiliser directement dans les agrégations<strong>(facettes)</strong>. Le champ <strong>prix</strong> est de type <strong>flottant</strong>, ce qui permet de créer des <strong>fourchettes de prix</strong>.</p><p>L'étape suivante consiste à indexer les données relatives aux produits :</p>POST videogames/_bulk
{ "index": { "_id": 1 } }
{ "name": "Play Station 5", "brand": "Sony", "storage": "1TB", "price": 499.99, "description": "Stunning Gaming: Marvel at stunning graphics and experience the features of the new PS5. Breathtaking Immersion: Discover a deeper gaming experience with support for haptic feedback, adaptive triggers, and 3D Audio technology. Slim Design: With the PS5 Digital Edition, gamers get powerful gaming technology in a sleek, compact design. 1TB of Storage: Have your favorite games ready and waiting for you to play with 1TB of built-in SSD storage. Backward Compatibility and Game Boost: The PS5 console can play over 4,000 PS4 games. With Game Boost, you can even enjoy faster, smoother frame rates in some of the best PS4 console games." }
{ "index": { "_id": 2 } }
{ "name": "Xbox Series X", "brand": "Microsoft", "storage": "1TB", "price": 499.99, "description": "Fastest, most powerful Xbox console ever. Play thousands of titles: Every game looks and plays better on Xbox Series X. At the heart of Series X is the Xbox Velocity. Architecture, which combines a custom SSD and built-in software to significantly reduce load times in and out of game. Switch between multiple games in an instant with Quick Resume. Explore new worlds and experience the action like never before with an unparalleled 12 teraflops of graphics processing power. Enjoy 4K gaming at up to 120 frames per second, premium advanced 3D sound, and more. 4K at 120 FPS: requires compatible content and display X version - with disc drive" }
{ "index": { "_id": 3 } }
{ "name": "Nintendo Switch", "brand": "Nintendo", "storage": "512GB", "price": 299.99, "description": "SHARPER, VIBRANT VISUALS. The new 7-inch screen on the Nintendo Switch OLED takes your gaming to the next level: vibrant colors with sharp contrasts for every moment. INTEGRATED GAMEPLAY. Enjoy the console's many multiplayer modes and connect with other players. Online or locally, the fun on the Nintendo Switch is guaranteed. ENJOY IMMERSION FOR LONGER. In addition to delivering an unparalleled experience, thanks to its improved audio, the Nintendo Switch has a rechargeable battery while you play. From 4.5 hours to 9 hours of battery life. INCLUDES SUPER MARIO BROS. WONDER. Transform your world with the phenomenal flowers in this new Mario game, full of amazing adventures, power-ups and new abilities. NINTENDO SWITCH ONLINE SUBSCRIPTION. Access online games, play with friends and enjoy the exclusive benefits of the Nintendo Switch Online subscription." }
{ "index": { "_id": 4 } }
{ "name": "Steam Deck", "brand": "Valve", "storage": "512GB", "price": 399.99, "description": "You can save games, apps, photos and videos without worrying about space. High-Level Performance: The 4-core processor and graphics ensure a dynamic experience and fast responses. High-Definition Images: Smooth transitions and sharp images provide complete immersion in the game. Wireless Connectivity: Wi-Fi technology allows you to play wherever you want, without wires or cables limiting your fun" }
{ "index": { "_id": 5 } }
{ "name": "Nintendo Switch Lite", "brand": "Nintendo", "storage": "512GB", "price": 299.99, "description": "MADE TO BE PORTABLE. Nintendo Switch Lite is designed specifically for portable gaming. The console lets you jump into your favorite games wherever you are. COMPACT AND LIGHTWEIGHT. With its sleek, lightweight design, this console is ready to hit the road wherever you are. COMPATIBLE GAMES. The Nintendo Switch Lite system plays the library of Nintendo Switch games that work in handheld mode. A WORLD OF COLOR TO CHOOSE FROM. Available in a variety of vibrant and unique colors, Nintendo Switch Lite lets you bring even more personality wherever you go." }<p>Retrouvons maintenant des facettes classiques en regroupant les résultats par marque, rangement et gamme de prix. Dans la requête, la taille:0 a été définie. Dans ce scénario, l'objectif est de récupérer uniquement les résultats de l'agrégation sans inclure les documents correspondant à la requête.</p>POST videogames/_search
{
  "size": 0,
  "aggs": {
    "brands": {
      "terms": { "field": "brand" }
    },
    "storage_sizes": {
      "terms": { "field": "storage" }
    },
    "price_ranges": {
      "range": {
        "field": "price",
        "ranges": [
          { "to": 300 },   
          { "from": 300, "to": 500 },  
          { "from": 500 }  
        ]
      }
    }
  }
}<p>La réponse comprendra des comptes pour la <strong>marque</strong>, le <strong>stockage</strong> et le <strong>prix</strong>, ce qui permettra de créer des filtres et des facettes.</p>"aggregations": {
   "brands": {
     "doc_count_error_upper_bound": 0,
     "sum_other_doc_count": 0,
     "buckets": [
       {
         "key": "Microsoft",
         "doc_count": 1
       },
       {
         "key": "Nintendo",
         "doc_count": 1
       },
       {
         "key": "Sony",
         "doc_count": 1
       },
       {
         "key": "Valve",
         "doc_count": 1
       }
     ]
   },
   "storage_sizes": {
     "doc_count_error_upper_bound": 0,
     "sum_other_doc_count": 0,
     "buckets": [
       {
         "key": "1TB",
         "doc_count": 2
       },
       {
         "key": "512GB",
         "doc_count": 2
       }
     ]
   },
   "price_ranges": {
     "buckets": [
       {
         "key": "*-300.0",
         "to": 300,
         "doc_count": 1
       },
       {
         "key": "300.0-500.0",
         "from": 300,
         "to": 500,
         "doc_count": 3
       },
       {
         "key": "500.0-*",
         "from": 500,
         "doc_count": 0
       }
     ]
   }
 }<h2>Approche basée sur le Machine Learning et l’IA pour les filtres et les facettes</h2><p>Dans cette approche, les modèles d'apprentissage automatique (ML), y compris les techniques d'intelligence artificielle (IA), analysent les attributs des données pour générer des filtres et des facettes pertinents. Au lieu de s'appuyer sur des règles prédéfinies, la ML/AI exploite les caractéristiques des données indexées. Cela permet la découverte dynamique de nouvelles facettes et de nouveaux filtres.</p><p><strong>Pour :</strong></p><ul><li><p><strong>Mises à jour automatiques :</strong> Les nouveaux filtres et facettes sont générés automatiquement, sans qu'il soit nécessaire de procéder à des ajustements manuels.</p></li><li><p><strong>Découverte de nouveaux attributs :</strong> Il peut identifier des caractéristiques de données <strong>précédemment non prises en compte </strong>en tant que filtres, enrichissant ainsi l'expérience de recherche.</p></li><li><p><strong>Réduction des efforts manuels :</strong> L'équipe n'a pas besoin de définir et de mettre à jour en permanence les règles de filtrage, car l'IA apprend à partir des données disponibles.</p></li></ul><p><strong>Cons :</strong></p><ul><li><p><strong>Complexité de la maintenance :</strong> L'utilisation de modèles peut nécessiter une prévalidation pour garantir la cohérence des filtres générés.</p></li><li><p><strong>Nécessite une expertise en ML et en IA :</strong> La solution exige des professionnels qualifiés pour affiner et surveiller les performances du modèle.</p></li><li><p><strong>Risque de filtres non pertinents :</strong> Si le modèle n'est pas bien calibré, il peut générer des facettes qui ne sont pas utiles aux utilisateurs.</p></li><li><p><strong>Coût :</strong> L'utilisation de la ML et de l'IA peut nécessiter des services tiers, ce qui augmente les coûts opérationnels.</p></li></ul><p>Il convient de noter que même avec un modèle bien calibré et une invite bien rédigée, les facettes générées doivent toujours passer par une étape de révision. Cette validation peut être manuelle ou basée sur des règles de modération, garantissant que le contenu est approprié et sûr. Bien qu'il ne s'agisse pas nécessairement d'un inconvénient, il est important de s'assurer de la qualité et de l'adéquation des facettes avant de les mettre à la disposition des utilisateurs.</p><h3>Mise en œuvre de filtres/façades - Approche IA</h3><p>Dans cette démonstration, nous utiliserons un modèle d'intelligence artificielle pour analyser automatiquement les caractéristiques des produits et suggérer des attributs pertinents. Avec une invite bien structurée, nous extrayons des informations du catalogue et les transformons en filtres et facettes. Nous présentons ci-dessous chaque étape du processus.</p><p>Dans un premier temps, nous utiliserons l'<strong>API Inference</strong> pour enregistrer un point de terminaison en vue d'une intégration avec un service de ML. Vous trouverez ci-dessous un exemple d'intégration avec le <strong>service OpenAI</strong>.</p>PUT _inference/completion/generate_filter_ia
{
   "service": "openai",
   "service_settings": {
       "api_key": "your-key",
       "model_id": "gpt-4o-mini"
   }
}<p>Nous définissons maintenant le pipeline permettant d'exécuter l'invite et d'obtenir les nouveaux filtres générés par le modèle.</p>PUT /_ingest/pipeline/generate_filter_ai
{
   "processors": [
     {
       "script": {
         "source": """ctx.prompt = "You are an expert in data organization for search and product categorization. Your task is to analyze the following product and identify the best dynamic facets that can be used in an e-commerce search experience. Product: " + ctx.name + "description: " + ctx.description + "Instructions: - Analyze the product name and description. - Extract only the dynamic facets (technological features or product characteristics that can be inferred from the description, try to create max 3 facets by characteristics found). Put the values into an array. Using key and value, e.g. dynamic_facets: [{ \"name\": \"Gaming Experience\", \"value\": \"Haptic Feedback\" },{ \"name\": \"Gaming Experience\", \"value\": \"Adaptive Triggers\" } - Return only a JSON."
         """
       }
     },
     {
       "inference": {
         "model_id": "generate_filter_ia",
         "input_output": {
           "input_field": "prompt",
           "output_field": "result"
         }
       }
     },
     {
       "gsub": {
         "field": "result",
         "pattern": "```json",
         "replacement": ""
       }
     },
     {
       "json" : {
         "field" : "result",
         "strict_json_parsing": false,
         "add_to_root" : true
       }
     },
     {
       "remove": {
         "field": "result"
       }
     },
     {
       "remove": {
         "field": "prompt"
       }
     }
   ]
}<p>Lancer une simulation de ce pipeline pour le produit "PlayStation 5", avec la description suivante :</p><p><em>Des jeux époustouflants : Admirez des graphismes époustouflants et découvrez les fonctionnalités de la nouvelle PS5.</em></p><p><em>Une immersion à couper le souffle : Découvrez une expérience de jeu plus profonde grâce à la prise en charge du retour haptique, des déclencheurs adaptatifs et de la technologie audio 3D.</em></p><p><em>Un design élancé : Avec la PS5 Digital Edition, les joueurs bénéficient d'une technologie de jeu puissante dans un design élégant et compact.</em></p><p><em>1 To de stockage : Vos jeux préférés sont prêts à être joués grâce à 1 To de stockage SSD intégré.</em></p><p><em>Rétrocompatibilité et boost de jeux : La console PS5 peut lire plus de 4 000 jeux PS4. Avec Game Boost, vous pouvez même profiter de taux de rafraîchissement plus rapides et plus fluides dans certains des meilleurs jeux de la console PS4.</em></p><p>Observons la sortie rapide générée par cette simulation.</p>{
 "docs": [
   {
     "doc": {
       "_index": "index",
       "_version": "-3",
       "_id": "1",
       "_source": {
         "name": "Play Station 5",
         "result": """```json
{
 "dynamic_facets": [
   { "name": "Storage Capacity", "value": "1TB SSD" },
   { "name": "Graphics Technology", "value": "Stunning Graphics" },
   { "name": "Audio Technology", "value": "3D Audio" }
 ]
}
```""",
         "description": "Stunning Gaming: Marvel at stunning graphics and experience the features of the new PS5. Breathtaking Immersion: Discover a deeper gaming experience with support for haptic feedback, adaptive triggers, and 3D Audio technology. Slim Design: With the PS5 Digital Edition, gamers get powerful gaming technology in a sleek, compact design. 1TB of Storage: Have your favorite games ready and waiting for you to play with 1TB of built-in SSD storage. Backward Compatibility and Game Boost: The PS5 console can play over 4,000 PS4 games. With Game Boost, you can even enjoy faster, smoother frame rates in some of the best PS4 console games.",
         "model_id": "generate_filter_ia",
         "prompt": """You are an expert in data organization for search and product categorization. Your task is to analyze the following product and identify the best dynamic facets that can be used in an e-commerce search experience. Product: Play Station 5description: Stunning Gaming: Marvel at stunning graphics and experience the features of the new PS5. Breathtaking Immersion: Discover a deeper gaming experience with support for haptic feedback, adaptive triggers, and 3D Audio technology. Slim Design: With the PS5 Digital Edition, gamers get powerful gaming technology in a sleek, compact design. 1TB of Storage: Have your favorite games ready and waiting for you to play with 1TB of built-in SSD storage. Backward Compatibility and Game Boost: The PS5 console can play over 4,000 PS4 games. With Game Boost, you can even enjoy faster, smoother frame rates in some of the best PS4 console games.Instructions: - Analyze the product name and description. - Extract only the dynamic facets (technological features or product characteristics that can be inferred from the description, try create max 3 facets by characteristics found). Put the values like arrays. Using key and value, e.g. dynamic_facets: [{ "name": "Gaming Experience", "value": "Haptic Feedback" },{ "name": "Gaming Experience", "value": "Adaptive Triggers" } - Return only a JSON."""
       },
       "_ingest": {
         "timestamp": "2025-03-19T22:14:32.0161803Z"
       }
     }
   }
 ]
}<p>Un nouveau champ, <strong>dynamic_facets</strong>, sera ajouté au nouvel index pour stocker les facettes générées par l'IA.</p>PUT videogames_1
{
 "mappings": {
   "properties": {
     "name": { "type": "text" },
     "brand": { "type": "keyword" },
     "storage": { "type": "keyword" },
     "price": { "type": "float" },
     "description": { "type": "text" },
     "dynamic_facets": { "type": "nested",
     "properties": { "name": { "type": "keyword" },
                     "value": { "type": "keyword" } } }
   }
 }
}<p>En utilisant l'<strong>API Reindex</strong>, nous allons réindexer l'index <strong>videogames</strong> en <strong>videogames_1</strong>, en appliquant le pipeline <strong>generate_filter_ai</strong> pendant le processus. Ce pipeline génère automatiquement des facettes dynamiques lors de l'indexation.</p>POST _reindex?wait_for_completion=false
{
 "source": {
   "index": "videogames"
 },
 "dest": {
   "index": "videogames_1",
   "pipeline": "generate_filter_ai"
 }
}<p>Nous allons maintenant lancer une recherche et obtenir les nouveaux filtres :</p>GET videogames_1/_search
{
 "size": 0,
 "query": {
   "match": {
     "name": "nintendo"
   }
 },
 "aggs": {
   "dynamic_facets": {
     "nested": {
       "path": "dynamic_facets"
     },
     "aggs": {
       "facets": {
         "terms": {
           "field": "dynamic_facets.name"
         },
         "aggs": {
           "facets": {
             "terms": {
               "field": "dynamic_facets.value"
             }
           }
         }
       }
     }
   }
 }
}<p>Résultats :</p>"aggregations": {
   "dynamic_facets": {
     "doc_count": 3,
     "facets": {
       "doc_count_error_upper_bound": 0,
       "sum_other_doc_count": 0,
       "buckets": [
         {
           "key": "Frame Rate",
           "doc_count": 1,
           "facets": {
             "doc_count_error_upper_bound": 0,
             "sum_other_doc_count": 0,
             "buckets": [
               {
                 "key": "120 FPS",
                 "doc_count": 1
               }
             ]
           }
         },
         {
           "key": "Gaming Resolution",
           "doc_count": 1,
           "facets": {
             "doc_count_error_upper_bound": 0,
             "sum_other_doc_count": 0,
             "buckets": [
               {
                 "key": "4K",
                 "doc_count": 1
               }
             ]
           }
         },
         {
           "key": "Graphics Processing Power",
           "doc_count": 1,
           "facets": {
             "doc_count_error_upper_bound": 0,
             "sum_other_doc_count": 0,
             "buckets": [
               {
                 "key": "12 Teraflops",
                 "doc_count": 1
               }
             ]
           }
         }
       ]
     }
   }
 }<p>Pour illustrer la mise en œuvre des facettes, nous présentons ci-dessous une interface simple :</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltb0d6aa40caf7a91a/6a170b86ab7f0839afdb9eb6/12b6d9d4f4d0985848d92841545fd22b7253ae6d-1600x1288.png" alt="la mise en œuvre des facettes" /><p>Le code de l'interface utilisateur présenté est <a href="https://gist.github.com/andreluiz1987/06d9ec1b381e942e9def0e969bd811a0">ici.</a></p><h2>Conclusion</h2><p>Les deux approches de la création de filtres et de facettes ont leurs avantages et leurs inconvénients. L'approche classique, basée sur des règles manuelles, permet de contrôler et de réduire les coûts, mais elle nécessite des mises à jour constantes et ne s'adapte pas de manière dynamique aux nouveaux produits ou aux nouvelles fonctionnalités.</p><p>D'autre part, l'approche basée sur l'IA et l'apprentissage automatique automatise l'extraction des facettes, ce qui rend la recherche plus flexible et permet de découvrir de nouveaux attributs sans intervention manuelle. Toutefois, cette approche peut être plus complexe à mettre en œuvre et à maintenir, et nécessite un étalonnage pour garantir des résultats cohérents.</p><p>Le choix entre l'approche classique et l'approche basée sur l'IA dépend des besoins et de la complexité de l'entreprise. Pour les scénarios plus simples, où les attributs des données sont stables et prévisibles, l'approche classique peut être plus efficace et plus facile à maintenir, en évitant les coûts inutiles liés à l'infrastructure et aux modèles d'IA. D'autre part, l'utilisation de la ML/AI pour extraire les facettes peut apporter une valeur ajoutée significative, en améliorant l'expérience de recherche et en rendant le filtrage plus intelligent.</p><p>L'important est d'évaluer si l'automatisation justifie l'investissement ou si une solution plus traditionnelle répond déjà efficacement aux besoins de l'entreprise.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/filters-facets-using-ml</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/filters-facets-using-ml</guid>
    <category><![CDATA[Pertinence]]></category>
    <category><![CDATA[Recherche ML]]></category>
    <dc:creator><![CDATA[Andre Luiz]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4084864dcdaa25d3/6a170b880c485781f901aaa9/6f196643d573614fe5124705c7e4db9bfce004b0-1200x628.png" length="0" type="image/png"/>
    <pubDate>Thu, 03 Apr 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Évaluation de la pertinence des recherches, partie 1 - Le benchmark BEIR]]></title>
    <description><![CDATA[Apprenez à évaluer votre système de recherche dans le cadre d'une meilleure compréhension du benchmark BEIR, grâce à des conseils et des techniques pour améliorer vos processus d'évaluation des recherches.]]></description>
    <content:encoded><![CDATA[<p>Ce document est le premier d'une série d'articles de blog traitant de la manière d'évaluer vos propres systèmes de recherche dans le cadre d'une meilleure compréhension du benchmark BEIR. Nous vous présenterons des conseils et des techniques spécifiques pour améliorer vos processus d'évaluation des recherches dans le contexte d'une meilleure compréhension du BEIR. Nous aborderons également les pièges courants qui affectent la fiabilité de l'évaluation. Enfin, nous soulignerons l'importance des LLM comme nouvel outil puissant pour les ingénieurs en recherche et illustrerons par des exemples leur utilisation pour faciliter l'évaluation.</p><h2>Comprendre le benchmark BEIR dans l'évaluation de la pertinence des recherches</h2><p>Pour améliorer un système, il faut pouvoir en mesurer l'efficacité. Dans le contexte de la recherche, <a href="https://arxiv.org/abs/2104.08663">BEIR</a> (ou, de manière équivalente, la section Récupération du classement <a href="https://huggingface.co/spaces/mteb/leaderboard">MTEB</a>) est considéré comme le "Saint Graal" de la communauté de recherche d'informations, et cela n'a rien d'étonnant. C'est un indice de référence très bien structuré avec des ensembles de données variés couvrant différentes tâches. Plus précisément, les domaines suivants sont abordés :</p><ul><li><p>Récupération d'arguments (ArguAna, Touche2020)</p></li><li><p>QA en domaine ouvert (HotpotQA, Natural Questions, FiQA)</p></li><li><p>Récupération par passes (MSMARCO)</p></li><li><p>Récupération des questions en double (Quora, CQADupstack)</p></li><li><p>Vérification des faits (FEVER, Climate-FEVER, Scifact)</p></li><li><p>Récupération d’informations biomédicales (TREC-COVID, NFCorpus, BioASQ)</p></li><li><p>Récupération d'entités (DBPedia)</p></li><li><p>Prédiction de citation (SCIDOCS)</p></li></ul><p>Cet benchmark fournit une statistique unique, nDCG@10, qui indique dans quelle mesure un système fait correspondre les documents les plus pertinents pour chaque exemple de tâche dans les premiers résultats qu'il renvoie. Pour un système de recherche avec lequel un humain interagit, la pertinence des résultats en haut de liste est essentielle. Cependant, l'évaluation d'une recherche comporte de nombreuses nuances qu'une simple statistique récapitulative ne permet pas de saisir.</p><h2>Structure d'un ensemble de données BEIR</h2><p>Chaque benchmark comporte trois artefacts :</p><ul><li><p>le corpus ou les documents à récupérer</p></li><li><p>les requêtes</p></li><li><p>les jugements de pertinence pour les requêtes (alias <code>qrels</code>).</p></li></ul><p>Les jugements de pertinence sont fournis sous forme de score égal ou supérieur à zéro. Les scores non nuls indiquent que le document est partiellement pertinent par rapport à la requête.</p><p>Ensemble de données</p><p>Taille du corpus</p><p>Nb. de requêtes dans l'ensemble de test</p><p>#qrels étiquetés positivement</p><p>#qrels égal à zéro</p><p>#Doublons dans le corpus</p><p>Arguana</p><p>8 674</p><p>1 406</p><p>1 406</p><p>0</p><p>96</p><p>Climate-FEVER</p><p>5 416 593</p><p>1 535</p><p>4 681</p><p>0</p><p>0</p><p>DBPedia</p><p>4 635 922</p><p>400</p><p>15 286</p><p>28 229</p><p>0</p><p>FEVER</p><p>5 416 568</p><p>6 666</p><p>7 937</p><p>0</p><p>0</p><p>FiQA-2018</p><p>57 638</p><p>648</p><p>1 706</p><p>0</p><p>0</p><p>HotpotQA</p><p>5 233 329</p><p>7 405</p><p>14 810</p><p>0</p><p>0</p><p>Questions naturelles</p><p>2 681 468</p><p>3 452</p><p>4 021</p><p>0</p><p>16 781</p><p>NFCorpus</p><p>3 633</p><p>323</p><p>12 334</p><p>0</p><p>80</p><p>Quora</p><p>522 931</p><p>10 000</p><p>15 675</p><p>0</p><p>1 092</p><p>SCIDOCS</p><p>25 657</p><p>1 000</p><p>4 928</p><p>25 000</p><p>2</p><p>SciFact</p><p>5 183</p><p>300</p><p>339</p><p>0</p><p>0</p><p>Touche2020</p><p>382 545</p><p>49</p><p>932</p><p>1 982</p><p>5 357</p><p>TREC-COVID</p><p>171 332</p><p>50</p><p>24 763</p><p>41 663</p><p>0</p><p>MSMARCO</p><p>8 841 823</p><p>6 980</p><p>7 437</p><p>0</p><p>324</p><p>CQADupstack (somme)</p><p>457 199</p><p>13 145</p><p>23 703</p><p>0</p><p>0</p><p><strong>Tableau 1</strong> : Statistiques de l'ensemble de données. Les chiffres ont été calculés sur la partie test des ensembles de données (<code>dev</code> pour <code>MSMARCO</code>).</p><p>Le <strong>tableau 1</strong> présente quelques statistiques issues des ensembles de données qui composent le benchmark <code>BEIR</code>, telles que le nombre de documents dans le corpus, le nombre de requêtes dans l'ensemble de données de test et le nombre de paires positives/négatives (requête, document) dans le fichier <code>qrels</code>. Un simple coup d'œil aux données nous permet de déduire immédiatement ce qui suit :</p><ul><li><p>La plupart des ensembles de données ne contiennent aucune relation négative dans le fichier <code>qrels</code>, c'est-à-dire des scores nuls, ce qui indiquerait explicitement que les documents ne sont pas pertinents pour la requête donnée.</p></li><li><p>Le nombre moyen de relations entre documents par requête (<code>#qrels</code> / <code>#queries</code>) varie de 1,0 dans le cas de <code>ArguAna</code> à 493,5 (<code>TREC-COVID</code>), mais avec une valeur de <code>&lt;</code>5 dans la majorité des cas.</p></li><li><p>Certains ensembles de données comportent des documents en double dans le corpus, ce qui, dans certains cas, peut conduire à une évaluation incorrecte, c'est-à-dire lorsqu'un document est considéré comme pertinent par rapport à une requête, alors que son doublon ne l'est pas. Par exemple, dans <code>ArguAna</code>, nous avons identifié 96 cas de paires de documents en double, avec un seul document par paire marqué comme pertinent pour une requête. En agrandissant la liste initiale des qrels pour inclure également les doublons, nous avons observé une augmentation relative d'environ 1 % du score <code>nDCG@10</code> en moyenne.</p></li></ul>{
  "_id": "test-economy-epiasghbf-pro02b",
  "title": "economic policy international africa society gender house believes feminisation",
  "text": "Again employment needs to be contextualised with …",
  "metadata": {}
}
{
  "_id": "test-society-epiasghbf-pro02b",
  "title": "economic policy international africa society gender house believes feminisation",
  "text": "Again employment needs to be contextualised with …",
  "metadata": {}
}
<p><strong>Exemple de paires dupliquées dans ArguAna. Dans le fichier qrels, seul la première semble pertinente (en tant que contre-argument) par rapport à la requête ("test-economy-epiasghbf-pro02a")</strong></p><p>Lors de la comparaison des modèles sur le classement MTEB, il est tentant de se concentrer sur la qualité moyenne de la récupération. Il s'agit d'un bon indicateur de la qualité globale du modèle, mais cela ne prédit pas nécessairement ses performances dans votre cas d'utilisation. Comme les résultats sont présentés par ensemble de données, il est important de comprendre le degré de pertinence des différents ensembles de données par rapport à votre tâche de recherche et de réévaluer les modèles en ne retenant que les plus pertinents. Pour une analyse plus approfondie, vous pouvez également vérifier le chevauchement thématique entre les différents corpus. Répartir les mesures de qualité par thème permet une évaluation beaucoup plus fine de leurs forces et faiblesses particulières.</p><p>Une remarque importante ici est que lorsqu'un document n'est pas marqué dans le fichier <code>qrels</code>, considéré par défaut comme non pertinent pour la requête. Nous approfondissons un peu plus ce domaine et recueillons des éléments de preuve pour éclairer davantage la question suivante : "À quelle fréquence un évaluateur est-il confronté à des paires (requête, document) pour lesquelles il n'existe aucune information de référence ?" Ceci est important, car lorsque seul un balisage superficiel est disponible (et que tous les documents pertinents ne sont donc pas étiquetés comme tels), un système de recherche d'informations peut être considéré comme pire qu'un autre simplement parce qu'il "choisit" de faire apparaître différents documents pertinents (mais non marqués). Il s'agit d'un piège courant dans la création d'ensembles de données d'évaluation de haute qualité, en particulier pour les grands ensembles de données. Pour être réalisable, l'étiquetage manuel se concentre généralement sur les meilleurs résultats renvoyés par le système actuel, ce qui peut entraîner l'omission de documents pertinents situés dans ses angles morts. Il est donc généralement préférable de consacrer davantage de ressources à un balisage plus complet d'un nombre restreint de requêtes plutôt qu'à un balisage superficiel et général.</p><h2>Utilisation du benchmark BEIR pour l'évaluation de la pertinence des recherches</h2><p>Pour initier notre analyse, nous mettons en œuvre le scénario suivant (voir le <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/evaluating-search-relevance-part-1/retrieve-and-rerank.ipynb">notebook</a>) :</p><ol><li><p>Tout d'abord, nous chargeons le corpus de chaque ensemble de données dans un index Elasticsearch.</p></li><li><p>Pour chaque requête dans l'ensemble de test, nous récupérons les 100 meilleurs documents avec BM25.</p></li><li><p>Nous reclassons les documents récupérés à l'aide de divers modèles de reclassement SOTA.</p></li><li><p>Enfin, nous rapportons le "taux de jugement" pour les 10 meilleurs documents provenant des étapes 2 (après récupération) et 3 (après reclassement). En d'autres termes, nous calculons le pourcentage moyen des 10 meilleurs documents qui ont un score dans le fichier <code>qrels</code>.</p></li></ol><p>Voici la liste des modèles de reclassement que nous avons utilisés :</p><ul><li><p><a href="https://docs.cohere.com/reference/rerank">Cohere</a> <code>rerank-english-v2.0</code> et <code>rerank-english-v3.0</code></p></li><li><p><a href="https://huggingface.co/BAAI/bge-reranker-base">BGE-base</a></p></li><li><p><a href="https://huggingface.co/mixedbread-ai/mxbai-rerank-xsmall-v1">mxbai-rerank-xsmall-v1</a></p></li><li><p><a href="https://huggingface.co/cross-encoder/ms-marco-MiniLM-L-6-v2">MiniLM-L-6-v2</a></p></li></ul><p></p><p>Récupération</p><p>Reranking</p><p></p><p></p><p></p><p></p><p>Ensemble de données</p><p>BM25 (%)</p><p>Cohere Rerank v2 (%)</p><p>Cohere Rerank v3 (%)</p><p>BGE-base (%)</p><p>mxbai-rerank-xsmall-v1 (%)</p><p>MiniLM-L-6-v2 (%)</p><p>Arguana</p><p>7,54</p><p>4,87</p><p>7,87</p><p>4,52</p><p>4,53</p><p>6,84</p><p>Climate-FEVER</p><p>5,75</p><p>6,24</p><p>8,15</p><p>9,36</p><p>7,79</p><p>7,58</p><p>DBPedia</p><p>61,18</p><p>60,78</p><p>64,15</p><p>63,9</p><p>63,5</p><p>67,62</p><p>FEVER</p><p>8,89</p><p>9,97</p><p>10,08</p><p>10,19</p><p>9,88</p><p>9,88</p><p>FiQa-2018</p><p>7,02</p><p>11,02</p><p>10,77</p><p>8,43</p><p>9,1</p><p>9,44</p><p>HotpotQA</p><p>12,59</p><p>14,5</p><p>14,76</p><p>15.1</p><p>14,02</p><p>14,42</p><p>Questions naturelles</p><p>5,94</p><p>8.84</p><p>8,71</p><p>8,37</p><p>8,14</p><p>8,34</p><p>NFCorpus</p><p>31,67</p><p>32,9</p><p>33,91</p><p>30,63</p><p>32,77</p><p>32,45</p><p>Quora</p><p>12,2</p><p>10,46</p><p>13,04</p><p>11,26</p><p>12,58</p><p>12,78</p><p>SCIDOCS</p><p>8,62</p><p>9,41</p><p>9,71</p><p>8,04</p><p>8,79</p><p>8,52</p><p>SciFact</p><p>9,07</p><p>9,57</p><p>9,77</p><p>9,3</p><p>9,1</p><p>9,17</p><p>Touche2020</p><p>38,78</p><p>30,41</p><p>32,24</p><p>33,06</p><p>37,96</p><p>33,67</p><p>TREC-COVID</p><p>92,4</p><p>98,4</p><p>98,2</p><p>93,8</p><p>99,6</p><p>97,4</p><p>MSMARCO</p><p>3,97</p><p>6,00</p><p>6,03</p><p>6,07</p><p>5,47</p><p>6,11</p><p>CQADupstack (moy.)</p><p>5,47</p><p>6,32</p><p>6,87</p><p>5,89</p><p>6,22</p><p>6,16</p><p><strong>Tableau 2</strong> : Taux de jugement par paires (ensemble de données, reranker) calculé sur les 10 premiers documents récupérés/reclassés</p><p>D'après le <strong>tableau 2</strong>, à l'exception de <code>TREC-COVID</code> (&gt;90 % de couverture), <code>DBPedia</code> (~65 %), <code>Touche2020</code> et <code>nfcorpus</code> (~35%), nous constatons que la majorité des ensembles de données ont un taux d'étiquetage compris entre 5 % et un peu plus de 10 % après l'extraction ou le reclassement. Cela ne veut pas dire que tous ces documents banalisés sont pertinents, mais il se peut qu'un sous-ensemble d'entre eux, en particulier ceux placés en tête de liste, soit positif.</p><p>L'avènement des modèles de langage réglés pour les instructions générales nous offre un nouvel outil puissant capable d'automatiser potentiellement l'évaluation de la pertinence. Ces méthodes sont généralement beaucoup trop gourmandes en ressources de calcul pour être utilisées en ligne dans le cadre de la recherche, mais nous nous intéressons ici à l'évaluation hors ligne. Nous utilisons ces méthodes dans ce qui suit pour examiner les indices montrant que certains ensembles de données BEIR souffrent d'un balisage superficiel.</p><p>Afin d'approfondir cette hypothèse, nous avons décidé de nous concentrer sur MSMARCO et de sélectionner un sous-ensemble de 100 requêtes, ainsi que les 5 documents les mieux reclassés (avec Cohere v2) qui ne sont actuellement pas marqués comme pertinents. Nous avons suivi deux voies d'évaluation différentes : premièrement, nous avons utilisé un prompt soigneusement ajusté (nous y reviendrons dans un article ultérieur) pour préparer le modèle <a href="https://huggingface.co/microsoft/Phi-3-mini-4k-instruct">Phi-3-mini-4k</a> récemment publié afin de prédire la pertinence (ou non) d'un document par rapport à la requête. En parallèle, ces cas ont également été étiquetés manuellement afin d'évaluer également le taux d'accord entre la sortie du LLM et le jugement humain. Dans l'ensemble, nous pouvons tirer les deux conclusions suivantes :</p><ul><li><p>Le taux de concordance entre les réponses LLM et les jugements humains était proche de 80 %, ce qui semble suffisant comme point de départ dans cette direction.</p></li><li><p>Dans 57,6 % des cas (sur la base du jugement humain), les documents renvoyés se sont avérés réellement pertinents par rapport à la requête. Autrement dit : pour 100 requêtes, 107 documents ont été jugés pertinents, mais au moins 0,576 × 5 × 100 = 288 documents supplémentaires sont réellement pertinents !</p></li></ul><p>Voici quelques exemples issus de l'ensemble de données <code>MSMARCO</code>/<code>dev</code> qui contiennent la requête, le document positif annoté (de <code>qrels</code>) et un faux négatif dû à un balisage incomplet :</p><p>1{^&gt;er &lt;^}exemple :</p>{
  "query":
    {
        "_id": 155234,
        "text": "do bigger tires affect gas mileage"
    },
  "positive_doc":
    {
        "_id": 502713,
        "text": "Tire Width versus Gas Mileage. Tire width is one of the only tire size factors that can influence gas mileage in a positive way. For example, a narrow tire will have less wind resistance, rolling resistance, and weight; thus increasing gas mileage.",
    },
    "negative_doc":
    {
        "_id": 7073658,
        "text": "Tire Size and Width Influences Gas Mileage. There are two things to consider when thinking about tires and their effect on gas mileage; one is wind resistance, and the other is rolling resistance. When a car is driving at higher speeds, it experiences higher wind resistance; this means lower fuel economy."
    }
}
<p>2{^&gt;e &lt;^}exemple :</p>{
  "query":
    {
        "_id": 300674,
        "text": "how many years did william bradford serve as governor of plymouth colony?"
    },
  "positive_doc":
    {
        "_id": 7067032,
        "text": "http://en.wikipedia.org/wiki/William_Bradford_(Plymouth_Colony_governor) William Bradford (c.1590 \u00e2\u0080\u0093 1657) was an English Separatist leader in Leiden, Holland and in Plymouth Colony was a signatory to the Mayflower Compact. He served as Plymouth Colony Governor five times covering about thirty years between 1621 and 1657."
    },
    "negative_doc":
    {
        "_id": 2495763,
        "text": "William Bradford was the governor of Plymouth Colony for 30 years. The colony was founded by people called Puritans. They were some of the first people from England to settle in what is now the United States. Bradford helped make Plymouth the first lasting colony in New England."
    }
}
<p>L'évaluation manuelle de requêtes spécifiques comme celle-ci est une technique généralement utile pour comprendre la qualité de la recherche qui complète les mesures quantitatives comme le nDCG@10. Si vous disposez d'un ensemble représentatif de requêtes que vous exécutez systématiquement lorsque vous modifiez la recherche, cela vous fournit des informations qualitatives importantes sur l'évolution des performances, informations invisibles dans les statistiques. Par exemple, cela vous donne beaucoup plus d'informations sur les faux résultats renvoyés par la recherche : cela peut vous aider à repérer les erreurs évidentes dans les résultats obtenus, les classes d'erreurs connexes, telles que la mauvaise interprétation de la terminologie spécifique au domaine, etc.</p><p>Notre résultat est en accord avec les recherches pertinentes concernant l'évaluation de <code>MSMARCO</code>. Par exemple, <a href="https://arxiv.org/pdf/2109.00062">Arabzadeh et al.</a> suivent une procédure similaire où ils emploient des travailleurs du crowdsourcing pour effectuer des jugements de préférences : entre autres, ils montrent que, dans de nombreux cas, les documents retournés par les modules de reclassement sont préférés à ceux du fichier MSMARCO <code>qrels</code>. Un autre élément de preuve est fourni par les auteurs de l'outil de reclassement <a href="https://arxiv.org/pdf/2010.08191">RocketQA</a>, qui indiquent que plus de 70 % des documents reclassés ont été jugés pertinents après inspection manuelle.</p><p> Mise à jour – 9 septembre : Après une réévaluation minutieuse de l'ensemble de données, nous avons identifié 15 autres cas de documents pertinents, portant leur nombre total de 273 à 288</p><h2>Principaux points à retenir et prochaines étapes</h2><ul><li><p>La quête d'une meilleure référence est sans fin, car elle est cruciale pour le benchmarking et la comparaison de modèles. Les LLM peuvent aider dans certains domaines d'évaluation s'ils sont utilisés avec prudence et réglés avec des instructions appropriées.</p></li><li><p>Plus généralement, étant donné que les critères de référence ne seront jamais parfaits, il peut être préférable de passer d'une simple comparaison de scores à des techniques plus robustes permettant de saisir les différences statistiquement significatives. Les travaux de <a href="https://arxiv.org/pdf/2109.00062">Arabzadeh et al.</a> fournit un bon exemple de cette méthode où, d'après leurs résultats, ils construisent des intervalles de confiance à 95 % indiquant des différences significatives (ou non) entre les différentes exécutions. Dans le <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/evaluating-search-relevance-part-1/retrieve-and-rerank.ipynb">notebook</a> joint, nous proposons une implémentation des intervalles de confiance en utilisant le <a href="https://en.wikipedia.org/wiki/Bootstrapping_(statistics)">bootstrapping</a>.</p></li><li><p>Du point de vue de l’utilisateur final, il est utile de réfléchir à l'alignement des tâches lors de la lecture des résultats de benchmark. Par exemple, pour un ingénieur en IA qui conçoit un pipeline RAG et sait que le cas d'utilisation le plus courant consiste à assembler de multiples informations provenant de différentes sources, il serait plus pertinent d'évaluer les performances de son modèle de recherche sur des ensembles de données QA multisauts comme HotpotQA plutôt que sur la moyenne globale du benchmark BEIR.</p></li></ul><p>Dans l'<a href="https://www.elastic.co/search-labs/blog/evaluating-search-relevance-part-2">article de blog suivant</a>, nous approfondirons l'utilisation de Phi-3 en tant que juge LLM et le processus de réglage pour prédire la pertinence.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/evaluating-search-relevance-part-1</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/evaluating-search-relevance-part-1</guid>
    <category><![CDATA[Recherche ML]]></category>
    <category><![CDATA[Python]]></category>
    <dc:creator><![CDATA[Thanos Papaoikonomou,Thomas Veasey]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt9d9912c8d4187096/6a1704f5b0367d30e672bc17/54a6e5197f5721b36fc65f27387d29803ed35589-721x420.jpg" length="0" type="image/jpeg"/>
    <pubDate>Tue, 16 Jul 2024 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Comprendre la quantification scalaire dans Lucene]]></title>
    <description><![CDATA[Découvrez comment Elastic a introduit la quantification scalaire dans Lucene, y compris la quantification automatique par octet, la quantification par segment &amp; performance insights.]]></description>
    <content:encoded><![CDATA[<h2>Quantification automatique des octets dans Lucene</h2><p>Bien que HNSW soit un moyen puissant et flexible de stocker et de rechercher des vecteurs, il nécessite une quantité importante de mémoire pour fonctionner rapidement. Par exemple, l'interrogation de 1MM float32 vectors de 768 dimensions nécessite environ  de ram. Dès que vous commencez à rechercher un nombre important de vecteurs, cela devient coûteux. La quantification des octets est un moyen d'utiliser environ  moins de mémoire. Lucene et, par conséquent, Elasticsearch prennent en charge l'indexation des vecteurs d' depuis un certain temps, mais la construction de ces vecteurs relève de la responsabilité de l'utilisateur. Cela est sur le point de changer, car nous avons introduit la quantification scalaire  dans Lucene.</p><h2>Quantification scalaire 101</h2><p>Toutes les techniques de quantification sont considérées comme des transformations avec perte des données brutes. Cela signifie que certaines informations sont perdues pour des raisons d'espace. Pour une explication approfondie de la quantification scalaire, voir : <a href="https://www.elastic.co/search-labs/scalar-quantization-101">Quantification scalaire 101</a>. À un niveau élevé, la quantification scalaire est une technique de compression avec perte. Un simple calcul permet de réaliser des économies d'espace significatives avec très peu d'impact sur le rappel.</p><h2>Explorer l'architecture</h2><p>Les personnes habituées à travailler avec Elasticsearch sont peut-être déjà familiarisées avec ces concepts, mais voici un aperçu rapide de la distribution des documents pour la recherche.</p><p>Chaque index Elasticsearch est composé de <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/size-your-shards.html#size-your-shards">plusieurs tiroirs (shards</a>). Bien que chaque nuage ne puisse être affecté qu'à un seul nœud, plusieurs nuages par index permettent un parallélisme de calcul entre les nœuds.</p><p>Chaque tesson est composé d'un seul <a href="https://lucene.apache.org/core/9_8_0/core/org/apache/lucene/index/package-summary.html">index Lucene</a>. Un index Lucene se compose de plusieurs segments en lecture seule. Pendant l'indexation, les documents sont mis en mémoire tampon et périodiquement vidés dans un segment en lecture seule. Lorsque certaines conditions sont remplies, ces segments peuvent être fusionnés en arrière-plan en un segment plus large. Tout cela est configurable et comporte son lot de complexités. Mais lorsque nous parlons de segments et de fusion, nous parlons de segments Lucene en lecture seule et de la fusion périodique automatique de ces segments. <a href="https://www.elastic.co/search-labs/vector-search-elasticsearch-rationale">Voici une analyse plus approfondie</a> de la fusion des segments et des décisions en matière de conception.</p><h2>Quantification par segment dans Lucene</h2><p>Chaque segment dans Lucene stocke les éléments suivants : les vecteurs individuels, les indices du graphe HNSW, les vecteurs quantifiés et les quantiles calculés. Par souci de concision, nous nous concentrerons sur la manière dont Lucene stocke les vecteurs quantifiés et bruts. Pour chaque segment, nous conservons la trace des  bruts dans le fichier vec, des vecteurs quantifiés et d'un seul multiplicateur correctif dans le  ainsi que les métadonnées relatives à la quantification  fichier vemq.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1861d0af970fd096/6a17d9887f6f15a45dc099c0/507a4d578f8a5d2225b11d16ac1fc0b7dd39eaa1-1207x228.png" alt="Le fichier .vec Fichier" /><p>Figure 1 : Présentation simplifiée d'un fichier de stockage de vecteurs bruts. Occupe la  de l'espace disque puisque les valeurs  sont de 4 octets. Étant donné que nous quantifions, ces données ne seront pas chargées lors de la recherche HNSW. Ils ne sont utilisés que sur demande expresse (par ex. secondaire par force brute via le <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/filter-search-results.html#query-rescorer">rescore</a>), ou pour la re-quantification lors de la fusion de segments.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt8c52b51939357280/6a17d9897b54f9130f8b3761/ffc6e8bffefc5cd36f14aae315184c89e04a6587-1440x207.png" alt="Le fichier .veq" /><p>Figure 2 : Présentation simplifiée du fichier  fichier. Occupe un espace de  et sera chargé en mémoire lors de la recherche. Les  octets sont destinés à prendre en compte le multiplicateur de correction, utilisé pour ajuster la notation afin d'améliorer la précision et la mémorisation.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt28e007988f81e5c0/6a17d98b25daabe23208a0d9/555cc92d7d179d8c9711cefbaaac3e0b815d2e42-1440x182.png" alt="Le fichier .vemq" /><p>Figure 3 : Présentation simplifiée du fichier de métadonnées. C'est ici que nous gardons trace de la quantification et de la configuration du vecteur, ainsi que des quantiles calculés pour ce segment.</p><p>Ainsi, pour chaque segment, nous stockons non seulement les vecteurs quantifiés, mais aussi les quantiles utilisés pour créer ces vecteurs quantifiés et les vecteurs bruts originaux. Mais pourquoi conserver les vecteurs bruts ?</p><h2>Une quantification qui évolue avec vous</h2><p>Étant donné que Lucene se concentre périodiquement sur les segments en lecture seule, chaque segment n'a qu'une vue partielle de l'ensemble des données. Cela signifie que les quantiles calculés ne s'appliquent directement qu'à cet échantillon de l'ensemble de vos données. Ce n'est pas très grave si votre échantillon représente correctement l'ensemble de votre corpus. Mais Lucene vous permet de trier votre index de différentes manières. Ainsi, vous pourriez indexer des données triées d'une manière qui ajoute un biais pour les calculs de quantile par segment. De plus, vous pouvez effacer les données quand vous le souhaitez ! Votre échantillon peut être minuscule, ne serait-ce qu'un seul vecteur. Un autre avantage est que vous avez le contrôle sur le moment où les fusions ont lieu. Bien qu'Elasticsearch ait configuré des valeurs par défaut et une fusion périodique, vous pouvez demander une fusion quand vous le souhaitez via l'API <a href="https://www.elastic.co/guide/en/elasticsearch/reference/8.10/indices-forcemerge.html">_force_merge</a>. Alors, comment permettre cette flexibilité tout en assurant une bonne quantification et un bon rappel ?</p><p>La quantification vectorielle de Lucene s'adaptera automatiquement au fil du temps. Lucene étant conçu avec une architecture de segments en lecture seule, nous avons la garantie que les données de chaque segment n'ont pas changé et des démarcations claires dans le code pour savoir quand les choses peuvent être mises à jour. Cela signifie que lors de la fusion des segments, nous pouvons ajuster les quantiles si nécessaire et éventuellement ré-équantifier les vecteurs.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0d9a2390958c3e82/6a17d98cbe6086e4fd0045d5/646baa8279719d06c05c1a4fdb80a0c060e0dd94-1440x446.png" alt="Quantiles de segments multiples" /><p>Figure 4 : Trois exemples de segments avec différents quantiles.</p><p>Mais la requantification n'est-elle pas coûteuse ? Il y a un certain surcoût, mais Lucene gère les quantiles intelligemment et ne les quantifie complètement que lorsque c'est nécessaire. Prenons l'exemple des segments de la figure 4. Donnons aux segments  et   documents chacun et au segment  seulement  documents. Lucene prend une moyenne pondérée des quantiles et si le quantile fusionné qui en résulte est suffisamment proche des quantiles originaux du segment, nous n'avons pas besoin de quantifier à nouveau ce segment et nous utiliserons les quantiles nouvellement fusionnés.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte2596c10ee616cf3/6a17d98eec0f8903b85a6497/58fa20d60dc337ca7108eb01e84a07c330e87ee6-1440x447.png" alt="Quantiles fusionnés" /><p>Figure 5 : Exemple de quantiles fusionnés lorsque les segments  et  ont  documents et que le segment  n'en a que .</p><p>Dans la situation représentée à la figure 5, nous pouvons voir que les quantiles fusionnés qui en résultent sont très similaires aux quantiles originaux en  et  Ils ne justifient donc pas la quantification des vecteurs. Le segment  semble s'écarter trop de la réalité. Par conséquent, les vecteurs de  seront quantifiés à nouveau avec les valeurs de quantile nouvellement fusionnées.</p><p>Il existe en effet des cas extrêmes où les quantiles fusionnés diffèrent considérablement des quantiles initiaux. Dans ce cas, nous prendrons un échantillon de chaque segment et recalculerons entièrement les quantiles.</p><h2>Performance de quantification &amp; numbers</h2><p>Est-il rapide et offre-t-il toujours un bon rappel ? Les chiffres suivants ont été recueillis lors de l'exécution de l'expérience sur une instance GCP <code>c3-standard-8</code>. Pour garantir une comparaison équitable avec , nous avons utilisé une instance suffisamment grande pour contenir des vecteurs bruts en mémoire. Nous avons indexé  vecteurs <a href="https://huggingface.co/datasets/Cohere/wikipedia-22-12-simple-embeddings">Cohere Wiki</a> en utilisant le produit intérieur maximal.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfa48e3724ad97fed/6a17d98f445de96aca4cff88/81958f99b8a1397f669db48de00f264cacc6b49f-576x455.png" alt="Rappel de quantification" /><p>Figure 6 : Rappel@10 pour les vecteurs quantifiés par rapport aux vecteurs bruts. La performance de recherche des vecteurs quantifiés est nettement plus rapide que celle des vecteurs bruts, et le rappel est rapidement récupérable en rassemblant seulement 5 vecteurs supplémentaires ; visible par .</p><p>La figure 6 illustre l'histoire. Bien qu'il y ait une différence de rappel, comme on peut s'y attendre, elle n'est pas significative. Et la différence de rappel disparaît en rassemblant seulement 5 vecteurs supplémentaires. Tout cela avec des fusions de segments  rapides et 1/4 de la mémoire des vecteurs .</p><h2>Conclusion</h2><p>Lucene apporte une solution unique à un problème difficile. La quantification ne nécessite aucune étape de "formation" ou d'"optimisation". Dans Lucene, cela fonctionnera simplement. Il n'y a pas d'inquiétude à avoir quant à la nécessité de "ré-entraîner" votre index vectoriel si vos données changent. Lucene détectera les changements significatifs et s'en chargera automatiquement pendant toute la durée de vie de vos données. Nous attendons avec impatience le moment où nous intégrerons cette fonctionnalité dans Elasticsearch !</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/scalar-quantization-in-lucene</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/scalar-quantization-in-lucene</guid>
    <category><![CDATA[Lucene]]></category>
    <category><![CDATA[Recherche ML]]></category>
    <dc:creator><![CDATA[Benjamin Trent]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltb382d99ffac9992c/6a17d991b1e113640179f12c/dc07f16d347a68476bded5df9adb831452f61278-1024x1024.jpg" length="0" type="image/jpeg"/>
    <pubDate>Sat, 11 Nov 2023 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Open-sourcing sysgrok - Un assistant IA pour analyser, comprendre et optimiser les systèmes]]></title>
    <description><![CDATA[Sysgrok est une preuve de concept expérimentale, destinée à démontrer comment les LLM peuvent être utilisés pour aider les SWE et les SRE à comprendre les systèmes, à déboguer les problèmes et à optimiser les performances.]]></description>
    <content:encoded><![CDATA[<p>Dans ce billet, je vais présenter sysgrok, un prototype de recherche dans lequel nous étudions comment les grands modèles de langage (LLM), comme les modèles GPT de l'OpenAI, peuvent être appliqués à des problèmes dans les domaines de l'optimisation des performances, de l'analyse des causes profondes et de l'ingénierie des systèmes. Vous pouvez le trouver sur <a href="https://github.com/elastic/perf-copilot">GitHub</a>.</p><h2>Que fait sysgrok ?</h2><p>sysgrok peut faire des choses comme :</p><ul><li><p>Prendre les fonctions et processus les plus coûteux identifiés par un profileur, expliquer la fonctionnalité de chacun et suggérer des optimisations.</p></li><li><p>À partir d'un hôte et d'une description d'un problème rencontré par cet hôte, il est possible de déboguer automatiquement le problème et de proposer des solutions et des actions supplémentaires.</p></li><li><p>Prendre un code source qui a été annoté par un profileur, expliquer les chemins chauds et suggérer des moyens d'améliorer les performances du code.</p></li></ul><p>Les fonctionnalités de sysgrok s'adressent à trois grandes catégories de solutions :</p><ol><li><p><strong>En tant que moteur d'analyse des performances, de la fiabilité et d'autres données relatives aux systèmes.</strong> Dans ce mode, le LLM est alimenté par la sortie d'un autre outil utilisé par l'ingénieur (par exemple, un outil de ligne de commande Linux, un profileur ou une plate-forme Observability). L'objectif de sysgrok est d'interpréter, de résumer et de formuler des hypothèses sur l'état du système à l'aide d'un LLM. Il peut également suggérer des optimisations ou des remédiations.</p></li><li><p><strong>En tant que solution ciblée et automatisée à des tâches spécifiques liées à la performance et à la fiabilité.</strong> Certaines tâches reviennent régulièrement dans les travaux d'ingénierie des performances et de SRE. Pour ces derniers, nous pouvons construire des assistants automatisés et ciblés qui peuvent être utilisés directement par l'ingénieur ou par sysgrok lui-même pour résoudre d'autres problèmes. Par exemple, dans le domaine de l'ingénierie des performances, il est courant de répondre à la question suivante : "Existe-t-il une version plus rapide de cette bibliothèque avec des fonctionnalités équivalentes ?". sysgrok prend cela en charge directement.</p></li><li><p><strong>Outil d'analyse automatisée des causes profondes des problèmes de performance et de fiabilité.</strong> Les deux premières catégories de solutions sont un mélange d'analyse, d'interprétation, de recherche et de synthèse de données. Surtout, ils sont appliqués de manière ciblée aux données que l'ingénieur a lui-même recueillies. Dans sysgrok, nous étudions également une troisième approche de la résolution de problèmes avec les LLM, dans laquelle le LLM est combiné avec d'autres outils pour effectuer de manière autonome l'analyse des causes profondes et la résolution d'un problème donné. Dans cette approche, le LLM reçoit une description du problème (par exemple, "Le serveur web connaît une latence élevée") et est informé des capacités dont il dispose (par exemple, "ssh à un hôte," " exécuter des outils de ligne de commande Linux arbitraires"). Il est ensuite demandé au mécanisme d'apprentissage à long terme d'indiquer les mesures à prendre, en utilisant les capacités dont il dispose, pour trier le problème. Ces actions sont exécutées par sysgrok, et il est demandé au LLM d'analyser les résultats, de trier le problème, de suggérer des remèdes et de recommander les prochaines étapes.</p></li></ol><p>sysgrok en est encore à ses débuts, mais nous le publions car il est déjà utile pour une variété de tâches - nous espérons qu'il sera une base pratique pour d'autres personnes afin de réaliser des expériences similaires. N'hésitez pas à nous envoyer des PR ou à ouvrir des problèmes <a href="https://github.com/elastic/sysgrok">sur GitHub</a> si vous avez des idées !</p><h2>Analyse des problèmes de performance avec les LLM</h2><p>Les LLM, tels que les modèles GPT d'OpenAI, ont vu leur popularité exploser au cours des derniers mois, fournissant une interface en langage naturel et un moteur au cœur de toutes sortes de produits, qu'il s'agisse de robots d'assistance à la clientèle, d'assistants de manipulation de données ou d'assistants de codage. Un aspect intéressant de cette tendance est que la plupart de ces applications utilisent des modèles génériques qui n'ont pas été spécifiquement formés ou affinés pour la tâche à accomplir. Au contraire, ils ont été formés sur de larges pans de l'internet dans son ensemble et sont donc applicables à un large éventail de tâches.</p><p>Pouvons-nous donc utiliser ces modèles pour faciliter l'analyse des performances, le débogage et l'optimisation ? Il existe <a href="https://www.brendangregg.com/methodology.html">plusieurs</a> méthodes pour étudier les problèmes de performance, déterminer les causes profondes et proposer des optimisations. Au fond, tout travail d'analyse des performances consiste à examiner les résultats de divers outils, tels que les outils de ligne de commande Linux ou une plate-forme d'observabilité, et à interpréter ces résultats afin de formuler une hypothèse sur l'état du système. Parmi le matériel sur lequel les modèles GPT ont été formés, on trouve des sources qui couvrent l'ingénierie logicielle, le débogage, l'analyse de l'infrastructure, les internes du système d'exploitation, Kubernetes, les commandes Linux et leur utilisation, ainsi que les méthodologies d'analyse de la performance. Par conséquent, les modèles peuvent être utilisés pour résumer, interpréter et émettre des hypothèses sur les données et les problèmes que les ingénieurs de performance rencontrent au quotidien, ce qui peut accélérer le rythme auquel un ingénieur progresse dans son analyse.</p><p>Nous pouvons aller plus loin et dépasser l'utilisation du LLM uniquement pour l'analyse des données et la réponse aux questions dans le contexte du processus d'investigation de l'ingénieur. Comme nous le montrerons plus loin dans ce billet, le LLM lui-même peut être utilisé pour piloter le processus dans certains scénarios, le LLM décidant des commandes à exécuter ou des sources de données à consulter pour déboguer un problème.</p><h2>Démonstrations</h2><p>Pour connaître l'ensemble des fonctionnalités prises en charge par sysgrok, consultez le <a href="https://github.com/elastic/sysgrok">dépôt</a> GitHub. D'une manière générale, il soutient trois approches de la résolution de problèmes :</p><h3>Approche 1 : moteur d'analyse des performances, de la fiabilité et d'autres données relatives aux systèmes</h3><p>Dans ce mode, le LLM est alimenté par la sortie d'un autre outil utilisé par l'ingénieur, tel qu'un outil de ligne de commande Linux, un profileur ou une plate-forme d'observabilité. L'objectif de sysgrok est d'interpréter, de résumer et de suggérer des remèdes.</p><p>Par exemple, la sous-commande <em>topn</em> prend les fonctions les plus coûteuses telles que rapportées par un profiler, explique le résultat et suggère ensuite des moyens d'optimiser le système.</p><p>Cette vidéo montre également la fonctionnalité de chat fournie par sysgrok. Lorsque l'argument -chat est fourni, sysgrok entre dans une session de chat après chaque réponse du LLM.</p><p>Cette capacité peut également être appliquée de manière générique à la sortie des outils de ligne de commande Linux. Par exemple, dans l'article <a href="https://www.brendangregg.com/Articles/Netflix_Linux_Perf_Analysis_60s.pdf">Linux Performance Analysis in 60 seconds</a>, Brendan Gregg présente 10 commandes qu'un SRE doit exécuter lorsqu'il se connecte pour la première fois à un hôte qui présente un problème de performance ou de stabilité. La sous-commande <em>analyzecmd</em> prend en entrée un hôte auquel se connecter et une commande à exécuter, puis analyse et résume la sortie de la commande pour l'utilisateur. Nous pouvons l'utiliser pour automatiser le processus décrit par Gregg et donner à l'utilisateur un résumé d'un paragraphe de toutes les données générées par les 10 commandes, lui évitant ainsi d'avoir à parcourir la sortie de chaque commande une par une.</p><h3>Approche 2 : Solution automatisée et ciblée pour des tâches spécifiques liées à la performance et à la fiabilité</h3><p>Certaines tâches reviennent régulièrement dans les travaux d'ingénierie des performances et de SRE. Pour ces derniers, nous pouvons construire des assistants automatisés et ciblés qui peuvent être utilisés soit directement par l'ingénieur, soit par sysgrok lui-même pour résoudre d'autres problèmes.</p><p>Par exemple, la sous-commande <em>findfaster</em> prend en entrée le nom d'une bibliothèque ou d'un programme et utilise le LLM pour trouver un remplacement équivalent plus rapide. Il s'agit d'une tâche très courante dans le domaine de l'ingénierie de la performance.</p><p>Un autre exemple de cette approche dans sysgrok est la sous-commande <em>explainfunction</em>. Cette sous-commande prend le nom d'une bibliothèque et d'une fonction au sein de cette bibliothèque. Il explique ce que fait la bibliothèque et ses cas d'utilisation courants, puis il explique la fonction. Enfin, il suggère des optimisations possibles si cette bibliothèque et cette fonction consomment une quantité importante de ressources de l'unité centrale.</p><h3>Approche 3 : En tant qu'outil d'analyse automatisée des causes profondes des problèmes de performance et de fiabilité</h3><p>L'utilisation des LLM ne se limite pas à la réponse à des questions ciblées, à l'élaboration de résumés et à des tâches similaires. Elle ne se limite pas non plus à une utilisation ponctuelle, où une seule question isolée leur est posée. La sous-commande sysgrok <em>debughost</em> démontre comment un LLM peut être utilisé comme le cerveau "" dans un agent dans le but de résoudre des problèmes de manière automatisée. Dans ce mode, le LLM est intégré à un processus qui l'utilise pour décider de la manière de déboguer un problème particulier et lui donne la possibilité de se connecter à des hôtes, d'exécuter des commandes et d'accéder à d'autres sources de données.</p><p>La commande debughost est probablement la partie la plus expérimentale de sysgrok pour le moment. Il s'agit d'une étape sur la voie des agents automatisés pour l'analyse des performances, mais il faut encore beaucoup de R&amp;D pour y parvenir.</p><h2>Conclusion</h2><p>Dans ce billet, j'ai présenté sysgrok, un nouvel assistant IA open-source pour l'analyse, la compréhension et l'optimisation des systèmes. Nous avons également abordé les trois grandes catégories d'approches mises en œuvre par sysgrok :</p><ol><li><p>Moteur d'analyse des performances, de la fiabilité et d'autres données relatives aux systèmes : Voir les sous-commandes topn, stacktrace, analyzecmd et code.</p></li><li><p>Solutions ciblées et automatisées à des tâches spécifiques liées à la performance et à la fiabilité : Voir les sous-commandes explainprocess, explainfunction et findfaster.</p></li><li><p>Analyse automatisée des causes profondes des problèmes de performance et de fiabilité : Voir la sous-commande debughost.</p></li></ol><p>Vous pouvez trouver le projet sysgrok <a href="https://github.com/elastic/sysgrok">sur GitHub</a>. N'hésitez pas à créer des relations publiques et des questions, ou à me contacter directement via <a href="mailto:sean.heelan@elastic.co">sean.heelan@elastic.co</a> si vous souhaitez discuter du projet ou des applications des LLM en général.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/open-sourcing-sysgrok-ai-assistant</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/open-sourcing-sysgrok-ai-assistant</guid>
    <category><![CDATA[Recherche ML]]></category>
    <dc:creator><![CDATA[Sean Heelan]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltff8f9a2d63790904/6a170bbbcdacbf61eb7d2a26/86f6f563d9f1ee6929ce4afc9005dfacd93f2990-720x420.png" length="0" type="image/png"/>
    <pubDate>Wed, 28 Jun 2023 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Stateless - votre nouvel état de recherche avec Elasticsearch]]></title>
    <description><![CDATA[Découvrez Elasticsearch stateless et explorez l'architecture sans état, qui permet d'améliorer les performances et de réduire les coûts.]]></description>
    <content:encoded><![CDATA[<p>Avec Elasticsearch sans état, nous investissons dans la construction d'une nouvelle architecture entièrement native pour repousser les limites de l'échelle et de la vitesse. Dans ce blog, nous explorons notre point de départ, l'avenir d'Elasticsearch avec l'introduction d'une architecture sans état et les détails de cette architecture.</p><h2>Où nous avons commencé</h2><p>La première version d'<a href="https://www.elastic.co/what-is/elasticsearch">Elasticsearch</a> a été publiée en 2010 en tant que moteur de recherche évolutif distribué permettant aux utilisateurs de rechercher rapidement des informations critiques et de les faire remonter à la surface. Douze ans et plus de 65 000 modifications plus tard, Elasticsearch continue de fournir aux utilisateurs des solutions éprouvées à une grande variété de problèmes de recherche. Grâce aux efforts de plus de 1 500 contributeurs, dont des centaines d'employés d'Elastic à temps plein, Elasticsearch a constamment évolué pour relever les nouveaux défis qui se présentent dans le domaine de la recherche.</p><p>Au début de la vie d'Elasticsearch, lorsque des problèmes de perte de données ont été soulevés, l'équipe d'Elastic a entrepris un <a href="https://www.elastic.co/blog/a-new-era-for-cluster-coordination-in-elasticsearch">effort pluriannuel</a> pour réécrire le système de coordination des clusters afin de garantir que les données reconnues sont stockées en toute sécurité. Lorsqu'il est apparu clairement que la gestion des index dans les grands clusters était un problème, l'équipe a travaillé à la mise en œuvre d'une <a href="https://www.elastic.co/blog/elasticsearch-data-lifecycle-management-with-data-tiers">solution ILM</a> complète pour automatiser ce travail en permettant aux utilisateurs de prédéfinir des modèles d'index et des actions de cycle de vie. Les utilisateurs ayant constaté la nécessité de stocker des quantités importantes de données métriques et de séries chronologiques, diverses fonctionnalités telles qu'une meilleure compression ont été ajoutées afin de réduire la taille des données. Comme le coût de stockage pour la recherche de grandes quantités de données froides augmentait, nous avons investi dans la création d'<a href="https://www.elastic.co/blog/introducing-elasticsearch-searchable-snapshots">instantanés consultables (Searchable Snapshots</a> ) comme moyen de rechercher des données d'utilisateur directement sur des magasins d'objets à faible coût.</p><p>Ces investissements jettent les bases de la prochaine évolution d'Elasticsearch. Avec la croissance des services cloud-native et des nouveaux systèmes d'orchestration, nous avons décidé qu'il était temps de faire évoluer Elasticsearch pour améliorer l'expérience de travail avec les systèmes cloud-native. Nous pensons que ces changements offrent des possibilités d'amélioration des opérations, des performances et des coûts lors de l'exécution d'Elasticsearch sur <a href="https://www.elastic.co/cloud/">Elastic Cloud.</a></p><h2>Où nous allons - Adopter une architecture sans état</h2><p>L'une des principales difficultés rencontrées lors de l'exploitation ou de l'orchestration d'Elasticsearch réside dans le fait qu'il dépend de nombreux éléments d'état persistants, et qu'il s'agit donc d'un système avec état. Les trois éléments principaux sont le translog, le magasin d'index et les métadonnées de la grappe. Cet état signifie que le stockage doit être persistant et ne peut être perdu lors du redémarrage ou du remplacement d'un nœud.</p><p>L'architecture Elasticsearch existante sur Elastic Cloud doit dupliquer l'indexation sur plusieurs zones de disponibilité pour assurer la redondance en cas de panne. Nous avons l'intention de transférer la persistance de ces données des disques locaux vers un magasin d'objets, comme AWS S3. En nous appuyant sur des services externes pour le stockage de ces données, nous supprimerons le besoin de réplication de l'indexation, ce qui réduira considérablement le matériel associé à l'ingestion. Cette architecture offre également des garanties de durabilité très élevées grâce à la manière dont les magasins d'objets en nuage tels que AWS S3, GCP Cloud Storage et Azure Blob Storage répliquent les données à travers les zones de disponibilité.</p><p>Le fait de décharger le stockage de l'index dans un service externe nous permettra également de réarchitecturer Elasticsearch en séparant les responsabilités d'indexation et de recherche. Au lieu d'avoir des instances primaires et répliquées gérant les deux charges de travail, nous avons l'intention d'avoir un niveau d'indexation et un niveau de recherche. La séparation de ces charges de travail permettra de les dimensionner indépendamment et de mieux cibler le choix du matériel en fonction des cas d'utilisation respectifs. Il permet également de résoudre un problème de longue date, à savoir que la charge de recherche et la charge d'indexation peuvent avoir un impact l'une sur l'autre.</p><p>Après une phase expérimentale de plusieurs mois, nous sommes convaincus que ces services de stockage d'objets répondent aux exigences que nous envisageons pour le stockage des index et des métadonnées des grappes. Nos tests et benchmarks indiquent que ces services de stockage peuvent répondre aux besoins d'indexation élevés des plus grands clusters que nous avons vus dans Elastic Cloud. En outre, la sauvegarde des données dans le magasin d'objets réduit les coûts d'indexation et permet de régler facilement les performances de la recherche. Pour rechercher des données, Elasticsearch utilisera le modèle Searchable Snapshots, qui a fait ses preuves, dans lequel les données sont conservées en permanence dans le magasin d'objets natif du nuage et les disques locaux sont utilisés comme caches pour les données auxquelles on accède fréquemment.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf17ddc7c69dc6e76/6a17d9f563baff2cc5741b02/e1d7b7b36bd1bbf906d50c3b873bfe2e1acd7fb3-1440x805.png" alt="" /><p>Pour faciliter la différenciation, nous décrivons notre modèle existant comme étant la réplication "de nœud à nœud". Dans l'étage chaud de ce modèle, l'étage primaire et l'étage réplique effectuent tous deux les mêmes tâches lourdes pour gérer l'ingestion et répondre aux demandes de recherche. Ces nœuds sont "stateful" en ce sens qu'ils s'appuient sur leurs disques locaux pour conserver en toute sécurité les données des ensembles qu'ils hébergent. En outre, les cartes primaires et les cartes répliques communiquent en permanence pour rester synchronisées. Pour ce faire, ils répliquent les opérations effectuées sur le groupe primaire vers le groupe réplique, ce qui signifie que le coût de ces opérations (CPU, principalement) est supporté pour chaque réplique spécifiée. Les mêmes unités de stockage et nœuds qui effectuent ce travail pour l'ingestion servent également à répondre aux demandes de recherche, de sorte que le dimensionnement et la mise à l'échelle doivent être effectués en tenant compte des deux charges de travail.</p><p>Au-delà de la recherche et de l'acquisition de données, les unités dans le modèle de réplication nœud à nœud gèrent d'autres responsabilités intensives, telles que la fusion de segments Lucene. Bien que cette conception ait ses mérites, nous avons vu beaucoup d'opportunités basées sur ce que nous avons appris avec nos clients au fil des ans et sur l'évolution de l'écosystème plus large de l'informatique dématérialisée.</p><p>La nouvelle architecture permet de nombreuses améliorations immédiates et futures :</p><ol><li><p>Il est possible d'augmenter considérablement le débit d'ingestion sur le même matériel ou, pour voir les choses autrement, d'améliorer considérablement l'efficacité pour la même charge de travail d'ingestion. Cette augmentation provient de la suppression de la duplication des opérations d'indexation pour chaque réplique. Les opérations d'indexation gourmandes en ressources humaines n'ont lieu qu'une seule fois au niveau de l'indexation, qui achemine ensuite les segments résultants vers un magasin d'objets. À partir de là, les données sont prêtes à être consommées telles quelles par le niveau de recherche.</p></li><li><p>Vous pouvez séparer le calcul du stockage pour simplifier la topologie de votre cluster. Aujourd'hui, Elasticsearch dispose de plusieurs niveaux de données (contenu, chaud, tiède, froid et gelé) pour faire correspondre les données au profil du matériel. Le niveau "chaud" est destiné à la recherche en temps quasi réel et le niveau "gelé" est destiné aux données moins fréquemment recherchées. Bien que ces niveaux apportent de la valeur, ils augmentent également la complexité. Dans la nouvelle architecture, les niveaux de données ne seront plus nécessaires, ce qui simplifiera la configuration et le fonctionnement d'Elasticsearch. Nous séparons également l'indexation de la recherche, ce qui réduit encore la complexité et nous permet de faire évoluer les deux charges de travail de manière indépendante.</p></li><li><p>Vous pouvez réduire les coûts de stockage au niveau de l'indexation en diminuant la quantité de données qui doivent être stockées sur un disque local. Actuellement, Elasticsearch doit stocker une copie complète du shard sur les nœuds chauds (à la fois primaires et répliqués) à des fins d'indexation. Avec l'approche sans état qui consiste à indexer directement le magasin d'objets, seule une partie de ces données locales est nécessaire. Pour les cas d'utilisation de type append only, seules certaines métadonnées devront être stockées pour l'indexation. Cela permettra de réduire considérablement le stockage local nécessaire à l'indexation.</p></li><li><p>Vous pouvez réduire les coûts de stockage associés aux requêtes de recherche. En faisant du modèle des instantanés consultables le mode natif de recherche des données, le coût de stockage associé aux requêtes de recherche diminuera de manière significative. En fonction des besoins des utilisateurs en matière de latence de recherche, Elasticsearch permettra des ajustements pour augmenter la mise en cache locale des données fréquemment demandées.</p></li></ol><h2>Analyse comparative - 75% amélioration du débit d'indexation</h2><p>Afin de valider cette approche, nous avons mis en œuvre une vaste démonstration de faisabilité dans laquelle les données n'étaient indexées que sur un seul nœud et la réplication était assurée par des magasins d'objets dans le nuage. Nous avons constaté que nous pouvions <strong>améliorer le débit d'indexation de 75%</strong> en supprimant la nécessité de dédier du matériel à la réplication de l'indexation. En outre, le coût de l'unité centrale associé à la simple extraction des données du magasin d'objets était bien inférieur à l'indexation des données et à leur écriture locale, comme c'est le cas aujourd'hui pour la couche chaude. Cela signifie que les nœuds de recherche pourront consacrer entièrement leur CPU à la recherche.</p><p>Ces tests de performance ont été réalisés sur un cluster de deux nœuds avec les trois principaux fournisseurs de clouds publics (AWS, GCP et Azure). Nous avons l'intention de continuer à développer des benchmarks plus importants au fur et à mesure de la mise en place d'une implémentation sans état de la production.</p><p><strong>Débit d'indexation</strong></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4a44b141e077a8cf/6a17d9f7445de982084cffa9/2c3c94b38a5c816a720112851b4a497b4176c285-593x270.png" alt="" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt8dfd035e67eaf0a8/6a17d9f9e3179127802d56d5/ee236cd455e8fa8f4af62a0f8557a5e907deffbf-596x270.png" alt="" /><p><strong>Utilisation de l'unité centrale</strong></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt13df63861f1149a6/6a17d9fa414c643b05945026/76632a9211a4762e3559ab498beb5381b7d441d2-547x329.png" alt="" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfd352e4ebd0a1417/6a17d9fcbe60863c0c0045e0/62dd9063a05d5841e196a5abf39db7e9c990fb01-547x326.png" alt="" /><h2>Apatrides pour nous, économies pour vous</h2><p>L'architecture sans état d'Elastic Cloud vous permettra de réduire la surcharge d'indexation, de faire évoluer indépendamment l'ingestion et la recherche, de simplifier la gestion des niveaux de données et d'accélérer les opérations, telles que la mise à l'échelle ou la mise à niveau. Il s'agit de la première étape vers une modernisation substantielle de la plateforme Elastic Cloud.</p><h2>Participez à notre vision d'Elasticsearch sans état d'âme</h2><p>Vous souhaitez tester cette solution avant tout le monde ? Vous pouvez nous contacter sur <a href="https://discuss.elastic.co/">discuss</a> ou sur le <a href="https://ela.st/slack">canal slack de notre communauté.</a> Nous serions ravis de recevoir vos commentaires pour nous aider à définir l'orientation de notre nouvelle architecture.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/stateless-your-new-state-of-find-with-elasticsearch</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/stateless-your-new-state-of-find-with-elasticsearch</guid>
    <category><![CDATA[Recherche ML]]></category>
    <category><![CDATA[Elastic Cloud Serverless]]></category>
    <dc:creator><![CDATA[Leaf Lin,Tim Brooks,Quin Hoxie]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltcc6aaa7d1d08f8d5/6a17d9c94b055d1ca0432084/dd0e2f3d452a288a185558102c705c60fdf77ad9-1440x840.png" length="0" type="image/png"/>
    <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>