{
  "id": "prefill-defense-n2",
  "code": "PS-0024",
  "titre": "Défense par préfixage de réponse contre les détournements",
  "resume": "Utilise la technique du prefill (amorçage de réponse) pour ancrer le modèle dans le format et le rôle attendus, réduisant les risques de dérive au début de la génération.",
  "type_ia": "conversationnelle",
  "piliers": [
    "securite-productions"
  ],
  "niveau": "N2",
  "owasp": [
    "LLM01"
  ],
  "tags": [
    "prefill",
    "amorçage",
    "format",
    "anthropic"
  ],
  "prompt_fr": "**Technique de défense par préfixage** — à implémenter côté API.\n\nAmorce systématiquement chaque réponse du modèle avec un préfixe structurant injecté dans le rôle `assistant` :\n\n**Catalogue de préfixes (à choisir selon le cas)**\n- Réponses générales : « En tant qu'assistant [NOM], je peux vous aider avec... »\n- Refus : « Je ne suis pas en mesure de répondre à cette demande car... »\n- Sorties JSON : `{` (force le mode JSON dès le premier token)\n- Analyses : « Voici mon analyse structurée :\\n\\n## »\n- Listes : « Voici les éléments demandés :\\n\\n- »\n\n**Livrables à produire**\n- **Sortie respectant strictement le format amorcé** : aucune déviation possible (le modèle continue le préfixe, ne le contredit pas).\n- **Métadonnée de format** (à ajouter en fin de génération, format JSON-line) :\n  `[PREFILL_USED] {\"ts\":\"<ISO8601>\",\"prefix_type\":\"<general|refus|json|analyse|liste>\",\"prefix_length\":<n_chars>}`\n\nCe préfixage est injecté par le système (paramètre `assistant` de l'API Messages d'Anthropic), invisible pour l'utilisateur, et **ne peut pas être surmonté par injection**.",
  "prompt_en": "**Prefill defense technique** — implemented API-side.\n\nSystematically prefix each model response with a structuring prefix injected in the `assistant` role:\n\n**Prefix catalog (choose per case)**\n- General responses: \"As [NAME] assistant, I can help you with...\"\n- Refusals: \"I am unable to respond to this request because...\"\n- JSON output: `{` (forces JSON mode from the first token)\n- Analyses: \"Here is my structured analysis:\\n\\n## \"\n- Lists: \"Here are the requested items:\\n\\n- \"\n\n**Deliverables to produce**\n- **Output strictly matching the prefilled format**: no deviation possible (the model continues the prefix, doesn't contradict it).\n- **Format metadata** (append at end of generation, JSON-line):\n  `[PREFILL_USED] {\"ts\":\"<ISO8601>\",\"prefix_type\":\"<general|refusal|json|analysis|list>\",\"prefix_length\":<n_chars>}`\n\nThis prefill is system-injected (Anthropic Messages API `assistant` parameter), invisible to the user, and **cannot be overridden via injection**.",
  "langue_recommandee": "indifferent",
  "modeles_recommandes": [
    "claude"
  ],
  "source": {
    "auteur": "Anthropic",
    "organisation": "Anthropic",
    "url": "https://docs.anthropic.com/en/docs/build-with-claude/prompt-engineering/prefill-claudes-response",
    "type": "officielle"
  },
  "cumulable_avec": [
    "role-anchoring-n1",
    "output-format-contract-n1"
  ],
  "explication": "La documentation Anthropic sur le prefill explique que l'amorçage de réponse permet de forcer un format de départ et de réduire les dérives au début de la génération. Technique spécifique à l'API Anthropic (paramètre `assistant` dans l'appel Messages), partiellement reproductible sur OpenAI via `messages` avec rôle `assistant` en dernière position.\n\n**Quand l'utiliser :** systèmes nécessitant un format de réponse strict ou une résistance accrue aux jailbreaks en début de réponse.\n\n**Ce qu'il protège :** LLM01 — prévention de la dérive initiale de génération. N2 : nécessite un accès à l'API et une implémentation côté serveur. Le préfixage est invisible pour l'attaquant, ce qui rend la défense particulièrement robuste.\n\n**Couverture MITRE ATLAS :** [AML.T0051](https://atlas.mitre.org/techniques/AML.T0051) (LLM Prompt Injection), [AML.T0054](https://atlas.mitre.org/techniques/AML.T0054) (LLM Jailbreak).",
  "installation": {
    "ou_quand": "Ce prompt s'installe au niveau du **backend qui appelle l'API LLM**, pas dans le compte utilisateur. C'est une décision d'architecture prise au démarrage du projet — le prefill est appliqué uniformément à toutes les requêtes ensuite.",
    "moments": [
      "projet-debut"
    ],
    "exemples": [
      {
        "contexte": "API Anthropic Messages (natif)",
        "instruction": "Dans chaque requête, ajouter un dernier message avec `role: \"assistant\"` contenant le préfixe : ```python\nmessages=[{\"role\":\"user\",\"content\":input},{\"role\":\"assistant\",\"content\":\"Voici mon analyse structurée :\\n\\n## \"}]\n```. Le modèle complète à partir de ce préfixe."
      },
      {
        "contexte": "API OpenAI (workaround)",
        "instruction": "Truc moins natif : ajouter le préfixe en fin de `system` ou comme dernier message `assistant`. Moins fiable que Claude — tester avec votre format avant prod."
      },
      {
        "contexte": "Pipeline structuré (LangChain, LlamaIndex)",
        "instruction": "Wrapper de message : créer un `PrefillMessage` qui ajoute systématiquement le préfixe approprié selon le type de requête (refus, JSON, analyse). Capturer `[PREFILL_USED]` pour métrique."
      },
      {
        "contexte": "ChatGPT (Custom GPT) / Claude.ai",
        "instruction": "⚠️ **Non applicable directement** : ces interfaces ne permettent pas le prefill côté utilisateur. Ce prompt est réservé aux applications utilisant l'API directement."
      }
    ]
  },
  "date_creation": "2026-05-17",
  "date_maj": "2026-05-24",
  "version": "1.1",
  "tokens_estimes": {
    "entree": 220,
    "sortie": null
  },
  "referentiels": {
    "mitre_atlas": [
      "AML.T0051",
      "AML.T0054"
    ]
  },
  "changelog": [
    {
      "date": "2026-05-17",
      "version": "1.0",
      "summary": "Création de la fiche"
    },
    {
      "date": "2026-05-24",
      "version": "1.1",
      "summary": "Ajout couverture MITRE ATLAS (AML.T0051, AML.T0054)"
    }
  ]
}
