Présentation du projet
Le corpus MicRou a été constitué pour un projet de RAG (Retrieval Augmented Generation) en mémoire de Michel Rouger : les documents sont tirés de ses archives personnelles et incluent ses propres articles et ouvrages ainsi que des contributions d'autres auteurs ou intervenants dans le cadre de projets à son initiative.
Cet ensemble de données comprend environ 850 documents en français (livres, articles, procès-verbaux de débats) produits entre 1998 et 2020. Il couvre la justice et le droit, la finance et l'économie, la gestion, la santé, l'éducation, le sport, l'histoire et la géopolitique... Au total, cela représente entre 1,5 million et 2 millions de tokens selon le tokenizer que vous utilisez.
Dans de nombreux cas, les documents proviennent d'une source plus grande qui a été divisée en parties pouvant être considérées indépendamment (par exemple, différents chapitres d'un livre ou différents articles d'un bulletin d'information). Il est néanmoins possible de reconstituer la source : au sein d'un "dossier", les documents peuvent être regroupés par date puis, au sein de chaque groupe de dates, ils peuvent être classés par index. Les documents qui ne proviennent pas d'une source plus importante ont un index de 0 par défaut.
Deux versions de l'ensemble de données ont été publiées sur GitHub et HuggingFace :
- microu : le corpus principal
- microu-chunked : les documents ont été découpés en morceaux qui respectent les contraintes de fenêtre contextuelle des tokenisers. Tous les fragments ont une taille attendue inférieure à 500 tokens avec la plupart des tokenisers, tout en maximisant la taille moyenne des fragments. La stratégie de chunking est détaillée ci-dessous.
Étapes du traitement des données
Tous les documents sont au format markdown. Les sources originales étaient soit au format Word ou soit en PDF. Les documents PDF ont d'abord été convertis en Word et tous les documents Word ont été consolidés. Note : l'utilisation de Word comme étape intermédiaire permet de parcourir rapidement les documents convertis à partir de PDF pour vérifier que la mise en page est correcte et de procéder rapidement aux ajustements nécessaires. Cependant, les documents très volumineux entraînent des problèmes de performances dans Word donc, en pratique, nous avons évité de dépasser 500 pages par document Word. Enfin, les documents Word ont été convertis en markdown à l'aide de pandoc afin de permettre le traitement de texte en python.
La déduplication a été réalisée à l'aide d'un modèle d'embedding et en évaluant la similarité sémantique entre les documents. A posteriori, ce n'était probablement pas une stratégie optimale. Nous avons utilisé BGE-m3 qui est un modèle multilingue (gérant ainsi correctement le français) et qui possède une fenêtre contextuelle de 8k tokens (évitant ainsi le chunking). Avec ce modèle, nous avons produit des embeddings denses de tous les documents (BGE-m3 permet également les embeddings ColBERT mais nous n'avons pas utilisé cette fonctionnalité pour ce projet)
Les résultats de BGE-m3 étaient suffisants pour identifier des documents similaires, mais suggéraient que les embeddings denses de longs documents en français ne seraient probablement pas suffisantes pour les applications de retrieval. Nous nous sommes alors tournés vers Solon, avec une fenêtre contextuelle de 512 tokens, ce qui impliquait un chunking.
La stratégie de chunking s'est appuyée autant que possible les sections existantes des documents grâce à une fonction récursive :
- en commençant par le haut, découper le document en sections en fonction du niveau des titres en markdown (en commençant par le niveau 1).
- tokeniser les sections résultantes et vérifier si elles respectent le nombre maximum de tokens
- si une section respecte la contrainte, l'enregistrer (cela garantit qu'une section n'est pas divisée). Sinon, appliquer le même processus au texte de la section, mais cette fois en divisant le texte en fonction des titres du niveau inférieur. La fonction récursive explore les sections et leurs sous-sections à chaque fois que le texte ne rentre pas.
- S'il n'y a pas de titres dans le texte, la fonction recherche des listes (ordonnées ou non) et décompose le texte en conséquence.
- s'il n'y a pas de liste, le texte est décomposé en paragraphes et si les paragraphes sont encore trop longs, ils sont ensuite décomposés en phrases.
- Enfin, en partant du niveau le plus granulaire de chaque sous-section (bottom-up), les fragments sont réagrégés avec un algorithme qui recherche le nombre minimal de groupes pouvant être formés avec les fragments tout en respectant les contraintes du nombre maximum de tokens par groupe. Rien d'extrêmement élaboré : c'est une optimisation par force brute.
Le script Python utilisé pour le chunking est inclus dans le dossier chunking du repo GitHub.
Licence
Le corpus est actuellement sous licence restrictive (CC-BY-NC-SA). Nous prévoyons de le convertir en licence ouverte une fois que nous aurons finalisé l'analyse des détenteurs des droit. Certains documents peuvent être exclus suite à cette analyse, mais nous prévoyons également d'en ajouter d'autres au fil du temps.
Tous les articles en français produits par PITTI seront ainsi ajoutés au dataset MicRou. Si vous souhaitez contribuer à cette base de connaissance ouverte en français, veuillez nous contacter.
Prochaines étapes
Une application Web devrait également voir le jour pour permettre aux utilisateurs d'interroger et de parcourir le dataset, et potentiellement de générer des résumés basés sur les morceaux récupérés.
En attendant, Embeddings Projector de Tensorflow est un bon outil pour explorer le dataset. Il ne gère pas vraiment markdwon et l'expérience de lecture pourrait être améliorée pour notre application spécifique, mais Embeddings Projector est, en pratique, ce que nous avons utilisé pour la vidéo ci-dessous. Voici comment l'utiliser :
- téléchargez les 2 fichiers tsv pour le microu-chunked embeddings et les métadonnées.
- une fois sur le Embeddings Projector, cliquez sur le chargement bouton ("Load" sur le côté gauche)
- suivez les instructions pour charger les deux fichiers tsv
Par défaut, la réduction des dimensions se fait avec PCA mais vous préférerez probablement UMAP (en bas à gauche).