Comment j'ai testé 55 invites pour créer de meilleurs contours

Publié: 2024-02-06

Invite DALL-E-3 pour l'image d'en-tête : « JE DOIS tester le fonctionnement de l'outil avec des invites extrêmement simples. N'ajoutez aucun détail, utilisez-le simplement tel quel : un robot écrivant un plan sur un tableau blanc dans un bureau. Organisez le plan en plusieurs sections étiquetées avec des chiffres romains et assurez-vous que les sous-sections sous-jacentes sont correctement mises en retrait par rapport à leurs en-têtes principaux. Il y a beaucoup de choses à déballer dans cette invite, ainsi que dans l'image : surveillez une analyse approfondie de DALL-E bientôt disponible sur un Verblog près de chez vous.

Si vous utilisez l'IA pour créer du contenu et que vous ne pensez pas avoir besoin de tester les invites, parcourez mon dernier article expliquant pourquoi les tests rapides sont si importants.

Dans cet article, je vais partager comment j'ai récemment testé 55 variantes d'invites pour changer la façon dont nous générons pour les clients les grandes lignes de notre contenu d'IA créé par l'homme.

Mon objectif ici est de vous aider à réfléchir à votre propre processus de test. Vous pouvez avoir des objectifs différents ou utiliser vos invites pour faire autre chose que générer des plans, mais les principes généraux et le cadre sont utiles quel que soit votre cas d'utilisation.

Un petit glossaire :

  • Variation d'invite : si je teste plusieurs invites différentes visant le même objectif, par exemple rédiger un plan, ce sont des variantes d'invite. Une variante donnée peut être une seule invite ou inclure plusieurs invites dans une chaîne.
  • Entrée : j'utilise « entrée » pour faire référence aux variables spécifiques utilisées dans une invite. La création d'invites avec ces variables en place vous permet de réutiliser la même invite encore et encore.
  • Sortie : la sortie fait référence à la réponse du LLM à une invite. Dans ChatGPT, c'est la réponse que vous voyez dans la fenêtre. Via l'API OpenAI, voici la réponse dans le champ response.choices[0].message.content . Lorsque j'utilise une chaîne d'invites, j'utilise « sortie » pour faire référence à la sortie finale (c'est-à-dire celle avec le contenu que je souhaite réellement, plutôt que la réponse intermédiaire du modèle.)

Deux commandements des tests LLM

1. Définissez le bien aussi quantitativement que possible

Les tests des LLM commencent souvent par une idée ambiguë : « Je veux voir quelle invite m'apporte un meilleur résultat ». Une partie de ce « meilleur » peut être subjective, et il n'y a aucun moyen de contourner ce problème. Mais proposer au moins quelques mesures quantitatives facilitera grandement l'évaluation des résultats des invites que vous testez, même s'il s'agit simplement de connaître la plage générale dans laquelle vous souhaitez que cette mesure s'inscrive.

Exemples de métriques que j'ai utilisées pour différents tests :

  • Nombre de mots : lors de la génération d'introductions, par exemple, je souhaitais les maintenir dans une certaine plage de nombre de mots.
  • Niveau de lecture : afin de cibler un certain niveau de lecture, j'ai automatisé l'exécution des sorties d'invite via un outil comme Readability pour comparer les niveaux de lecture. (Si j'avais d'abord lu cet article sur la capacité de GPT-4 à évaluer la lisibilité, j'aurais simplement utilisé ce modèle au lieu d'un outil distinct. Attention, cet article contient une tonne de concepts statistiques mais vaut la peine d'être parcouru si vous êtes intéressé. intéressé du tout par la lisibilité.)
  • Nombre de fois qu'un mot-clé est utilisé
  • Si un mot interdit est utilisé
  • Longueur par rapport à l'original : par exemple, je construisais un outil pour supprimer une partie du contenu généré par l'IA et le réécrire de manière plus concise. Je me souciais de la longueur du texte réécrit par rapport à l'original parce que je ne voulais pas trop le réduire, mais je voulais aussi être sûr qu'il ne le rallongeait pas. Le nombre de mots à lui seul ne m'aurait pas dit ce que j'avais besoin de savoir : j'avais besoin d'évaluer le résultat par rapport à l'entrée spécifique.
  • Durée d'exécution : si quelqu'un attend la sortie en temps réel, je ne souhaite pas utiliser une chaîne d'invites dont l'exécution prend quelques minutes.

