Lost in the middle : pourquoi tout mettre dans le prompt ne marche pas
Le phénomène « lost in the middle » désigne une faiblesse observée sur de nombreux LLM : ils exploitent bien les informations placées au début et à la fin d'un long contexte, mais moins bien celles qui se trouvent au milieu.
Capacité n'est pas attention
La fenêtre de contexte indique combien de tokens le modèle peut lire. Elle ne dit pas avec quelle fiabilité il exploite chacun d'eux. Un contrat de 120 pages tient dans une fenêtre de 128 000 tokens, et pourtant la clause de la page 60 peut être ignorée.
Ce qu'ont montré les tests
Une étude de 2023 (Liu et al.) a placé une information clé à différentes positions dans un long contexte, au milieu de documents sans rapport, puis posé une question qui en dépend. La précision dessine une courbe en U : élevée quand l'information est au début, élevée à la fin, nettement plus basse au milieu. Les modèles récents ont atténué le phénomène, mais il reste mesurable.
Deux causes se renforcent : l'attention se répartit entre un très grand nombre de tokens, et les textes d'entraînement placent le plus souvent l'essentiel en introduction et en conclusion.
L'argument contre « je mets tout dans le prompt »
Avec des fenêtres de contexte de plus en plus grandes, il est tentant de coller toute la documentation dans le prompt et de se passer de RAG. C'est rarement une bonne idée :
- l'information utile risque d'être noyée au milieu ;
- chaque requête coûte plus cher, puisque tout est facturé en tokens d'entrée ;
- le délai avant la première réponse s'allonge.
Les bonnes pratiques
- Placer les consignes importantes au début et rappeler la question à la fin, après les documents.
- N'envoyer que les passages utiles : c'est le rôle du RAG, de la recherche hybride et du reranking.
- Découper les gros travaux : analyser un long document section par section, puis synthétiser les résultats.
- Structurer les documents fournis avec des titres et des balises.
- Tester sur vos propres documents : le test « needle in a haystack » cache une phrase à toutes les positions et vérifie que le modèle la retrouve.