Mettre un RAG (Retrieval-Augmented Generation) sur un corpus Drupal, c'est tentant sur le papier : une interface en langage naturel sur votre base documentaire, des réponses contextuelles pour vos équipes ou vos clients, un assistant qui connaît vraiment votre contenu.
En pratique, la plupart des projets buttent dès la deuxième semaine. Non pas sur l'IA — les modèles sont capables — mais sur ce qui arrive avant : la qualité des données, la conformité, la gestion des droits. Mettre un RAG sur un corpus mal préparé, c'est construire un oracle qui cite du contenu obsolète, des données personnelles ou des pages accessibles uniquement à certains rôles.
Cet article décrit le pipeline complet : de l'extraction Drupal jusqu'au monitoring de dérive, en passant par l'anonymisation conforme RGPD et la stratégie de citations.
Ce que Drupal exporte et ce que le RAG attend
Un corpus Drupal, c'est rarement homogène. On y trouve des nodes de types variés (articles, pages, fiches produit, FAQ), des paragraphes imbriqués, des fichiers attachés, du contenu multilingue, des révisions non publiées et — presque toujours — des données qui n'auraient jamais dû atterrir dans un champ texte : noms de clients, numéros de contrat, e-mails saisis dans un corps de texte.
Un pipeline RAG attend des chunks cohérents : des fragments de quelques centaines de tokens, avec des métadonnées précises (source, date de mise à jour, langue, droits d'accès). L'écart entre les deux définit l'essentiel du travail d'ingestion.
Trois points de tension à anticiper dès la conception :
- La granularité du contenu Drupal ne correspond pas aux chunks RAG. Un article long doit être découpé ; une FAQ courte ne doit pas l'être.
- Les révisions créent du bruit. Drupal conserve l'historique ; l'index RAG ne doit exposer que la révision publiée courante.
- Les droits d'accès existent dans Drupal. Ils doivent être propagés jusqu'au retrieval, sinon votre RAG répond à un utilisateur standard avec du contenu réservé à l'administrateur.
Le pipeline d'ingestion en quatre étapes
1. Extraction
L'extraction peut passer par l'API JSON:API de Drupal (disponible nativement depuis Drupal 8.7), par Views exportées en JSON, ou par une requête directe à la base de données pour les corpus volumineux. L'API JSON:API est préférable pour les projets courants : elle respecte l'arbre de publication, expose les relations entre entités et simplifie le filtrage par type de contenu, statut et langue.
Ce que l'extraction doit produire pour chaque entité : le contenu texte nettoyé (sans balises HTML), les métadonnées (nid, type, langcode, changed, statut, URL canonique), et les droits associés (rôles autorisés à consulter ce contenu).
2. Nettoyage et chunking
Le nettoyage précède systématiquement le chunking. Opérations à appliquer dans l'ordre : suppression des balises HTML résiduelles, normalisation des espaces, suppression des blocs boilerplate (navigation, pied de page), détection des doublons stricts.
Pour le chunking, deux stratégies selon la nature du contenu :
- Chunking par paragraphe sémantique pour les articles longs : on coupe aux séparateurs naturels (titres H2/H3, sauts de section), avec une fenêtre de recoupement de 10 à 15 %.
- Chunking par entité complète pour les contenus courts (FAQ, fiches, glossaires) : un node = un chunk, avec un plafond de 512 tokens.
3. Anonymisation conforme RGPD
C'est l'étape la plus sous-estimée. Un corpus Drupal contient presque toujours des données personnelles introduites par les utilisateurs : noms dans les commentaires, e-mails dans les corps de texte, numéros de téléphone dans les champs libres. Indexer ces données dans un vecteur store, c'est les rendre requêtables hors de leur contexte d'origine.
Deux approches, non exclusives :
- La détection et la suppression avant indexation. Un passage NER (Named Entity Recognition) détecte les entités de type PERSON, EMAIL, PHONE, IBAN. Les entités détectées sont supprimées ou remplacées par un placeholder générique.
- La politique de filtrage à la source. Identifier avant extraction les types de contenus qui ne doivent pas entrer dans le corpus : formulaires de contact archivés, contenus privés, nodes liés à des profils utilisateurs.
4. Gestion des versions et des droits
Un index RAG n'est pas statique. La synchronisation peut être déclenchée par hook Drupal (hook_entity_update) ou par batch différentiel. Pour la gestion des droits, le retrieval doit filtrer les chunks selon les rôles de l'utilisateur — les métadonnées de chaque chunk portent les rôles autorisés, et un filtre de pré-retrieval s'applique avant d'envoyer les chunks au LLM.
La stratégie de citations
Un RAG sans citations est un oracle sans responsabilité. Deux niveaux de citation :
- Citation de source : chaque réponse inclut les URLs canoniques des nodes utilisés pour générer la réponse.
- Citation de passage : la réponse reproduit un extrait du chunk source entre guillemets, avec la référence.
Le prompt système doit explicitement instruire le modèle de ne générer que ce qui peut être relié à un chunk fourni, et de signaler quand une question dépasse le corpus disponible.
Monitoring, dérives et rafraîchissement d'index
Un RAG en production dérive. Trois types de dérives à surveiller :
- Dérive de contenu : l'index ne suit pas les mises à jour du corpus Drupal. Indicateur : chunks avec un timestamp antérieur de plus de N jours à la date de la requête.
- Dérive de pertinence : les embeddings ne correspondent plus aux requêtes des utilisateurs. Indicateur : score de similarité moyen des chunks récupérés en baisse.
- Dérive de qualité de réponse : évaluation automatisée sur un jeu de questions de référence — à constituer dès le déploiement.
Ce que ce chantier demande réellement
Un RAG sur contenu Drupal n'est pas un projet IA. C'est un projet data avec une couche IA dessus. La difficulté est dans le pipeline : extraction propre, anonymisation rigoureuse, synchronisation fiable, droits propagés jusqu'au retrieval.
Le point d'entrée utile : un diagnostic qui couvre le corpus, l'architecture d'accès et les contraintes réglementaires — avant d'écrire la première ligne de code.