Content is user-generated and unverified.

Guide d'Ingénierie Contextuelle

Guide d'Ingénierie Contextuelle

Par DAIR.AI Academy

Format web : Guide d'Ingénierie Contextuelle

Table des matières

  • Qu'est-ce que l'ingénierie contextuelle ?
  • L'ingénierie contextuelle en action
    • Prompt système
    • Instructions
    • Entrée utilisateur
    • Entrées et sorties structurées
    • Appel d'outils
    • RAG et mémoire
    • État et contexte historique
  • Ingénierie contextuelle avancée
  • Ressources

Qu'est-ce que l'ingénierie contextuelle ?

Il y a quelques années, de nombreux chercheurs, même parmi les meilleurs en IA, affirmaient que l'ingénierie de prompt serait morte à l'heure actuelle.

Évidemment, ils avaient très tort, et en fait, l'ingénierie de prompt est maintenant plus importante que jamais. Elle est si importante qu'elle est maintenant rebaptisée ingénierie contextuelle.

Oui, encore un terme sophistiqué pour décrire le processus important d'ajustement des instructions et du contexte pertinent dont un LLM a besoin pour effectuer ses tâches efficacement.

Beaucoup a déjà été écrit sur l'ingénierie contextuelle (Ankur Goyal, Walden Yan, Tobi Lutke, et Andrej Karpathy), mais je voulais écrire sur mes réflexions sur le sujet et vous montrer un guide concret étape par étape mettant l'ingénierie contextuelle en action dans le développement d'un workflow d'agent IA.

Je ne suis pas entièrement sûr de qui a inventé l'ingénierie contextuelle, mais nous nous appuierons sur cette figure de Dex Horthy qui explique brièvement ce qu'est l'ingénierie contextuelle.

J'aime le terme ingénierie contextuelle car il ressemble à un terme plus large qui explique mieux la plupart du travail qui entre dans l'ingénierie de prompt, y compris d'autres tâches connexes.

Le doute sur l'ingénierie de prompt étant une compétence sérieuse vient du fait que beaucoup la confondent avec le prompting aveugle (une description courte de tâche que vous utilisez dans un LLM comme ChatGPT). Dans le prompting aveugle, vous posez simplement une question au système. Dans l'ingénierie de prompt, vous devez réfléchir plus attentivement au contexte et à la structure de votre prompt. Peut-être aurait-elle dû être appelée ingénierie contextuelle dès le début.

L'ingénierie contextuelle est la phase suivante, où vous architecturez le contexte complet, ce qui dans de nombreux cas nécessite d'aller au-delà du simple prompting et vers des méthodes plus rigoureuses pour obtenir, améliorer et optimiser les connaissances pour le système.

Du point de vue d'un développeur, l'ingénierie contextuelle implique un processus itératif pour optimiser les instructions et le contexte que vous fournissez à un LLM pour obtenir un résultat souhaité. Cela inclut d'avoir des processus formels (par exemple, des pipelines d'évaluation) pour mesurer si vos tactiques fonctionnent.

