Construire des agents conversationnels fiables dépend moins de la création du prompt initial parfait que de la gestion de l'évolution chaotique du contexte au fil du temps. Dans les sessions de longue durée, les grands modèles de langage (LLM) souffrent de la « dérive contextuelle », où le modèle perd progressivement le focus sur les contraintes initiales ou mal interprète l'intention évolutive de l'utilisateur. Ce guide technique explore des stratégies avancées de gestion d'état et de conception de prompts pour atténuer ces problèmes.
Comprendre la dérive contextuelle
La dérive contextuelle se produit lorsque le poids cumulé des interactions précédentes amène le modèle à privilégier les jetons récents, moins pertinents, par rapport aux instructions initiales critiques. Par exemple, dans une session d'assistant de codage qui dure 50 tours, le modèle pourrait oublier l'exigence initiale d'utiliser le mode strict TypeScript parce que les cinq derniers tours se sont concentrés sur le débogage d'un extrait Python spécifique.
Le défi principal est que les LLM sont sans état. Ils ne se souviennent pas des interactions précédentes à moins que l'historique complet ne soit réinjecté dans la fenêtre de contexte. À mesure que cet historique s'allonge, les mécanismes d'attention peinent à maintenir la cohérence, ce qui entraîne des sorties incohérentes.
Stratégies de prompting avec état
Au lieu de compter uniquement sur l'historique brut, nous devrions implémenter une gestion d'état structurée. Cela implique de maintenir un « objet d'état » séparé et léger qui résume le contexte de la conversation actuelle, les préférences de l'utilisateur et les contraintes actives.
Le motif d'injection d'état
En injectant un état résumé au début de chaque prompt, nous nous assurons que les informations critiques restent saillantes. Voici une implémentation pratique en Python :
class ConversationState:
def __init__(self):
self.user_role = "developer"
self.active_constraints = ["use_apis_v2", "python_3.9"]
self.last_topic = "authentication"
def construct_prompt(state: ConversationState, user_input: str, history: list):
# Truncate history to avoid token limits
recent_history = history[-3:] if len(history) > 3 else history
state_summary = f"""
[SYSTEM STATE]
Role: {state.user_role}
Constraints: {', '.join(state.active_constraints)}
Last Topic: {state.last_topic}
[/SYSTEM STATE]
"""
# Combine static system prompt, state, recent history, and new input
prompt_parts = [
"You are a helpful AI assistant. Adhere strictly to the provided state constraints.",
state_summary,
"Recent Dialogue:",
*[f"{h['role']}: {h['content']}" for h in recent_history],
f"User: {user_input}"
]
return "\n".join(prompt_parts)
Atténuer la dérive par résumés périodiques
Pour les sessions très longues, l'injection simple de l'état ne suffit pas. L'historique lui-même peut devenir bruité. Une solution robuste est le résumé périodique. Tous les N tours, utilisez le LLM pour compresser l'historique complet de la conversation en un résumé concis.
Ce résumé remplace l'historique brut dans la fenêtre de contexte, réduisant considérablement le nombre de jetons tout en préservant le sens sémantique. Le résumé doit explicitement inclure :
- Les décisions clés prises par l'utilisateur.
- Les questions non résolues ou les tâches en attente.
- Tout changement apporté aux contraintes initiales.
Exemple pratique : La technique de l'« Ancre »
L'ancrage consiste à répéter les instructions de base à intervalles réguliers. Si votre prompt système définit un format de sortie spécifique, répétez un bref rappel tous les 5 tours. Cela agit comme une « réancrage », ramenant l'attention du modèle vers la tâche principale.
# Example of an anchor injection every 5 turns
if turn_count % 5 == 0:
prompt += "\n\n[REMINDER: Always output valid JSON. Do not include markdown formatting.]"
Conclusion
Gérer l'état et la dérive contextuelle est un pilier des applications LLM de niveau production. En passant au-delà de la simple concaténation d'historique vers l'injection d'état structurée, le résumé périodique et l'ancrage stratégique, les développeurs peuvent construire des agents conversationnels qui restent concentrés, cohérents et fiables au fil d'interactions prolongées. À mesure que les modèles deviennent plus puissants, la sophistication de nos techniques de génie de prompts doit évoluer en parallèle.