Personnaliser un transformateur de documents avec LangChain4j pour le nettoyage des données

Dans les architectures de type RAG (Retrieval-Augmented Generation), les données brutes issues de sources exterens contiennent souvent du bruit. Ce bruit, comme les balises HTML dans le texte, peut dégrader la qualité des résultats de recherche et de génération. LangChain4j intègre des mécanismes pour traiter ces données via des transformateurs de documents. Toutefois, pour des besoins métier spécifiques, il est fréquemment nécessaire de développer un transformateur personnalisé.

Voici comment implémenter un transformateur sur mesure pour supprimer les balises HTML d'un document.

Création d'un transformateur de documents personnalisé

L'implémentation s'appuie sur l'interface DocumentTransformer de LangChain4j. Il faut créer une classe qui implémente cette interface et redéfinir les méthodes transform (pour un document unique) et transformAll (pour une collection de documents).

Exemple d'implémentation pour le nettoyage HTML

import dev.langchain4j.data.document.Document;
import dev.langchain4j.data.document.DocumentTransformer;
import java.util.List;
import java.util.stream.Collectors;

/**
 * Transformateur qui extrait le texte brut en éliminant les balises de balisage.
 */
public class MarkupStripperTransformer implements DocumentTransformer {

    private static final String HTML_TAG_PATTERN = "<[^>]+>";

    @Override
    public Document transform(Document inputDocument) {
        String purifiedText = stripMarkup(inputDocument.text());
        return Document.from(purifiedText);
    }

    @Override
    public List<Document> transformAll(List<Document> inputDocuments) {
        return inputDocuments.stream()
                .map(this::transform)
                .collect(Collectors.toList());
    }

    private String stripMarkup(String content) {
        if (content == null || content.isEmpty()) {
            return "";
        }
        return content.replaceAll(HTML_TAG_PATTERN, "").trim();
    }
}

Utilisation du transformateur

Pour appliquer la transformation, on instancie le transformateur personnalisé et on l'utilise sur les documents chargés.

// Supposons un document source contenant des balises HTML
Document originalDoc = Document.from(
    "<article><h1>Titre</h1><p>Un <em>texte</em> important.</p></article>"
);

// Initialisation du transformateur
DocumentTransformer cleaner = new MarkupStripperTransformer();
Document cleanedDocument = cleaner.transform(originalDoc);

// Affichage du résultat nettoyé
System.out.println(cleanedDocument.text());
// Sortie: TitreUn texte important.

Dans un pipeline RAG, ce transformateur serait intégré lors de l'ingestion des documents, après le chargement et avant la segmentation et la vectorisation.

La construction d'un système RAG robuste en production implique plusieurs étapes cruciales : le chargement des documents, leur analyse, leur transformation (nettoyage), la segmentation en chunks, la génération des embeddings, leur stockage dans une base de données vectorielles et enfin l'implémentation de la logique de récupération. Chaque composant nécessite une attention et un ajustement continu pour atteindre les niveaux de précision requis.

Étiquettes: LangChain4j rag DocumentTransformer Nettoyage de données Java

Publié le 8 juin à 07h45