Compte tenu de l'évolution rapide du domaine de l'IA, je suggère une définition plus large de l'ingénierie contextuelle : le processus de conception et d'optimisation des instructions et du contexte pertinent pour les LLMs et les modèles d'IA avancés afin qu'ils effectuent leurs tâches efficacement. Cela englobe non seulement les LLMs basés sur le texte, mais aussi l'optimisation du contexte pour les modèles multimodaux, qui deviennent plus répandus. Cela peut inclure tous les efforts d'ingénierie de prompt et les processus connexes tels que :

  • Conception et gestion des chaînes de prompts (le cas échéant)
  • Ajustement des instructions/prompts système
  • Gestion des éléments dynamiques du prompt (par exemple, entrées utilisateur, date/heure, etc.)
  • Recherche et préparation de connaissances pertinentes (c'est-à-dire RAG)
  • Augmentation de requêtes
  • Définitions et instructions d'outils (dans le cas de systèmes agentiques)
  • Préparation et optimisation de démonstrations few-shot
  • Structuration des entrées et sorties (par exemple, délimiteurs, schéma JSON)
  • Mémoire à court terme (c'est-à-dire gestion de l'état/contexte historique) et mémoire à long terme (par exemple, récupération de connaissances pertinentes d'un magasin de vecteurs)
  • Et les nombreuses autres astuces qui sont utiles pour optimiser le prompt système LLM afin d'accomplir les tâches désirées.

En d'autres termes, ce que vous essayez d'accomplir dans l'ingénierie contextuelle, c'est optimiser l'information que vous fournissez dans la fenêtre de contexte du LLM. Cela signifie aussi filtrer les informations bruyantes, ce qui est une science en soi, car cela nécessite de mesurer systématiquement la performance du LLM.

Tout le monde écrit sur l'ingénierie contextuelle, mais ici nous allons vous guider à travers un exemple concret de ce à quoi ressemble l'ingénierie contextuelle lors de la construction d'agents IA.

L'ingénierie contextuelle en action

Regardons un exemple concret de travail d'ingénierie contextuelle récent que j'ai fait pour une application de recherche approfondie multi-agents que j'ai construite pour un usage personnel.

J'ai construit le workflow agentique à l'intérieur de n8n, mais l'outil n'a pas d'importance. L'architecture d'agent complète que j'ai construite ressemble à ceci :

L'agent Search Planner dans mon workflow est chargé de générer un plan de recherche basé sur la requête utilisateur.

Prompt système

Voici le prompt système que j'ai assemblé pour ce sous-agent :

Vous êtes un planificateur de recherche expert. Votre tâche est de décomposer une requête de recherche complexe (délimitée par <user_query></user_query>) en sous-tâches de recherche spécifiques, chacune se concentrant sur un aspect différent ou un type de source.

La date et l'heure actuelles sont : {{ $now.toISO() }}

Pour chaque sous-tâche, fournissez :

1. Un ID de chaîne unique pour la sous-tâche (par exemple, 'subtask_1', 'news_update')

2. Une requête de recherche spécifique qui se concentre sur un aspect de la requête principale

3. Le type de source à rechercher (web, news, academic, specialized)

4. Pertinence de la période temporelle (today, last week, recent, past_year, all_time)

5. Focus du domaine si applicable (technology, science, health, etc.)

6. Niveau de priorité (1-le plus élevé à 5-le plus bas)

Tous les champs (id, query, source_type, time_period, domain_focus, priority) sont requis pour chaque sous-tâche, sauf time_period et domain_focus qui peuvent être null si non applicable.

Créez 2 sous-tâches qui ensemble fourniront une couverture complète du sujet. Concentrez-vous sur différents aspects, perspectives ou sources d'information.

Chaque sous-tâche inclura les informations suivantes :

id: str

query: str

source_type: str  # par exemple, "web", "news", "academic", "specialized"

time_period: Optional[str] = None  # par exemple, "today", "last week", "recent", "past_year", "all_time"

domain_focus: Optional[str] = None  # par exemple, "technology", "science", "health"

priority: int  # 1 (le plus élevé) à 5 (le plus bas)

Après avoir obtenu les informations des sous-tâches ci-dessus, vous ajouterez deux champs supplémentaires. Ceux-ci correspondent à start_date et end_date. Inférez ces informations en fonction de la date actuelle et de la time_period sélectionnée. start_date et end_date doivent utiliser le format comme dans l'exemple ci-dessous :

"start_date": "2024-06-03T06:00:00.000Z",

"end_date": "2024-06-11T05:59:59.999Z",

Il y a de nombreuses parties à ce prompt qui nécessitent une réflexion attentive sur le contexte exact que nous fournissons à l'agent planificateur pour effectuer la tâche efficacement. Comme vous pouvez le voir, il ne s'agit pas seulement de concevoir un prompt ou une instruction simple ; ce processus nécessite de l'expérimentation et de fournir un contexte important pour que le modèle effectue la tâche de manière optimale.

Décomposons le problème en composants centraux qui sont clés pour une ingénierie contextuelle efficace.

Instructions

L'instruction est l'instruction de haut niveau fournie au système pour lui dire exactement quoi faire.

Vous êtes un planificateur de recherche expert. Votre tâche est de décomposer une requête de recherche complexe (délimitée par <user_query></user_query>) en sous-tâches de recherche spécifiques, chacune se concentrant sur un aspect différent ou un type de source.

Beaucoup de débutants et même des développeurs IA expérimentés s'arrêteraient ici. Étant donné que j'ai partagé le prompt complet ci-dessus, vous pouvez apprécier combien plus de contexte nous devons donner au système pour qu'il fonctionne comme nous le voulons. C'est ce qu'est l'ingénierie contextuelle ; elle informe le système plus sur la portée du problème et les spécificités de ce que nous désirons exactement de lui.

Entrée utilisateur

L'entrée utilisateur n'était pas montrée dans le prompt système, mais voici un exemple de ce à quoi elle ressemblerait.

<user_query> Quelles sont les dernières nouvelles dev d'OpenAI ? </user_query>

Notez l'utilisation des délimiteurs, qui concerne une meilleure structuration du prompt. C'est important pour éviter la confusion et ajoute de la clarté sur ce qu'est l'entrée utilisateur et quelles choses nous voulons que le système génère. Parfois, le type d'information que nous entrons est lié à ce que nous voulons que le modèle produise (par exemple, la requête est l'entrée, et les sous-requêtes sont les sorties).

Entrées et sorties structurées

En plus de l'instruction de haut niveau et de l'entrée utilisateur, vous avez peut-être remarqué que j'ai consacré un effort considérable aux détails liés aux sous-tâches que l'agent planificateur doit produire. Voici les instructions détaillées que j'ai fournies à l'agent planificateur pour créer les sous-tâches étant donné la requête utilisateur.

Pour chaque sous-tâche, fournissez :

1. Un ID de chaîne unique pour la sous-tâche (par exemple, 'subtask_1', 'news_update')

2. Une requête de recherche spécifique qui se concentre sur un aspect de la requête principale

3. Le type de source à rechercher (web, news, academic, specialized)

4. Pertinence de la période temporelle (today, last week, recent, past_year, all_time)

5. Focus du domaine si applicable (technology, science, health, etc.)

6. Niveau de priorité (1-le plus élevé à 5-le plus bas)

Tous les champs (id, query, source_type, time_period, domain_focus, priority) sont requis pour chaque sous-tâche, sauf time_period et domain_focus qui peuvent être null si non applicable.

Créez 2 sous-tâches qui ensemble fourniront une couverture complète du sujet. Concentrez-vous sur différents aspects, perspectives ou sources d'information.

Si vous regardez attentivement les instructions ci-dessus, j'ai décidé de structurer une liste des informations requises que je veux que l'agent planificateur génère, accompagnées de quelques indices/exemples pour mieux aider à guider le processus de génération de données. C'est crucial pour donner à l'agent un contexte supplémentaire sur ce qui est attendu. Par exemple, si vous ne lui dites pas que vous voulez que le niveau de priorité soit sur une échelle de 1-5, alors le système pourrait préférer utiliser une échelle de 1-10. Encore une fois, ce contexte compte beaucoup !

Ensuite, parlons des sorties structurées. Pour obtenir des sorties cohérentes de l'agent planificateur, nous fournissons aussi du contexte sur le format de sous-tâche et les types de champs que nous attendons. Voici l'exemple que nous passons comme contexte supplémentaire à l'agent. Cela fournira à l'agent des indices et des pistes sur ce que nous attendons comme sortie :

Chaque sous-tâche inclura les informations suivantes :

id: str

query: str

source_type: str  # par exemple, "web", "news", "academic", "specialized"

time_period: Optional[str] = None  # par exemple, "today", "last week", "recent", "past_year", "all_time"

domain_focus: Optional[str] = None  # par exemple, "technology", "science", "health"

priority: int  # 1 (le plus élevé) à 5 (le plus bas)

En plus de cela, à l'intérieur de n8n, vous pouvez aussi utiliser un analyseur de sortie d'outil, qui essentiellement va être utilisé pour structurer les sorties finales. L'option que j'utilise fournit un exemple JSON comme suit :

json
{
  "subtasks": [
    {
      "id": "openai_latest_news",
      "query": "latest OpenAI announcements and news",
      "source_type": "news",
      "time_period": "recent",
      "domain_focus": "technology",
      "priority": 1,
      "start_date": "2025-06-03T06:00:00.000Z",
      "end_date": "2025-06-11T05:59:59.999Z"
    },
    {
      "id": "openai_official_blog",
      "query": "OpenAI official blog recent posts",
      "source_type": "web",
      "time_period": "recent",
      "domain_focus": "technology",
      "priority": 2,
      "start_date": "2025-06-03T06:00:00.000Z",
      "end_date": "2025-06-11T05:59:59.999Z"
    }
  ]
}

Ensuite, l'outil générera automatiquement le schéma à partir de ces exemples, ce qui à son tour permet au système d'analyser et de générer des sorties structurées appropriées, comme montré dans l'exemple ci-dessous :

json
[
  {
    "action": "parse",
    "response": {
      "output": {
        "subtasks": [
          {
            "id": "subtask_1",
            "query": "OpenAI recent announcements OR news OR updates",
            "source_type": "news",
            "time_period": "recent",
            "domain_focus": "technology",
            "priority": 1,
            "start_date": "2025-06-24T16:35:26.901Z",
            "end_date": "2025-07-01T16:35:26.901Z"
          },
          {
            "id": "subtask_2",
            "query": "OpenAI official blog OR press releases",
            "source_type": "web",
            "time_period": "recent",
            "domain_focus": "technology",
            "priority": 1.2,
            "start_date": "2025-06-24T16:35:26.901Z",
            "end_date": "2025-07-01T16:35:26.901Z"
          }
        ]
      }
    }
  }
]

Ce truc semble compliqué, mais beaucoup d'outils aujourd'hui permettent des fonctionnalités de sortie structurée prêtes à l'emploi, donc il est probable que vous n'aurez pas besoin de l'implémenter vous-même. n8n rend cette partie de l'ingénierie contextuelle facile. C'est un aspect sous-estimé de l'ingénierie contextuelle que je vois beaucoup de développeurs IA ignorer pour une raison quelconque. Espérons que l'ingénierie contextuelle éclairera davantage ces techniques importantes. C'est une approche vraiment puissante, surtout quand votre agent obtient des sorties incohérentes qui doivent être passées dans un format spécial au composant suivant dans le workflow.

Outils

Nous utilisons n8n pour construire notre agent, donc c'est facile de mettre en contexte la date et l'heure actuelles. Vous pouvez le faire comme ceci :

La date et l'heure actuelles sont : {{ $now.toISO() }}

C'est une fonction simple et pratique qui est appelée dans n8n, mais il est typique de construire cela comme un outil dédié qui peut aider à rendre les choses plus dynamiques (c'est-à-dire obtenir seulement la date et l'heure si la requête l'exige). C'est ce qu'est l'ingénierie contextuelle. Elle vous force, le constructeur, à prendre des décisions concrètes sur quel contexte passer et quand le passer au LLM. C'est génial parce que cela élimine les hypothèses et les inexactitudes de votre application.

