Tous les articles

Guide d'optimisation pour moteurs de réponses IA

Ross Hill · 1 avril 2026

Près de 60 % des recherches Google se terminent maintenant sans clic. Le trafic de référence provenant de l'IA vers les sites majeurs a augmenté de 357 % en un an en 2025. Quand quelqu'un demande à ChatGPT ou Perplexity « quelle est la meilleure plateforme d'hébergement canadien », la réponse ne provient pas d'une liste de liens bleus classés. Elle provient de la source que le modèle connaît déjà ou peut récupérer en temps réel.

Être le meilleur résultat sur une page de résultats de moteur de recherche pourrait ne plus suffire. Vous pourriez aussi avoir besoin d'être la source qu'un modèle IA peut le plus facilement comprendre et citer. C'est la prémisse derrière l'optimisation pour les moteurs de réponses (AEO) : rendre votre contenu lisible pour les systèmes qui médient de plus en plus la façon dont les gens trouvent l'information.

Voici le problème que l'AEO tente de résoudre. Un navigateur télécharge votre JavaScript, hydrate votre arbre React, affiche vos composants et offre à l'utilisateur une page entièrement interactive. Un moteur de réponses IA télécharge votre HTML et tente d'en extraire le sens. Ce qu'il obtient ressemble à ceci : un <div> avec un nom de classe qui est un hachage, contenant un autre <div>, contenant une <section> avec des classes utilitaires Tailwind, enveloppant un <h2> qui contient enfin le texte recherché. Si le modèle effectue une recherche en temps réel (comme Perplexity ou ChatGPT avec navigation), il a un budget de temps, et plus vous rendez le contenu difficile à trouver, moins vous avez de chances d'être cité.

J'ai donc reconstruit mon pipeline de contenu pour corriger cela : j'ai tout déplacé en markdown, ajouté un intergiciel pour le servir directement aux agents IA, et superposé les métadonnées dont ils ont besoin pour vous citer correctement. Cet article détaille chaque étape, au cas où vous voudriez l'essayer aussi.

Avertissement : les normes présentées ici sont des brouillons ou des propositions (llms.txt, Content-Signal), personne ne sait quelles techniques compteront à long terme, et je ne peux pas encore mesurer l'impact direct sur les citations IA. Je les ai essayées quand même parce que la tendance sous-jacente semble réelle, que c'était un défi d'ingénierie amusant, et que les résultats sont utiles quoi qu'il arrive.

Étape 1 : mettez tout votre contenu en markdown

Déplacez chaque page de votre site marketing des composants JSX vers des fichiers markdown. Cela inclut les pages d'atterrissage riches avec des sections hero, des grilles de fonctionnalités, des tableaux comparatifs et des sections FAQ. Le répertoire de contenu devient la source unique de vérité pour tout le contenu des pages.

Le markdown est la bonne base parce que c'est le format que les modèles IA comprennent le mieux. Ils sont entraînés sur d'énormes quantités de markdown (documentation, READMEs, articles de blogue, wikis), donc la structure leur est déjà familière. Comparez cela au HTML où la même information est enfouie dans des <div> imbriqués, des hachages de classes CSS et des éléments enveloppants qui n'existent que pour le style.

Markdoc est le système d'édition de contenu de Stripe, essentiellement du markdown avec une syntaxe de balises pour les composants personnalisés. MDX résout un problème similaire en permettant d'intégrer du JSX directement dans le markdown, et les deux fonctionnent bien pour cette approche puisque les grands modèles de langage gèrent bien les deux formats. Si vous êtes sur Next.js App Router, utilisez la bibliothèque principale @markdoc/markdoc plutôt que le plugin @markdoc/next.js, qui cible Pages Router.

Une page d'atterrissage qui était auparavant un composant React plein de chaînes codées en dur devient quelque chose comme ceci :

---
title: Hébergement canadien
description: Déployez sur une infrastructure canadienne avec git push.
---

{% hero-section %}
Déployez sur une infrastructure canadienne
{% /hero-section %}

