Jeu de données de recherche vectorielle Hacker News de 28,74 millions de posts et de commentaires
(clickhouse.com)- 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
hackernewsest 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=64etef_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
- Les paramètres sont définis avec
- 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
- Saisie d’un sujet par l’utilisateur
- Génération de l’embedding du sujet avec
SentenceTransformers all-MiniLM-L6-v2 - Récupération des posts/commentaires pertinents via une recherche de similarité vectorielle dans ClickHouse
- Résumé des résultats avec
LangChainet OpenAIgpt-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,ChatOpenAIet 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înemap_reduceest choisie pour le traitement - Le résultat est affiché au format
Summary from chatgpt-3.5:
1 commentaires
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
Poids ouverts, prise en charge multilingue et contexte de 32k
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
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
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
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
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
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
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
Je considère que j’ai le droit de créer une base de données vectorielle comme aide-mémoire externe
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
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
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
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
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
Avant, j’avais l’impression d’aider des inconnus ; maintenant, j’ai l’impression d’aider des gens que je n’apprécie pas
Peut-être que, quelque part dans un immense modèle du futur, mes mots résonneront encore un peu
J’aimerais qu’il y ait une fonction de suppression de compte/commentaire
C’est devenu en pratique une donnée permanente, et un jour mes commentaires resteront peut-être comme une forme de sagesse antique
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 ?