La date et l'heure sont un contexte important pour le système ; sinon, il tend à ne pas bien performer avec les requêtes qui nécessitent une connaissance de la date et de l'heure actuelles. Par exemple, si je demandais au système de rechercher les dernières nouvelles dev d'OpenAI qui se sont passées la semaine dernière, il devinerait simplement les dates et l'heure, ce qui conduirait à des requêtes sous-optimales et, par conséquent, à des recherches web inexactes. Quand le système a la date et l'heure correctes, il peut mieux inférer les plages de dates, qui sont importantes pour l'agent de recherche et les outils. J'ai ajouté ceci comme partie du contexte pour permettre au LLM de générer la plage de dates :

Après avoir obtenu les informations des sous-tâches ci-dessus, vous ajouterez deux champs supplémentaires. Ceux-ci correspondent à start_date et end_date. Inférez ces informations en fonction de la date actuelle et de la time_period sélectionnée. start_date et end_date doivent utiliser le format comme dans l'exemple ci-dessous :

"start_date": "2024-06-03T06:00:00.000Z",

"end_date": "2024-06-11T05:59:59.999Z",

Nous nous concentrons sur l'agent planificateur de notre architecture, donc il n'y a pas trop d'outils que nous devons ajouter ici. Le seul autre outil qui aurait du sens à ajouter est un outil de récupération qui récupère les sous-tâches pertinentes étant donné une requête. Discutons de cette idée ci-dessous.

