Le site web envisagé comme un corpus vectoriel interconnecté
Un site web n'est pas une simple collection de fichiers HTML posés sur un serveur : c'est un corpus vivant. Si vous structurez intelligemment cette base de connaissances, elle devient immédiatement exploitable par un grand modèle de langage connecté à votre infrastructure.
Il ne s'agit pas ici de concevoir une démonstration technique de plus pour amuser la galerie. Ce tuto a vocation à vous aider à construire un outil de production capable de répondre à des questions que les outils SEO classiques ne savent pas traiter :
- Quelles pages souffrent d'un déficit de liens internes entrants ?
- Quels articles partagent une proximité sémantique forte et doivent être reliés pour renforcer un cocon ?
- Quelles ancres exactes pointent vers une URL spécifique ?
- Quelles pages s'éloignent dangereusement du centroïde sémantique du site ?
- Quels contenus ont été modifiés depuis le dernier passage, exigeant une mise à jour des vecteurs sans pour autant tout réencoder ?
Le code source complet pour déployer cette architecture est accessible ici : Dépôt GitHub - Semantic Site RAG.
Pourquoi PostgreSQL et pgvector surclassent les bases vectorielles dédiées
Choisir une base de données vectorielle pure pour analyser le référencement d'un site est une erreur d'architecture. Le SEO est une affaire de relations : une URL pointe vers une autre via une ancre précise, au sein d'une structure parent-enfant.
Supabase résout ce problème en combinant la puissance relationnelle de PostgreSQL, une API d'accès rapide et l'extension pgvector. Il est ainsi possible de stocker des types de données radicalement différents au même endroit. D'un côté, des tables SQL classiques pour les URLs, les balises meta, les codes de réponse HTTP et les liens. De l'autre, des représentations vectorielles de nos contenus (les embeddings) pour mesurer la distance sémantique entre deux pages ou deux paragraphes. Un simple script Python assure la synchronisation, tandis que le connecteur de votre modèle de langage ou de votre plateforme conversationnelle (il existe des connecteurs Supabase natifs dans ChatGPT, Claude, ou encore Le Chat de Mistral AI) interroge l'ensemble sans friction.

