[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fNDnM6Wy7OZGWBIDSqnKAlI_EHsXNtgWpY4oYzuznXeI":3,"$fE8mzuLcfUwHuiTYnrFBqKMn2IhnsiUXnfyubjFwFtEM":25},{"_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":23,"updatedAt":24},"69fdfb2eaa6b273b0c38f8ac","how-to-run-prompt-level-seo-experiments-for-ai-search",0,"Equipe Seogard","Un site e-commerce de 22 000 pages produit perd 18 % de son trafic referral depuis ChatGPT en trois semaines. Aucune modification de contenu. Aucune pénalité. Le problème : une reformulation mineure dans les prompts utilisateurs a déplacé les citations vers un concurrent dont le contenu structurel répondait mieux à la nouvelle formulation. Sans framework de test prompt-level, l'équipe SEO a mis 11 jours à identifier la cause.\n\nL'AI search ne fonctionne pas comme le ranking classique. Il n'y a pas de position 1 à 10 — il y a une inclusion ou une absence dans la réponse générée. Et cette inclusion dépend directement de la manière dont le prompt est formulé, du contexte conversationnel, et de la façon dont le LLM gronde sa réponse sur les sources disponibles. Tester cette mécanique exige une méthodologie radicalement différente du split testing SEO traditionnel.\n\n## Pourquoi le SEO classique ne s'applique pas aux prompt-level experiments\n\nLe ranking organique est déterministe à un instant T : pour une requête donnée, sur un device donné, dans une localisation donnée, Google retourne un classement relativement stable. Vous pouvez tracker des positions, mesurer des CTR, calculer des corrélations entre modifications on-page et variations de ranking.\n\nLes réponses LLM sont stochastiques. Le même prompt soumis deux fois à GPT-4o ou Gemini peut produire des citations différentes. La température du modèle, le contexte de la conversation, le timing du crawl des sources, et même le load balancing entre instances du modèle introduisent de la variance.\n\nConséquence directe : vous ne pouvez pas traiter un test de visibilité AI comme un test de position Google. Vous devez raisonner en termes de **fréquence d'inclusion** (sur N exécutions du même prompt, combien de fois votre domaine apparaît dans la réponse) et de **qualité de citation** (mention du brand, lien direct, paraphrase sans attribution).\n\n### La différence fondamentale : retrieval vs ranking\n\nQuand Bing gronde une réponse pour Copilot ou quand Google construit un AI Overview, le processus suit un pipeline en deux étapes distinctes — [un processus que Bing a détaillé publiquement](/blog/bing-team-describes-how-grounding-differs-from-search-indexing-via-sejournal-mattgsouthern). D'abord le retrieval : le système sélectionne un ensemble de documents candidats. Ensuite le grounding : le LLM synthétise une réponse en s'appuyant sur ces documents.\n\nVotre contenu peut échouer à l'une ou l'autre étape. Un prompt-level experiment bien conçu doit vous permettre de distinguer entre \"mon contenu n'est pas dans le retrieval set\" et \"mon contenu est récupéré mais le LLM ne le cite pas dans sa réponse\". Ce sont deux problèmes distincts qui appellent des corrections différentes.\n\n## Concevoir un corpus de prompts contrôlés\n\nLa première erreur que commettent les équipes SEO : tester avec des prompts trop vagues ou trop peu nombreux. \"Quel est le meilleur CRM pour PME ?\" est un prompt, pas un test. Un test exige un corpus structuré avec des variables isolées.\n\n### Taxonomie des variables de prompt\n\nPour chaque sujet que vous testez, vous devez faire varier systématiquement ces dimensions :\n\n- **Intent framing** : informationnelle (\"comment fonctionne X\"), comparative (\"X vs Y\"), transactionnelle (\"meilleur X pour [use case]\"), recommandation (\"quel X recommandez-vous\")\n- **Spécificité** : générique (\"meilleur outil SEO\") vs niché (\"meilleur outil de monitoring SSR pour sites Next.js en production\")\n- **Persona implicite** : débutant (\"expliquez-moi simplement\") vs expert (\"d'un point de vue technique\")\n- **Contexte géographique** : avec ou sans mention de localisation\n- **Temporalité** : \"en 2026\", \"actuellement\", sans mention temporelle\n\nUn corpus minimal pour un sujet donné doit croiser au minimum intent × spécificité × persona, soit 12 à 24 prompts distincts par sujet testé.\n\n### Générer et versionner le corpus\n\nStockez vos prompts dans un format structuré. Un fichier YAML versionné dans Git vous permet de tracker les modifications et de reproduire exactement les mêmes tests d'un mois à l'autre :\n\n```yaml\n# prompt_corpus/crm-pme.yaml\nexperiment:\n  id: \"crm-pme-v3\"\n  subject: \"CRM pour PME\"\n  created: \"2026-05-01\"\n  target_domain: \"votredomaine.fr\"\n\nprompts:\n  - id: \"crm-pme-info-generic-beginner\"\n    text: \"Comment choisir un CRM adapté à une PME de 20 salariés ?\"\n    intent: \"informational\"\n    specificity: \"generic\"\n    persona: \"beginner\"\n    geo: null\n    temporal: null\n\n  - id: \"crm-pme-compare-specific-expert\"\n    text: \"Comparaison technique entre HubSpot CRM et Pipedrive pour une équipe sales B2B de 15 personnes avec intégration Salesforce existante\"\n    intent: \"comparative\"\n    specificity: \"specific\"\n    persona: \"expert\"\n    geo: null\n    temporal: null\n\n  - id: \"crm-pme-reco-specific-beginner-geo\"\n    text: \"Quel CRM recommandez-vous pour une PME française dans le secteur industriel ?\"\n    intent: \"recommendation\"\n    specificity: \"specific\"\n    persona: \"beginner\"\n    geo: \"france\"\n    temporal: null\n\n  - id: \"crm-pme-transac-generic-expert-temporal\"\n    text: \"Meilleur CRM B2B en 2026 pour scale-up SaaS avec API ouverte\"\n    intent: \"transactional\"\n    specificity: \"generic\"\n    persona: \"expert\"\n    geo: null\n    temporal: \"2026\"\n```\n\nCe format vous permet d'ajouter des prompts sans casser la structure, de filtrer par dimension dans vos analyses, et surtout de garantir la reproductibilité. Chaque prompt a un ID unique — c'est votre unité expérimentale.\n\n## Automatiser l'exécution et la collecte de données\n\nExécuter manuellement 24 prompts × 3 LLMs × 5 répétitions = 360 requêtes, puis analyser chaque réponse à la main, ne passe pas à l'échelle. Vous avez besoin d'un pipeline automatisé.\n\n### Script de collecte multi-LLM\n\nVoici un script TypeScript qui exécute un corpus de prompts contre plusieurs APIs LLM et stocke les résultats de manière structurée :\n\n```typescript\nimport OpenAI from \"openai\";\nimport Anthropic from \"@anthropic-ai/sdk\";\nimport { readFileSync, writeFileSync, mkdirSync } from \"fs\";\nimport { parse } from \"yaml\";\n\ninterface PromptEntry {\n  id: string;\n  text: string;\n  intent: string;\n  specificity: string;\n  persona: string;\n}\n\ninterface ExperimentResult {\n  prompt_id: string;\n  llm: string;\n  run_index: number;\n  timestamp: string;\n  response_text: string;\n  target_domain_mentioned: boolean;\n  target_brand_mentioned: boolean;\n  citation_type: \"direct_link\" | \"brand_mention\" | \"paraphrase\" | \"absent\";\n  competitor_domains: string[];\n  response_length: number;\n}\n\nconst RUNS_PER_PROMPT = 5;\nconst TARGET_DOMAIN = \"votredomaine.fr\";\nconst TARGET_BRAND = \"VotreMarque\";\n\nconst openai = new OpenAI();\nconst anthropic = new Anthropic();\n\nfunction analyzeResponse(text: string): Pick\u003C\n  ExperimentResult,\n  \"target_domain_mentioned\" | \"target_brand_mentioned\" | \"citation_type\" | \"competitor_domains\"\n> {\n  const domainMentioned = text.toLowerCase().includes(TARGET_DOMAIN);\n  const brandMentioned = text.toLowerCase().includes(TARGET_BRAND.toLowerCase());\n\n  let citationType: ExperimentResult[\"citation_type\"] = \"absent\";\n  if (domainMentioned) citationType = \"direct_link\";\n  else if (brandMentioned) citationType = \"brand_mention\";\n\n  // Extraction basique des domaines concurrents — à affiner avec regex spécifiques\n  const domainRegex = /(?:https?:\\/\\/)?(?:www\\.)?([a-zA-Z0-9-]+\\.[a-z]{2,})/g;\n  const competitors = [...new Set(\n    [...text.matchAll(domainRegex)]\n      .map(m => m[1])\n      .filter(d => d !== TARGET_DOMAIN && !d.includes(\"openai\") && !d.includes(\"anthropic\"))\n  )];\n\n  return { target_domain_mentioned: domainMentioned, target_brand_mentioned: brandMentioned, citation_type: citationType, competitor_domains: competitors };\n}\n\nasync function runExperiment(corpusPath: string): Promise\u003CExperimentResult[]> {\n  const corpus = parse(readFileSync(corpusPath, \"utf-8\"));\n  const results: ExperimentResult[] = [];\n\n  for (const prompt of corpus.experiment.prompts as PromptEntry[]) {\n    for (let run = 0; run \u003C RUNS_PER_PROMPT; run++) {\n      // OpenAI GPT-4o\n      const gptResponse = await openai.chat.completions.create({\n        model: \"gpt-4o\",\n        messages: [{ role: \"user\", content: prompt.text }],\n        temperature: 1.0, // température max pour capturer la variance\n      });\n      const gptText = gptResponse.choices[0]?.message?.content ?? \"\";\n      results.push({\n        prompt_id: prompt.id,\n        llm: \"gpt-4o\",\n        run_index: run,\n        timestamp: new Date().toISOString(),\n        response_text: gptText,\n        ...analyzeResponse(gptText),\n        response_length: gptText.length,\n      });\n\n      // Claude 3.5 Sonnet\n      const claudeResponse = await anthropic.messages.create({\n        model: \"claude-sonnet-4-20250514\",\n        max_tokens: 2048,\n        messages: [{ role: \"user\", content: prompt.text }],\n      });\n      const claudeText = claudeResponse.content[0]?.type === \"text\"\n        ? claudeResponse.content[0].text : \"\";\n      results.push({\n        prompt_id: prompt.id,\n        llm: \"claude-3.5-sonnet\",\n        run_index: run,\n        timestamp: new Date().toISOString(),\n        response_text: claudeText,\n        ...analyzeResponse(claudeText),\n        response_length: claudeText.length,\n      });\n\n      // Rate limiting basique\n      await new Promise(r => setTimeout(r, 1500));\n    }\n  }\n  return results;\n}\n\nasync function main() {\n  const results = await runExperiment(\"./prompt_corpus/crm-pme.yaml\");\n  mkdirSync(\"./results\", { recursive: true });\n  writeFileSync(\n    `./results/experiment-${Date.now()}.json`,\n    JSON.stringify(results, null, 2)\n  );\n  console.log(`${results.length} résultats collectés.`);\n}\n\nmain();\n```\n\nQuelques détails importants dans ce script :\n\n- **Temperature à 1.0** : on veut capturer la variance naturelle du modèle, pas la réponse la plus probable. C'est l'opposé de ce que vous feriez pour un chatbot en production.\n- **5 runs par prompt** : c'est le minimum pour commencer à estimer une fréquence d'inclusion. Pour des résultats statistiquement fiables, visez 20+ runs sur les prompts critiques.\n- **Analyse naïve** : la fonction `analyzeResponse` est volontairement simpliste. En production, vous voudrez un classificateur plus robuste — potentiellement un second LLM qui analyse la réponse avec un prompt structuré.\n\n### Limites importantes de cette approche\n\nLes APIs LLM ne reproduisent pas exactement le comportement de ChatGPT web, Copilot, ou Google AI Overviews. Quand un utilisateur pose une question dans ChatGPT, le système peut déclencher une recherche web via Bing, utiliser le browsing tool, ou s'appuyer uniquement sur les données d'entraînement. L'API par défaut n'a pas accès au web.\n\nPour tester le comportement avec web grounding, vous devez activer les search tools quand ils sont disponibles (OpenAI le propose via le paramètre `web_search` sur certains modèles) ou utiliser des outils tiers qui automatisent la version web des interfaces. C'est un trade-off entre contrôle expérimental et fidélité au comportement réel.\n\n## Métriques de mesure : au-delà de la simple mention\n\nLe piège classique : réduire la visibilité AI à un binaire \"mentionné / pas mentionné\". La réalité est bien plus granulaire, et [les signaux qui définissent la visibilité AI](/blog/4-signals-that-now-define-visibility-in-ai-search) sont multiples.\n\n### Le framework FICQ (Frequency, Inclusion depth, Citation quality, Query coverage)\n\n**Frequency** — Sur 20 exécutions du même prompt, combien de fois votre domaine/brand apparaît. Exprimé en pourcentage. Un score de 60 % signifie que vous êtes cité 12 fois sur 20. C'est votre métrique principale.\n\n**Inclusion depth** — Où dans la réponse votre mention apparaît. Premier paragraphe (haute autorité topique perçue par le LLM), milieu de réponse (source complémentaire), ou fin (mention accessoire). Codez cela en position relative : `position_du_premier_caractère_mentionnant_votre_brand / longueur_totale_de_la_réponse`.\n\n**Citation quality** — Quatre niveaux :\n1. Lien direct avec attribution (\"selon VotreMarque.fr, ...\")\n2. Mention de brand sans lien (\"VotreMarque recommande...\")\n3. Paraphrase identifiable (votre contenu est utilisé mais sans attribution)\n4. Absent\n\n**Query coverage** — Sur votre corpus de 24 prompts, combien de catégories de prompts (intent × specificity) déclenchent une inclusion. Un coverage de 100 % en informationnelle mais 0 % en transactionnelle vous indique un problème de positionnement commercial dans votre contenu.\n\n### Tableau de bord de suivi\n\nStructurez votre reporting dans un format qui permet la comparaison temporelle. Voici un exemple de sortie agrégée :\n\n```\n┌──────────────────────────┬────────┬────────┬──────────┬──────────┐\n│ Prompt Category          │ Freq % │ Depth  │ Cit. Qty │ Coverage │\n├──────────────────────────┼────────┼────────┼──────────┼──────────┤\n│ info / generic / begin   │   65%  │  0.12  │  brand   │    ✓     │\n│ info / specific / expert │   80%  │  0.08  │  link    │    ✓     │\n│ compare / generic / beg  │   40%  │  0.45  │  para    │    ✓     │\n│ compare / specific / exp │   55%  │  0.22  │  brand   │    ✓     │\n│ reco / generic / begin   │   20%  │  0.67  │  para    │    ✓     │\n│ reco / specific / expert │   35%  │  0.31  │  brand   │    ✓     │\n│ transac / generic / exp  │   10%  │  0.78  │  para    │    ✗     │\n│ transac / specific / beg │    5%  │  0.82  │  absent  │    ✗     │\n└──────────────────────────┴────────┴────────┴──────────┴──────────┘\n```\n\nCe tableau raconte une histoire claire : le domaine testé a une forte visibilité sur les requêtes informationnelles mais disparaît quasi-complètement sur les requêtes transactionnelles. L'action corrective est évidente — renforcer le contenu à intent commercial avec des éléments structurels que le LLM peut extraire (comparatifs chiffrés, tableaux de fonctionnalités, recommandations explicites).\n\n## Isoler les variables : la méthodologie du test contrôlé\n\nVous avez observé que votre fréquence d'inclusion baisse de 65 % à 40 % sur les prompts comparatifs. Avant de réécrire tout votre contenu, vous devez identifier la variable causale. Est-ce le contenu, la structure, l'autorité perçue, ou la formulation du prompt ?\n\n### Test A/B côté contenu\n\nContrairement au SEO classique où un A/B test nécessite du trafic significatif et des semaines de données, en AI search vous pouvez tester l'impact d'une modification de contenu en quelques heures — à condition que le LLM ait accès au web et que votre page modifiée soit recrawlée.\n\nLe protocole :\n\n1. Identifiez une page qui est dans le retrieval set (vérifiable via les logs de crawl — [l'activité de crawl d'OpenAI a triplé récemment](/blog/openai-crawl-activity-tripled-since-gpt-5-data-shows-via-sejournal-mattgsouthern), ce qui facilite les expérimentations).\n2. Exécutez votre corpus de prompts (baseline : 20 runs minimum).\n3. Modifiez **une seule variable** sur la page : par exemple, ajoutez un tableau comparatif structuré en HTML.\n4. Attendez le recrawl (monitorez vos logs serveur pour confirmer le passage du bot).\n5. Ré-exécutez exactement le même corpus de prompts.\n6. Comparez les métriques FICQ.\n\n### Test A/B côté prompt (isolation de la formulation)\n\nParfois, le problème n'est pas votre contenu mais votre compréhension des prompts réels utilisés par les internautes. Testez des variations de prompt pour identifier quelles formulations déclenchent ou non l'inclusion de votre domaine :\n\n```yaml\n# Variation test : impact de la mention de critères techniques\ncontrol:\n  text: \"Quel outil de monitoring SEO choisir ?\"\n  expected_result: \"baseline frequency\"\n\nvariant_a:\n  text: \"Quel outil de monitoring SEO choisir pour détecter les régressions techniques ?\"\n  changed_variable: \"specificity_technical_criteria\"\n\nvariant_b:\n  text: \"Quel outil de monitoring SEO choisir pour un site e-commerce de 10 000 pages ?\"\n  changed_variable: \"specificity_scale\"\n\nvariant_c:\n  text: \"Recommandez-moi un outil de monitoring SEO technique avec alertes automatiques\"\n  changed_variable: \"intent_shift_to_recommendation\"\n```\n\nSi la variant_a multiplie votre fréquence d'inclusion par 3 par rapport au control, vous savez que votre contenu est fortement associé par le LLM au concept de \"régressions techniques\" — et vous pouvez optimiser votre stratégie de contenu en conséquence.\n\n## Scénario complet : un SaaS B2B de 4 200 pages\n\nContexte réaliste. DataPulse (nom fictif) est un SaaS d'analytics B2B. 4 200 pages indexées : 180 pages produit, 850 articles de blog, 3 100 pages de documentation technique, et environ 70 landing pages. L'équipe SEO a remarqué que ChatGPT mentionne systématiquement deux concurrents (Mixpanel, Amplitude) mais jamais DataPulse dans les réponses aux prompts comparatifs.\n\n### Phase 1 : Audit de baseline (semaine 1)\n\nL'équipe construit un corpus de 36 prompts couvrant 4 intents × 3 niveaux de spécificité × 3 personas. Chaque prompt est exécuté 20 fois sur GPT-4o et 20 fois sur Claude. Total : 36 × 20 × 2 = 1 440 requêtes API. Coût approximatif : ~85 € en tokens.\n\nRésultats baseline :\n- Fréquence d'inclusion GPT-4o : 8 % (principalement sur prompts informationnels très spécifiques liés à la documentation technique)\n- Fréquence d'inclusion Claude : 12 %\n- Citation quality dominante : paraphrase sans attribution\n- Coverage : 3 catégories de prompts sur 12\n\nL'équipe identifie que [le LLM comprend la marque principalement via sa documentation technique](/blog/how-ai-models-understand-your-brand), pas via ses contenus marketing ou comparatifs.\n\n### Phase 2 : Hypothèse et intervention (semaines 2-3)\n\nHypothèse : les pages comparatives de DataPulse n'ont pas de structure extractible par le LLM. Les concurrents ont des pages `/vs/` avec des tableaux HTML standardisés.\n\nIntervention : création de 8 pages `/vs/[concurrent]` avec une structure HTML sémantique optimisée pour l'extraction LLM :\n\n```html\n\u003Carticle itemscope itemtype=\"https://schema.org/Article\">\n  \u003Ch1>DataPulse vs Mixpanel : comparaison technique complète\u003C/h1>\n\n  \u003Csection aria-label=\"Résumé de la comparaison\">\n    \u003Cp>DataPulse est une plateforme d'analytics B2B spécialisée dans\n    le tracking d'événements produit avec rétention de données illimitée.\n    Mixpanel se concentre sur l'analytics produit avec des fonctionnalités\n    avancées de segmentation comportementale.\u003C/p>\n  \u003C/section>\n\n  \u003Ctable>\n    \u003Ccaption>Comparaison fonctionnelle DataPulse vs Mixpanel — Mai 2026\u003C/caption>\n    \u003Cthead>\n      \u003Ctr>\n        \u003Cth scope=\"col\">Critère\u003C/th>\n        \u003Cth scope=\"col\">DataPulse\u003C/th>\n        \u003Cth scope=\"col\">Mixpanel\u003C/th>\n      \u003C/tr>\n    \u003C/thead>\n    \u003Ctbody>\n      \u003Ctr>\n        \u003Cth scope=\"row\">Rétention de données\u003C/th>\n        \u003Ctd>Illimitée (plan Pro)\u003C/td>\n        \u003Ctd>12 mois (plan Growth), 36 mois (Enterprise)\u003C/td>\n      \u003C/tr>\n      \u003Ctr>\n        \u003Cth scope=\"row\">SDK server-side\u003C/th>\n        \u003Ctd>Node.js, Python, Go, Rust\u003C/td>\n        \u003Ctd>Node.js, Python, Java, Ruby\u003C/td>\n      \u003C/tr>\n      \u003Ctr>\n        \u003Cth scope=\"row\">Export API rate limit\u003C/th>\n        \u003Ctd>10 000 req/min\u003C/td>\n        \u003Ctd>2 000 req/min (peut être augmenté sur Enterprise)\u003C/td>\n      \u003C/tr>\n      \u003Ctr>\n        \u003Cth scope=\"row\">Conformité RGPD\u003C/th>\n        \u003Ctd>Hébergement EU natif, DPA inclus\u003C/td>\n        \u003Ctd>EU data residency en option ($), DPA sur demande\u003C/td>\n      \u003C/tr>\n    \u003C/tbody>\n  \u003C/table>\n\n  \u003Csection aria-label=\"Verdict\">\n    \u003Ch2>Quand choisir DataPulse plutôt que Mixpanel\u003C/h2>\n    \u003Cp>DataPulse est le meilleur choix pour les équipes B2B qui ont besoin\n    d'une rétention de données illimitée et d'un hébergement européen natif.\n    Mixpanel reste pertinent pour les équipes produit B2C qui priorisent\n    la segmentation comportementale avancée.\u003C/p>\n  \u003C/section>\n\u003C/article>\n```\n\nPoints clés de cette structure : le paragraphe d'introduction fournit un résumé extractible sans parser le tableau, le tableau utilise des `scope` pour la lisibilité machine, et la section verdict formule une recommandation explicite — exactement le type de contenu qu'un LLM peut citer directement dans une réponse comparative.\n\n### Phase 3 : Re-test et mesure d'impact (semaine 4)\n\nAprès confirmation du crawl des nouvelles pages par les bots IA (GPTBot, ClaudeBot, Bingbot — vérifiés dans les access logs), l'équipe ré-exécute le même corpus de 36 prompts × 20 runs × 2 LLMs.\n\nRésultats post-intervention :\n- Fréquence d'inclusion GPT-4o : 34 % (+26 points)\n- Fréquence d'inclusion Claude : 41 % (+29 points)\n- Citation quality dominante : brand mention (progression depuis paraphrase)\n- Coverage : 8 catégories sur 12\n\nL'amélioration est concentrée sur les prompts comparatifs et de recommandation — exactement les catégories ciblées par l'intervention. Les prompts informationnels restent stables, ce qui valide l'isolation de la variable.\n\n## Construire un framework de test reproductible et continu\n\nUn test ponctuel ne suffit pas. La visibilité AI est volatile — les modèles sont mis à jour, les données d'entraînement changent, les concurrents optimisent. Vous avez besoin d'un framework qui tourne en continu, comme un [pipeline de diagnostic automatisé](/blog/the-10-gate-ai-search-pipeline-find-where-your-content-fails).\n\n### Architecture du framework\n\nLe framework minimal comporte trois couches :\n\n**Couche 1 — Corpus management** : vos fichiers YAML de prompts, versionnés dans Git. Revue et mise à jour mensuelle. Ajout de nouveaux prompts basés sur les requêtes réelles observées (si vous avez accès aux logs de recherche interne, aux données Search Console, ou aux outils de monitoring de citations AI).\n\n**Couche 2 — Execution pipeline** : un cron job (ou GitHub Action) qui exécute le corpus à fréquence régulière. Hebdomadaire pour la plupart des sites, quotidien si vous êtes en phase d'optimisation active.\n\n**Couche 3 — Analysis et alerting** : agrégation des résultats, calcul des métriques FICQ, détection des régressions. Un outil de monitoring comme Seogard permet de corréler les variations de visibilité AI avec les changements détectés sur vos pages (meta modifiées, contenu disparu, SSR cassé) — car souvent, une régression de visibilité AI a une cause technique identifiable côté site.\n\n### Tracking des régressions\n\nLe signal le plus actionable n'est pas votre score absolu — c'est la variation. Si votre fréquence d'inclusion passe de 55 % à 30 % sur une catégorie de prompts en une semaine, quelque chose a changé. Les causes possibles :\n\n- Un concurrent a publié du contenu plus pertinent\n- Votre page a été modifiée (intentionnellement ou par régression)\n- Le modèle a été mis à jour\n- Le retrieval system a changé sa logique de sélection\n\nPour les deux premières causes, vous avez des leviers d'action. Pour les deux dernières, vous devez adapter votre contenu. Dans tous les cas, sans monitoring continu, vous ne saurez jamais que la régression a eu lieu — jusqu'à ce que votre trafic referral AI s'effondre.\n\n## Pièges et limites de l'expérimentation prompt-level\n\n### Le biais de l'API vs l'interface utilisateur\n\nLes réponses via API et via l'interface web de ChatGPT/Copilot/Gemini ne sont pas identiques. L'interface web peut déclencher des recherches web, afficher des images, utiliser des plugins. L'API vous donne un contrôle fin sur les paramètres mais ne reproduit pas l'expérience utilisateur réelle.\n\nCombinez les deux approches : API pour les tests à grande échelle et le suivi quantitatif, vérification manuelle sur les interfaces web pour les prompts critiques (vos 5-10 prompts les plus importants business).\n\n### Le coût en tokens\n\nÀ 20 runs × 36 prompts × 2 LLMs, vous générez 1 440 appels API par cycle de test. Avec des réponses moyennes de 800 tokens et un coût moyen de ~0,01 € par requête, chaque cycle coûte environ 15-20 €. Sur un rythme hebdomadaire, c'est ~80 € par mois — raisonnable pour un sujet de test. Mais si vous testez 10 sujets en parallèle, le budget mensuel monte à 800 €. Dimensionnez vos tests en fonction de la valeur business de chaque sujet.\n\n### L'absence de ground truth\n\nContrairement au SEO classique où Search Console vous donne des données first-party sur vos impressions et clics, il n'existe pas encore de source de vérité côté LLM. [Google commence à exposer des données dans Search Console](/blog/google-fixes-search-console-s-year-long-data-logging-issue-well-kind-of) et [Bing propose des métriques de citation AI](/blog/bing-previews-ai-citation-share-for-webmaster-tools-via-sejournal-mattgsouthern), mais ces données restent partielles. Vos propres tests sont votre meilleure source de signal — à condition qu'ils soient méthodologiquement rigoureux.\n\n### La tentation du sur-optimisation\n\nUn contenu structuré exclusivement pour l'extraction LLM peut devenir illisible pour les humains. Les tableaux comparatifs, les FAQ, les résumés TL;DR sont utiles — mais si chaque page de votre site ressemble à un template de réponse IA, vous [perdez le signal d'authenticité et de profondeur](/blog/why-more-content-is-no-longer-a-reliable-way-to-grow-seo) qui fait qu'un LLM vous considère comme une source fiable en premier lieu. Le paradoxe : le meilleur contenu pour l'AI search est du contenu écrit pour des experts humains, avec une structure qui facilite l'extraction machine","https://seogard.io/blog/how-to-run-prompt-level-seo-experiments-for-ai-search","Actualités SEO","2026-05-08T15:03:10.029Z","2026-05-08","Méthodologie complète pour isoler des variables, mesurer l'inclusion dans les réponses LLM et construire un framework de tests reproductibles pour la visibilité AI.","\u003Cp>Un site e-commerce de 22 000 pages produit perd 18 % de son trafic referral depuis ChatGPT en trois semaines. Aucune modification de contenu. Aucune pénalité. Le problème : une reformulation mineure dans les prompts utilisateurs a déplacé les citations vers un concurrent dont le contenu structurel répondait mieux à la nouvelle formulation. Sans framework de test prompt-level, l'équipe SEO a mis 11 jours à identifier la cause.\u003C/p>\n\u003Cp>L'AI search ne fonctionne pas comme le ranking classique. Il n'y a pas de position 1 à 10 — il y a une inclusion ou une absence dans la réponse générée. Et cette inclusion dépend directement de la manière dont le prompt est formulé, du contexte conversationnel, et de la façon dont le LLM gronde sa réponse sur les sources disponibles. Tester cette mécanique exige une méthodologie radicalement différente du split testing SEO traditionnel.\u003C/p>\n\u003Ch2>Pourquoi le SEO classique ne s'applique pas aux prompt-level experiments\u003C/h2>\n\u003Cp>Le ranking organique est déterministe à un instant T : pour une requête donnée, sur un device donné, dans une localisation donnée, Google retourne un classement relativement stable. Vous pouvez tracker des positions, mesurer des CTR, calculer des corrélations entre modifications on-page et variations de ranking.\u003C/p>\n\u003Cp>Les réponses LLM sont stochastiques. Le même prompt soumis deux fois à GPT-4o ou Gemini peut produire des citations différentes. La température du modèle, le contexte de la conversation, le timing du crawl des sources, et même le load balancing entre instances du modèle introduisent de la variance.\u003C/p>\n\u003Cp>Conséquence directe : vous ne pouvez pas traiter un test de visibilité AI comme un test de position Google. Vous devez raisonner en termes de \u003Cstrong>fréquence d'inclusion\u003C/strong> (sur N exécutions du même prompt, combien de fois votre domaine apparaît dans la réponse) et de \u003Cstrong>qualité de citation\u003C/strong> (mention du brand, lien direct, paraphrase sans attribution).\u003C/p>\n\u003Ch3>La différence fondamentale : retrieval vs ranking\u003C/h3>\n\u003Cp>Quand Bing gronde une réponse pour Copilot ou quand Google construit un AI Overview, le processus suit un pipeline en deux étapes distinctes — \u003Ca href=\"/blog/bing-team-describes-how-grounding-differs-from-search-indexing-via-sejournal-mattgsouthern\">un processus que Bing a détaillé publiquement\u003C/a>. D'abord le retrieval : le système sélectionne un ensemble de documents candidats. Ensuite le grounding : le LLM synthétise une réponse en s'appuyant sur ces documents.\u003C/p>\n\u003Cp>Votre contenu peut échouer à l'une ou l'autre étape. Un prompt-level experiment bien conçu doit vous permettre de distinguer entre \"mon contenu n'est pas dans le retrieval set\" et \"mon contenu est récupéré mais le LLM ne le cite pas dans sa réponse\". Ce sont deux problèmes distincts qui appellent des corrections différentes.\u003C/p>\n\u003Ch2>Concevoir un corpus de prompts contrôlés\u003C/h2>\n\u003Cp>La première erreur que commettent les équipes SEO : tester avec des prompts trop vagues ou trop peu nombreux. \"Quel est le meilleur CRM pour PME ?\" est un prompt, pas un test. Un test exige un corpus structuré avec des variables isolées.\u003C/p>\n\u003Ch3>Taxonomie des variables de prompt\u003C/h3>\n\u003Cp>Pour chaque sujet que vous testez, vous devez faire varier systématiquement ces dimensions :\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Intent framing\u003C/strong> : informationnelle (\"comment fonctionne X\"), comparative (\"X vs Y\"), transactionnelle (\"meilleur X pour [use case]\"), recommandation (\"quel X recommandez-vous\")\u003C/li>\n\u003Cli>\u003Cstrong>Spécificité\u003C/strong> : générique (\"meilleur outil SEO\") vs niché (\"meilleur outil de monitoring SSR pour sites Next.js en production\")\u003C/li>\n\u003Cli>\u003Cstrong>Persona implicite\u003C/strong> : débutant (\"expliquez-moi simplement\") vs expert (\"d'un point de vue technique\")\u003C/li>\n\u003Cli>\u003Cstrong>Contexte géographique\u003C/strong> : avec ou sans mention de localisation\u003C/li>\n\u003Cli>\u003Cstrong>Temporalité\u003C/strong> : \"en 2026\", \"actuellement\", sans mention temporelle\u003C/li>\n\u003C/ul>\n\u003Cp>Un corpus minimal pour un sujet donné doit croiser au minimum intent × spécificité × persona, soit 12 à 24 prompts distincts par sujet testé.\u003C/p>\n\u003Ch3>Générer et versionner le corpus\u003C/h3>\n\u003Cp>Stockez vos prompts dans un format structuré. Un fichier YAML versionné dans Git vous permet de tracker les modifications et de reproduire exactement les mêmes tests d'un mois à l'autre :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># prompt_corpus/crm-pme.yaml\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#85E89D\">experiment\u003C/span>\u003Cspan style=\"color:#E1E4E8\">:\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#85E89D\">  id\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"crm-pme-v3\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#85E89D\">  subject\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"CRM pour PME\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#85E89D\">  created\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"2026-05-01\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#85E89D\">  target_domain\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"votredomaine.fr\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#85E89D\">prompts\u003C/span>\u003Cspan style=\"color:#E1E4E8\">:\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  - \u003C/span>\u003Cspan style=\"color:#85E89D\">id\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"crm-pme-info-generic-beginner\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#85E89D\">    text\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Comment choisir un CRM adapté à une PME de 20 salariés ?\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#85E89D\">    intent\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"informational\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#85E89D\">    specificity\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"generic\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#85E89D\">    persona\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"beginner\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#85E89D\">    geo\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#79B8FF\">null\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#85E89D\">    temporal\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#79B8FF\">null\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  - \u003C/span>\u003Cspan style=\"color:#85E89D\">id\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"crm-pme-compare-specific-expert\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#85E89D\">    text\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Comparaison technique entre HubSpot CRM et Pipedrive pour une équipe sales B2B de 15 personnes avec intégration Salesforce existante\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#85E89D\">    intent\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"comparative\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#85E89D\">    specificity\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"specific\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#85E89D\">    persona\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"expert\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#85E89D\">    geo\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#79B8FF\">null\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#85E89D\">    temporal\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#79B8FF\">null\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  - \u003C/span>\u003Cspan style=\"color:#85E89D\">id\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"crm-pme-reco-specific-beginner-geo\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#85E89D\">    text\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Quel CRM recommandez-vous pour une PME française dans le secteur industriel ?\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#85E89D\">    intent\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"recommendation\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#85E89D\">    specificity\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"specific\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#85E89D\">    persona\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"beginner\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#85E89D\">    geo\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"france\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#85E89D\">    temporal\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#79B8FF\">null\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  - \u003C/span>\u003Cspan style=\"color:#85E89D\">id\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"crm-pme-transac-generic-expert-temporal\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#85E89D\">    text\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Meilleur CRM B2B en 2026 pour scale-up SaaS avec API ouverte\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#85E89D\">    intent\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"transactional\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#85E89D\">    specificity\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"generic\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#85E89D\">    persona\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"expert\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#85E89D\">    geo\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#79B8FF\">null\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#85E89D\">    temporal\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"2026\"\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Ce format vous permet d'ajouter des prompts sans casser la structure, de filtrer par dimension dans vos analyses, et surtout de garantir la reproductibilité. Chaque prompt a un ID unique — c'est votre unité expérimentale.\u003C/p>\n\u003Ch2>Automatiser l'exécution et la collecte de données\u003C/h2>\n\u003Cp>Exécuter manuellement 24 prompts × 3 LLMs × 5 répétitions = 360 requêtes, puis analyser chaque réponse à la main, ne passe pas à l'échelle. Vous avez besoin d'un pipeline automatisé.\u003C/p>\n\u003Ch3>Script de collecte multi-LLM\u003C/h3>\n\u003Cp>Voici un script TypeScript qui exécute un corpus de prompts contre plusieurs APIs LLM et stocke les résultats de manière structurée :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">import\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> OpenAI \u003C/span>\u003Cspan style=\"color:#F97583\">from\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"openai\"\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\"> Anthropic \u003C/span>\u003Cspan style=\"color:#F97583\">from\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"@anthropic-ai/sdk\"\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\"> { readFileSync, writeFileSync, mkdirSync } \u003C/span>\u003Cspan style=\"color:#F97583\">from\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"fs\"\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\"> { parse } \u003C/span>\u003Cspan style=\"color:#F97583\">from\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"yaml\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">interface\u003C/span>\u003Cspan style=\"color:#B392F0\"> PromptEntry\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  id\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:#FFAB70\">  text\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:#FFAB70\">  intent\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:#FFAB70\">  specificity\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:#FFAB70\">  persona\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\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">interface\u003C/span>\u003Cspan style=\"color:#B392F0\"> ExperimentResult\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  prompt_id\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:#FFAB70\">  llm\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:#FFAB70\">  run_index\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> number\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  timestamp\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:#FFAB70\">  response_text\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:#FFAB70\">  target_domain_mentioned\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> boolean\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  target_brand_mentioned\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> boolean\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  citation_type\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"direct_link\"\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"brand_mention\"\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"paraphrase\"\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"absent\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  competitor_domains\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:#FFAB70\">  response_length\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> number\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:#F97583\">const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> RUNS_PER_PROMPT\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 5\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> TARGET_DOMAIN\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"votredomaine.fr\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> TARGET_BRAND\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"VotreMarque\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> openai\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#F97583\"> new\u003C/span>\u003Cspan style=\"color:#B392F0\"> OpenAI\u003C/span>\u003Cspan style=\"color:#E1E4E8\">();\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> anthropic\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#F97583\"> new\u003C/span>\u003Cspan style=\"color:#B392F0\"> Anthropic\u003C/span>\u003Cspan style=\"color:#E1E4E8\">();\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">function\u003C/span>\u003Cspan style=\"color:#B392F0\"> analyzeResponse\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#FFAB70\">text\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> string\u003C/span>\u003Cspan style=\"color:#E1E4E8\">)\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#B392F0\"> Pick\u003C/span>\u003Cspan style=\"color:#E1E4E8\">&#x3C;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">  ExperimentResult\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">  \"target_domain_mentioned\"\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"target_brand_mentioned\"\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"citation_type\"\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"competitor_domains\"\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\"> domainMentioned\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> text.\u003C/span>\u003Cspan style=\"color:#B392F0\">toLowerCase\u003C/span>\u003Cspan style=\"color:#E1E4E8\">().\u003C/span>\u003Cspan style=\"color:#B392F0\">includes\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#79B8FF\">TARGET_DOMAIN\u003C/span>\u003Cspan style=\"color:#E1E4E8\">);\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> brandMentioned\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> text.\u003C/span>\u003Cspan style=\"color:#B392F0\">toLowerCase\u003C/span>\u003Cspan style=\"color:#E1E4E8\">().\u003C/span>\u003Cspan style=\"color:#B392F0\">includes\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#79B8FF\">TARGET_BRAND\u003C/span>\u003Cspan style=\"color:#E1E4E8\">.\u003C/span>\u003Cspan style=\"color:#B392F0\">toLowerCase\u003C/span>\u003Cspan style=\"color:#E1E4E8\">());\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  let\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> citationType\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#B392F0\"> ExperimentResult\u003C/span>\u003Cspan style=\"color:#E1E4E8\">[\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"citation_type\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">] \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"absent\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  if\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> (domainMentioned) citationType \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"direct_link\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  else\u003C/span>\u003Cspan style=\"color:#F97583\"> if\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> (brandMentioned) citationType \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"brand_mention\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">  // Extraction basique des domaines concurrents — à affiner avec regex spécifiques\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> domainRegex\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> /\u003C/span>\u003Cspan style=\"color:#DBEDFF\">(?:https\u003C/span>\u003Cspan style=\"color:#F97583\">?\u003C/span>\u003Cspan style=\"color:#DBEDFF\">:\u003C/span>\u003Cspan style=\"color:#85E89D;font-weight:bold\">\\/\\/\u003C/span>\u003Cspan style=\"color:#DBEDFF\">)\u003C/span>\u003Cspan style=\"color:#F97583\">?\u003C/span>\u003Cspan style=\"color:#DBEDFF\">(?:www\u003C/span>\u003Cspan style=\"color:#85E89D;font-weight:bold\">\\.\u003C/span>\u003Cspan style=\"color:#DBEDFF\">)\u003C/span>\u003Cspan style=\"color:#F97583\">?\u003C/span>\u003Cspan style=\"color:#DBEDFF\">(\u003C/span>\u003Cspan style=\"color:#79B8FF\">[a-zA-Z0-9-]\u003C/span>\u003Cspan style=\"color:#F97583\">+\u003C/span>\u003Cspan style=\"color:#85E89D;font-weight:bold\">\\.\u003C/span>\u003Cspan style=\"color:#79B8FF\">[a-z]\u003C/span>\u003Cspan style=\"color:#F97583\">{2,}\u003C/span>\u003Cspan style=\"color:#DBEDFF\">)\u003C/span>\u003Cspan style=\"color:#9ECBFF\">/\u003C/span>\u003Cspan style=\"color:#F97583\">g\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> competitors\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> [\u003C/span>\u003Cspan style=\"color:#F97583\">...new\u003C/span>\u003Cspan style=\"color:#B392F0\"> Set\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    [\u003C/span>\u003Cspan style=\"color:#F97583\">...\u003C/span>\u003Cspan style=\"color:#E1E4E8\">text.\u003C/span>\u003Cspan style=\"color:#B392F0\">matchAll\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(domainRegex)]\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      .\u003C/span>\u003Cspan style=\"color:#B392F0\">map\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#FFAB70\">m\u003C/span>\u003Cspan style=\"color:#F97583\"> =>\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> m[\u003C/span>\u003Cspan style=\"color:#79B8FF\">1\u003C/span>\u003Cspan style=\"color:#E1E4E8\">])\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      .\u003C/span>\u003Cspan style=\"color:#B392F0\">filter\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#FFAB70\">d\u003C/span>\u003Cspan style=\"color:#F97583\"> =>\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> d \u003C/span>\u003Cspan style=\"color:#F97583\">!==\u003C/span>\u003Cspan style=\"color:#79B8FF\"> TARGET_DOMAIN\u003C/span>\u003Cspan style=\"color:#F97583\"> &#x26;&#x26;\u003C/span>\u003Cspan style=\"color:#F97583\"> !\u003C/span>\u003Cspan style=\"color:#E1E4E8\">d.\u003C/span>\u003Cspan style=\"color:#B392F0\">includes\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"openai\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">) \u003C/span>\u003Cspan style=\"color:#F97583\">&#x26;&#x26;\u003C/span>\u003Cspan style=\"color:#F97583\"> !\u003C/span>\u003Cspan style=\"color:#E1E4E8\">d.\u003C/span>\u003Cspan style=\"color:#B392F0\">includes\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"anthropic\"\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:#F97583\">  return\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> { target_domain_mentioned: domainMentioned, target_brand_mentioned: brandMentioned, citation_type: citationType, competitor_domains: competitors };\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\">async\u003C/span>\u003Cspan style=\"color:#F97583\"> function\u003C/span>\u003Cspan style=\"color:#B392F0\"> runExperiment\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#FFAB70\">corpusPath\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> string\u003C/span>\u003Cspan style=\"color:#E1E4E8\">)\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#B392F0\"> Promise\u003C/span>\u003Cspan style=\"color:#E1E4E8\">&#x3C;\u003C/span>\u003Cspan style=\"color:#B392F0\">ExperimentResult\u003C/span>\u003Cspan style=\"color:#E1E4E8\">[]> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> corpus\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#B392F0\"> parse\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#B392F0\">readFileSync\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(corpusPath, \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"utf-8\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">));\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> results\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#B392F0\"> ExperimentResult\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\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  for\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> (\u003C/span>\u003Cspan style=\"color:#F97583\">const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> prompt\u003C/span>\u003Cspan style=\"color:#F97583\"> of\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> corpus.experiment.prompts \u003C/span>\u003Cspan style=\"color:#F97583\">as\u003C/span>\u003Cspan style=\"color:#B392F0\"> PromptEntry\u003C/span>\u003Cspan style=\"color:#E1E4E8\">[]) {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    for\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> (\u003C/span>\u003Cspan style=\"color:#F97583\">let\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> run \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 0\u003C/span>\u003Cspan style=\"color:#E1E4E8\">; run \u003C/span>\u003Cspan style=\"color:#F97583\">&#x3C;\u003C/span>\u003Cspan style=\"color:#79B8FF\"> RUNS_PER_PROMPT\u003C/span>\u003Cspan style=\"color:#E1E4E8\">; run\u003C/span>\u003Cspan style=\"color:#F97583\">++\u003C/span>\u003Cspan style=\"color:#E1E4E8\">) {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">      // OpenAI GPT-4o\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">      const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> gptResponse\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#F97583\"> await\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> openai.chat.completions.\u003C/span>\u003Cspan style=\"color:#B392F0\">create\u003C/span>\u003Cspan style=\"color:#E1E4E8\">({\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        model: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"gpt-4o\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        messages: [{ role: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"user\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, content: prompt.text }],\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        temperature: \u003C/span>\u003Cspan style=\"color:#79B8FF\">1.0\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#6A737D\">// température max pour capturer la variance\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\"> gptText\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> gptResponse.choices[\u003C/span>\u003Cspan style=\"color:#79B8FF\">0\u003C/span>\u003Cspan style=\"color:#E1E4E8\">]?.message?.content \u003C/span>\u003Cspan style=\"color:#F97583\">??\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      results.\u003C/span>\u003Cspan style=\"color:#B392F0\">push\u003C/span>\u003Cspan style=\"color:#E1E4E8\">({\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        prompt_id: prompt.id,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        llm: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"gpt-4o\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        run_index: run,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        timestamp: \u003C/span>\u003Cspan style=\"color:#F97583\">new\u003C/span>\u003Cspan style=\"color:#B392F0\"> Date\u003C/span>\u003Cspan style=\"color:#E1E4E8\">().\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\">        response_text: gptText,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">        ...\u003C/span>\u003Cspan style=\"color:#B392F0\">analyzeResponse\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(gptText),\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        response_length: gptText.\u003C/span>\u003Cspan style=\"color:#79B8FF\">length\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\">      // Claude 3.5 Sonnet\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">      const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> claudeResponse\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#F97583\"> await\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> anthropic.messages.\u003C/span>\u003Cspan style=\"color:#B392F0\">create\u003C/span>\u003Cspan style=\"color:#E1E4E8\">({\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        model: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"claude-sonnet-4-20250514\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        max_tokens: \u003C/span>\u003Cspan style=\"color:#79B8FF\">2048\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        messages: [{ role: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"user\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, content: prompt.text }],\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\"> claudeText\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> claudeResponse.content[\u003C/span>\u003Cspan style=\"color:#79B8FF\">0\u003C/span>\u003Cspan style=\"color:#E1E4E8\">]?.type \u003C/span>\u003Cspan style=\"color:#F97583\">===\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"text\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">        ?\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> claudeResponse.content[\u003C/span>\u003Cspan style=\"color:#79B8FF\">0\u003C/span>\u003Cspan style=\"color:#E1E4E8\">].text \u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      results.\u003C/span>\u003Cspan style=\"color:#B392F0\">push\u003C/span>\u003Cspan style=\"color:#E1E4E8\">({\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        prompt_id: prompt.id,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        llm: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"claude-3.5-sonnet\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        run_index: run,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        timestamp: \u003C/span>\u003Cspan style=\"color:#F97583\">new\u003C/span>\u003Cspan style=\"color:#B392F0\"> Date\u003C/span>\u003Cspan style=\"color:#E1E4E8\">().\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\">        response_text: claudeText,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">        ...\u003C/span>\u003Cspan style=\"color:#B392F0\">analyzeResponse\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(claudeText),\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        response_length: claudeText.\u003C/span>\u003Cspan style=\"color:#79B8FF\">length\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\">      // Rate limiting basique\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">      await\u003C/span>\u003Cspan style=\"color:#F97583\"> new\u003C/span>\u003Cspan style=\"color:#79B8FF\"> Promise\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#FFAB70\">r\u003C/span>\u003Cspan style=\"color:#F97583\"> =>\u003C/span>\u003Cspan style=\"color:#B392F0\"> setTimeout\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(r, \u003C/span>\u003Cspan style=\"color:#79B8FF\">1500\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\">\u003Cspan style=\"color:#F97583\">  return\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> results;\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\">async\u003C/span>\u003Cspan style=\"color:#F97583\"> function\u003C/span>\u003Cspan style=\"color:#B392F0\"> main\u003C/span>\u003Cspan style=\"color:#E1E4E8\">() {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> results\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#F97583\"> await\u003C/span>\u003Cspan style=\"color:#B392F0\"> runExperiment\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"./prompt_corpus/crm-pme.yaml\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">);\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">  mkdirSync\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"./results\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, { recursive: \u003C/span>\u003Cspan style=\"color:#79B8FF\">true\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> });\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">  writeFileSync\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    `./results/experiment-${\u003C/span>\u003Cspan style=\"color:#E1E4E8\">Date\u003C/span>\u003Cspan style=\"color:#9ECBFF\">.\u003C/span>\u003Cspan style=\"color:#B392F0\">now\u003C/span>\u003Cspan style=\"color:#9ECBFF\">()\u003C/span>\u003Cspan style=\"color:#9ECBFF\">}.json`\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    JSON\u003C/span>\u003Cspan style=\"color:#E1E4E8\">.\u003C/span>\u003Cspan style=\"color:#B392F0\">stringify\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(results, \u003C/span>\u003Cspan style=\"color:#79B8FF\">null\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#79B8FF\">2\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\">  console.\u003C/span>\u003Cspan style=\"color:#B392F0\">log\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">`${\u003C/span>\u003Cspan style=\"color:#E1E4E8\">results\u003C/span>\u003Cspan style=\"color:#9ECBFF\">.\u003C/span>\u003Cspan style=\"color:#79B8FF\">length\u003C/span>\u003Cspan style=\"color:#9ECBFF\">} résultats collectés.`\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:#B392F0\">main\u003C/span>\u003Cspan style=\"color:#E1E4E8\">();\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Quelques détails importants dans ce script :\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Temperature à 1.0\u003C/strong> : on veut capturer la variance naturelle du modèle, pas la réponse la plus probable. C'est l'opposé de ce que vous feriez pour un chatbot en production.\u003C/li>\n\u003Cli>\u003Cstrong>5 runs par prompt\u003C/strong> : c'est le minimum pour commencer à estimer une fréquence d'inclusion. Pour des résultats statistiquement fiables, visez 20+ runs sur les prompts critiques.\u003C/li>\n\u003Cli>\u003Cstrong>Analyse naïve\u003C/strong> : la fonction \u003Ccode>analyzeResponse\u003C/code> est volontairement simpliste. En production, vous voudrez un classificateur plus robuste — potentiellement un second LLM qui analyse la réponse avec un prompt structuré.\u003C/li>\n\u003C/ul>\n\u003Ch3>Limites importantes de cette approche\u003C/h3>\n\u003Cp>Les APIs LLM ne reproduisent pas exactement le comportement de ChatGPT web, Copilot, ou Google AI Overviews. Quand un utilisateur pose une question dans ChatGPT, le système peut déclencher une recherche web via Bing, utiliser le browsing tool, ou s'appuyer uniquement sur les données d'entraînement. L'API par défaut n'a pas accès au web.\u003C/p>\n\u003Cp>Pour tester le comportement avec web grounding, vous devez activer les search tools quand ils sont disponibles (OpenAI le propose via le paramètre \u003Ccode>web_search\u003C/code> sur certains modèles) ou utiliser des outils tiers qui automatisent la version web des interfaces. C'est un trade-off entre contrôle expérimental et fidélité au comportement réel.\u003C/p>\n\u003Ch2>Métriques de mesure : au-delà de la simple mention\u003C/h2>\n\u003Cp>Le piège classique : réduire la visibilité AI à un binaire \"mentionné / pas mentionné\". La réalité est bien plus granulaire, et \u003Ca href=\"/blog/4-signals-that-now-define-visibility-in-ai-search\">les signaux qui définissent la visibilité AI\u003C/a> sont multiples.\u003C/p>\n\u003Ch3>Le framework FICQ (Frequency, Inclusion depth, Citation quality, Query coverage)\u003C/h3>\n\u003Cp>\u003Cstrong>Frequency\u003C/strong> — Sur 20 exécutions du même prompt, combien de fois votre domaine/brand apparaît. Exprimé en pourcentage. Un score de 60 % signifie que vous êtes cité 12 fois sur 20. C'est votre métrique principale.\u003C/p>\n\u003Cp>\u003Cstrong>Inclusion depth\u003C/strong> — Où dans la réponse votre mention apparaît. Premier paragraphe (haute autorité topique perçue par le LLM), milieu de réponse (source complémentaire), ou fin (mention accessoire). Codez cela en position relative : \u003Ccode>position_du_premier_caractère_mentionnant_votre_brand / longueur_totale_de_la_réponse\u003C/code>.\u003C/p>\n\u003Cp>\u003Cstrong>Citation quality\u003C/strong> — Quatre niveaux :\u003C/p>\n\u003Col>\n\u003Cli>Lien direct avec attribution (\"selon VotreMarque.fr, ...\")\u003C/li>\n\u003Cli>Mention de brand sans lien (\"VotreMarque recommande...\")\u003C/li>\n\u003Cli>Paraphrase identifiable (votre contenu est utilisé mais sans attribution)\u003C/li>\n\u003Cli>Absent\u003C/li>\n\u003C/ol>\n\u003Cp>\u003Cstrong>Query coverage\u003C/strong> — Sur votre corpus de 24 prompts, combien de catégories de prompts (intent × specificity) déclenchent une inclusion. Un coverage de 100 % en informationnelle mais 0 % en transactionnelle vous indique un problème de positionnement commercial dans votre contenu.\u003C/p>\n\u003Ch3>Tableau de bord de suivi\u003C/h3>\n\u003Cp>Structurez votre reporting dans un format qui permet la comparaison temporelle. Voici un exemple de sortie agrégée :\u003C/p>\n\u003Cpre>\u003Ccode>┌──────────────────────────┬────────┬────────┬──────────┬──────────┐\n│ Prompt Category          │ Freq % │ Depth  │ Cit. Qty │ Coverage │\n├──────────────────────────┼────────┼────────┼──────────┼──────────┤\n│ info / generic / begin   │   65%  │  0.12  │  brand   │    ✓     │\n│ info / specific / expert │   80%  │  0.08  │  link    │    ✓     │\n│ compare / generic / beg  │   40%  │  0.45  │  para    │    ✓     │\n│ compare / specific / exp │   55%  │  0.22  │  brand   │    ✓     │\n│ reco / generic / begin   │   20%  │  0.67  │  para    │    ✓     │\n│ reco / specific / expert │   35%  │  0.31  │  brand   │    ✓     │\n│ transac / generic / exp  │   10%  │  0.78  │  para    │    ✗     │\n│ transac / specific / beg │    5%  │  0.82  │  absent  │    ✗     │\n└──────────────────────────┴────────┴────────┴──────────┴──────────┘\n\u003C/code>\u003C/pre>\n\u003Cp>Ce tableau raconte une histoire claire : le domaine testé a une forte visibilité sur les requêtes informationnelles mais disparaît quasi-complètement sur les requêtes transactionnelles. L'action corrective est évidente — renforcer le contenu à intent commercial avec des éléments structurels que le LLM peut extraire (comparatifs chiffrés, tableaux de fonctionnalités, recommandations explicites).\u003C/p>\n\u003Ch2>Isoler les variables : la méthodologie du test contrôlé\u003C/h2>\n\u003Cp>Vous avez observé que votre fréquence d'inclusion baisse de 65 % à 40 % sur les prompts comparatifs. Avant de réécrire tout votre contenu, vous devez identifier la variable causale. Est-ce le contenu, la structure, l'autorité perçue, ou la formulation du prompt ?\u003C/p>\n\u003Ch3>Test A/B côté contenu\u003C/h3>\n\u003Cp>Contrairement au SEO classique où un A/B test nécessite du trafic significatif et des semaines de données, en AI search vous pouvez tester l'impact d'une modification de contenu en quelques heures — à condition que le LLM ait accès au web et que votre page modifiée soit recrawlée.\u003C/p>\n\u003Cp>Le protocole :\u003C/p>\n\u003Col>\n\u003Cli>Identifiez une page qui est dans le retrieval set (vérifiable via les logs de crawl — \u003Ca href=\"/blog/openai-crawl-activity-tripled-since-gpt-5-data-shows-via-sejournal-mattgsouthern\">l'activité de crawl d'OpenAI a triplé récemment\u003C/a>, ce qui facilite les expérimentations).\u003C/li>\n\u003Cli>Exécutez votre corpus de prompts (baseline : 20 runs minimum).\u003C/li>\n\u003Cli>Modifiez \u003Cstrong>une seule variable\u003C/strong> sur la page : par exemple, ajoutez un tableau comparatif structuré en HTML.\u003C/li>\n\u003Cli>Attendez le recrawl (monitorez vos logs serveur pour confirmer le passage du bot).\u003C/li>\n\u003Cli>Ré-exécutez exactement le même corpus de prompts.\u003C/li>\n\u003Cli>Comparez les métriques FICQ.\u003C/li>\n\u003C/ol>\n\u003Ch3>Test A/B côté prompt (isolation de la formulation)\u003C/h3>\n\u003Cp>Parfois, le problème n'est pas votre contenu mais votre compréhension des prompts réels utilisés par les internautes. Testez des variations de prompt pour identifier quelles formulations déclenchent ou non l'inclusion de votre domaine :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Variation test : impact de la mention de critères techniques\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#85E89D\">control\u003C/span>\u003Cspan style=\"color:#E1E4E8\">:\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#85E89D\">  text\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Quel outil de monitoring SEO choisir ?\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#85E89D\">  expected_result\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"baseline frequency\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#85E89D\">variant_a\u003C/span>\u003Cspan style=\"color:#E1E4E8\">:\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#85E89D\">  text\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Quel outil de monitoring SEO choisir pour détecter les régressions techniques ?\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#85E89D\">  changed_variable\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"specificity_technical_criteria\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#85E89D\">variant_b\u003C/span>\u003Cspan style=\"color:#E1E4E8\">:\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#85E89D\">  text\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Quel outil de monitoring SEO choisir pour un site e-commerce de 10 000 pages ?\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#85E89D\">  changed_variable\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"specificity_scale\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#85E89D\">variant_c\u003C/span>\u003Cspan style=\"color:#E1E4E8\">:\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#85E89D\">  text\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Recommandez-moi un outil de monitoring SEO technique avec alertes automatiques\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#85E89D\">  changed_variable\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"intent_shift_to_recommendation\"\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Si la variant_a multiplie votre fréquence d'inclusion par 3 par rapport au control, vous savez que votre contenu est fortement associé par le LLM au concept de \"régressions techniques\" — et vous pouvez optimiser votre stratégie de contenu en conséquence.\u003C/p>\n\u003Ch2>Scénario complet : un SaaS B2B de 4 200 pages\u003C/h2>\n\u003Cp>Contexte réaliste. DataPulse (nom fictif) est un SaaS d'analytics B2B. 4 200 pages indexées : 180 pages produit, 850 articles de blog, 3 100 pages de documentation technique, et environ 70 landing pages. L'équipe SEO a remarqué que ChatGPT mentionne systématiquement deux concurrents (Mixpanel, Amplitude) mais jamais DataPulse dans les réponses aux prompts comparatifs.\u003C/p>\n\u003Ch3>Phase 1 : Audit de baseline (semaine 1)\u003C/h3>\n\u003Cp>L'équipe construit un corpus de 36 prompts couvrant 4 intents × 3 niveaux de spécificité × 3 personas. Chaque prompt est exécuté 20 fois sur GPT-4o et 20 fois sur Claude. Total : 36 × 20 × 2 = 1 440 requêtes API. Coût approximatif : ~85 € en tokens.\u003C/p>\n\u003Cp>Résultats baseline :\u003C/p>\n\u003Cul>\n\u003Cli>Fréquence d'inclusion GPT-4o : 8 % (principalement sur prompts informationnels très spécifiques liés à la documentation technique)\u003C/li>\n\u003Cli>Fréquence d'inclusion Claude : 12 %\u003C/li>\n\u003Cli>Citation quality dominante : paraphrase sans attribution\u003C/li>\n\u003Cli>Coverage : 3 catégories de prompts sur 12\u003C/li>\n\u003C/ul>\n\u003Cp>L'équipe identifie que \u003Ca href=\"/blog/how-ai-models-understand-your-brand\">le LLM comprend la marque principalement via sa documentation technique\u003C/a>, pas via ses contenus marketing ou comparatifs.\u003C/p>\n\u003Ch3>Phase 2 : Hypothèse et intervention (semaines 2-3)\u003C/h3>\n\u003Cp>Hypothèse : les pages comparatives de DataPulse n'ont pas de structure extractible par le LLM. Les concurrents ont des pages \u003Ccode>/vs/\u003C/code> avec des tableaux HTML standardisés.\u003C/p>\n\u003Cp>Intervention : création de 8 pages \u003Ccode>/vs/[concurrent]\u003C/code> avec une structure HTML sémantique optimisée pour l'extraction LLM :\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\">article\u003C/span>\u003Cspan style=\"color:#B392F0\"> itemscope\u003C/span>\u003Cspan style=\"color:#B392F0\"> itemtype\u003C/span>\u003Cspan style=\"color:#E1E4E8\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"https://schema.org/Article\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">h1\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>DataPulse vs Mixpanel : comparaison technique complète&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">h1\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">section\u003C/span>\u003Cspan style=\"color:#B392F0\"> aria-label\u003C/span>\u003Cspan style=\"color:#E1E4E8\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Résumé de la comparaison\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">p\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>DataPulse est une plateforme d'analytics B2B spécialisée dans\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    le tracking d'événements produit avec rétention de données illimitée.\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    Mixpanel se concentre sur l'analytics produit avec des fonctionnalités\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    avancées de segmentation comportementale.&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">p\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  &#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">section\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">table\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">caption\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>Comparaison fonctionnelle DataPulse vs Mixpanel — Mai 2026&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">caption\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">thead\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">tr\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">th\u003C/span>\u003Cspan style=\"color:#B392F0\"> scope\u003C/span>\u003Cspan style=\"color:#E1E4E8\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"col\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>Critère&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">th\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">th\u003C/span>\u003Cspan style=\"color:#B392F0\"> scope\u003C/span>\u003Cspan style=\"color:#E1E4E8\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"col\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>DataPulse&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">th\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">th\u003C/span>\u003Cspan style=\"color:#B392F0\"> scope\u003C/span>\u003Cspan style=\"color:#E1E4E8\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"col\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>Mixpanel&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">th\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      &#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">tr\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    &#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">thead\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">tbody\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">tr\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">th\u003C/span>\u003Cspan style=\"color:#B392F0\"> scope\u003C/span>\u003Cspan style=\"color:#E1E4E8\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"row\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>Rétention de données&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">th\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">td\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>Illimitée (plan Pro)&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">td\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">td\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>12 mois (plan Growth), 36 mois (Enterprise)&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">td\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      &#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">tr\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">tr\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">th\u003C/span>\u003Cspan style=\"color:#B392F0\"> scope\u003C/span>\u003Cspan style=\"color:#E1E4E8\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"row\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>SDK server-side&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">th\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">td\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>Node.js, Python, Go, Rust&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">td\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">td\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>Node.js, Python, Java, Ruby&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">td\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      &#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">tr\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">tr\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">th\u003C/span>\u003Cspan style=\"color:#B392F0\"> scope\u003C/span>\u003Cspan style=\"color:#E1E4E8\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"row\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>Export API rate limit&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">th\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">td\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>10 000 req/min&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">td\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">td\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>2 000 req/min (peut être augmenté sur Enterprise)&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">td\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      &#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">tr\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">tr\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">th\u003C/span>\u003Cspan style=\"color:#B392F0\"> scope\u003C/span>\u003Cspan style=\"color:#E1E4E8\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"row\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>Conformité RGPD&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">th\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">td\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>Hébergement EU natif, DPA inclus&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">td\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">td\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>EU data residency en option ($), DPA sur demande&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">td\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      &#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">tr\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    &#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">tbody\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  &#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">table\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">section\u003C/span>\u003Cspan style=\"color:#B392F0\"> aria-label\u003C/span>\u003Cspan style=\"color:#E1E4E8\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Verdict\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">h2\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>Quand choisir DataPulse plutôt que Mixpanel&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">h2\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">p\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>DataPulse est le meilleur choix pour les équipes B2B qui ont besoin\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    d'une rétention de données illimitée et d'un hébergement européen natif.\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    Mixpanel reste pertinent pour les équipes produit B2C qui priorisent\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    la segmentation comportementale avancée.&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">p\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  &#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">section\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">article\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Points clés de cette structure : le paragraphe d'introduction fournit un résumé extractible sans parser le tableau, le tableau utilise des \u003Ccode>scope\u003C/code> pour la lisibilité machine, et la section verdict formule une recommandation explicite — exactement le type de contenu qu'un LLM peut citer directement dans une réponse comparative.\u003C/p>\n\u003Ch3>Phase 3 : Re-test et mesure d'impact (semaine 4)\u003C/h3>\n\u003Cp>Après confirmation du crawl des nouvelles pages par les bots IA (GPTBot, ClaudeBot, Bingbot — vérifiés dans les access logs), l'équipe ré-exécute le même corpus de 36 prompts × 20 runs × 2 LLMs.\u003C/p>\n\u003Cp>Résultats post-intervention :\u003C/p>\n\u003Cul>\n\u003Cli>Fréquence d'inclusion GPT-4o : 34 % (+26 points)\u003C/li>\n\u003Cli>Fréquence d'inclusion Claude : 41 % (+29 points)\u003C/li>\n\u003Cli>Citation quality dominante : brand mention (progression depuis paraphrase)\u003C/li>\n\u003Cli>Coverage : 8 catégories sur 12\u003C/li>\n\u003C/ul>\n\u003Cp>L'amélioration est concentrée sur les prompts comparatifs et de recommandation — exactement les catégories ciblées par l'intervention. Les prompts informationnels restent stables, ce qui valide l'isolation de la variable.\u003C/p>\n\u003Ch2>Construire un framework de test reproductible et continu\u003C/h2>\n\u003Cp>Un test ponctuel ne suffit pas. La visibilité AI est volatile — les modèles sont mis à jour, les données d'entraînement changent, les concurrents optimisent. Vous avez besoin d'un framework qui tourne en continu, comme un \u003Ca href=\"/blog/the-10-gate-ai-search-pipeline-find-where-your-content-fails\">pipeline de diagnostic automatisé\u003C/a>.\u003C/p>\n\u003Ch3>Architecture du framework\u003C/h3>\n\u003Cp>Le framework minimal comporte trois couches :\u003C/p>\n\u003Cp>\u003Cstrong>Couche 1 — Corpus management\u003C/strong> : vos fichiers YAML de prompts, versionnés dans Git. Revue et mise à jour mensuelle. Ajout de nouveaux prompts basés sur les requêtes réelles observées (si vous avez accès aux logs de recherche interne, aux données Search Console, ou aux outils de monitoring de citations AI).\u003C/p>\n\u003Cp>\u003Cstrong>Couche 2 — Execution pipeline\u003C/strong> : un cron job (ou GitHub Action) qui exécute le corpus à fréquence régulière. Hebdomadaire pour la plupart des sites, quotidien si vous êtes en phase d'optimisation active.\u003C/p>\n\u003Cp>\u003Cstrong>Couche 3 — Analysis et alerting\u003C/strong> : agrégation des résultats, calcul des métriques FICQ, détection des régressions. Un outil de monitoring comme Seogard permet de corréler les variations de visibilité AI avec les changements détectés sur vos pages (meta modifiées, contenu disparu, SSR cassé) — car souvent, une régression de visibilité AI a une cause technique identifiable côté site.\u003C/p>\n\u003Ch3>Tracking des régressions\u003C/h3>\n\u003Cp>Le signal le plus actionable n'est pas votre score absolu — c'est la variation. Si votre fréquence d'inclusion passe de 55 % à 30 % sur une catégorie de prompts en une semaine, quelque chose a changé. Les causes possibles :\u003C/p>\n\u003Cul>\n\u003Cli>Un concurrent a publié du contenu plus pertinent\u003C/li>\n\u003Cli>Votre page a été modifiée (intentionnellement ou par régression)\u003C/li>\n\u003Cli>Le modèle a été mis à jour\u003C/li>\n\u003Cli>Le retrieval system a changé sa logique de sélection\u003C/li>\n\u003C/ul>\n\u003Cp>Pour les deux premières causes, vous avez des leviers d'action. Pour les deux dernières, vous devez adapter votre contenu. Dans tous les cas, sans monitoring continu, vous ne saurez jamais que la régression a eu lieu — jusqu'à ce que votre trafic referral AI s'effondre.\u003C/p>\n\u003Ch2>Pièges et limites de l'expérimentation prompt-level\u003C/h2>\n\u003Ch3>Le biais de l'API vs l'interface utilisateur\u003C/h3>\n\u003Cp>Les réponses via API et via l'interface web de ChatGPT/Copilot/Gemini ne sont pas identiques. L'interface web peut déclencher des recherches web, afficher des images, utiliser des plugins. L'API vous donne un contrôle fin sur les paramètres mais ne reproduit pas l'expérience utilisateur réelle.\u003C/p>\n\u003Cp>Combinez les deux approches : API pour les tests à grande échelle et le suivi quantitatif, vérification manuelle sur les interfaces web pour les prompts critiques (vos 5-10 prompts les plus importants business).\u003C/p>\n\u003Ch3>Le coût en tokens\u003C/h3>\n\u003Cp>À 20 runs × 36 prompts × 2 LLMs, vous générez 1 440 appels API par cycle de test. Avec des réponses moyennes de 800 tokens et un coût moyen de ~0,01 € par requête, chaque cycle coûte environ 15-20 €. Sur un rythme hebdomadaire, c'est ~80 € par mois — raisonnable pour un sujet de test. Mais si vous testez 10 sujets en parallèle, le budget mensuel monte à 800 €. Dimensionnez vos tests en fonction de la valeur business de chaque sujet.\u003C/p>\n\u003Ch3>L'absence de ground truth\u003C/h3>\n\u003Cp>Contrairement au SEO classique où Search Console vous donne des données first-party sur vos impressions et clics, il n'existe pas encore de source de vérité côté LLM. \u003Ca href=\"/blog/google-fixes-search-console-s-year-long-data-logging-issue-well-kind-of\">Google commence à exposer des données dans Search Console\u003C/a> et \u003Ca href=\"/blog/bing-previews-ai-citation-share-for-webmaster-tools-via-sejournal-mattgsouthern\">Bing propose des métriques de citation AI\u003C/a>, mais ces données restent partielles. Vos propres tests sont votre meilleure source de signal — à condition qu'ils soient méthodologiquement rigoureux.\u003C/p>\n\u003Ch3>La tentation du sur-optimisation\u003C/h3>\n\u003Cp>Un contenu structuré exclusivement pour l'extraction LLM peut devenir illisible pour les humains. Les tableaux comparatifs, les FAQ, les résumés TL;DR sont utiles — mais si chaque page de votre site ressemble à un template de réponse IA, vous \u003Ca href=\"/blog/why-more-content-is-no-longer-a-reliable-way-to-grow-seo\">perdez le signal d'authenticité et de profondeur\u003C/a> qui fait qu'un LLM vous considère comme une source fiable en premier lieu. Le paradoxe : le meilleur contenu pour l'AI search est du contenu écrit pour des experts humains, avec une structure qui facilite l'extraction machine\u003C/p>",null,14,[18,19,20,21,22],"prompt-level","experiments","ai search","llm visibility","seo technique","Prompt-level SEO experiments : framework de test pour l'AI search","Fri May 08 2026 15:03:10 GMT+0000 (Coordinated Universal Time)",[26,42,56],{"_id":27,"slug":28,"__v":6,"author":7,"canonical":29,"category":10,"createdAt":30,"date":31,"description":32,"image":15,"imageAlt":15,"readingTime":33,"tags":34,"title":40,"updatedAt":41},"6a041412aa6b273b0c40f181","how-to-build-local-pages-that-win-in-ai-powered-search-via-sejournal-lorenbaker","https://seogard.io/blog/how-to-build-local-pages-that-win-in-ai-powered-search-via-sejournal-lorenbaker","2026-05-13T06:02:58.743Z","2026-05-13","Guide technique pour construire des pages locales qui performent dans les AI Overviews et AI Mode. Schema, SSR, contenu structuré.",12,[35,36,37,38,39],"local SEO","AI search","pages locales","schema markup","SSR","Pages locales pour l'AI Search : architecture technique","Wed May 13 2026 06:02:58 GMT+0000 (Coordinated Universal Time)",{"_id":43,"slug":44,"__v":6,"author":7,"canonical":45,"category":10,"createdAt":46,"date":47,"description":48,"image":15,"imageAlt":15,"readingTime":16,"tags":49,"title":54,"updatedAt":55},"6a02c291aa6b273b0c2a74f9","the-tech-seo-audit-for-the-ai-search-era-how-to-maximize-your-ai-visibility-via-sejournal-jetoctopus","https://seogard.io/blog/the-tech-seo-audit-for-the-ai-search-era-how-to-maximize-your-ai-visibility-via-sejournal-jetoctopus","2026-05-12T06:02:57.339Z","2026-05-12","Comment adapter votre audit technique SEO aux exigences des AI Overviews, du crawl par les LLMs et du grounding. Méthodes, code et scénarios concrets.",[50,20,51,52,53],"tech seo audit","ai visibility","crawl budget","structured data","Audit SEO technique pour l'ère AI Search : guide avancé","Tue May 12 2026 06:02:57 GMT+0000 (Coordinated Universal Time)",{"_id":57,"slug":58,"__v":6,"author":7,"canonical":59,"category":10,"createdAt":60,"date":47,"description":61,"image":15,"imageAlt":15,"readingTime":33,"tags":62,"title":67,"updatedAt":68},"6a02fac0aa6b273b0c58d096","the-consensus-gap-via-sejournal-kevin-indig","https://seogard.io/blog/the-consensus-gap-via-sejournal-kevin-indig","2026-05-12T10:02:40.519Z","Une marque peut dominer dans un dashboard AI agrégé et être absente de deux moteurs sur trois. Analyse technique du Consensus Gap et méthodes pour le détecter.",[63,36,64,65,66],"consensus gap","LLM visibility","GEO","multi-engine","The Consensus Gap : votre marque visible sur un LLM, invisible sur deux autres","Tue May 12 2026 10:02:40 GMT+0000 (Coordinated Universal Time)"]