Très probablement, vous ne pourrez pas réduire toutes vos évaluations à des mesures quantitatives. À un moment donné, vous devrez en fait examiner les résultats et décider par vous-même que « c'était le meilleur des temps ; c'était le pire des temps » est une phrase d'ouverture plus forte que « C'était une époque caractérisée à la fois par la joie et la tristesse ». À tout le moins, cependant, la mise en place de certaines mesures vous permettra d'éliminer certains résultats d'emblée, réduisant ainsi le nombre que vous devez examiner manuellement.

Utiliser l’IA pour évaluer les résultats

Vous vous demandez si vous pouvez utiliser l’IA pour vous aider à évaluer qualitativement les résultats ? Les recherches suggèrent que GPT-4 peut atteindre un accord à 80 % avec les préférences humaines, ce qui, pour mémoire, est le même niveau d’accord que les humains atteignent entre eux. Cependant, je me méfie de m'appuyer exclusivement sur cette approche, car j'ai effectué mes propres tests avec celle-ci au cours de l'été et les résultats n'inspiraient pas vraiment confiance.

Comment j'ai testé : j'ai présenté deux options à GPT-4 et lui ai demandé d'évaluer laquelle était le meilleur exemple d'une certaine voix. J'ai utilisé une température basse pour réduire la variabilité et j'ai exécuté exactement la même invite avec les mêmes choix deux fois, puis j'ai réexécuté l'invite avec les deux mêmes choix, mais j'ai inversé l'ordre dans lequel les choix étaient proposés.

Au total, GPT-4 a comparé quatre fois les deux mêmes choix. J'ai fait cela pour 274 paires différentes, et le modèle n'avait un accord unanime avec lui-même (ce qui signifie qu'il a choisi le même choix quatre fois, que ce choix ait été présenté en premier ou en deuxième) sur 53 % de ces paires.

n = 274

C'est la part de tarte rose ci-dessus. Le deuxième résultat le plus courant (la tranche violette) était que le modèle choisisse deux fois chaque option de la paire, ce qui signifie que son choix était entièrement arbitraire.

Il convient de souligner que ces statistiques ne mesurent que la cohérence de GPT-4 lors de l'évaluation des paires et ne commencent même pas à déterminer si son choix était réellement « correct », c'est-à-dire. si cela correspondait à la préférence d'un évaluateur humain. Précision et exactitude : vous avez besoin des deux si vous comptez utiliser l'IA comme outil d'évaluation.

Tout cela ne veut pas dire qu’il est impossible d’utiliser l’IA pour juger de ses propres résultats. Je pourrais sans aucun doute élever son niveau de consensus (précision) en améliorant l'invite qui lui demande d'évaluer les deux paires, et fournir des exemples de mes propres choix dans cette invite aiderait probablement à l'aligner plus étroitement sur les préférences d'un humain (précision) . Cela prend cependant encore plus de temps et de tests.

En résumé : si vous confiez l’évaluation qualitative à l’IA sans consacrer beaucoup de temps au préalable pour vous assurer que ses évaluations sont A) cohérentes et B) alignées sur vos préférences, vos résultats ne seront pas très bons.

2. Testez sur plusieurs entrées

Si vous utilisez l'IA à grande échelle pour créer du contenu, vous devez tester vos invites sur plusieurs entrées. Sauf si vous utilisez une température très basse, les LLM vous donneront des sorties différentes à chaque fois, même pour la même entrée, et leurs performances varieront encore plus selon les différentes.

