[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$feTjwa6gKM8flezlhT1Wwkd7VbffCI5iOskzC8BSORUA":3,"$fASOeQ0EUDjxkip3AJ5f8U0OHxJch17AF0TniTXpYm7I":26},{"_id":4,"slug":5,"__v":6,"author":7,"body":8,"canonical":9,"category":10,"createdAt":11,"date":12,"description":13,"htmlContent":14,"image":15,"imageAlt":15,"readingTime":16,"tags":17,"title":24,"updatedAt":25},"69d1bd55c84600c5cb821339","llms-txt-was-step-one-here-s-the-architecture-that-comes-next-via-sejournal-duaneforrester",0,"Equipe Seogard","Un fichier texte à la racine de votre domaine ne va pas convaincre un LLM de citer votre marque correctement. `llms.txt` a posé le premier jalon — un signal d'intention, un geste vers les modèles de langage. Mais entre un fichier statique et une architecture capable de nourrir GPT-4, Gemini ou Claude avec des faits vérifiables et attribuables, il y a un gouffre d'ingénierie.\n\n## llms.txt : ce qu'il fait, ce qu'il ne fait pas\n\nLa proposition `llms.txt`, inspirée de `robots.txt`, part d'une idée simple : offrir aux crawlers IA un fichier lisible par machine, à la racine du site, qui décrit le contenu disponible, les autorisations d'usage et les métadonnées clés de la marque. L'initiative, documentée sur [llmstxt.org](https://llmstxt.org/), est un point de départ raisonnable.\n\nVoici à quoi ressemble un fichier `llms.txt` typique :\n\n```text\n# Nom: MarchandElectro\n# URL: https://www.marchand-electro.fr\n# Description: Vente en ligne d'électroménager et high-tech, 14 000 références.\n\n## Contenu autorisé\n- /guides/ : guides d'achat, comparatifs produits\n- /blog/ : actualités tech et conseils d'utilisation\n- /produits/ : fiches produits structurées\n\n## Contact\n- contact@marchand-electro.fr\n\n## Politique\n- Utilisation en citation avec attribution requise\n- Pas de reproduction intégrale des fiches produits\n```\n\nLe problème : ce fichier est **déclaratif et statique**. Il ne contient aucune sémantique exploitable par un modèle. Un LLM qui ingère ce fichier sait que votre site existe et vend de l'électroménager. Il ne sait pas que votre guide \"Lave-linge : top 10 en 2026\" compare 10 modèles spécifiques avec des mesures de consommation réelles, ni que vos prix sont mis à jour quotidiennement, ni que votre rédacteur est un ingénieur certifié.\n\nLes limites concrètes :\n\n- **Pas de granularité sémantique.** Le fichier pointe vers des répertoires, pas vers des entités ou des faits.\n- **Pas de fraîcheur.** Aucun mécanisme de versioning ou de date de dernière mise à jour par ressource.\n- **Pas de provenance.** Rien ne permet au modèle de distinguer un fait vérifié d'une opinion, ni de tracer la source d'une affirmation.\n- **Pas de standard adopté.** Contrairement à `robots.txt` (supporté universellement depuis 1994 et [formalisé en RFC 9309](https://www.rfc-editor.org/rfc/rfc9309)), `llms.txt` n'a aucun support officiel de Google, OpenAI ou Anthropic à ce jour.\n\nL'article de Search Engine Journal publié par Duane Forrester pose la bonne question : si `llms.txt` est l'étape un, quelle architecture technique faut-il construire pour que les LLMs citent votre marque avec précision ? La réponse tient en trois piliers : des APIs structurées, un entity graph explicite, et un système de provenance.\n\n## Pilier 1 : exposer un entity graph, pas du contenu plat\n\nLes LLMs ne \"lisent\" pas vos pages comme un humain. Ils ingèrent du texte et tentent d'en extraire des relations entre entités. Si votre contenu est du HTML sémantiquement pauvre, le modèle doit deviner les relations. Et il devine mal.\n\n### Du HTML au Knowledge Graph local\n\nL'objectif est de construire un **entity graph local** — un graphe de connaissances propre à votre domaine, exposé de manière exploitable. JSON-LD est le véhicule naturel, mais il faut aller bien au-delà du balisage `Product` ou `Article` de base.\n\nPrenons le cas de MarchandElectro, un e-commerce de 14 000 fiches produits. Chaque fiche produit doit exposer non seulement le produit, mais ses relations :\n\n```html\n\u003Cscript type=\"application/ld+json\">\n{\n  \"@context\": \"https://schema.org\",\n  \"@type\": \"Product\",\n  \"@id\": \"https://www.marchand-electro.fr/produits/lave-linge-samsung-ww90t654dlh#product\",\n  \"name\": \"Samsung WW90T654DLH\",\n  \"brand\": {\n    \"@type\": \"Brand\",\n    \"name\": \"Samsung\",\n    \"@id\": \"https://www.marchand-electro.fr/marques/samsung#brand\"\n  },\n  \"category\": \"Lave-linge\",\n  \"offers\": {\n    \"@type\": \"Offer\",\n    \"price\": \"649.00\",\n    \"priceCurrency\": \"EUR\",\n    \"availability\": \"https://schema.org/InStock\",\n    \"priceValidUntil\": \"2026-04-30\"\n  },\n  \"additionalProperty\": [\n    {\n      \"@type\": \"PropertyValue\",\n      \"name\": \"Consommation énergétique\",\n      \"value\": \"52 kWh/100 cycles\",\n      \"unitCode\": \"KWH\"\n    },\n    {\n      \"@type\": \"PropertyValue\",\n      \"name\": \"Capacité\",\n      \"value\": \"9\",\n      \"unitCode\": \"KGM\"\n    }\n  ],\n  \"review\": {\n    \"@type\": \"Review\",\n    \"author\": {\n      \"@type\": \"Person\",\n      \"name\": \"Marc Dupuis\",\n      \"jobTitle\": \"Ingénieur électroménager\",\n      \"@id\": \"https://www.marchand-electro.fr/equipe/marc-dupuis#person\"\n    },\n    \"reviewBody\": \"Testé sur 30 cycles. Niveau sonore mesuré à 47 dB en essorage.\",\n    \"datePublished\": \"2026-03-15\"\n  },\n  \"isRelatedTo\": [\n    {\n      \"@type\": \"Product\",\n      \"@id\": \"https://www.marchand-electro.fr/produits/seche-linge-samsung-dv90t6240lh#product\"\n    }\n  ]\n}\n\u003C/script>\n```\n\nLes points critiques dans ce balisage :\n\n- **`@id` sur chaque entité** : c'est ce qui transforme du JSON-LD isolé en graphe. Chaque produit, chaque personne, chaque marque a un identifiant unique et dereferenceable. Un LLM (ou son pipeline d'indexation) peut résoudre ces `@id` pour construire des relations.\n- **`additionalProperty` avec unités** : les faits numériques avec unités sont exactement ce que les LLMs peinent à extraire du texte libre. Les exposer en structuré élimine l'ambiguïté.\n- **`isRelatedTo`** : le graphe de relations entre produits aide le modèle à comprendre votre catalogue comme un système, pas comme une liste.\n- **`author` avec `jobTitle`** : la provenance de l'avis n'est pas anonyme. Le modèle peut évaluer la crédibilité.\n\n### Valider le graphe à l'échelle\n\nSur 14 000 pages produit, un seul `@id` en doublon ou un type Schema.org invalide peut corrompre l'interprétation de pans entiers du graphe. Utilisez le [Schema Markup Validator](https://validator.schema.org/) pour des vérifications ponctuelles, mais pour un audit à l'échelle, Screaming Frog avec l'extraction personnalisée JSON-LD est indispensable :\n\n```\nScreaming Frog > Configuration > Custom > Extraction\n  - Extraction: JSONPath\n  - Expression: $['@id']\n  - Source: LD+JSON\n```\n\nExportez, dédupliquez, identifiez les `@id` manquants ou en conflit. Sur un site de cette taille, attendez-vous à trouver 3 à 8 % de fiches avec un balisage incomplet après une migration ou un changement de template.\n\n## Pilier 2 : une API structurée pour les agents IA\n\nLes LLMs d'aujourd'hui ingèrent du contenu principalement via le crawl web. Mais la tendance lourde est aux **agents IA** qui consomment des APIs. OpenAI a documenté ses [plugins et actions](https://platform.openai.com/docs/actions) — des endpoints REST ou GraphQL que le modèle peut interroger en temps réel.\n\n### Pourquoi une API dédiée aux agents\n\nVotre site a probablement déjà une API interne (pour votre front React, votre app mobile). L'exposer directement aux agents IA est une mauvaise idée :\n\n- **Rate limiting** : un agent IA peut envoyer des centaines de requêtes en quelques secondes.\n- **Surface d'attaque** : vos endpoints internes exposent peut-être des données sensibles (marges, stocks fournisseurs).\n- **Format inadapté** : votre API interne renvoie du JSON optimisé pour votre UI, pas pour un modèle de langage.\n\nLa bonne approche : un **endpoint dédié**, en lecture seule, avec un format optimisé pour la consommation IA.\n\n```typescript\n// api/v1/llm/products/[slug].ts — Next.js API Route\nimport { getProductBySlug } from '@/lib/products';\nimport { NextRequest, NextResponse } from 'next/server';\n\nexport async function GET(\n  request: NextRequest,\n  { params }: { params: { slug: string } }\n) {\n  const product = await getProductBySlug(params.slug);\n\n  if (!product) {\n    return NextResponse.json({ error: 'Product not found' }, { status: 404 });\n  }\n\n  // Format optimisé pour consommation LLM\n  const llmPayload = {\n    '@context': 'https://schema.org',\n    '@type': 'Product',\n    '@id': `https://www.marchand-electro.fr/produits/${product.slug}#product`,\n    name: product.name,\n    brand: product.brand.name,\n    category: product.category,\n    price: {\n      amount: product.price,\n      currency: 'EUR',\n      validUntil: product.priceValidUntil,\n    },\n    specifications: product.specs.map((s) => ({\n      name: s.label,\n      value: s.value,\n      unit: s.unit,\n    })),\n    factCheckedClaims: product.claims.map((c) => ({\n      claim: c.text,\n      source: c.sourceUrl,\n      dateVerified: c.verifiedAt,\n      verifiedBy: c.verifierName,\n    })),\n    provenance: {\n      lastUpdated: product.updatedAt.toISOString(),\n      dataSource: 'internal-testing-lab',\n      license: 'CC-BY-4.0',\n    },\n  };\n\n  return NextResponse.json(llmPayload, {\n    headers: {\n      'Cache-Control': 'public, max-age=3600, s-maxage=86400',\n      'X-Robots-Tag': 'noindex',  // pas d'indexation Google classique\n    },\n  });\n}\n```\n\nPoints d'attention dans cette implémentation :\n\n- **`factCheckedClaims`** : chaque affirmation factuelle est traçable. C'est le concept de **provenance**, que nous détaillons dans la section suivante.\n- **`X-Robots-Tag: noindex`** : cet endpoint est destiné aux agents IA, pas à l'index Google classique. Évitez le contenu dupliqué.\n- **Cache agressif** : un `s-maxage` de 24h au CDN empêche un agent de bombarder votre origin.\n- **Schema.org comme format de sortie** : le modèle reçoit des données déjà structurées selon un vocabulaire qu'il connaît intimement (Schema.org est massivement présent dans ses données d'entraînement).\n\n### Documenter l'API dans llms.txt (v2)\n\nC'est là que `llms.txt` retrouve son utilité — non plus comme déclaration statique, mais comme **manifest** pointant vers vos endpoints :\n\n```text\n# Nom: MarchandElectro\n# URL: https://www.marchand-electro.fr\n\n## API pour agents IA\n- Endpoint produits: https://www.marchand-electro.fr/api/v1/llm/products/{slug}\n- Endpoint guides: https://www.marchand-electro.fr/api/v1/llm/guides/{slug}\n- Format: JSON-LD (Schema.org)\n- Authentification: aucune (lecture seule, rate limited à 60 req/min)\n- Documentation OpenAPI: https://www.marchand-electro.fr/api/v1/llm/openapi.yaml\n\n## Provenance\n- Données produits vérifiées par notre laboratoire interne\n- Dernière mise à jour du catalogue: 2026-04-04\n```\n\nCe n'est plus un fichier passif. C'est un point d'entrée vers une architecture technique complète.\n\n## Pilier 3 : la provenance comme avantage concurrentiel\n\nLa provenance — la capacité de tracer l'origine, la date et la fiabilité d'une information — est ce qui différencie un contenu citable d'un contenu ignoré par les LLMs.\n\n### Pourquoi les LLMs ont besoin de provenance\n\nLes modèles de langage souffrent d'un problème structurel : ils ne distinguent pas un fait d'une hallucination. Les systèmes de RAG (Retrieval-Augmented Generation) comme ceux utilisés par Bing Chat, Google AI Overviews ou Perplexity tentent de résoudre ce problème en **ancrant** les réponses dans des sources. Mais pour ancrer une réponse dans votre contenu, le pipeline RAG doit pouvoir :\n\n1. Extraire un **claim** (affirmation factuelle) de votre page.\n2. Évaluer sa **fraîcheur** (date de publication, date de dernière vérification).\n3. Évaluer sa **crédibilité** (qui affirme cela ? avec quelle expertise ?).\n4. Fournir un **lien de citation** au modèle pour attribution.\n\nSi votre contenu ne fournit pas ces signaux explicitement, le pipeline doit les inférer. Et l'inférence est lossy. Vous perdez en précision, donc en probabilité de citation.\n\n### Implémenter ClaimReview et l'authorship structuré\n\nLe type Schema.org [`ClaimReview`](https://schema.org/ClaimReview) est conçu exactement pour cela. Même si vous ne faites pas du fact-checking journalistique, vous pouvez l'adapter pour vos contenus techniques :\n\n```html\n\u003Cscript type=\"application/ld+json\">\n{\n  \"@context\": \"https://schema.org\",\n  \"@type\": \"ClaimReview\",\n  \"datePublished\": \"2026-03-15\",\n  \"url\": \"https://www.marchand-electro.fr/guides/lave-linge-top-10-2026\",\n  \"claimReviewed\": \"Le Samsung WW90T654DLH consomme 52 kWh pour 100 cycles de lavage standard.\",\n  \"itemReviewed\": {\n    \"@type\": \"Claim\",\n    \"author\": {\n      \"@type\": \"Organization\",\n      \"name\": \"Samsung Electronics\"\n    },\n    \"datePublished\": \"2025-09-01\"\n  },\n  \"author\": {\n    \"@type\": \"Person\",\n    \"name\": \"Marc Dupuis\",\n    \"jobTitle\": \"Ingénieur électroménager\",\n    \"affiliation\": {\n      \"@type\": \"Organization\",\n      \"name\": \"MarchandElectro\"\n    }\n  },\n  \"reviewRating\": {\n    \"@type\": \"Rating\",\n    \"ratingValue\": 5,\n    \"bestRating\": 5,\n    \"alternateName\": \"Vérifié par test en laboratoire\"\n  }\n}\n\u003C/script>\n```\n\nCette approche est agressive mais défendable : vous affirmez que vos claims sont vérifiées, vous identifiez qui les vérifie, et vous datez la vérification. Un pipeline RAG qui compare deux sources — l'une avec ce niveau de structuration, l'autre sans — va privilégier la source structurée.\n\n### L'authorship comme signal E-E-A-T machine-readable\n\nGoogle parle d'E-E-A-T (Experience, Expertise, Authoritativeness, Trustworthiness) depuis des années, mais en pratique, c'est un concept évalué par les quality raters humains. Pour les LLMs, l'E-E-A-T doit devenir **machine-readable**.\n\nCréez une page auteur pour chaque contributeur, avec un balisage `Person` complet :\n\n```html\n\u003Cscript type=\"application/ld+json\">\n{\n  \"@context\": \"https://schema.org\",\n  \"@type\": \"Person\",\n  \"@id\": \"https://www.marchand-electro.fr/equipe/marc-dupuis#person\",\n  \"name\": \"Marc Dupuis\",\n  \"jobTitle\": \"Ingénieur électroménager\",\n  \"worksFor\": {\n    \"@type\": \"Organization\",\n    \"name\": \"MarchandElectro\",\n    \"@id\": \"https://www.marchand-electro.fr/#organization\"\n  },\n  \"alumniOf\": {\n    \"@type\": \"EducationalOrganization\",\n    \"name\": \"INSA Lyon\"\n  },\n  \"knowsAbout\": [\"électroménager\", \"efficacité énergétique\", \"normes EU 2019/2014\"],\n  \"sameAs\": [\n    \"https://www.linkedin.com/in/marc-dupuis-electromenager\",\n    \"https://twitter.com/marcdupuis_tech\"\n  ]\n}\n\u003C/script>\n```\n\nLe `sameAs` est crucial : il permet au modèle de croiser l'identité de votre expert avec des profils externes, renforçant la crédibilité. Le `knowsAbout` donne des signaux thématiques explicites.\n\n## Scénario concret : migration vers une architecture LLM-ready\n\nPrenons un cas réaliste. MarchandElectro — 14 000 fiches produit, 350 guides d'achat, 1 200 articles de blog — tourne sur Next.js avec un rendu ISR. Le trafic organique Google représente 45 % des sessions. Le trafic provenant de citations IA (Perplexity, Google AI Overviews, Bing Chat) est passé de 2 % à 11 % en 6 mois. L'équipe veut accélérer cette tendance.\n\n### Phase 1 — Audit du balisage existant (semaine 1-2)\n\nCrawl complet avec Screaming Frog, extraction JSON-LD :\n- 14 000 fiches produit : 62 % ont un balisage `Product` basique (nom, prix, dispo). 0 % ont des `@id`, des `additionalProperty` ou des relations `isRelatedTo`.\n- 350 guides : 80 % ont un balisage `Article` avec `author` en texte libre (pas de `@id`).\n- Aucune page auteur structurée.\n\n### Phase 2 — Entity graph (semaine 3-6)\n\n- Génération automatique des `@id` pour les 14 000 produits, les 47 marques, les 12 auteurs.\n- Enrichissement des fiches produit avec `additionalProperty` (specs techniques déjà en base de données, mapping vers les unités Schema.org).\n- Création de 12 pages auteurs avec balisage `Person`.\n- Ajout de `isRelatedTo` entre produits compatibles (données existantes dans le PIM).\n\nImpact mesurable : le nombre de rich results dans Search Console passe de 2 100 à 8 400 en 4 semaines. Ce n'est pas directement lié aux LLMs, mais c'est un proxy de la qualité du balisage.\n\n### Phase 3 — API LLM (semaine 7-10)\n\n- Développement de l'endpoint `/api/v1/llm/products/[slug]` et `/api/v1/llm/guides/[slug]`.\n- Rate limiting à 60 req/min via middleware Next.js.\n- Mise à jour de `llms.txt` pour pointer vers l'API et la spec OpenAPI.\n- Monitoring des requêtes entrantes : identification des user-agents IA (GPTBot, ClaudeBot, PerplexityBot).\n\nAprès 6 semaines, les logs montrent 12 000 requêtes/jour sur les endpoints LLM, principalement de PerplexityBot et GPTBot. Le trafic référé depuis Perplexity augmente de 34 %.\n\n### Phase 4 — Provenance (semaine 11-14)\n\n- Ajout de `ClaimReview` sur les 50 guides les plus consultés (ceux qui génèrent le plus de citations IA d'après les logs).\n- Enrichissement progressif : chaque nouveau guide publié passe par un workflow de fact-checking interne avec balisage automatique.\n\nLe contenu structuré avec provenance apparaît dans les citations IA avec **le nom de l'auteur et le nom du site**, alors que les contenus non structurés sont souvent cités de manière anonyme (\"selon un site spécialisé\"). La différence en termes de branding est considérable.\n\n## Surveiller les régressions : le maillon critique\n\nConstruire cette architecture prend des semaines. La casser prend un déploiement. Un merge qui modifie le template produit peut supprimer les `@id` de 14 000 pages en une seconde. Un changement de CMS peut corrompre le JSON-LD. Une mise à jour de dépendance peut casser le [SSR](/blog/ssr-vs-csr-impact-reel-sur-le-seo) et renvoyer du contenu vide aux crawlers IA — exactement le type de problème décrit dans l'article sur [les pages blanches en SPA](/blog/pourquoi-google-voit-une-page-blanche-sur-votre-spa).\n\nLe monitoring manuel n'est pas viable à l'échelle. Vous avez besoin d'un système qui vérifie en continu :\n- La présence et la validité des blocs JSON-LD sur un échantillon de pages.\n- La disponibilité et le temps de réponse des endpoints API LLM.\n- La cohérence des `@id` (pas de doublons, pas de 404 sur les URIs dereferencées).\n- Le bon fonctionnement du [rendu serveur](/blog/isr-ssr-ssg-quel-mode-de-rendering-pour-le-seo) — un [hydration mismatch](/blog/hydration-mismatch-le-bug-invisible-qui-tue-votre-seo) peut produire un JSON-LD côté serveur différent de celui côté client.\n\nUn outil de monitoring comme Seogard détecte ces régressions automatiquement et alerte avant que les crawlers IA n'ingèrent du contenu corrompu. La fenêtre de réaction est étroite : les pipelines d'indexation IA recrawlent fréquemment, et un contenu dégradé peut persister dans les réponses du modèle pendant des semaines après correction.\n\n## Ce que les LLMs ne peuvent pas encore faire (et ce que cela implique)\n\nIl serait malhonnête de présenter cette architecture comme une garantie de citation IA. Plusieurs limites systémiques subsistent.\n\n### Le problème de l'attribution opaque\n\nAucun LLM majeur ne documente publiquement comment il sélectionne ses sources de citation en mode RAG. Google AI Overviews, par exemple, ne suit pas les mêmes règles que le ranking organique classique. Un contenu qui [ranke en top 10 n'apparaît pas forcément dans les AI Overviews](/blog/why-your-content-doesn-t-appear-in-ai-overviews-even-if-it-ranks-in-the-top-10). L'architecture que nous décrivons maximise vos chances, mais le processus de sélection reste une boîte noire.\n\n### Le problème de la fraîcheur\n\nLes modèles de base (non RAG) ont une date de coupure d'entraînement. Même avec RAG, le pipeline de retrieval peut cacher des versions obsolètes de vos pages. Exposer des dates de mise à jour explicites dans votre JSON-LD et vos endpoints API aide, mais ne garantit pas que le modèle utilise la version la plus récente.\n\n### Le problème du crawl budget IA\n\nTout comme Googlebot a un [crawl budget limité](/blog/google-core-update-crawl-limits-gemini-traffic-data-seo-pulse-via-sejournal-mattgsouthern), les crawlers IA (GPTBot, ClaudeBot) ont des contraintes de crawl. Si votre `robots.txt` bloque ces bots, ou si votre serveur est trop lent à répondre, votre contenu ne sera jamais ingéré. Vérifiez vos logs serveur pour `GPTBot`, `ClaudeBot`, `PerplexityBot`, `Bytespider` :\n\n```bash\n# Comptage des requêtes par bot IA sur les 7 derniers jours\nzcat /var/log/nginx/access.log.*.gz | \\\n  grep -iE \"(GPTBot|ClaudeBot|PerplexityBot|Bytespider|GoogleOther)\" | \\\n  awk '{print $1, $14}' | \\\n  sed 's/.*compatible; \\([^;/]*\\).*/\\1/' | \\\n  sort | uniq -c | sort -rn | head -20\n```\n\nSi vous ne voyez aucune requête de ces bots, votre architecture LLM-ready ne sert à rien. Commencez par vérifier que votre `robots.txt` ne les bloque pas, que vos temps de réponse sont corrects, et que vos [sitemaps sont bien structurés](/blog/google-answers-why-some-seos-split-their-sitemap-into-multiple-files-via-sejournal-martinibuster) pour faciliter la découverte.\n\n## L'architecture cible en résumé\n\n`llms.txt` reste utile comme manifest d'entrée — un fichier que les agents IA consultent pour comprendre ce que votre site expose et comment y accéder. Mais le fichier seul est inerte. L'architecture qui vient ensuite repose sur un entity graph JSON-LD avec des `@id` cohérents et des relations explicites, des endpoints API dédiés aux agents IA avec du JSON-LD en sortie et un rate limiting adapté, un système de provenance qui trace chaque claim jusqu'à son auteur et sa date de vérification, et un monitoring continu pour détecter les régressions avant qu'elles ne propagent du contenu corrompu dans les réponses IA.\n\nLes marques qui construisent cette couche technique maintenant prennent de l'avance dans un jeu où la visibilité se déplace progressivement du SERP classique vers les réponses générées. Ce n'est pas une question de si, mais de quand.\n```","https://seogard.io/blog/llms-txt-was-step-one-here-s-the-architecture-that-comes-next-via-sejournal-duaneforrester","Actualités SEO","2026-04-05T01:39:33.885Z","2026-04-05","llms.txt ne suffit plus. Entity graphs, APIs structurées et provenance : l'architecture technique pour obtenir des citations IA fiables.","\u003Cp>Un fichier texte à la racine de votre domaine ne va pas convaincre un LLM de citer votre marque correctement. \u003Ccode>llms.txt\u003C/code> a posé le premier jalon — un signal d'intention, un geste vers les modèles de langage. Mais entre un fichier statique et une architecture capable de nourrir GPT-4, Gemini ou Claude avec des faits vérifiables et attribuables, il y a un gouffre d'ingénierie.\u003C/p>\n\u003Ch2>llms.txt : ce qu'il fait, ce qu'il ne fait pas\u003C/h2>\n\u003Cp>La proposition \u003Ccode>llms.txt\u003C/code>, inspirée de \u003Ccode>robots.txt\u003C/code>, part d'une idée simple : offrir aux crawlers IA un fichier lisible par machine, à la racine du site, qui décrit le contenu disponible, les autorisations d'usage et les métadonnées clés de la marque. L'initiative, documentée sur \u003Ca href=\"https://llmstxt.org/\">llmstxt.org\u003C/a>, est un point de départ raisonnable.\u003C/p>\n\u003Cp>Voici à quoi ressemble un fichier \u003Ccode>llms.txt\u003C/code> typique :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan># Nom: MarchandElectro\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan># URL: https://www.marchand-electro.fr\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan># Description: Vente en ligne d'électroménager et high-tech, 14 000 références.\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>## Contenu autorisé\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>- /guides/ : guides d'achat, comparatifs produits\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>- /blog/ : actualités tech et conseils d'utilisation\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>- /produits/ : fiches produits structurées\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>## Contact\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>- contact@marchand-electro.fr\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>## Politique\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>- Utilisation en citation avec attribution requise\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>- Pas de reproduction intégrale des fiches produits\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Le problème : ce fichier est \u003Cstrong>déclaratif et statique\u003C/strong>. Il ne contient aucune sémantique exploitable par un modèle. Un LLM qui ingère ce fichier sait que votre site existe et vend de l'électroménager. Il ne sait pas que votre guide \"Lave-linge : top 10 en 2026\" compare 10 modèles spécifiques avec des mesures de consommation réelles, ni que vos prix sont mis à jour quotidiennement, ni que votre rédacteur est un ingénieur certifié.\u003C/p>\n\u003Cp>Les limites concrètes :\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Pas de granularité sémantique.\u003C/strong> Le fichier pointe vers des répertoires, pas vers des entités ou des faits.\u003C/li>\n\u003Cli>\u003Cstrong>Pas de fraîcheur.\u003C/strong> Aucun mécanisme de versioning ou de date de dernière mise à jour par ressource.\u003C/li>\n\u003Cli>\u003Cstrong>Pas de provenance.\u003C/strong> Rien ne permet au modèle de distinguer un fait vérifié d'une opinion, ni de tracer la source d'une affirmation.\u003C/li>\n\u003Cli>\u003Cstrong>Pas de standard adopté.\u003C/strong> Contrairement à \u003Ccode>robots.txt\u003C/code> (supporté universellement depuis 1994 et \u003Ca href=\"https://www.rfc-editor.org/rfc/rfc9309\">formalisé en RFC 9309\u003C/a>), \u003Ccode>llms.txt\u003C/code> n'a aucun support officiel de Google, OpenAI ou Anthropic à ce jour.\u003C/li>\n\u003C/ul>\n\u003Cp>L'article de Search Engine Journal publié par Duane Forrester pose la bonne question : si \u003Ccode>llms.txt\u003C/code> est l'étape un, quelle architecture technique faut-il construire pour que les LLMs citent votre marque avec précision ? La réponse tient en trois piliers : des APIs structurées, un entity graph explicite, et un système de provenance.\u003C/p>\n\u003Ch2>Pilier 1 : exposer un entity graph, pas du contenu plat\u003C/h2>\n\u003Cp>Les LLMs ne \"lisent\" pas vos pages comme un humain. Ils ingèrent du texte et tentent d'en extraire des relations entre entités. Si votre contenu est du HTML sémantiquement pauvre, le modèle doit deviner les relations. Et il devine mal.\u003C/p>\n\u003Ch3>Du HTML au Knowledge Graph local\u003C/h3>\n\u003Cp>L'objectif est de construire un \u003Cstrong>entity graph local\u003C/strong> — un graphe de connaissances propre à votre domaine, exposé de manière exploitable. JSON-LD est le véhicule naturel, mais il faut aller bien au-delà du balisage \u003Ccode>Product\u003C/code> ou \u003Ccode>Article\u003C/code> de base.\u003C/p>\n\u003Cp>Prenons le cas de MarchandElectro, un e-commerce de 14 000 fiches produits. Chaque fiche produit doit exposer non seulement le produit, mais ses relations :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">&#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">script\u003C/span>\u003Cspan style=\"color:#B392F0\"> type\u003C/span>\u003Cspan style=\"color:#E1E4E8\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"application/ld+json\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">{\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"@context\": \"https://schema.org\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"@type\": \"Product\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"@id\": \"https://www.marchand-electro.fr/produits/lave-linge-samsung-ww90t654dlh#product\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"name\": \"Samsung WW90T654DLH\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"brand\": {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"@type\": \"Brand\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"name\": \"Samsung\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"@id\": \"https://www.marchand-electro.fr/marques/samsung#brand\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"category\": \"Lave-linge\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"offers\": {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"@type\": \"Offer\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"price\": \"649.00\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"priceCurrency\": \"EUR\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"availability\": \"https://schema.org/InStock\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"priceValidUntil\": \"2026-04-30\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"additionalProperty\": [\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      \"@type\": \"PropertyValue\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      \"name\": \"Consommation énergétique\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      \"value\": \"52 kWh/100 cycles\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      \"unitCode\": \"KWH\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      \"@type\": \"PropertyValue\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      \"name\": \"Capacité\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      \"value\": \"9\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      \"unitCode\": \"KGM\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  ],\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"review\": {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"@type\": \"Review\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"author\": {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      \"@type\": \"Person\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      \"name\": \"Marc Dupuis\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      \"jobTitle\": \"Ingénieur électroménager\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      \"@id\": \"https://www.marchand-electro.fr/equipe/marc-dupuis#person\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"reviewBody\": \"Testé sur 30 cycles. Niveau sonore mesuré à 47 dB en essorage.\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"datePublished\": \"2026-03-15\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"isRelatedTo\": [\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      \"@type\": \"Product\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      \"@id\": \"https://www.marchand-electro.fr/produits/seche-linge-samsung-dv90t6240lh#product\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  ]\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">script\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Les points critiques dans ce balisage :\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>\u003Ccode>@id\u003C/code> sur chaque entité\u003C/strong> : c'est ce qui transforme du JSON-LD isolé en graphe. Chaque produit, chaque personne, chaque marque a un identifiant unique et dereferenceable. Un LLM (ou son pipeline d'indexation) peut résoudre ces \u003Ccode>@id\u003C/code> pour construire des relations.\u003C/li>\n\u003Cli>\u003Cstrong>\u003Ccode>additionalProperty\u003C/code> avec unités\u003C/strong> : les faits numériques avec unités sont exactement ce que les LLMs peinent à extraire du texte libre. Les exposer en structuré élimine l'ambiguïté.\u003C/li>\n\u003Cli>\u003Cstrong>\u003Ccode>isRelatedTo\u003C/code>\u003C/strong> : le graphe de relations entre produits aide le modèle à comprendre votre catalogue comme un système, pas comme une liste.\u003C/li>\n\u003Cli>\u003Cstrong>\u003Ccode>author\u003C/code> avec \u003Ccode>jobTitle\u003C/code>\u003C/strong> : la provenance de l'avis n'est pas anonyme. Le modèle peut évaluer la crédibilité.\u003C/li>\n\u003C/ul>\n\u003Ch3>Valider le graphe à l'échelle\u003C/h3>\n\u003Cp>Sur 14 000 pages produit, un seul \u003Ccode>@id\u003C/code> en doublon ou un type Schema.org invalide peut corrompre l'interprétation de pans entiers du graphe. Utilisez le \u003Ca href=\"https://validator.schema.org/\">Schema Markup Validator\u003C/a> pour des vérifications ponctuelles, mais pour un audit à l'échelle, Screaming Frog avec l'extraction personnalisée JSON-LD est indispensable :\u003C/p>\n\u003Cpre>\u003Ccode>Screaming Frog > Configuration > Custom > Extraction\n  - Extraction: JSONPath\n  - Expression: $['@id']\n  - Source: LD+JSON\n\u003C/code>\u003C/pre>\n\u003Cp>Exportez, dédupliquez, identifiez les \u003Ccode>@id\u003C/code> manquants ou en conflit. Sur un site de cette taille, attendez-vous à trouver 3 à 8 % de fiches avec un balisage incomplet après une migration ou un changement de template.\u003C/p>\n\u003Ch2>Pilier 2 : une API structurée pour les agents IA\u003C/h2>\n\u003Cp>Les LLMs d'aujourd'hui ingèrent du contenu principalement via le crawl web. Mais la tendance lourde est aux \u003Cstrong>agents IA\u003C/strong> qui consomment des APIs. OpenAI a documenté ses \u003Ca href=\"https://platform.openai.com/docs/actions\">plugins et actions\u003C/a> — des endpoints REST ou GraphQL que le modèle peut interroger en temps réel.\u003C/p>\n\u003Ch3>Pourquoi une API dédiée aux agents\u003C/h3>\n\u003Cp>Votre site a probablement déjà une API interne (pour votre front React, votre app mobile). L'exposer directement aux agents IA est une mauvaise idée :\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Rate limiting\u003C/strong> : un agent IA peut envoyer des centaines de requêtes en quelques secondes.\u003C/li>\n\u003Cli>\u003Cstrong>Surface d'attaque\u003C/strong> : vos endpoints internes exposent peut-être des données sensibles (marges, stocks fournisseurs).\u003C/li>\n\u003Cli>\u003Cstrong>Format inadapté\u003C/strong> : votre API interne renvoie du JSON optimisé pour votre UI, pas pour un modèle de langage.\u003C/li>\n\u003C/ul>\n\u003Cp>La bonne approche : un \u003Cstrong>endpoint dédié\u003C/strong>, en lecture seule, avec un format optimisé pour la consommation IA.\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">// api/v1/llm/products/[slug].ts — Next.js API Route\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">import\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> { getProductBySlug } \u003C/span>\u003Cspan style=\"color:#F97583\">from\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> '@/lib/products'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">import\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> { NextRequest, NextResponse } \u003C/span>\u003Cspan style=\"color:#F97583\">from\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> 'next/server'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">export\u003C/span>\u003Cspan style=\"color:#F97583\"> async\u003C/span>\u003Cspan style=\"color:#F97583\"> function\u003C/span>\u003Cspan style=\"color:#B392F0\"> GET\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  request\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#B392F0\"> NextRequest\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  { \u003C/span>\u003Cspan style=\"color:#FFAB70\">params\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> }\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> { \u003C/span>\u003Cspan style=\"color:#FFAB70\">params\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> { \u003C/span>\u003Cspan style=\"color:#FFAB70\">slug\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> string\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> } }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">) {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> product\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#F97583\"> await\u003C/span>\u003Cspan style=\"color:#B392F0\"> getProductBySlug\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(params.slug);\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  if\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> (\u003C/span>\u003Cspan style=\"color:#F97583\">!\u003C/span>\u003Cspan style=\"color:#E1E4E8\">product) {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    return\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> NextResponse.\u003C/span>\u003Cspan style=\"color:#B392F0\">json\u003C/span>\u003Cspan style=\"color:#E1E4E8\">({ error: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'Product not found'\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> }, { status: \u003C/span>\u003Cspan style=\"color:#79B8FF\">404\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> });\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">  // Format optimisé pour consommation LLM\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> llmPayload\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    '@context'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'https://schema.org'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    '@type'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'Product'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    '@id'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">`https://www.marchand-electro.fr/produits/${\u003C/span>\u003Cspan style=\"color:#E1E4E8\">product\u003C/span>\u003Cspan style=\"color:#9ECBFF\">.\u003C/span>\u003Cspan style=\"color:#E1E4E8\">slug\u003C/span>\u003Cspan style=\"color:#9ECBFF\">}#product`\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    name: product.name,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    brand: product.brand.name,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    category: product.category,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    price: {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      amount: product.price,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      currency: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'EUR'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      validUntil: product.priceValidUntil,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    specifications: product.specs.\u003C/span>\u003Cspan style=\"color:#B392F0\">map\u003C/span>\u003Cspan style=\"color:#E1E4E8\">((\u003C/span>\u003Cspan style=\"color:#FFAB70\">s\u003C/span>\u003Cspan style=\"color:#E1E4E8\">) \u003C/span>\u003Cspan style=\"color:#F97583\">=>\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> ({\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      name: s.label,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      value: s.value,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      unit: s.unit,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    })),\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    factCheckedClaims: product.claims.\u003C/span>\u003Cspan style=\"color:#B392F0\">map\u003C/span>\u003Cspan style=\"color:#E1E4E8\">((\u003C/span>\u003Cspan style=\"color:#FFAB70\">c\u003C/span>\u003Cspan style=\"color:#E1E4E8\">) \u003C/span>\u003Cspan style=\"color:#F97583\">=>\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> ({\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      claim: c.text,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      source: c.sourceUrl,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      dateVerified: c.verifiedAt,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      verifiedBy: c.verifierName,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    })),\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    provenance: {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      lastUpdated: product.updatedAt.\u003C/span>\u003Cspan style=\"color:#B392F0\">toISOString\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(),\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      dataSource: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'internal-testing-lab'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      license: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'CC-BY-4.0'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  };\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  return\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> NextResponse.\u003C/span>\u003Cspan style=\"color:#B392F0\">json\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(llmPayload, {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    headers: {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">      'Cache-Control'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'public, max-age=3600, s-maxage=86400'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">      'X-Robots-Tag'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'noindex'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,  \u003C/span>\u003Cspan style=\"color:#6A737D\">// pas d'indexation Google classique\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  });\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Points d'attention dans cette implémentation :\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>\u003Ccode>factCheckedClaims\u003C/code>\u003C/strong> : chaque affirmation factuelle est traçable. C'est le concept de \u003Cstrong>provenance\u003C/strong>, que nous détaillons dans la section suivante.\u003C/li>\n\u003Cli>\u003Cstrong>\u003Ccode>X-Robots-Tag: noindex\u003C/code>\u003C/strong> : cet endpoint est destiné aux agents IA, pas à l'index Google classique. Évitez le contenu dupliqué.\u003C/li>\n\u003Cli>\u003Cstrong>Cache agressif\u003C/strong> : un \u003Ccode>s-maxage\u003C/code> de 24h au CDN empêche un agent de bombarder votre origin.\u003C/li>\n\u003Cli>\u003Cstrong>Schema.org comme format de sortie\u003C/strong> : le modèle reçoit des données déjà structurées selon un vocabulaire qu'il connaît intimement (Schema.org est massivement présent dans ses données d'entraînement).\u003C/li>\n\u003C/ul>\n\u003Ch3>Documenter l'API dans llms.txt (v2)\u003C/h3>\n\u003Cp>C'est là que \u003Ccode>llms.txt\u003C/code> retrouve son utilité — non plus comme déclaration statique, mais comme \u003Cstrong>manifest\u003C/strong> pointant vers vos endpoints :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan># Nom: MarchandElectro\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan># URL: https://www.marchand-electro.fr\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>## API pour agents IA\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>- Endpoint produits: https://www.marchand-electro.fr/api/v1/llm/products/{slug}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>- Endpoint guides: https://www.marchand-electro.fr/api/v1/llm/guides/{slug}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>- Format: JSON-LD (Schema.org)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>- Authentification: aucune (lecture seule, rate limited à 60 req/min)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>- Documentation OpenAPI: https://www.marchand-electro.fr/api/v1/llm/openapi.yaml\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>## Provenance\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>- Données produits vérifiées par notre laboratoire interne\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>- Dernière mise à jour du catalogue: 2026-04-04\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Ce n'est plus un fichier passif. C'est un point d'entrée vers une architecture technique complète.\u003C/p>\n\u003Ch2>Pilier 3 : la provenance comme avantage concurrentiel\u003C/h2>\n\u003Cp>La provenance — la capacité de tracer l'origine, la date et la fiabilité d'une information — est ce qui différencie un contenu citable d'un contenu ignoré par les LLMs.\u003C/p>\n\u003Ch3>Pourquoi les LLMs ont besoin de provenance\u003C/h3>\n\u003Cp>Les modèles de langage souffrent d'un problème structurel : ils ne distinguent pas un fait d'une hallucination. Les systèmes de RAG (Retrieval-Augmented Generation) comme ceux utilisés par Bing Chat, Google AI Overviews ou Perplexity tentent de résoudre ce problème en \u003Cstrong>ancrant\u003C/strong> les réponses dans des sources. Mais pour ancrer une réponse dans votre contenu, le pipeline RAG doit pouvoir :\u003C/p>\n\u003Col>\n\u003Cli>Extraire un \u003Cstrong>claim\u003C/strong> (affirmation factuelle) de votre page.\u003C/li>\n\u003Cli>Évaluer sa \u003Cstrong>fraîcheur\u003C/strong> (date de publication, date de dernière vérification).\u003C/li>\n\u003Cli>Évaluer sa \u003Cstrong>crédibilité\u003C/strong> (qui affirme cela ? avec quelle expertise ?).\u003C/li>\n\u003Cli>Fournir un \u003Cstrong>lien de citation\u003C/strong> au modèle pour attribution.\u003C/li>\n\u003C/ol>\n\u003Cp>Si votre contenu ne fournit pas ces signaux explicitement, le pipeline doit les inférer. Et l'inférence est lossy. Vous perdez en précision, donc en probabilité de citation.\u003C/p>\n\u003Ch3>Implémenter ClaimReview et l'authorship structuré\u003C/h3>\n\u003Cp>Le type Schema.org \u003Ca href=\"https://schema.org/ClaimReview\">\u003Ccode>ClaimReview\u003C/code>\u003C/a> est conçu exactement pour cela. Même si vous ne faites pas du fact-checking journalistique, vous pouvez l'adapter pour vos contenus techniques :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">&#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">script\u003C/span>\u003Cspan style=\"color:#B392F0\"> type\u003C/span>\u003Cspan style=\"color:#E1E4E8\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"application/ld+json\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">{\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"@context\": \"https://schema.org\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"@type\": \"ClaimReview\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"datePublished\": \"2026-03-15\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"url\": \"https://www.marchand-electro.fr/guides/lave-linge-top-10-2026\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"claimReviewed\": \"Le Samsung WW90T654DLH consomme 52 kWh pour 100 cycles de lavage standard.\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"itemReviewed\": {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"@type\": \"Claim\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"author\": {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      \"@type\": \"Organization\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      \"name\": \"Samsung Electronics\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"datePublished\": \"2025-09-01\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"author\": {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"@type\": \"Person\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"name\": \"Marc Dupuis\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"jobTitle\": \"Ingénieur électroménager\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"affiliation\": {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      \"@type\": \"Organization\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      \"name\": \"MarchandElectro\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"reviewRating\": {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"@type\": \"Rating\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"ratingValue\": 5,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"bestRating\": 5,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"alternateName\": \"Vérifié par test en laboratoire\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">script\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Cette approche est agressive mais défendable : vous affirmez que vos claims sont vérifiées, vous identifiez qui les vérifie, et vous datez la vérification. Un pipeline RAG qui compare deux sources — l'une avec ce niveau de structuration, l'autre sans — va privilégier la source structurée.\u003C/p>\n\u003Ch3>L'authorship comme signal E-E-A-T machine-readable\u003C/h3>\n\u003Cp>Google parle d'E-E-A-T (Experience, Expertise, Authoritativeness, Trustworthiness) depuis des années, mais en pratique, c'est un concept évalué par les quality raters humains. Pour les LLMs, l'E-E-A-T doit devenir \u003Cstrong>machine-readable\u003C/strong>.\u003C/p>\n\u003Cp>Créez une page auteur pour chaque contributeur, avec un balisage \u003Ccode>Person\u003C/code> complet :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">&#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">script\u003C/span>\u003Cspan style=\"color:#B392F0\"> type\u003C/span>\u003Cspan style=\"color:#E1E4E8\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"application/ld+json\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">{\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"@context\": \"https://schema.org\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"@type\": \"Person\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"@id\": \"https://www.marchand-electro.fr/equipe/marc-dupuis#person\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"name\": \"Marc Dupuis\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"jobTitle\": \"Ingénieur électroménager\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"worksFor\": {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"@type\": \"Organization\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"name\": \"MarchandElectro\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"@id\": \"https://www.marchand-electro.fr/#organization\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"alumniOf\": {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"@type\": \"EducationalOrganization\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"name\": \"INSA Lyon\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"knowsAbout\": [\"électroménager\", \"efficacité énergétique\", \"normes EU 2019/2014\"],\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"sameAs\": [\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"https://www.linkedin.com/in/marc-dupuis-electromenager\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"https://twitter.com/marcdupuis_tech\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  ]\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">script\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Le \u003Ccode>sameAs\u003C/code> est crucial : il permet au modèle de croiser l'identité de votre expert avec des profils externes, renforçant la crédibilité. Le \u003Ccode>knowsAbout\u003C/code> donne des signaux thématiques explicites.\u003C/p>\n\u003Ch2>Scénario concret : migration vers une architecture LLM-ready\u003C/h2>\n\u003Cp>Prenons un cas réaliste. MarchandElectro — 14 000 fiches produit, 350 guides d'achat, 1 200 articles de blog — tourne sur Next.js avec un rendu ISR. Le trafic organique Google représente 45 % des sessions. Le trafic provenant de citations IA (Perplexity, Google AI Overviews, Bing Chat) est passé de 2 % à 11 % en 6 mois. L'équipe veut accélérer cette tendance.\u003C/p>\n\u003Ch3>Phase 1 — Audit du balisage existant (semaine 1-2)\u003C/h3>\n\u003Cp>Crawl complet avec Screaming Frog, extraction JSON-LD :\u003C/p>\n\u003Cul>\n\u003Cli>14 000 fiches produit : 62 % ont un balisage \u003Ccode>Product\u003C/code> basique (nom, prix, dispo). 0 % ont des \u003Ccode>@id\u003C/code>, des \u003Ccode>additionalProperty\u003C/code> ou des relations \u003Ccode>isRelatedTo\u003C/code>.\u003C/li>\n\u003Cli>350 guides : 80 % ont un balisage \u003Ccode>Article\u003C/code> avec \u003Ccode>author\u003C/code> en texte libre (pas de \u003Ccode>@id\u003C/code>).\u003C/li>\n\u003Cli>Aucune page auteur structurée.\u003C/li>\n\u003C/ul>\n\u003Ch3>Phase 2 — Entity graph (semaine 3-6)\u003C/h3>\n\u003Cul>\n\u003Cli>Génération automatique des \u003Ccode>@id\u003C/code> pour les 14 000 produits, les 47 marques, les 12 auteurs.\u003C/li>\n\u003Cli>Enrichissement des fiches produit avec \u003Ccode>additionalProperty\u003C/code> (specs techniques déjà en base de données, mapping vers les unités Schema.org).\u003C/li>\n\u003Cli>Création de 12 pages auteurs avec balisage \u003Ccode>Person\u003C/code>.\u003C/li>\n\u003Cli>Ajout de \u003Ccode>isRelatedTo\u003C/code> entre produits compatibles (données existantes dans le PIM).\u003C/li>\n\u003C/ul>\n\u003Cp>Impact mesurable : le nombre de rich results dans Search Console passe de 2 100 à 8 400 en 4 semaines. Ce n'est pas directement lié aux LLMs, mais c'est un proxy de la qualité du balisage.\u003C/p>\n\u003Ch3>Phase 3 — API LLM (semaine 7-10)\u003C/h3>\n\u003Cul>\n\u003Cli>Développement de l'endpoint \u003Ccode>/api/v1/llm/products/[slug]\u003C/code> et \u003Ccode>/api/v1/llm/guides/[slug]\u003C/code>.\u003C/li>\n\u003Cli>Rate limiting à 60 req/min via middleware Next.js.\u003C/li>\n\u003Cli>Mise à jour de \u003Ccode>llms.txt\u003C/code> pour pointer vers l'API et la spec OpenAPI.\u003C/li>\n\u003Cli>Monitoring des requêtes entrantes : identification des user-agents IA (GPTBot, ClaudeBot, PerplexityBot).\u003C/li>\n\u003C/ul>\n\u003Cp>Après 6 semaines, les logs montrent 12 000 requêtes/jour sur les endpoints LLM, principalement de PerplexityBot et GPTBot. Le trafic référé depuis Perplexity augmente de 34 %.\u003C/p>\n\u003Ch3>Phase 4 — Provenance (semaine 11-14)\u003C/h3>\n\u003Cul>\n\u003Cli>Ajout de \u003Ccode>ClaimReview\u003C/code> sur les 50 guides les plus consultés (ceux qui génèrent le plus de citations IA d'après les logs).\u003C/li>\n\u003Cli>Enrichissement progressif : chaque nouveau guide publié passe par un workflow de fact-checking interne avec balisage automatique.\u003C/li>\n\u003C/ul>\n\u003Cp>Le contenu structuré avec provenance apparaît dans les citations IA avec \u003Cstrong>le nom de l'auteur et le nom du site\u003C/strong>, alors que les contenus non structurés sont souvent cités de manière anonyme (\"selon un site spécialisé\"). La différence en termes de branding est considérable.\u003C/p>\n\u003Ch2>Surveiller les régressions : le maillon critique\u003C/h2>\n\u003Cp>Construire cette architecture prend des semaines. La casser prend un déploiement. Un merge qui modifie le template produit peut supprimer les \u003Ccode>@id\u003C/code> de 14 000 pages en une seconde. Un changement de CMS peut corrompre le JSON-LD. Une mise à jour de dépendance peut casser le \u003Ca href=\"/blog/ssr-vs-csr-impact-reel-sur-le-seo\">SSR\u003C/a> et renvoyer du contenu vide aux crawlers IA — exactement le type de problème décrit dans l'article sur \u003Ca href=\"/blog/pourquoi-google-voit-une-page-blanche-sur-votre-spa\">les pages blanches en SPA\u003C/a>.\u003C/p>\n\u003Cp>Le monitoring manuel n'est pas viable à l'échelle. Vous avez besoin d'un système qui vérifie en continu :\u003C/p>\n\u003Cul>\n\u003Cli>La présence et la validité des blocs JSON-LD sur un échantillon de pages.\u003C/li>\n\u003Cli>La disponibilité et le temps de réponse des endpoints API LLM.\u003C/li>\n\u003Cli>La cohérence des \u003Ccode>@id\u003C/code> (pas de doublons, pas de 404 sur les URIs dereferencées).\u003C/li>\n\u003Cli>Le bon fonctionnement du \u003Ca href=\"/blog/isr-ssr-ssg-quel-mode-de-rendering-pour-le-seo\">rendu serveur\u003C/a> — un \u003Ca href=\"/blog/hydration-mismatch-le-bug-invisible-qui-tue-votre-seo\">hydration mismatch\u003C/a> peut produire un JSON-LD côté serveur différent de celui côté client.\u003C/li>\n\u003C/ul>\n\u003Cp>Un outil de monitoring comme Seogard détecte ces régressions automatiquement et alerte avant que les crawlers IA n'ingèrent du contenu corrompu. La fenêtre de réaction est étroite : les pipelines d'indexation IA recrawlent fréquemment, et un contenu dégradé peut persister dans les réponses du modèle pendant des semaines après correction.\u003C/p>\n\u003Ch2>Ce que les LLMs ne peuvent pas encore faire (et ce que cela implique)\u003C/h2>\n\u003Cp>Il serait malhonnête de présenter cette architecture comme une garantie de citation IA. Plusieurs limites systémiques subsistent.\u003C/p>\n\u003Ch3>Le problème de l'attribution opaque\u003C/h3>\n\u003Cp>Aucun LLM majeur ne documente publiquement comment il sélectionne ses sources de citation en mode RAG. Google AI Overviews, par exemple, ne suit pas les mêmes règles que le ranking organique classique. Un contenu qui \u003Ca href=\"/blog/why-your-content-doesn-t-appear-in-ai-overviews-even-if-it-ranks-in-the-top-10\">ranke en top 10 n'apparaît pas forcément dans les AI Overviews\u003C/a>. L'architecture que nous décrivons maximise vos chances, mais le processus de sélection reste une boîte noire.\u003C/p>\n\u003Ch3>Le problème de la fraîcheur\u003C/h3>\n\u003Cp>Les modèles de base (non RAG) ont une date de coupure d'entraînement. Même avec RAG, le pipeline de retrieval peut cacher des versions obsolètes de vos pages. Exposer des dates de mise à jour explicites dans votre JSON-LD et vos endpoints API aide, mais ne garantit pas que le modèle utilise la version la plus récente.\u003C/p>\n\u003Ch3>Le problème du crawl budget IA\u003C/h3>\n\u003Cp>Tout comme Googlebot a un \u003Ca href=\"/blog/google-core-update-crawl-limits-gemini-traffic-data-seo-pulse-via-sejournal-mattgsouthern\">crawl budget limité\u003C/a>, les crawlers IA (GPTBot, ClaudeBot) ont des contraintes de crawl. Si votre \u003Ccode>robots.txt\u003C/code> bloque ces bots, ou si votre serveur est trop lent à répondre, votre contenu ne sera jamais ingéré. Vérifiez vos logs serveur pour \u003Ccode>GPTBot\u003C/code>, \u003Ccode>ClaudeBot\u003C/code>, \u003Ccode>PerplexityBot\u003C/code>, \u003Ccode>Bytespider\u003C/code> :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Comptage des requêtes par bot IA sur les 7 derniers jours\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">zcat\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> /var/log/nginx/access.log.\u003C/span>\u003Cspan style=\"color:#79B8FF\">*\u003C/span>\u003Cspan style=\"color:#9ECBFF\">.gz\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#79B8FF\"> \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">  grep\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -iE\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"(GPTBot|ClaudeBot|PerplexityBot|Bytespider|GoogleOther)\"\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#79B8FF\"> \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">  awk\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> '{print $1, $14}'\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#79B8FF\"> \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">  sed\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> 's/.*compatible; \\([^;/]*\\).*/\\1/'\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#79B8FF\"> \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">  sort\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#B392F0\"> uniq\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -c\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#B392F0\"> sort\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -rn\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#B392F0\"> head\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -20\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Si vous ne voyez aucune requête de ces bots, votre architecture LLM-ready ne sert à rien. Commencez par vérifier que votre \u003Ccode>robots.txt\u003C/code> ne les bloque pas, que vos temps de réponse sont corrects, et que vos \u003Ca href=\"/blog/google-answers-why-some-seos-split-their-sitemap-into-multiple-files-via-sejournal-martinibuster\">sitemaps sont bien structurés\u003C/a> pour faciliter la découverte.\u003C/p>\n\u003Ch2>L'architecture cible en résumé\u003C/h2>\n\u003Cp>\u003Ccode>llms.txt\u003C/code> reste utile comme manifest d'entrée — un fichier que les agents IA consultent pour comprendre ce que votre site expose et comment y accéder. Mais le fichier seul est inerte. L'architecture qui vient ensuite repose sur un entity graph JSON-LD avec des \u003Ccode>@id\u003C/code> cohérents et des relations explicites, des endpoints API dédiés aux agents IA avec du JSON-LD en sortie et un rate limiting adapté, un système de provenance qui trace chaque claim jusqu'à son auteur et sa date de vérification, et un monitoring continu pour détecter les régressions avant qu'elles ne propagent du contenu corrompu dans les réponses IA.\u003C/p>\n\u003Cp>Les marques qui construisent cette couche technique maintenant prennent de l'avance dans un jeu où la visibilité se déplace progressivement du SERP classique vers les réponses générées. Ce n'est pas une question de si, mais de quand.\u003C/p>\n\u003Cpre>\u003Ccode>\u003C/code>\u003C/pre>",null,12,[18,19,20,21,22,23],"llms.txt","LLM","entity graph","structured data","AI citations","architecture SEO","Au-delà de llms.txt : l'architecture pour exister dans les réponses IA","Sun Apr 05 2026 01:46:32 GMT+0000 (Coordinated Universal Time)",[27,43,57],{"_id":28,"slug":29,"__v":6,"author":7,"canonical":30,"category":10,"createdAt":31,"date":32,"description":33,"image":15,"imageAlt":15,"readingTime":34,"tags":35,"title":41,"updatedAt":42},"69d481e1f4fa19862862f691","how-to-design-content-that-ai-systems-prefer-and-promote","https://seogard.io/blog/how-to-design-content-that-ai-systems-prefer-and-promote","2026-04-07T04:02:41.265Z","2026-04-07","Comment le passage-level retrieval fonctionne et pourquoi un contenu answer-first, structuré par blocs, maximise vos chances d'être surfacé par les IA.",14,[36,37,38,39,40],"AI content design","passage retrieval","answer-first","structured content","SEO technique","Structurer le contenu pour les systèmes IA : passage retrieval et answer-first","Tue Apr 07 2026 04:02:41 GMT+0000 (Coordinated Universal Time)",{"_id":44,"slug":45,"__v":6,"author":7,"canonical":46,"category":10,"createdAt":47,"date":32,"description":48,"image":15,"imageAlt":15,"readingTime":16,"tags":49,"title":55,"updatedAt":56},"69d4ba23f4fa19862878e7ce","chatgpt-now-crawls-3-6x-more-than-googlebot-what-24m-requests-reveal","https://seogard.io/blog/chatgpt-now-crawls-3-6x-more-than-googlebot-what-24m-requests-reveal","2026-04-07T08:02:43.199Z","Analyse technique de 24M de requêtes de crawl : pourquoi ChatGPT-User dépasse Googlebot et comment adapter votre infrastructure serveur.",[50,51,52,53,54],"chatgpt","googlebot","crawl budget","log analysis","AI crawlers","ChatGPT crawle 3.6x plus que Googlebot : analyse de 24M de requêtes","Tue Apr 07 2026 08:02:43 GMT+0000 (Coordinated Universal Time)",{"_id":58,"slug":59,"__v":6,"author":7,"canonical":60,"category":10,"createdAt":61,"date":62,"description":63,"image":15,"imageAlt":15,"readingTime":16,"tags":64,"title":69,"updatedAt":70},"69d3db11f4fa19862809a070","seo-in-2026-higher-standards-ai-influence-and-a-web-still-catching-up","https://seogard.io/blog/seo-in-2026-higher-standards-ai-influence-and-a-web-still-catching-up","2026-04-06T16:10:57.670Z","2026-04-06","Analyse technique des évolutions SEO 2026 : gestion des bots IA, LLMs.txt, structured data avancé et monitoring des régressions critiques.",[65,66,21,67,68],"seo 2026","AI SEO","LLMs.txt","technical SEO","SEO en 2026 : standards relevés, IA omniprésente, web en retard","Mon Apr 06 2026 16:10:57 GMT+0000 (Coordinated Universal Time)"]