Ingestion RAG : recommandations pour la création des pages Web

, par Bertrand Degoy

L’ingestion des documents d’un site Web s’adapte plus ou moins bien à des compositions mal adaptées. Dans un contexte RAG, il s’agit des pages du site d’une entreprise : celle-ci doit veiller à ce que leur markup soit bien adapté à l’analyse. Cela rejoint les exigences du SEO et doit être spécifié dans le cahier des charges avant la création du site.

La problématique de la sélection du contenu utile

La première étape de l’ingestion d’un document consiste à le découper en "gros morceaux" (chunks). Il est important de ne pas encombrer le système avec les entêtes, les menus, les colonnes de liens vers la totalité des pages du site etc.. A défaut, on risque de constater que le texte utile n’est pas pris en compte en totalité. Il en résulte que, toutes les pages semblant contenir à peu près la même chose, les recherches n’aboutissent pas.
Il faut donc commencer par sélectionner le contenu utile.

La solution consiste à appliquer un minimum de balisage sémantique : les balises h1, h2, article et p. Du seul point de vue de l’extraction, si on ne devait utiliser qu’une seule balise, ce serait : article.

Un contournement...
La sélection est faite, par défaut, de la façon suivante :

   contenu = str(soup.find_all('article'))

Pour ceux qui ne pourraient reprendre le formatage de leur pages Web, nous avons prévu un moyen de contournement : le script d’extraction dans le dossier de configuration du thème.

Les déclarations de la section head et les balises utiles pour l’indexation et la recherche

 la déclaration title est impérative.
 la déclaration meta description est vivement recommandée [1] .
 la balise summary pourrait être utile en complément de la déclaration meta description pour construire un index de sommaire (summary index).
Il est important de noter que le SEO a les mêmes exigences.

La balise meta keyword, bien qu’obsolète du point de vue du SEO, sera exploitée pour la recherche.

Pour le SEO, il sera utile d’appliquer les balises main, header, footer et aside.

La problématique du découpage

Le découpage en gros morceaux pour en faire des "noeuds" (nodes) est la première étape du processus d’ingestion des documents. S’agissant des documents de type MarkDown, et donc du contenu des pages Web que nous ramenons à ce format, le découpage est principalement effectué sur les balises de titres h1, h2, h3 etc. L’usage des balises h4 et suivantes n’est significatif que du point de vue du SEO.

Le module LlamaIndex MarkdownNodeParser va découper sur toute balise hx, quel qu’en soit le niveau. Il est donc important :
 de ne pas abuser de ces balises,
 de veiller à ne pas séparer des parties de document cohérentes.
 de ne pas aboutir à des morceaux (chunks) trop petits ou trop grands. Une bonne mesure serait autour de 500 à 1000 caractères ou 10 à 20 lignes.

Ne pas abuser des balises hx
S’il s’agit seulement de styler un titre, une bonne pratique consiste à définir des classes de style reproduisant les styles hx, par exemple h3-like pour h3.
Par ailleurs, il est recommandé de placer une balise h1 en tête du contenu utile, suivi des balises de sous-titre en respectant strictement une imbrication hiérarchique.

Ne pas séparer des parties de document cohérentes
L’exemple suivant provoque un découpage erroné :

<div class="mx-auto testimonial-item mb-5 mb-lg-0">
       <img class="rounded-circle img-fluid mb-3" alt="Témoignage dev/ops" src="assets/img/testimonials-1.jpg">
        <h5>Brigitte E. ingénieure Dev/Ops</h5>
         <p class="font-weight-light mb-0">"Pour le travail à domicile, c'est ... ses applications !"</p>
</div>

D’une part l’emploi de la balise h5 (et donc logiquement de multiples h3, h4) conduit à un trop grand nombre de petits morceaux.
D’autre part, l’image va se trouver dans un morceau différent (le précédent) de celui du texte qui s’y rapporte. Une recherche sélectionnant ce morceau du texte omettra l’image, celle-ci apparaissant dans une réponse sans rapport, liée au morceau précédent. C’est pourtant bien tentant de mettre le titre sous l’ image [2] !