Assurez-vous également que vos entrées représentent la gamme de façons dont vous utiliserez cette invite. Si je crée du contenu pour plusieurs secteurs différents, par exemple, je vais m'assurer que les entrées que j'utilise pour les tests ne proviennent pas toutes d'un seul secteur. De même, si je souhaite utiliser la même invite pour générer des plans pour des articles allant de 600 à 2 000 mots, je vais inclure une plage de nombres de mots dans mes entrées. Sinon, je pourrais me retrouver avec une invite qui génère de bons plans pour les articles de 2 000 mots, mais pas pour les articles de 600 mots.

Pour tester une invite de création de contours, par exemple, je pourrais utiliser une feuille de calcul d'entrées qui ressemble à ceci :

feuille de calcul affichant des informations pour six articles différents

Chaque ligne représente un ensemble différent d'entrées. J'exécuterais la même invite six fois, en remplaçant à chaque fois les variables de l'invite telles que {topic} ou {word_count} par les valeurs réelles de l'une des lignes.

Mon processus de test rapide

Une fois ces principes en place, voyons comment j'ai testé 55 invites différentes pour générer des aperçus pour nos clients. Je couvrirai ce que je cherchais à améliorer, les outils et processus que j'ai utilisés pour tester les différentes invites, les mesures résultantes et comment j'ai évalué l'invite gagnante.

Ce que je voulais améliorer

Je souhaitais apporter quelques améliorations spécifiques aux contours générés pour nos clients :

  • Plans plus courts : nos plans existants comprenaient souvent trop de sections, ce qui rendait l'article final trop long pour le nombre de mots désigné.
  • Risque réduit d’hallucination : si le plan comprenait des sections telles que « Études de cas », « Témoignages » ou « Références », l’IA tenterait inévitablement d’inventer ces informations lors de la rédaction de l’article, ce qui impliquait un travail supplémentaire pour nos rédacteurs humains. Je voulais améliorer notre processus pour empêcher l'IA d'inclure ces sections.
  • Meilleurs aperçus du format : par exemple, si le sujet du client est une liste telle que "X meilleurs VPN", les titres du plan doivent chacun être un VPN spécifique plutôt que "VPN n°1", "VPN n°2", etc. , et ces sections devraient constituer la majeure partie de l’article. Je voulais également m'assurer que nos plans faisaient un meilleur travail en gardant à l'esprit l'intention du lecteur et en couvrant les informations qu'il s'attendait à voir lors de la recherche du mot-clé du client.

Une dernière considération pour la qualité de notre expérience client, mais pas pour la qualité du contenu lui-même, était le temps qu'il fallait pour générer le plan. Étant donné que les clients attendent dans notre application en temps réel que le plan apparaisse afin de pouvoir le consulter et le modifier avant de finaliser leur commande, il est important qu'ils doivent attendre dix secondes ou une minute.

Nous voulons vraiment que nos clients examinent et modifient le plan afin que nous puissions être sûrs que nous couvrons ce qu'ils veulent. Plus ils doivent attendre, moins ils sont susceptibles de le faire.

Le processus

Google Sheets et Google Colab sont mes meilleurs amis.

Dans une feuille, j'ai dressé une première liste de variantes d'invites. Dans certains cas, la différence entre deux invites ne serait que de quelques mots. Dans d’autres, ils seraient totalement différents. Voici un exemple :

 Prompt variation #1 write an outline for the topic: {topic} word length: {word_count}

Comme vous pouvez le voir, j'ai commencé extrêmement simplement pour comprendre ce que le LLM ferait avec un minimum de direction. Pour d'autres variantes, j'ai utilisé des stratégies d'incitation plus sophistiquées :

 Prompt variation #5 You will be writing an outline for a given topic. First, think through how the article should be structured, given the searcher intent for the keyword. Provide these thoughts inside <analysis></analysis> tags. Then, provide the outline itself inside <outline></outline> tags. topic: {topic} keyword: {keyword}

Dans une deuxième feuille, j'ai stocké les brèves informations de 30 articles réels différents déjà commandés et livrés à nos clients, ainsi que les aperçus initialement générés pour ceux-ci.