Modéliser à double échelle : la page et le chunk
L'analyse sémantique d'un site exige deux niveaux de lecture bien distincts sous peine de générer des faux positifs. C'est pourquoi notre structure de données sépare l'entité globale de ses composants.
L'embedding de la page complète offre une vue macroscopique. Il sert à définir la thématique générale d'une URL, à calculer le centre de gravité sémantique du site et à détecter les hors-sujets. Mais il s'avère trop imprécis pour identifier un point d'insertion précis de lien interne.
C'est là que le découpage en blocs (les chunks) intervient. En fragmentant un texte de deux mille mots en segments de taille contrôlée, nous pouvons localiser le paragraphe exact qui justifie la création d'un lien hypertexte.
Découvrez mon article sur pourquoi structurer son contenu pour le chunking sémantique.
La structure de la base de données : SQL de déploiement
La configuration de la base de données s'effectue en injectant trois scripts SQL directement dans l'éditeur de requêtes de Supabase.
Étape 1 : Activer le moteur vectoriel
Nous devons d'abord indiquer à PostgreSQL qu'il doit manipuler des vecteurs de haute dimension. Exécutez le script d'initialisation de l'extension :
Étape 2 : Définir le schéma relationnel
Le cœur du système repose sur quatre tables interconnectées. La table des pages enregistre les métadonnées et l'empreinte de sécurité (le hash), la table des blocs stocke les fragments de texte, la table des liens modélise le graphe du site, et la table de suivi enregistre l'historique des opérations de crawl.
Exécutez la structure suivante :
Étape 3 : Déployer les fonctions de recherche vectorielle
Pour calculer la similarité cosinus directement dans la base de données sans rapatrier les données en mémoire locale, nous créons deux fonctions SQL. Elles renvoient les éléments les plus proches d'un vecteur cible.
Exécutez ce troisième bloc :
Étape 4 : Sécuriser vos tables avec Row Level Security
Par défaut, toute table créée dans le schéma public de Supabase est exposée via l'API PostgREST. Si une clé anon est ensuite intégrée dans un frontend ou une application cliente, les tables rag_pages, rag_chunks et rag_links deviennent lisibles, voire modifiables, par n'importe quel visiteur.
Notre script d'ingestion utilise la clé service_role côté serveur, qui ignore les politiques RLS. Vous pouvez donc activer Row Level Security sur ces tables sans créer la moindre politique d'accès : le script continuera à fonctionner normalement, tandis que toute tentative de lecture ou d'écriture depuis l'API publique sera bloquée par défaut.
Exécutez ce script de durcissement immédiatement après le déploiement du schéma :
Vérification : dans le tableau de bord Supabase, ouvrez l'onglet Authentication → Policies. Chaque table doit afficher l'icône RLS active et aucune politique attachée. Si vous prévoyez plus tard d'exposer un tableau de bord public alimenté par ces données, vous devrez ajouter explicitement des politiques create policy pour autoriser des lectures contrôlées — jamais d'écritures depuis la clé anon.
La documentation officielle Supabase sur Row Level Security détaille la rédaction de politiques avancées si vous avez ce besoin.
Configuration de l'environnement de crawl
La mise en place du script d'ingestion demande une préparation rigoureuse de vos variables d'accès.
Clonez d'abord le projet de base et préparez votre environnement d'exécution :
Dupliquez le fichier .env.example sous le nom .env. Vous devez renseigner les clés d'accès à Supabase et à votre fournisseur de modèles de langage :
Note stratégique : la clé service_role possède des privilèges d'écriture globaux sur votre base de données. Ne la committez jamais sur un dépôt public.
L'ingestion des données et l'évitement des coûts inutiles
Le principal défaut des scripts de RAG amateur est de recalculer les vecteurs à chaque exécution. Pour un site de mille pages, cette pratique se traduit par une consommation absurde de requêtes API.
Notre script de synchronisation contourne ce problème en utilisant une empreinte MD5 du texte de la page. Lors du crawl, le script télécharge le contenu HTML brut, extrait la zone de texte principale (en ignorant les menus, le pied de page et les barres latérales), puis calcule son empreinte.
Si le hash calculé correspond à celui stocké en base de données, l'insertion est ignorée. Dans le cas contraire, les anciens blocs associés à cette URL sont nettoyés et une nouvelle passe d'embedding est lancée.
Pour démarrer la première indexation complète de votre sitemap XML, lancez la commande suivante :
Si vous venez de publier un nouvel article et souhaitez l'intégrer immédiatement sans re-parcourir le sitemap, ciblez directement son URL :
Exploiter le potentiel sémantique
Une fois les données structurées et les relations stockées, vous disposez d'un levier d'optimisation puissant.
Calculer la force du maillage avec le PageRank interne
Le score de PageRank interne ne représente pas l'autorité théorique attribuée par Google, mais la répartition réelle de la popularité au sein de votre propre architecture de liens.
Exécutez le script d'analyse structurelle :
Cette commande applique l'algorithme de PageRank sur la table rag_links. Les pages qui reçoivent beaucoup de liens qualitatifs obtiennent un score élevé, tandis que les pages isolées sombrent vers zéro.
Traquer les anomalies structurelles
En croisant le PageRank avec la position sémantique de vos pages, vous identifiez instantanément les défauts de votre structure. Lancez l'audit global :
Le rapport généré dans reports/site_audit.json met en lumière un concept mathématique crucial : le centroïde sémantique. Il s'agit de la moyenne vectorielle de toutes les pages de votre site, qui représente l'identité thématique globale de votre domaine.
Une page située à une distance excessive du centroïde sémantique est une anomalie. Soit le script d'extraction a récupéré du code parasite, soit la page traite d'un sujet hors-thème qui risque de diluer la cohérence globale de votre site, soit elle est totalement déconnectée du reste du catalogue.
Proposer des maillages pertinents avant publication
La meilleure intégration d'un lien se fait lors de l'écriture du texte, pas après coup sous la contrainte d'un outil d'audit.
Lorsque vous rédigez un nouvel article sous forme de brouillon au format Markdown, vous pouvez interroger votre base Supabase pour connaître les meilleures opportunités de maillage à intégrer dans ce texte avant même qu'il ne soit en ligne.
Lancez le script d'analyse prédictive :
Le script calcule l'embedding temporaire de votre brouillon et interroge la table rag_chunks dans Supabase. Il génère un rapport structuré dans reports/link_opportunities.json.
La force de cette approche est que votre texte de travail n'est pas inséré en base : il sert simplement de sonde sémantique pour trouver les paragraphes existants qui partagent une affinité sémantique étroite avec vos nouveaux écrits.
Piloter son SEO par le dialogue sémantique
Une fois votre base de données Supabase connectée à votre interface d'assistance (comme ChatGPT ou un agent Codex), vous pouvez formuler des requêtes d'analyse stratégique complexes.
Voici trois scénarios de requêtes directes à soumettre à votre assistant connecté à la base :
Scénario 1 : Détecter les déficits de maillage interne
« Analyse la table
rag_pageset la tablerag_links. Identifie les 15 pages ayant le score de PageRank le plus faible. Pour chacune, parcours la tablerag_chunkset suggère trois paragraphes issus d'autres pages sémantiquement proches qui pourraient naturellement accueillir un lien pointant vers ces pages faibles. »
Scénario 2 : Traquer la sur-optimisation des ancres
« Regroupe les entrées de la table
rag_linkspartarget_url. Pour chaque URL cible, calcule la diversité de ses ancres. Signale-moi les pages qui reçoivent plus de 70 % de liens avec une ancre strictement identique. Propose des variations d'ancres plus naturelles en te basant sur le contexte sémantique des chunks d'origine correspondants. »
Scénario 3 : Analyse d'isolation thématique
« Identifie les pages dont la distance sémantique par rapport au centroïde du site est supérieure à la moyenne. Indique-moi si ces pages partagent des liens avec le reste du site ou si elles se comportent comme des silos isolés. »
Recommandation stratégique
La mise en œuvre de ce système marque la fin des analyses de maillage basées sur de simples correspondances de mots-clés. Attention cependant, la proximité sémantique calculée par un modèle vectoriel n'est pas une preuve absolue d'opportunité SEO : elle indique une cohérence de sujet.
Pour maximiser l'efficacité de vos décisions, je vous conseille de croiser les données de cette base sémantique avec vos données réelles de trafic et d'impressions issues de la Search Console. Un lien interne performant doit non seulement être sémantiquement logique, mais il doit également relier une page forte à fort trafic vers une page stratégique en phase de conversion. Utilisez ce RAG comme une boussole thématique, mais gardez toujours l'œil sur l'intention de recherche réelle de vos utilisateurs.
Commentaires
Aucun commentaire pour le moment. Soyez le premier à commenter !
Ajouter un commentaire