Un contournement ?
Pour ceux qui ne pourraient reprendre le formatage de leur pages Web, nous avons prévu la suppression des sous-titres du niveau inférieur à h1, h2. Cela pourra résoudre quelques problèmes.
Mais rien ne vaudra une bonne composition des pages dès l’origine !

Les balises utiles pour le rendu

Parce que nous convertissons tout le contenu au format MarkDown, les balises suivantes sont prises en compte dans le rendu :
 les balises em, strong, code et hr pour la décoration.
 les balises ol, ul et li pour le rendu des listes.
 les balises table, thead, tr, th et td seront rendues en tableau [3]. Imbriquez les à votre péril !
 les balises figure, video, audio, details pourraient être utiles pour effectuer des rendus spécifiques de leur contenu .

Utiliser les ancres nommées

Les ancres nommées (named anchor ou fragment) permettent aux navigateurs d’ouvrir une page web en en point donné, souvent avant un titre de paragraphe.
Par exemple, si nous avons une page web dans laquelle figure :

<a name="audioguide"></a>

l’URL :

https://i-tego.com/index.html#audioguide

conduira vers :

Dans la réponse à une requête, un (bon) chatbot cite ses sources. Lorsqu’il s’agit d’une page web, le lien vers le document pourra comprendre l’ancre afin de permettre au navigateur d’ouvrir la page au bon endroit.

Il est donc recommandé de placer des ancres en tête des principaux paragraphes. Compte-tenu de nos précédentes recommandations, une ancre devrait précéder chaque balise h2.
Le nom de l’ancre devrait rester court et être semblable à un mot clé en rapport avec le contenu du paragraphe qui suit.

Structurer les URLs comme (devrait l’être) le contenu du site

Le contenu du site est le plus souvent organisé en rubriques-> sous-rubriques (->etc.) -> article. C’est d’abord une exigence du SEO.
Ceci étant acquis, pour permettre l’extraction d’une partie bien spécifique du site, on construira les URLs des pages sous la forme d’ "URLs arborescentes" dont le chemin d’accès à la page suit la structure logique des rubriques, par exemple :

https://ia.dnc.global/Documentation/Aspects-techniques/Ingestion-RAG-recommandations-pour-la-creation-des-pages-Web

plutôt que la forme URLs "propres", par exemple :

https://ia.dnc.global/Ingestion-RAG-recommandations-pour-la-creation-des-pages-Web

qui ne permettent pas de limiter le parcours à une partie spécifique.

Ainsi, dans le cas de l’ingestion avec le script ingestcmd.py si le paramètre —forwards est spécifié et que la source est https://ia.dnc.global/Documentation/Aspects-techniques/, alors seule la rubrique ’Aspects Techniques’ sera parcourue.

Dans le cas d’un site multilingue, nous avons un argument supplémentaire : l’analyse sémantique ne tient pas compte du langage. Il est donc superflu (voir nuisible) d’ingérer un même contenu dans ses différentes traductions. Ainsi, un site multilingue devrait être organisé "par secteur de langues", c’est à dire avec des rubriques de premier niveau du type fr/, en/, de/ etc.

Dernières recommandations

 Toujours utiliser le charset utf8. Dans la section head :<meta charset="utf-8">
 Éviter d’utiliser les caractères spéciaux dans les URLs, sinon veiller à bien les encoder : "Encodage-pourcent".
 En particulier, un espace ne doit pas apparaître dans une URL. Google recommande de le représenter avec un tiret haut (plutôt que + ou %20). Un espace dans une URL conduira à des erreurs dans l’extraction et la génération de liens tronqués dans les réponses (d’un chat bot par exemple).

Notes

[1La limitation à 155 caractère est significative d’un point de vue SEO. Du point de vue de l’ingestion RAG, il n’y a pas de limite, si ce n’est que la description sera intégrée aux méta données, au détriment de la longueur du texte. Finalement, se limiter à 155 caractères n’est pas incohérent.

[2Il s’avère que c’est une pratique généralisée, l’ingestion en tient désormais compte en recherchant les images au-dessus des titres.

[3Ces balises ont été considérées comme obsolètes dans la mesure où elles ont été employées abusivement pour positionner le contenu. En revanche, d’un point de vue sémantique, elles sont fondamentales pour créer des tableaux de données qui pourront être interprétées par les modèles de langage.