capture d'écran du formulaire de commande de contenu de Verblio
Nous avons intentionnellement gardé notre formulaire de commande de contenu minimal et structuré, mais nos invites doivent toujours prendre en compte un large éventail d'entrées.

L'étape suivante consistait à utiliser l'API d'OpenAI. Si vous n'êtes pas à l'aise avec l'écriture de code mais que vous avez accès à un outil avec peu ou pas de code comme Make ou Zapier, vous pouvez accéder aux modèles d'OpenAI de cette façon. Quoi qu'il en soit, c'est beaucoup plus facile que de copier/coller les invites et les sorties d'une fenêtre ChatGPT, et c'est le seul moyen viable d'effectuer de véritables tests à grande échelle.

À l'aide d'un programme Python dans un notebook Colab, j'ai envoyé une invite au modèle (principalement GPT-4 ou GPT-3.5-turbo). Cette invite a été créée en remplaçant les variables de l'une des variantes d'invite de la première feuille par l'un des 30 ensembles d'entrées de la deuxième feuille, et en recommençant jusqu'à ce que j'aie invité le modèle avec chaque combinaison d'invite et d'entrées. Le programme a ensuite automatiquement enregistré les contours résultants sur une troisième feuille.

capture d'écran du code python dans un notebook Google Colab
Il s'agit de la partie principale de mon code, dans laquelle je récupère les entrées d'article et les variantes d'invite de deux feuilles différentes, et j'exécute chaque ensemble d'entrées dans chaque variation d'invite.

Pour chaque nouveau schéma généré par le modèle, j'ai ensuite évalué les mesures quantitatives qui m'intéressaient, sur la base des améliorations que j'ai identifiées ci-dessus :

  • Dans quelle mesure était-il plus court que le plan que nous avions généré précédemment pour le client à l'aide de notre flux d'invites existant ?
  • Comportait-il des sections que nous ne voulions pas voir, comme des études de cas ou des références ?
  • Combien de temps a-t-il fallu pour courir ?

J'ai regroupé ces métriques pour chaque variation d'invite et comparé les résultats globaux.

Je ne pouvais pas me fier uniquement aux chiffres, j'ai donc également examiné manuellement les plans pour voir si les listes étaient correctement formatées, si elles avaient un sens, etc.

J'ai ensuite itéré sur les variantes d'invite les plus performantes pour voir si je pouvais encore améliorer les résultats, et j'ai recommencé le même processus. Et encore. Et encore et encore et encore.

Les résultats

À la fin, j’avais testé 55 variantes différentes d’invites, de modèles et de températures. Les résultats pour certains d’entre eux figurent dans le tableau ci-dessous.

feuille de calcul montrant les résultats des tests de différentes variantes d'invite
n = 30

Première légende : vous pouvez voir les résultats s'améliorer (plus de vert, moins de rouge) au fur et à mesure de mes itérations. C'est pourquoi les tests sont importants. Vous pouvez apporter des améliorations très réelles, dans plusieurs dimensions, qui vous permettront de gagner beaucoup de temps lorsque vous exécutez ces invites sur des centaines de cas.

Les colonnes B à E indiquent toutes à quel point le nouveau plan était plus court que celui que nous avions généré précédemment. La colonne F indique le temps qu'il a fallu à chaque invite (ou chaîne d'invites, dans certains cas) pour s'exécuter, ce qui correspond approximativement au temps qu'il faudrait à notre client pour attendre dans l'application. La colonne G indique combien de nouveaux plans contenaient une section qu'elle n'aurait pas dû avoir, comme « Études de cas ».

La cohérence compte

La principale raison pour laquelle il est si important de tester vos invites sur plusieurs entrées (30, dans mon cas) est qu'elles se comporteront différemment à chaque fois. C'était très important pour nous de voir à quel point le nouveau contour était plus court que l'ancien.

