4 points par GN⁺ 2025-11-29 | 1 commentaires | Partager sur WhatsApp
  • Le jeu de données Hacker News comprend 28,74 millions de posts et commentaires, et chaque texte est composé d’un embedding vectoriel de 384 dimensions généré par le modèle SentenceTransformers all-MiniLM-L6-v2
  • Les données sont publiées sous forme d’un fichier Parquet unique (bucket S3) fourni par ClickHouse, et peuvent être utilisées pour la conception et l’évaluation des performances d’applications de recherche vectorielle à grande échelle
  • Des exemples SQL décrivent pas à pas la création de table, le chargement des données, la création d’un index de similarité vectorielle basé sur HNSW et l’exécution de requêtes de recherche
  • Dans l’exemple Python, des embeddings de requête sont générés avec SentenceTransformers, et une recherche sémantique est effectuée dans ClickHouse via la fonction cosineDistance()
  • L’application de démonstration suivante résume les posts récupérés avec LangChain et OpenAI GPT-3.5-turbo, et montre le potentiel d’extension vers des cas d’usage d’IA générative en entreprise

Vue d’ensemble du jeu de données de recherche vectorielle Hacker News

  • Le jeu de données contient 28,74 millions de messages et de commentaires de Hacker News, chaque entrée incluant un embedding vectoriel de 384 dimensions généré avec le modèle SentenceTransformers all-MiniLM-L6-v2
    • L’embedding utilise un modèle d’embedding local pour capturer le sens des phrases et des paragraphes
  • Ce jeu de données peut être utilisé pour concevoir, estimer la taille, et analyser les performances d’applications de recherche vectorielle basées sur des données textuelles générées par les utilisateurs

Détails du jeu de données

  • L’ensemble des données est proposé par ClickHouse en tant que fichier Parquet unique, téléchargeable depuis le bucket S3 https://clickhouse-datasets.s3.amazonaws.com/hackernews-miniLM/…
  • Les utilisateurs sont invités à se référer au guide des index ANN dans la documentation ClickHouse pour estimer les besoins de stockage et de mémoire

Procédure de chargement des données et de construction de l’index

  • La table hackernews est créée pour inclure diverses colonnes telles que l’identifiant du post, le texte, le vecteur, l’auteur, l’horodatage et le score
  • Le chargement des données s’effectue via la commande SQL suivante
    INSERT INTO hackernews SELECT * FROM s3('https://clickhouse-datasets.s3.amazonaws.com/hackernews-miniLM/…');
    
    • L’insertion d’environ 28,74 millions de lignes prend quelques minutes
  • L’index de similarité vectorielle est construit avec l’algorithme HNSW et cosineDistance
    ALTER TABLE hackernews ADD INDEX vector_index vector TYPE vector_similarity('hnsw', 'cosineDistance', 384, 'bf16', 64, 512);
    ALTER TABLE hackernews MATERIALIZE INDEX vector_index SETTINGS mutations_sync = 2;
    
    • Les paramètres sont définis avec M=64 et ef_construction=512 ; selon le nombre de cœurs CPU et la bande passante de stockage, la construction de l’index peut prendre de quelques minutes à plusieurs heures
  • Une fois l’index construit, les requêtes de recherche vectorielle l’utilisent automatiquement
    SELECT id, title, text
    FROM hackernews
    ORDER BY cosineDistance(vector, <search vector>)
    LIMIT 10
    
    • Le chargement en mémoire de l’index peut prendre de quelques secondes à quelques minutes

Exemple de recherche sémantique en Python

  • Le script Python génère un embedding de la requête avec SentenceTransformers et exécute la requête via ClickHouse Connect
  • La similarité entre le vecteur d’entrée et les vecteurs du dataset est calculée avec la fonction cosineDistance()
  • Dans l’exemple d’exécution, la requête “Are OLAP cubes useful” retourne les 20 posts les plus pertinents
    • La sortie affiche l’ID de chaque post et une partie du texte (100 caractères)