{% feature-grid-section %}
{% feature-card title="Déploiements git push" %}
Poussez vers main. Votre application est en ligne en minutes.
{% /feature-card %}
{% feature-card title="Bases de données gérées" %}
PostgreSQL, MySQL, Redis. Provisionnement en un clic.
{% /feature-card %}
{% /feature-grid-section %}

Les balises personnalisées comme hero-section et feature-card correspondent à des composants React au moment du rendu, donc le navigateur obtient toujours la même page interactive. Mais le fichier source est du markdown propre, directement lisible par tout système qui comprend le texte. C'est l'idée clé : vos fichiers source Markdoc sont maintenant du contexte que vous pouvez servir directement aux systèmes IA sans aucune transformation.

Étape 2 : ajoutez llms.txt

La spécification llms.txt est une convention simple : placez un fichier texte à /llms.txt qui donne aux modèles IA un index organisé de votre site, essentiellement sitemap.xml pour les modèles de langage.

Un plan du site est une liste plate d'URL pour les robots qui visitent chaque page individuellement. Un fichier llms.txt est une carte organisée et annotée, la table des matières que vous écririez si vous transformiez l'ensemble de votre site en un document. Il indique au modèle qui vous êtes, ce que couvrent vos pages clés et où aller pour plus de profondeur.

Les agents IA avec utilisation d'outils sont de plus en plus capables de recherche en plusieurs étapes : récupérer un index, décider quelles pages sont pertinentes, récupérer ces pages, synthétiser une réponse. Un llms.txt bien structuré donne à ces agents exactement le point d'entrée dont ils ont besoin pour naviguer efficacement dans votre site.

Générez le vôtre dynamiquement à partir du répertoire de contenu :

# MapleDeploy

> Hébergement Coolify géré, canadien d'abord.