RAG et mémoire

Cette première version de l'application de recherche approfondie que j'ai construite n'exige pas l'utilisation de mémoire à court terme, mais nous avons construit une version qui met en cache les sous-requêtes pour différentes requêtes utilisateur. C'est utile pour obtenir quelques accélérations/optimisations dans le workflow. Si une requête similaire était déjà utilisée par un utilisateur auparavant, il est possible de stocker ces résultats dans un magasin de vecteurs et de les rechercher pour éviter le besoin de créer un nouvel ensemble de sous-requêtes pour un plan que nous avons déjà généré et qui existe dans le magasin de vecteurs. Rappelez-vous, chaque fois que vous appelez les APIs LLM, vous augmentez la latence et les coûts.

C'est de l'ingénierie contextuelle intelligente car elle rend votre application plus dynamique, moins chère et efficace. Vous voyez, l'ingénierie contextuelle ne concerne pas seulement l'optimisation de votre prompt ; il s'agit de choisir le bon contexte pour les objectifs que vous ciblez. Vous pouvez aussi être plus créatif sur la façon dont vous maintenez ce magasin de vecteurs et comment vous tirez ces sous-tâches existantes dans le contexte. L'ingénierie contextuelle créative et nouvelle est le fossé !

États et contexte historique

Nous ne le montrons pas dans la v1 de notre agent de recherche approfondie, mais une partie importante de ce projet était d'optimiser les résultats pour générer le rapport final. Dans de nombreux cas, le système agentique pourrait avoir besoin de réviser toutes ou un sous-ensemble des requêtes, sous-tâches, et potentiellement les données qu'il tire des APIs de recherche web. Cela signifie que le système prendra plusieurs essais au problème et a besoin d'accès aux états précédents et potentiellement tout le contexte historique du système.