Application de démonstration de résumé

  • Après l’exemple de recherche sémantique et documentaire avec ClickHouse, une application de résumé basée sur l’IA générative est présentée
  • Principales étapes
    1. Saisie d’un sujet par l’utilisateur
    2. Génération de l’embedding du sujet avec SentenceTransformers all-MiniLM-L6-v2
    3. Récupération des posts/commentaires pertinents via une recherche de similarité vectorielle dans ClickHouse
    4. Résumé des résultats avec LangChain et OpenAI gpt-3.5-turbo
  • Dans l’exemple d’exécution, une recherche est effectuée sur le thème “ClickHouse performance experiences” puis GPT-3.5 génère un résumé
    • Le résumé met en avant la performance, la simplicité, l’efficacité et l’adéquation de ClickHouse aux analyses à grande échelle, tout en mentionnant certaines limitations de DML et de sauvegarde
  • Cette application peut être étendue à divers cas d’usage d’IA générative en entreprise, tels que l’analyse des sentiments clients, l’automatisation du support technique, la synthèse de comptes rendus de réunion et l’analyse de documents financiers

Structure du code de l’application de résumé

  • Le code Python utilise SentenceTransformer, clickhouse_connect, LangChain, ChatOpenAI et d’autres composants
  • Les résultats de recherche sont fusionnés puis envoyés au modèle GPT-3.5 afin de générer un résumé de 10 phrases maximum
  • Selon le nombre de tokens du texte d’entrée, soit une chaîne stuff, soit une chaîne map_reduce est choisie pour le traitement
  • Le résultat est affiché au format Summary from chatgpt-3.5:

1 commentaires

 
GN⁺ 2025-11-29
Avis Hacker News
  • Le nouveau jeu de données d’embeddings vectoriels recommande de ne pas utiliser all-MiniLM-L6-v2
    Ce modèle était un modèle pratique basé sur sentence-transformers, souvent utilisé dans les premiers tutoriels, mais il est désormais ancien et ne reflète plus les architectures et pipelines d’entraînement récents
    Sa longueur de contexte est aussi limitée à 512. À la place, EmbeddingGemma est recommandé. Il prend en charge une fenêtre de contexte de 2k et affiche d’excellentes performances en benchmark
    Il est plus lent, mais cela en vaut la peine. Comme compromis, bge-base-en-v1.5 ou nomic-embed-text-v1.5 sont aussi de bonnes options

    • Ces jours-ci, je préfère Qwen3-Embedding-0.6B
      Poids ouverts, prise en charge multilingue et contexte de 32k
    • Malgré tout, l’avantage de all-Mini reste qu’il peut s’exécuter côté client
      Avec environ 70 Mo, il se télécharge facilement. EmbeddingGemma dépasse les 300 Mo, ce qui est plus contraignant
      Je me demande s’il existe un bon modèle sous les 100 Mo
    • Le problème de licence d’EmbeddingGemma est regrettable
      La « licence Gemma » est ambiguë, donc une revue juridique pourrait être nécessaire
      Si Google modifie la liste des « usages restreints », il y a un risque qu’il devienne interdit à tout moment
    • Je suis curieux de voir des comparaisons entre modèles d’embedding commerciaux
      Par exemple, il manque des comparatifs du type Cohere vs OpenAI small vs OpenAI large
      Je ne sais pas sur quels critères faire le benchmark
    • J’ai fait un test A/B entre EmbeddingGemma et nomic-embed-text-v1 il y a quelques semaines, et nomic a donné des résultats bien meilleurs
      Il fonctionne aussi bien sur CPU
  • Depuis 2023, tous les commentaires HN sont vectorisés dans BigQuery et hébergés sur hn.fiodorov.es
    Le code source est disponible sur GitHub

    • Je l’ai essayé moi-même, et cela m’a donné des réponses plutôt correctes
      En recherchant « Who’s Gary Marcus », j’ai obtenu des résultats plus négatifs que sur Google
      Je me demande combien cela coûte à faire tourner
    • L’explication de l’architecture dans le dépôt GitHub était impressionnante. Très beau projet
    • Je serais curieux de savoir avec quel matériel les embeddings ont été générés, et combien de temps cela a pris
    • Je voudrais savoir s’il existe une fonction de dépôt d’issue permettant aux utilisateurs de demander la suppression de leurs données
  • D’après la Privacy et Data Policy de HN, l’usage commercial des commentaires est interdit
    Les représentations vectorielles constituent techniquement aussi des œuvres dérivées

    • Selon les conditions d’utilisation de Y Combinator
      il est interdit de reproduire, distribuer, modifier ou créer des œuvres dérivées du contenu du site à des fins commerciales
      De plus, des pratiques comme le data mining et le scraping sont également interdites
    • Bien sûr, les vecteurs sont des dérivés, mais ma mémoire aussi, d’une certaine façon
      Je considère que j’ai le droit de créer une base de données vectorielle comme aide-mémoire externe
    • C’est une blague, mais j’étais justement sur le point de demander la suppression de tous mes commentaires. Maintenant, je n’en aurai peut-être plus besoin
    • Dans ce cas, il faudrait aussi prévenir OpenAI
  • Ce serait bien d’avoir sur HN un menu clic droit du type « voir les phrases similaires »
    On pourrait aussi voir si la même suggestion a déjà été faite auparavant

    • Relier les commentaires et les fils de discussion sur une base sémantique serait vraiment intéressant
      On pourrait voir à quel point les mêmes discussions se répètent d’un post à l’autre,
      et même vérifier à l’avance quelles réactions ont déjà été suscitées par ce qu’on s’apprête à écrire
      Cela pourrait devenir une sorte de fil sémantique
    • Avec une telle fonctionnalité, on verrait probablement défiler plein de mots comme « tangential, orthogonal, anecdata, enshittification, razor… »
    • Quelqu’un avait déjà créé autrefois un outil d’identification de comptes secondaires sur HN, et c’était effrayant de voir à quel point il retrouvait presque parfaitement les gens à partir de leur seul style d’écriture
  • Je me demande s’il existe des articles comparant la recherche vectorielle et la recherche textuelle classique
    Je me demande si la recherche vectorielle vaut vraiment le coup

    • La recherche classique est généralement appelée bm25. Dans la plupart des articles sur la recherche, bm25 sert de baseline
    • Je ne connais pas d’article précis, mais le compte reachsumit.com sur Bluesky partage souvent des contenus sur le RAG et la recherche d’information
    • Tout dépend de l’angle de comparaison — charge serveur ou expérience utilisateur, par exemple
  • Il est dit que les posts HN et les métadonnées d’embedding réunis font 55 Go ; si ce sont des fichiers Parquet, je me demande si ce chiffre est plausible

    • La plus grande partie doit probablement être constituée des données d’embedding. Ma base contient l’ensemble des posts et commentaires HN, et elle pèse environ 17,68 Go non compressée et 5,67 Go compressée
    • L’efficacité de compression est étonnamment bonne. Avec Brotli, même plusieurs millions de pages peuvent être réduites à 1 ou 2 Go
    • Au vu du tableau, ce chiffre semble juste. J’aimerais aussi vectoriser mes données d’upvotes pour analyser mes préférences
    • Si c’est compressé, la taille est tout à fait plausible
  • Si le seul objectif est d’utiliser les commentaires pour entraîner des modèles commerciaux, c’est un peu amer
    J’ai l’impression que cela pourrait affecter ma motivation à participer à l’avenir

    • Depuis l’arrivée des LLM, j’ai moins envie d’écrire des choses utiles sur Internet
      Avant, j’avais l’impression d’aider des inconnus ; maintenant, j’ai l’impression d’aider des gens que je n’apprécie pas
    • Moi, au contraire, je trouve amusant de penser que mes commentaires excentriques laisseront une trace dans l’espace latent d’un LLM
      Peut-être que, quelque part dans un immense modèle du futur, mes mots résonneront encore un peu
    • L’ambiance est trop sérieuse. J’ai juste envie de dire : profitons-en
  • J’aimerais qu’il y ait une fonction de suppression de compte/commentaire

    • Ce que nous avons écrit a déjà été répliqué sur d’innombrables appareils dans le monde entier
      C’est devenu en pratique une donnée permanente, et un jour mes commentaires resteront peut-être comme une forme de sagesse antique
    • Le jeu de données HN a déjà été recopié à de nombreux endroits, donc il faut considérer ce qu’on écrit ici comme du contenu public
  • J’ai supprimé un élément de ma liste de choses à faire (grâce à ce projet)

  • Imaginons qu’un ami me demande… si je poste un commentaire ici, il sera transformé en vecteur ?