## Pages clés
- [Accueil](https://mapledeploy.ca): Page d'accueil de MapleDeploy...
- [Hébergement canadien](https://mapledeploy.ca/canadian-hosting): Déployez sur une infrastructure canadienne...

## Comparaisons
- [vs Railway](https://mapledeploy.ca/compare/railway): Comparez MapleDeploy avec Railway...

## Blogue
- [Pourquoi nous avons choisi une infrastructure canadienne d'abord](https://mapledeploy.ca/blog/why-we-chose-canadian-first-infrastructure): ...

## Contenu complet
Pour le contenu complet des pages, consultez [/llms-full.txt](https://mapledeploy.ca/llms-full.txt)

Servez aussi /llms-full.txt, qui concatène le corps markdown complet de chaque page publiée dans un seul fichier. Un agent IA qui souhaite un contexte exhaustif sur votre produit peut récupérer le site entier en une seule requête.

Filtrez le contenu non publié (articles à date future) des deux itinéraires et mettez-les en cache pour 24 heures.

Rendre llms.txt découvrable

Le chemin bien connu /llms.txt et le champ llms_txt dans le frontmatter enrichi (étape 4) rendent déjà l'index trouvable. Mais vous pouvez renforcer la découvrabilité avec des en-têtes de réponse HTTP sur chaque page :

Link: <https://votresite.com/llms.txt>; rel="llms-txt"
X-Llms-Txt: https://votresite.com/llms.txt

L'en-tête Link suit la relation de lien llms-txt proposée. X-Llms-Txt est une alternative plus simple pour les agents qui n'analysent pas la syntaxe Link. Définissez les deux globalement dans la configuration des en-têtes de votre framework et sur les réponses d'API markdown. Dans le <head> HTML, ajoutez la balise <link> équivalente :

<link rel="llms-txt" href="https://votresite.com/llms.txt" />

Étape 3 : servez le markdown aux agents IA

Avec le contenu en markdown, ajoutez un intergiciel qui intercepte les requêtes des agents IA et sert le markdown brut au lieu du HTML rendu. Cela implique de détecter les bonnes requêtes, de donner aux humains et aux agents un moyen explicite de demander le markdown via l'extension .md, et de s'assurer que les URL markdown ne créent pas de problèmes de contenu dupliqué avec les moteurs de recherche.

Détection des agents IA

Vérifiez l'en-tête User-Agent par rapport à une liste de robots IA connus. Le dépôt ai-robots-txt maintient une liste exhaustive et régulièrement mise à jour. En pratique, vous faites correspondre environ 60 modèles couvrant OpenAI (ChatGPT-User, OAI-SearchBot), Anthropic (Claude-SearchBot, Claude-User), Perplexity (PerplexityBot), Google (Gemini-Deep-Research) et d'autres.

Répondez aussi à Accept: text/markdown, pour que tout client puisse demander explicitement la version markdown. Quand une correspondance est trouvée, réécrivez la requête vers une route API qui lit le fichier source Markdoc et le retourne avec text/markdown comme type de contenu :

export function middleware(request: NextRequest) {
  const userAgent = request.headers.get("user-agent") || "";
  if (!isAICrawler(userAgent) && !wantsMarkdown(request)) {
    return NextResponse.next();
  }

  const slug = pathToSlug(request.nextUrl.pathname);
  const url = request.nextUrl.clone();
  url.pathname = "/api/markdoc-source";
  url.searchParams.set("slug", slug);
  return NextResponse.rewrite(url);
}

Les exemples ici utilisent l'intergiciel Next.js, mais le modèle fonctionne dans tout framework qui permet d'intercepter les requêtes avant qu'elles n'atteignent vos gestionnaires de routes. Astro, Nuxt, SvelteKit et Remix ont tous des couches d'intergiciel ou de crochet serveur équivalentes. La logique est la même : vérifier le user-agent ou l'en-tête Accept, et réécrire vers une route qui sert le markdown.

Couvrez tous les chemins de contenu dans le comparateur et n'excluez que les routes API, les internes du framework et les fichiers statiques. Les nouvelles pages de contenu sont couvertes automatiquement sans modifier l'intergiciel.

Prise en charge de l'extension .md

Il y a un troisième déclencheur qui vaut la peine d'être ajouté : l'extension de fichier .md. Si quelqu'un ajoute .md à n'importe quelle URL de votre site, servez le markdown avec les métadonnées complètes directement. Cela donne aux personnes et aux agents IA un moyen explicite et sans ambiguïté de demander le markdown sans compter sur la détection du user-agent ou la négociation de contenu. Ajoutez une vérification au début de l'intergiciel, avant la logique des agents IA. Retirez le suffixe .md, résolvez l'identifiant et réécrivez vers la même route d'API markdown.

Essayez-le sur n'importe quelle page de ce site : ajoutez .md à l'URL (par exemple, /blog/answer-engine-optimization-guide.md) et vous verrez le markdown avec les métadonnées commerciales complètes dans le frontmatter. Chaque page a un lien « Cette page en markdown » dans le pied de page qui mène à sa version .md.

Gestion du contenu dupliqué

Les URL .md créent du contenu dupliqué du point de vue de Google. La solution est un en-tête HTTP Link avec rel="canonical" sur la réponse markdown, pointant vers la version HTML. C'est la manière standard de déclarer une URL canonique quand la réponse n'est pas du HTML (où vous utiliseriez une balise <link> à la place). Google le prend explicitement en charge.

return new Response(markdown, {
  headers: {
    "Content-Type": "text/markdown; charset=utf-8",
    Link: `<https://exemple.com${canonicalPath}>; rel="canonical"`,
  },
});

Cela indique aux moteurs de recherche que /canadian-hosting est la version faisant autorité de /canadian-hosting.md. Assurez-vous que vos pages HTML ont aussi la balise standard <link rel="canonical"> pointant vers elles-mêmes, pour que les deux versions s'accordent sur l'URL canonique.

Vérification du fonctionnement

Une fois l'intergiciel déployé, vous voudrez confirmer que les agents IA obtiennent effectivement le markdown. Le test le plus simple est de faire un curl de votre propre site avec un user-agent usurpé, l'en-tête Accept: text/markdown ou l'extension .md :

curl -H "User-Agent: ChatGPT-User" https://votresite.com/une-page
curl -H "Accept: text/markdown" https://votresite.com/une-page
curl https://votresite.com/une-page.md

Les trois devraient retourner la même réponse markdown. Vérifiez que l'en-tête Content-Type est text/markdown et que l'en-tête canonique Link est présent.

Au-delà des vérifications ponctuelles, vous voudrez une visibilité continue. Le paysage d'outils AEO est encore jeune et évolue rapidement, donc l'approche la plus fiable est de surveiller vos propres journaux serveur : filtrez les chaînes user-agent IA et suivez la fréquence à laquelle ils consultent vos pages, quel contenu retient le plus d'attention et comment ce volume évolue au fil du temps. Si vous êtes derrière un CDN comme Cloudflare, leurs tableaux de bord analytiques afficheront le trafic des robots comme une catégorie distincte, ce qui facilite l'identification des pages les plus visitées et la détection de nouveaux robots non couverts par votre liste.

Étape 4 : enrichissez le markdown avec des métadonnées

Servir du markdown brut est un bon début, mais les modèles IA perdent le contexte quand ils ne voient qu'une seule page isolément. Sur une page HTML normale, les modèles peuvent extraire l'identité et le contexte des balises meta, des propriétés OpenGraph et des données structurées JSON-LD. Dans une réponse markdown, tout cela est absent à moins que vous ne le remettiez explicitement.

Résolvez cela en injectant des métadonnées commerciales dans le frontmatter YAML avant de servir la réponse. Quand ChatGPT récupère /canadian-hosting, il devrait recevoir le frontmatter original plus le même type de contexte que les balises meta HTML et les données structurées fourniraient normalement :

---
# ... titre original, description, etc.
type: article
author: Ross Hill
locale: fr_CA
site_name: MapleDeploy
slogan: Hébergement puissant en sol canadien
founding_date: 2026-01-13
email: hello@mapledeploy.ca
geo_region: CA-ON
geo_placename: Toronto
address_country: CA
area_served: Canada
offers: Starter 45 $/mois, Pro 95 $/mois, Ultra 195 $/mois CAD
canonical_url: https://mapledeploy.ca/canadian-hosting
llms_txt: https://mapledeploy.ca/llms.txt
---

Ces métadonnées servent un objectif spécifique : elles ancrent la réponse du modèle dans des faits vérifiables sur votre entreprise. Sans elles, un modèle répondant à « combien coûte MapleDeploy ? » doit inférer les prix de ce qu'il trouve dans le corps de la page, s'il les trouve. Avec les métadonnées globales injectées dans le frontmatter, cette information est structurée, sans ambiguïté et immédiatement disponible. Le champ llms_txt est particulièrement utile parce qu'il donne au modèle un pointeur vers votre index complet du site, lui permettant de récupérer du contexte supplémentaire si la page actuelle ne répond pas complètement à la question de l'utilisateur.

Gardez ces champs uniquement dans la version servie à l'IA, pas dans les fichiers .md bruts du dépôt. Si vous avez construit quoi que ce soit avec les mises en page ou l'héritage de modèles Next.js, le modèle mental est le même : les métadonnées globales définissent les valeurs par défaut à l'échelle du site, le frontmatter spécifique à la page les remplace. La nouvelle partie consiste à extraire de tous les endroits où cette information vit normalement dans le HTML (balises meta, propriétés OpenGraph, données structurées JSON-LD) et à les fusionner dans un seul bloc frontmatter YAML.

Du côté HTML, ajoutez des données structurées JSON-LD à vos pages. Cela aide autant les moteurs de recherche traditionnels que les systèmes IA à comprendre votre contenu, et les mêmes types servent doublement pour l'AEO. Choisissez les types qui correspondent à ce qui se trouve sur chaque page : Organization sur votre page d'accueil, FAQPage sur les pages avec des sections FAQ, Article et BreadcrumbList sur les articles de blogue, des types spécifiques au produit comme SoftwareApplication ou WebApplication sur les pages de tarification. La liste complète des types schema.org est volumineuse, mais la plupart des sites n'en ont besoin que d'une poignée.

Étape 5 : définissez les permissions

Les étapes 1 à 4 rendent votre contenu facile à trouver et à comprendre pour les systèmes IA. Cette étape leur indique ce qu'ils sont autorisés à en faire.

Cela vaut la peine d'être bien fait parce que le paysage des permissions pour l'IA est fragmenté et en évolution. Différents systèmes respectent différents mécanismes, et les normes juridiques et éthiques autour des données d'entraînement IA sont encore en cours d'établissement. Être explicite sur vos permissions, même si tous les systèmes ne les lisent pas encore, établit une intention claire qui vous bénéficie quelle que soit la maturation de l'écosystème.

robots.txt est le mécanisme le plus ancien. Si vous voulez que chaque robot ait accès, un simple User-agent: * / Allow: / suffit. Il n'est pas nécessaire de lister les robots IA individuellement. Un caractère générique accorde déjà l'accès à tout. La seule raison de lister des agents utilisateurs spécifiques est de les bloquer avec Disallow. Si vous voulez bloquer certains robots (par exemple, autoriser la recherche mais interdire les robots d'entraînement), robots.txt est l'endroit pour le faire, bien que cela exige de connaître les chaînes user-agent spécifiques pour chaque catégorie de robot.

Si vous voulez un contrôle plus granulaire (par exemple, autoriser la citation mais bloquer l'entraînement), le brouillon d'en-tête Content-Signal de l'IETF permet d'exprimer cela par réponse :

Content-Signal: intent="allow", use="search,assist", block="train"

Cela indique aux systèmes IA qu'ils peuvent utiliser votre contenu pour les résultats de recherche et les réponses d'assistant, mais pas pour l'entraînement de modèles. Vous pouvez définir cet en-tête globalement dans votre intergiciel ou la configuration CDN. La spécification est encore un brouillon et l'adoption est précoce, donc traitez-le comme un signal prospectif plutôt qu'un mécanisme d'application. Si vous êtes permissif de bout en bout, un robots.txt générique suffit.

Mises en garde

L'identification par user-agent peut se retourner contre vous. L'outil de récupération d'un agent IA s'attend probablement à du HTML. À la place, il obtient du Markdoc brut avec une syntaxe de balises personnalisée. La plupart des grands modèles de langage gèrent cela correctement, mais un pipeline d'ingestion de données qui s'attend à du HTML pourrait échouer. De même, un client demandant Accept: text/markdown s'attend probablement à du CommonMark, pas aux balises personnalisées de Markdoc. Si cela devient un problème, retirez les balises personnalisées et servez uniquement le contenu en prose.

La liste des robots est une cible mouvante. De nouveaux agents utilisateurs IA apparaissent régulièrement. Consultez périodiquement le dépôt ai-robots-txt et mettez à jour votre liste.

Prévoyez du temps pour la plomberie des métadonnées. La fusion des métadonnées globales et au niveau de la page est la partie la plus fastidieuse. Aplatir plusieurs sources de métadonnées en un seul bloc frontmatter cohérent, avec des règles de précédence correctes, demande plus d'effort que prévu.

Conclusion

C'est le pipeline complet : source markdown, routage intelligent, métadonnées en couches et permissions claires. Chaque étape s'appuie sur la précédente, et le résultat final est un site aussi facile à lire pour les systèmes IA qu'à afficher pour les navigateurs.

Tout cela est-il nécessaire ? Honnêtement, je ne le sais pas encore. Les normes sont des brouillons et des propositions (llms.txt, Content-Signal), l'adoption est précoce, et il est difficile de mesurer l'impact direct sur les citations IA. La frontière entre « votre site Web » et « un document qu'une IA peut lire » semble effectivement s'estomper, mais savoir si cela signifie que vous devez servir du markdown aux robots dès aujourd'hui reste véritablement incertain. J'ai trouvé que c'était un projet d'ingénierie amusant qui m'a forcé à repenser mon pipeline de contenu de façon utile. Au minimum, avoir tout votre contenu en markdown avec des métadonnées propres est une bonne base, peu importe ce qui se passe avec la recherche IA. Et si la découverte médiée par l'IA devient la norme, vous serez déjà prêts.


MapleDeploy est une plateforme d'hébergement Coolify gérée sur une infrastructure canadienne, avec des forfaits à partir de 45 $ CAD/mois et un essai gratuit de 14 jours. Si vous construisez quelque chose qui nécessite la résidence des données au Canada, jetez un coup d'œil.

Conçu pour la découvrabilité

Hébergement canadien avec données structurées, réponses rapides et URL propres. Essayez gratuitement pendant 14 jours.