Que signifie cela dans le contexte de notre cas d'usage ? Dans notre exemple, cela pourrait être donner à l'agent l'accès à l'état des sous-tâches, les révisions (le cas échéant), les résultats passés de chaque agent dans le workflow, et quel que soit l'autre contexte nécessaire pour aider dans la phase de révision. Pour ce type de contexte, ce que nous passons dépendrait de ce pour quoi vous optimisez. Beaucoup de prise de décision se passera ici. L'ingénierie contextuelle n'est pas toujours directe, et je pense que vous pouvez commencer à imaginer combien d'itérations ce composant nécessitera. C'est pourquoi je continue à souligner l'importance d'autres domaines, comme l'évaluation. Si vous ne mesurez pas toutes ces choses, comment savez-vous si vos efforts d'ingénierie contextuelle fonctionnent ?

Ingénierie contextuelle avancée [EN COURS]

Il y a beaucoup d'autres aspects de l'ingénierie contextuelle que nous ne couvrons pas dans cet article, tels que la compression de contexte, les techniques de gestion de contexte, la sécurité du contexte, et l'évaluation de l'efficacité du contexte (c'est-à-dire mesurer à quel point ce contexte est efficace au fil du temps). Nous partagerons plus d'idées sur ces sujets dans de futurs articles.

Le contexte peut se diluer ou devenir inefficace (c'est-à-dire être rempli d'informations obsolètes et non pertinentes), ce qui nécessite des workflows d'évaluation spéciaux pour capturer ces problèmes.

Je m'attends à ce que l'ingénierie contextuelle continue d'évoluer comme un ensemble important de compétences pour les développeurs/ingénieurs IA. Au-delà de l'ingénierie contextuelle manuelle, il y a aussi des opportunités de construire des méthodes qui automatisent le traitement d'une ingénierie contextuelle efficace. J'ai vu quelques outils qui ont tenté cela, mais il faut plus de progrès dans ce domaine.

Ressources

Voici quelques lectures recommandées d'autres personnes qui ont récemment écrit sur l'ingénierie contextuelle :

N'hésitez pas à me contacter si vous voyez des erreurs dans cet article.

Content is user-generated and unverified.
    Guide d'Ingénierie Contextuelle - Traduction Française | Claude