La réduction médiane (colonne B) est explicite, mais si nous avions examiné uniquement cette mesure, nous n'aurions rien appris sur la cohérence de cette variation rapide entre les intrants. Il était également important d'examiner la réduction minimale (colonne C) car elle montrait le pire des cas : chaque variation d'invite entraînait en fait un plan plus long que l'original pour au moins un des articles de test. Pour l'invite 41, le pire des cas impliquait d'obtenir un plan plus de deux fois plus long que celui que nous avions initialement obtenu avec nos invites actuelles. Pour l'invite 55, en revanche, le pire des cas était nettement meilleur, le nouveau plan n'étant que 10 % plus long que l'original.

La réduction maximale (colonne D) n'est pas codée par couleur car je ne visais pas un pourcentage de réduction particulier, bien que la réduction de 84 % pour l'invite 43 soit probablement trop élevée. Ce qui est plus important pour comprendre le comportement cohérent d'une invite est l'écart entre les réductions minimales et maximales : colonne E. Plus ce nombre est bas, plus les résultats de cette invite étaient cohérents, ce que nous souhaitons.

Au moment de l'exécution

Deux facteurs principaux ont eu un impact sur le temps d'exécution (colonne F) :

  1. le LLM utilisé
  2. le nombre d'invites, c'est-à-dire. s'il s'agissait d'une seule invite ou d'une chaîne d'invites

La longueur de l'invite a également un impact sur la durée d'exécution, mais dans une bien moindre mesure que ces deux facteurs.

Le compromis est que vous pouvez souvent obtenir des résultats qualitativement meilleurs en utilisant des invites ou des chaînes d'invites plus longues, mais l'exécution prendra alors plus de temps. Cependant, différents modèles ont également des durées d'exécution différentes. En général, les modèles plus anciens et plus petits sont plus rapides, tandis que les modèles plus récents comme GPT-4 sont plus lents, en raison à la fois de leur taille et de leur trafic plus élevé.

L'invite gagnante

La variation rapide qui s'est avérée globalement la meilleure, tant sur les mesures quantitatives que qualitatives, était le numéro 54.

Vous pouvez voir les résultats pour l'invite 54 qui a atteint mes objectifs initiaux :

  • Cela aboutissait systématiquement à des contours plus courts (mais pas trop courts !) et à un écart relativement faible entre la réduction minimale et maximale (colonne E).
  • La durée d'exécution médiane de 15 secondes (colonne F) n'était pas la plus basse, mais elle représentait tout de même moins de la moitié de la durée d'exécution moyenne de l'invite que nous utilisions actuellement.
  • Il n'a jamais inclus de section que nous ne voulions pas voir dans le plan (colonne G).
  • Lorsque j'ai examiné les plans manuellement, ils correspondaient à ce que nous recherchions en termes de qualité, de format, etc.

J'aborderai plus en détail les stratégies d'invite exactes dans mon prochain article, mais en un mot, voici ce qui a fait que l'invite 54 fonctionne si bien :

  • Donner au modèle le temps de « réfléchir »
  • Fournir des exemples de ce que je voulais
  • Utiliser une chaîne d'invites (plutôt qu'une seule invite) pour améliorer sa précision lorsqu'il s'agit de répondre à des exigences spécifiques, mais en faisant cela sur un modèle plus ancien pour maintenir le temps d'exécution relativement faible.

Aurais-je pu continuer avec plus de variantes rapides et constater plus d’améliorations ? Bien sûr. Mais à un moment donné, j'ai voulu obtenir une meilleure incitation à la production afin que nos clients puissent commencer à constater les améliorations le plus tôt possible.

Morale de l'histoire : testez une quantité raisonnable, mais ne laissez pas le parfait devenir l'ennemi du bien. À mesure que les gains issus des nouvelles variantes diminuent, vous aurez envie de déclarer un gagnant et de continuer votre vie.

Dans le prochain article, j'aborderai le contenu des invites elles-mêmes en partageant les stratégies d'invite spécifiques que j'ai testées et des conseils pour rédiger des invites qui fonctionnent à grande échelle. Si vous avez des questions sur la configuration des tests, le code Python que j'ai utilisé ou toute autre chose, envoyez un message à [email protected].