Markdown Processor

Le MarkdownProcessor est une étape d’optimisation cruciale dans le pipeline. Son rôle est de filtrer le Markdown brut pour n’en conserver que les parties sémantiquement liées aux horaires d’ouverture, afin de réduire la taille et le coût des requêtes envoyées au LLM.

Fonctionnalités

  • Découpage du Texte : Le texte peut être découpé en chunks de taille fixe ou en phrases en utilisant le sentencizer de NLTK, selon la configuration.

  • Filtrage Sémantique par Embeddings : Le processeur utilise des modèles d’embeddings (locaux ou via une API comme Mistral/OpenAI) pour convertir des phrases de référence (ex: « nos horaires ») et les segments du texte en vecteurs numériques.

  • Calcul de Similarité : Il calcule la similarité cosinus entre les vecteurs de référence et ceux du texte pour identifier les segments les plus pertinents.

  • Sélection de Contenu : Les segments de texte (chunks ou phrases) dont la similarité dépasse un seuil configurable sont conservés. Les segments adjacents (définis par la fenêtre de contexte) sont également inclus pour préserver le sens.

  • Mise à Jour de la Base de Données : Le contenu filtré et réduit est sauvegardé dans la colonne markdown_filtre de la base de données via le DatabaseProcessor.

  • Suivi des Émissions CO2 : Il enregistre et accumule les émissions de CO2 estimées lors des appels aux APIs d’embeddings.

Usage

Ce processeur s’exécute après la récupération des URLs. Il prend en entrée le markdown_nettoye, le filtre, et produit le markdown_filtre qui sera utilisé par le LLMProcessor suivant.

Modules

class src.smart_watch.processing.markdown_processor.MarkdownProcessor(config_manager: ConfigManager, logger_instance: SmartWatchLogger)[source]

Bases : object

Classe pour traiter et filtrer le contenu Markdown en se basant sur la pertinence sémantique.

Cette classe utilise des embeddings pour identifier et extraire les sections d’un document Markdown qui sont les plus pertinentes par rapport à un ensemble de phrases de référence.

__init__(config_manager: ConfigManager, logger_instance: SmartWatchLogger)[source]

Initialise le processeur de markdown.

Paramètres:
  • config_manager (ConfigManager) – Le gestionnaire de configuration global.

  • logger_instance (SmartWatchLogger) – L’instance de logger à utiliser.

_get_embeddings(texts: List[str]) Tuple[ndarray | None, float][source]

Génère les embeddings pour une liste de textes.

Paramètres:

texts (List[str]) – la liste des textes à encoder.

Renvoie:

un tuple contenant les embeddings sous forme de tableau NumPy

et les émissions de CO2 estimées.

Type renvoyé:

Tuple[Optional[np.ndarray], float]

Lève:

ValueError – si aucun client d’embedding n’est initialisé.

_calculate_reference_embeddings() None[source]

Calcule et met en cache les embeddings pour les phrases de référence définies dans la configuration.

Lève:

ValueError – si aucune phrase de référence n’est configurée.

process_markdown_filtering(db_processor: DatabaseProcessor, execution_id: int) None[source]

Filtre le contenu markdown pour tous les résultats d’une exécution donnée.

Paramètres:
  • db_processor (DatabaseProcessor) – l’instance du processeur de base de données.

  • execution_id (int) – l’ID de l’exécution à traiter.

filter_markdown(markdown_content: str, counter: Tuple[int, int] | None = None) Tuple[str, float][source]

Filtre un contenu Markdown pour n’en conserver que les sections sémantiquement pertinentes.

Paramètres:
  • markdown_content (str) – le contenu Markdown à filtrer.

  • counter (Optional[Tuple[int, int]]) – un compteur (ex: (1, 10)) pour le logging.

Renvoie:

le contenu Markdown filtré et les émissions de CO2 associées.

Type renvoyé:

Tuple[str, float]

_classify_line(line: str) str[source]

Classifie une ligne de texte en catégories structurelles (paragraphe, tabulaire, etc.).

Paramètres:

line (str) – la ligne à classifier.

Renvoie:

le type de la ligne (“empty”, “tabular”, “indented”, “paragraph”).

Type renvoyé:

str

_identify_logical_blocks(lines: List[str]) List[Dict[str, Any]][source]

Segmente une liste de lignes en blocs logiques (paragraphes, tableaux, etc.).

Paramètres:

lines (List[str]) – les lignes de texte à analyser.

Renvoie:

une liste de dictionnaires, chaque dictionnaire représentant un bloc.

Type renvoyé:

List[Dict[str, Any]]

_chunk_blocks(blocks: List[Dict[str, Any]]) List[Dict[str, Any]][source]

Regroupe les blocs logiques en “chunks” de taille définie pour l’analyse sémantique.

Paramètres:

blocks (List[Dict[str, Any]]) – la liste des blocs logiques à regrouper.

Renvoie:

une liste de chunks, chaque chunk contenant un ou plusieurs blocs.

Type renvoyé:

List[Dict[str, Any]]

_filter_chunks(chunks: List[Dict[str, Any]]) Tuple[List[Dict[str, Any]], float][source]

Filtre les chunks en fonction de leur similarité sémantique avec les phrases de référence.

Paramètres:

chunks (List[Dict[str, Any]]) – la liste des chunks à filtrer.

Renvoie:

une liste des chunks pertinents et les émissions de CO2.

Type renvoyé:

Tuple[List[Dict[str, Any]], float]

_merge_ranges(ranges: List[Tuple[int, int]], gap: int = 1) List[Tuple[int, int]][source]

Fusionne des plages de nombres (intervalles) qui se chevauchent ou sont proches.

Paramètres:
  • ranges (List[Tuple[int, int]]) – une liste de tuples représentant les plages (début, fin).

  • gap (int) – l’écart maximal entre deux plages pour qu’elles soient fusionnées.

Renvoie:

une liste de plages fusionnées.

Type renvoyé:

List[Tuple[int, int]]