Réponse courte
GPT-3 ne peut examiner qu’une quantité fixe de texte à la fois, appelée sa fenêtre de contexte, et cette fenêtre est partagée entre votre prompt et sa réponse. Tout ce qui n’y entre pas n’existe tout simplement pas pour le modèle; un long document doit donc être découpé en morceaux traités un à la fois.
Question de suivi Comment découper un long texte en morceaux?
Collez un long rapport dans le Playground de GPT-3 et demandez-en un résumé : l’une de deux choses risque de se produire. Soit la requête est refusée parce qu’elle est trop longue, soit vous la raccourcissez jusqu’à ce qu’elle entre, et le résumé ignore en silence tout ce que vous avez coupé. Le modèle n’a rien oublié. Il n’a tout simplement jamais vu ce texte.
La raison, c’est la fenêtre de contexte : la quantité maximale de texte que le modèle peut prendre en compte dans une seule requête. GPT-3 n’a aucune mémoire d’une requête à l’autre et aucun moyen de revenir en arrière. Ce qui se trouve dans la fenêtre constitue tout son univers à ce moment-là.
Quelle est la taille de la fenêtre?
La fenêtre se mesure en jetons, les morceaux de mots que lit le modèle. Selon la règle générale d’OpenAI, un jeton correspond à environ quatre caractères d’anglais, ou aux trois quarts d’un mot; 100 jetons font donc environ 75 mots, et 1 500 mots remplissent à peu près 2 048 jetons.
Ce chiffre, 2 048 jetons, est la limite de la plupart des moteurs GPT-3. La documentation d’OpenAI indique que text-davinci-002, le modèle le plus récent et le plus capable, accepte jusqu’à 4 000 jetons par requête, soit environ le double. Deux détails prennent les gens au dépourvu :
- La limite couvre le prompt et la réponse ensemble. Si votre prompt utilise 3 700 jetons avec
text-davinci-002, il n’en reste qu’environ 300 pour la réponse. - Les jetons ne sont pas des mots. Les langues autres que l’anglais demandent souvent plus de jetons pour la même quantité de texte. OpenAI note qu’une courte phrase en espagnol peut prendre un jeton pour chaque groupe de deux caractères.
Un petit calcul montre le problème. Un rapport de 30 pages à environ 500 mots par page fait environ 15 000 mots, soit autour de 20 000 jetons. C’est cinq fois la plus grande fenêtre offerte, avant même que le modèle écrive un seul mot.
Pourquoi le modèle « perd le fil » même quand le texte entre
Comme la fenêtre est partagée, un prompt qui entre tout juste cause ses propres ennuis. Le modèle écrit jusqu’à ce qu’il atteigne son point d’arrêt ou le plafond de jetons; un long document qui laisse peu de place à la réponse produit donc une réponse qui s’arrête au milieu d’une phrase. Et si vous raccourcissez le document pour faire de la place, le modèle ne travaille qu’à partir de la partie conservée, sans aucun indice que quelque chose manque. Une bonne habitude consiste à garder chaque requête bien en deçà du plafond et à décider d’avance des parties du document dont le modèle a vraiment besoin.
Une méthode concrète : résumer un rapport de 30 pages
La solution fiable consiste à cesser de demander au modèle de contenir tout le document et à lui donner un morceau gérable à la fois. Les chercheurs d’OpenAI ont utilisé cette approche l’an dernier pour résumer des romans entiers : ils ont découpé chaque livre en sections, résumé chaque section, puis résumé ces résumés jusqu’à ce qu’il ne reste qu’un court compte rendu du livre entier.
Voici la même idée à l’échelle d’un bureau :
- Découpez le rapport à ses intertitres en morceaux d’environ 1 500 à 2 000 mots chacun, ce qui vous donne une douzaine de morceaux.
- Résumez chaque morceau avec le même prompt, pour que les résultats soient cohérents.
- Rassemblez les résumés des morceaux, dans l’ordre, dans un seul document.
- Résumez les résumés dans une dernière requête, qui entre maintenant facilement.
Le prompt de l’étape 2 pourrait ressembler à ceci :
Voici la section 4 sur 12 d’un rapport sur le transport en commun régional.
Résume-la en 5 puces pour un conseiller municipal très occupé. Garde chaque nombre et chaque date exactement tels qu’ils sont écrits.
Texte de la section :
"""
[colle la section 4 ici]
"""
Résumé :Dire au modèle quelle section il lit, et à qui s’adresse le résumé, garde les morceaux alignés. Lui demander de conserver les nombres exactement tels qu’ils sont écrits rend les résumés beaucoup plus faciles à vérifier par rapport à la source par la suite.
À essayer : prenez un document de cinq à dix pages que vous connaissez bien. Résumez-le par morceaux avec le prompt ci-dessus, combinez les puces, puis demandez un résumé d’un paragraphe. Comparez-le ensuite avec l’original : qu’est-ce qui a survécu, et qu’est-ce qui a disparu?
Comment découper un long texte en morceaux?
Découpez selon la structure du document lui-même chaque fois que c’est possible. Les changements de chapitre, les intertitres et les lignes vides entre les sections sont des coutures naturelles, et les chercheurs qui résumaient des romans visaient justement ces limites. Couper au milieu d’un paragraphe sépare une affirmation de son explication, et le modèle résumera chaque moitié sans l’autre.
Calibrez chaque morceau pour laisser de la place. Avec un modèle de 4 000 jetons, un morceau d’environ 2 000 mots (environ 2 700 jetons) plus votre consigne laisse encore de l’espace pour un résumé complet. Avec un moteur de 2 048 jetons, visez environ 1 000 mots. Chaque étape doit réduire fortement le texte; l’étude d’OpenAI sur les livres visait à le diviser par cinq à dix à chaque niveau.
Enfin, donnez un peu de contexte à chaque morceau. Une section lue isolément peut être mal comprise. L’étude sur les livres en donne un exemple frappant : lu sans le reste du chapitre, un passage d’Orgueil et préjugés où l’on demande sa main à un personnage a été résumé comme une demande en mariage, alors que le chapitre complet montre clairement qu’il s’agissait d’une invitation à danser. Les chercheurs ont atténué ce problème en transmettant les résumés précédents avec chaque nouvelle section. Vous pouvez faire de même en commençant chaque prompt par deux ou trois phrases qui récapitulent ce qui précède.
Sources
- OpenAI API documentation: GPT-3 engines and Playground settings — OpenAI, 5 avril 2022
- What are tokens and how to count them? — OpenAI Help Center, 21 mars 2022
- Recursively Summarizing Books with Human Feedback — OpenAI (arXiv), 22 septembre 2021