Nous avons construit un système RAG "local-first" complet avec ingestion de documents multi-formats, découpage ("chunking") conscient de la structure, génération d'embeddings locaux, un pipeline de recherche hybride (sémantique + texte intégral + récence), un reranking par cross-encoder et une interface utilisateur web — le tout fonctionnant entièrement sur la machine de l'utilisateur.
Architecture
- Chargeurs de documents : Parseurs spécifiques aux formats pour PDF, DOCX, XLSX, CSV, HTML, Markdown et texte brut
- Chunker : Découpage ("splitting") conscient de la structure qui préserve les limites des pages, des feuilles et des titres
- Embeddings : Modèle d'embedding local via Transformers.js (pas d'appels API externes)
- Base de données vectorielle : LanceDB (serverless, basée sur fichiers) pour le stockage des embeddings et la recherche de similarité
- Recherche en texte intégral : Indexation basée sur les trigrammes pour la correspondance lexicale
- Reranker : Modèle cross-encoder pour la notation des résultats en fonction du contexte
- Analyseur de requêtes : Routage de la détection d'intention entre les requêtes sémantiques et structurées
- Serveur Web : API Express.js avec des endpoints de gestion de projet et de recherche
- Frontend : Interface utilisateur web pour le téléchargement, la gestion et la recherche interactive de documents
Pipeline de traitement de documents
Chargeurs multi-formats
Un modèle de registre détecte automatiquement le type de fichier et le dirige vers le parseur approprié :
- PDF — Extraction de texte avec segmentation au niveau de la page
- Word (.docx/.doc) — Parsing conscient des titres, préservant la hiérarchie du document
- Excel/CSV — Parsing feuille par feuille avec détection d'en-tête et contenu au niveau des lignes
- HTML — Extraction consciente des balises avec préservation de la structure
- Markdown — Parsing de sections basé sur les titres
- Texte brut — Segmentation basée sur les lignes
Chaque chargeur extrait les métadonnées (titre, auteur, date de création, nombre de pages/feuilles, nombre de mots) en plus du contenu, produisant des sections structurées avec des références de source.
Découpage ("Chunking") conscient de la structure
Contrairement au découpage de texte naïf, le chunker respecte les limites du document :
- Préserve les sauts de page (PDF), les limites de feuille (tableurs) et la hiérarchie des titres (Word/Markdown)
- Dimensionnement basé sur les tokens avec taille de chunk et chevauchement configurables
- Retour hiérarchique : divise d'abord par sections, puis par paragraphes, puis par phrases
- Chaque chunk conserve les métadonnées de source (numéro de page, nom de feuille, titre) pour l'attribution
Embedding et Indexation
Modèle d'embedding local
- Fonctionne entièrement localement via Transformers.js — aucune donnée ne quitte la machine
- Modèle quantifié pour l'optimisation des performances
- Embedding par lot pour un traitement de masse efficace
- Troncation automatique aux limites des mots avec normalisation L2
Stockage vectoriel
LanceDB offre un stockage vectoriel serverless :
- Basé sur fichiers (aucun serveur de base de données séparé nécessaire)
- Isolation par projet avec des index indépendants
- Clés de cache basées sur SHA256 pour la déduplication
- Métadonnées stockées avec les vecteurs pour une récupération filtrée
Pipeline de recherche hybride
Le pipeline de récupération combine trois signaux de classement pour de meilleurs résultats que toute approche unique :
Signal 1 : Recherche par Embedding (Sémantique)
La recherche de similarité vectorielle trouve des chunks (morceaux) avec un sens similaire même lorsque des mots différents sont utilisés. Gère la paraphrase, les synonymes et les requêtes conceptuelles.
Signal 2 : Recherche en Texte Intégral (Lexicale)
L'indexation basée sur les trigrammes avec la similarité de Jaccard détecte les correspondances exactes de mots-clés que la recherche par embedding pourrait manquer — important pour les termes techniques, les noms et les identifiants.
Signal 3 : Boost de récence
La pondération par décroissance exponentielle favorise les documents récemment consultés ou modifiés, garantissant que les informations à jour apparaissent en premier.
Combinaison des scores
Les signaux sont combinés avec des poids configurables (par défaut : 50% sémantique, 25% lexical, 25% récence), normalisés et filtrés par un seuil de score minimum.
Reranking par Cross-Encoder
Après la récupération initiale, un modèle cross-encoder re-évalue les meilleurs candidats :
- Notation consciente du contexte qui considère les paires requête-document ensemble (pas indépendamment)
- Calcul du boost de mots-clés pour le chevauchement de termes
- Notation combinée (cross-encoder + signaux de mots-clés)
- Produit une liste classée finale avec une précision supérieure à celle de la récupération du premier passage seule
Support des données structurées
Pour le contenu des feuilles de calcul, le système offre des capacités supplémentaires :
- Auto-détection des types de colonnes (numérique, date, booléen, chaîne de caractères)
- Filtrage en langage naturel (par exemple, "employés en ingénierie avec un salaire supérieur au seuil")
- Support de l'agrégation (compte, somme, moyenne, min, max)
- L'analyseur de requêtes route les requêtes structurées vers un moteur dédié plutôt que vers la recherche d'embedding
Interface Web
- Gestion de projet — Créer, mettre à jour et supprimer des projets de base de connaissances
- Téléchargement de documents — Téléchargement de fichiers par glisser-déposer avec auto-détection du format
- Création de documents — Créer des documents à partir de texte directement dans l'interface utilisateur
- Recherche interactive — Interface de requête en langage naturel avec résultats classés
- Statistiques — Taille de l'index, nombre de documents et distribution des formats par projet
Fonctionnalités clés
- Entièrement local — Tout le traitement est effectué sur l'appareil ; pas d'appels API externes pour les embeddings ou la recherche
- 9 formats d'entrée — PDF, DOCX, DOC, XLSX, XLS, CSV, HTML, Markdown, texte brut
- Découpage ("Chunking") conscient de la structure — Préserve les pages, les feuilles et les titres comme limites de "chunk"
- Recherche hybride — Combine les signaux sémantiques, lexicaux et de récence pour une meilleure récupération
- Reranking par Cross-Encoder — Notation de second passage pour des résultats de plus haute précision
- Requêtes structurées — Filtrage et agrégation en langage naturel sur les données de feuilles de calcul
- Base de données vectorielle serverless — Stockage basé sur fichiers LanceDB sans surcharge d'infrastructure
- Écriture de documents — Capacités d'exportation pour la création de PDF, DOCX et XLSX
- Isolation de projet — Bases de connaissances indépendantes avec des index séparés
- Interface utilisateur Web — Interface complète pour la gestion de documents et la recherche interactive