Stratégies pour obtenir de meilleurs résultats

Rédiger des instructions claires

Ces modèles ne peuvent pas lire dans vos pensées. Si les sorties sont trop longues, demandez des réponses concises. Si les résultats sont trop simples, demandez un texte de niveau expert. Si le format ne vous convient pas, montrez le format que vous aimeriez voir. Moins le modèle doit deviner ce que vous voulez, plus vous êtes susceptible de l'obtenir.

Tactiques :

  • Inclure des détails dans votre requête pour obtenir des réponses plus pertinentes
  • Demander au modèle d'adopter une personnalité
  • Utiliser des délimiteurs pour indiquer clairement les parties distinctes de l'entrée
  • Spécifier les étapes requises pour accomplir une tâche
  • Fournir des exemples
  • Spécifier la longueur désirée de la sortie

Fournir un texte de référence

Les modèles de langage peuvent inventer avec confiance de fausses réponses, surtout lorsqu'on leur demande à propos de sujets ésotériques ou de citations et d'URL. De la même manière qu'une feuille de notes peut aider un étudiant à mieux réussir un examen, fournir un texte de référence à ces modèles peut aider à répondre avec moins de fabrications.

Tactiques :

  • Instruire le modèle de répondre en utilisant un texte de référence
  • Instruire le modèle de répondre avec des citations issues d'un texte de référence

Diviser des tâches complexes en sous-tâches plus simples

Tout comme il est courant en génie logiciel de décomposer un système complexe en un ensemble de composants modulaires, il en va de même pour les tâches soumises à un modèle de langage. Les tâches complexes ont tendance à présenter des taux d'erreurs plus élevés que les tâches plus simples. De plus, les tâches complexes peuvent souvent être redéfinies comme un flux de tâches plus simples où les résultats des tâches antérieures sont utilisés pour construire les entrées des tâches ultérieures.

Tactiques :

  • Utiliser la classification d'intention pour identifier les instructions les plus pertinentes pour une requête utilisateur
  • Pour les applications de dialogue nécessitant de très longues conversations, résumer ou filtrer le dialogue précédent
  • Résumer les longs documents par morceaux et construire un résumé complet de manière récursive

Donner le temps au modèle de "réfléchir"

Si on vous demandait de multiplier 17 par 28, vous ne le sauriez peut-être pas instantanément, mais pourriez toujours trouver la réponse avec le temps. De la même manière, les modèles commettent plus d'erreurs de raisonnement lorsqu'ils essaient de répondre immédiatement, plutôt que de prendre le temps de réfléchir à une réponse. Demander une "chaîne de pensée" avant une réponse peut aider le modèle à raisonner de manière plus fiable vers des réponses correctes.

Tactiques :

  • Instruire le modèle à trouver sa propre solution avant de se précipiter vers une conclusion
  • Utiliser un monologue intérieur ou une séquence de requêtes pour cacher le processus de raisonnement du modèle
  • Demander au modèle s'il a manqué quelque chose lors des passages précédents

Utiliser des outils externes

Compensez les faiblesses du modèle en lui fournissant les sorties d'autres outils. Par exemple, un système de récupération de texte (parfois appelé RAG ou génération augmentée par récupération) peut informer le modèle des documents pertinents. Un moteur d'exécution de code comme l'interprète de code d'OpenAI peut aider le modèle à faire des calculs mathématiques et exécuter du code. Si une tâche peut être effectuée de manière plus fiable ou efficace par un outil plutôt que par un modèle de langage, déléguez-la pour obtenir le meilleur des deux mondes.

Tactiques :

  • Utiliser une recherche basée sur des embeddings pour mettre en œuvre une récupération de connaissances efficace
  • Utiliser l'exécution de code pour effectuer des calculs plus précis ou appeler des API externes
  • Donner au modèle accès à des fonctions spécifiques

Tester les changements de manière systématique

Il est plus facile d'améliorer les performances si vous pouvez les mesurer. Dans certains cas, une modification d'une instruction permettra d'obtenir de meilleures performances sur quelques exemples isolés, mais entraînera de moins bonnes performances dans l'ensemble sur un ensemble d'exemples plus représentatif. Ainsi, pour être certain qu'un changement améliore les performances dans l'ensemble, il peut être nécessaire de définir une suite de tests complète (également appelée "éval").

Tactique :

  • Évaluer les sorties du modèle en référence à des réponses de qualité supérieure

Tactiques

Chacune des stratégies énumérées ci-dessus peut être concrétisée avec des tactiques spécifiques. Ces tactiques sont censées fournir des idées de choses à essayer. Elles ne sont en aucun cas entièrement exhaustives, et vous devriez vous sentir libre d'essayer des idées créatives qui ne sont pas représentées ici.

Description de l'exemple de mot d'amorçage

Nous savons tous que l'API du modèle de discussion qui appelle OpenAI a trois types de messages, SYSTEM, USER et ASSISTANT, et les fonctions de ces trois messages sont les suivantes :

Type de message (correspondant au paramètre de rôle de l'API) Description
SYSTEM Le message système aide à définir le comportement de l'assistant. Par exemple, vous pouvez modifier la personnalité de l'assistant ou fournir des instructions spécifiques sur la manière dont il doit se comporter tout au long de la conversation. Cependant, notez que le message du système est facultatif et que le comportement du modèle sans un message du système est susceptible d'être similaire à l'utilisation d'un message générique tel que "Vous êtes un assistant utile."
USER Un message utilisateur est une question de l'utilisateur.
ASSISTANT Les messages d'assistance représentent ce que GPT renvoie.

Les exemples de mots d'amorçage dans ce tutoriel seront expliqués dans le format suivant :

// Message du SYSTEM
Cela montre comment définir le mot d'amorçage du message SYSTEM.

// Message de l'UTILISATEUR
Cela montre comment définir le mot d'amorçage du message UTILISATEUR.

// Message de l'ASSISTANT
Cela montre ce que GPT pourrait renvoyer.

Stratégie : Rédiger des instructions claires

Tactique : Inclure des détails dans votre requête pour obtenir des réponses plus pertinentes

Pour obtenir une réponse très pertinente, assurez-vous que les demandes fournissent tous les détails ou le contexte importants. Sinon, vous laissez le modèle deviner ce que vous voulez dire.

Moins bien Mieux
Comment ajouter des chiffres dans Excel ? Comment puis-je additionner une ligne de montants en dollars dans Excel ? Je souhaite le faire automatiquement pour toute une feuille de lignes avec tous les totaux se trouvant à droite dans une colonne appelée "Total".
Qui est le président ? Qui était le président du Mexique en 2021, et à quelle fréquence ont lieu les élections ?
Écrire du code pour calculer la suite de Fibonacci. Écrire une fonction TypeScript pour calculer efficacement la suite de Fibonacci. Commentez généreusement le code pour expliquer ce que fait chaque élément et pourquoi il est écrit de cette manière.
Résumer les notes de la réunion. Résumez les notes de la réunion en un seul paragraphe. Ensuite, écrivez une liste en markdown des intervenants et de chacun de leurs points clés. Enfin, énumérez les prochaines étapes ou les actions suggérées par les intervenants, le cas échéant.

Tactique : Demander au modèle d'adopter une personna

Le message système peut être utilisé pour spécifier la personnalité utilisée par le modèle dans ses réponses.

// Message du SYSTEM
Quand je demande de l'aide pour écrire quelque chose, vous répondrez avec un document contenant au moins une blague ou un commentaire ludique dans chaque paragraphe.

// Message de l'UTILISATEUR
Écrivez une note de remerciement à mon fournisseur de boulons en acier pour avoir livré à temps et avec un court préavis. Cela nous a permis de livrer une commande importante.

Tactique : Utiliser des délimiteurs pour indiquer clairement les parties distinctes de l'entrée

Les délimiteurs comme les triples guillemets, les balises XML, les titres de section, etc. peuvent aider à délimiter les sections de texte à traiter différemment.

// Message de l'UTILISATEUR
Résumez le texte délimité par des triples guillemets avec un haïku.

"""insérer le texte ici"""
// Message du SYSTEM
Vous recevrez une paire d'articles (délimités par des balises XML) sur le même sujet. Résumez d'abord les arguments de chaque article. Ensuite, indiquez lequel présente le meilleur argument et expliquez pourquoi.

// Message de l'UTILISATEUR
<article> insérer le premier article ici </article>
<article> insérer le second article ici </article>
// Message du SYSTEM
Vous recevrez un résumé de thèse et un titre suggéré pour celui-ci. Le titre de la thèse doit donner une bonne idée du sujet de la thèse tout en étant accrocheur. Si le titre ne répond pas à ces critères, suggérez 5 alternatives.

// Message de l'UTILISATEUR
Résumé : insérer le résumé ici

Titre : insérer le titre ici

Tactic: Spécifiez les étapes nécessaires pour accomplir une tâche

Certaines tâches sont mieux spécifiées sous forme de séquence d'étapes. Écrire explicitement les étapes peut faciliter la compréhension par le modèle.

// Message SYSTEME

Suivez les instructions étape par étape pour répondre aux entrées de l'utilisateur.

Étape 1 - L'utilisateur vous fournira un texte entre triples guillemets. Résumez ce texte en une seule phrase, en ajoutant le préfixe "Résumé : ".

Étape 2 - Traduisez le résumé de l'étape 1 en espagnol, en ajoutant le préfixe "Traduction : ".

Tactic: Fournissez des exemples

Donner des instructions générales qui s'appliquent à tous les exemples est généralement plus efficace que de montrer toutes les permutations d'une tâche par des exemples, mais dans certains cas, fournir des exemples peut être plus facile. Par exemple, si vous attendez du modèle qu'il reproduise un style spécifique pour répondre aux requêtes de l'utilisateur, ce qui est difficile à décrire explicitement. Cela s'appelle un "apprentissage à quelques exemples".

// Message SYSTEME
Répondez dans un style cohérent.

// Message UTILISATEUR
Enseigne-moi la patience.

// Message ASSISTANT
La rivière qui creuse le plus profond canyon provient d'une modeste source ; la plus grande symphonie a pour origine une seule note ; la tapisserie la plus complexe commence par un fil solitaire.

// Message UTILISATEUR
Enseigne-moi sur l'océan.

Tactic: Spécifiez la longueur de la sortie souhaitée

Vous pouvez demander au modèle de produire des sorties d'une longueur cible donnée. La longueur cible peut être spécifiée en termes de nombre de mots, de phrases, de paragraphes, de points de liste, etc. Notez cependant que demander au modèle de générer un nombre spécifique de mots ne fonctionne pas avec une grande précision. Le modèle peut générer des sorties de manière plus fiable avec un nombre spécifique de paragraphes ou de points de liste.

// Message UTILISATEUR

Résumez le texte contenu entre guillemets triples en environ 50 mots.

"""insérer le texte ici"""
// Message UTILISATEUR

Résumez le texte contenu entre guillemets triples en 2 paragraphes.

"""insérer le texte ici"""
// Message UTILISATEUR

Résumez le texte contenu entre guillemets triples en 3 points de liste.

"""insérer le texte ici"""

Stratégie : Fournir un texte de référence

Tactic: Instruisez le modèle à répondre en utilisant un texte de référence

Si nous pouvons fournir au modèle des informations fiables et pertinentes par rapport à la question posée, nous pouvons lui demander d'utiliser ces informations pour composer sa réponse.

// Message SYSTEME
Utilisez les articles fournis entre guillemets triples pour répondre aux questions. Si la réponse ne peut pas être trouvée dans les articles, écrivez "Je n'ai pas pu trouver de réponse".

// Message UTILISATEUR
<insérez les articles, chacun entre guillemets triples>

Question : <insérez la question ici>

Étant donné que tous les modèles ont des fenêtres contextuelles limitées, nous avons besoin d'un moyen de rechercher dynamiquement des informations pertinentes par rapport à la question posée. Les embeddings peuvent être utilisés pour mettre en œuvre une récupération de connaissances efficace. Consultez la tactique "Utiliser la recherche basée sur les embeddings pour mettre en œuvre une récupération de connaissances efficace" pour plus de détails sur la façon de mettre en œuvre cela.

Tactic: Instruisez le modèle à répondre avec des citations à partir d'un texte de référence

Si l'entrée a été enrichie avec des connaissances pertinentes, il est simple de demander au modèle d'ajouter des citations à ses réponses en référençant des passages des documents fournis. Notez que les citations dans la sortie peuvent ensuite être vérifiées de manière programmatique en faisant correspondre les chaînes de caractères dans les documents fournis.

// Message SYSTEME
Vous recevrez un document délimité par des guillemets triples ainsi qu'une question. Votre tâche est de répondre à la question en utilisant uniquement le document fourni et de citer le(s) passage(s) du document utilisé pour répondre à la question. Si le document ne contient pas les informations nécessaires pour répondre à cette question, écrivez simplement : "Informations insuffisantes". Si une réponse à la question est fournie, elle doit être annotée d'une citation. Utilisez le format suivant pour citer les passages pertinents ({"citation" : …}).

// Message UTILISATEUR

"""<insérer le document ici>"""

Question : <insérez la question ici>

Tactic: Utiliser la classification d'intention pour identifier les instructions les plus pertinentes pour une requête utilisateur

Pour les tâches nécessitant de nombreuses séries d'instructions indépendantes pour gérer différents cas, il peut être bénéfique de classifier d'abord le type de requête et d'utiliser cette classification pour déterminer les instructions nécessaires. Cela peut être réalisé en définissant des catégories fixées et en codant en dur les instructions pertinentes pour traiter les tâches dans une catégorie donnée. Ce processus peut également être appliqué de manière récursive pour décomposer une tâche en une séquence d'étapes. L'avantage de cette approche est que chaque requête ne contiendra que les instructions nécessaires pour effectuer la prochaine étape d'une tâche, ce qui peut entraîner des taux d'erreur plus faibles par rapport à l'utilisation d'une seule requête pour effectuer toute la tâche. Cela peut également entraîner des coûts moindres car les prompts plus importants coûtent plus cher à exécuter.

Par exemple, pour une application de service client, les requêtes pourraient être utilement classifiées comme suit:

// Message SYSTÈME
Vous recevrez des requêtes de service client. Classez chaque requête dans une catégorie principale et une catégorie secondaire. Fournissez votre sortie au format json avec les clés : primaire et secondaire.

Catégories principales : Facturation, Support technique, Gestion de compte, ou Demande générale.

Catégories secondaires de Facturation :
- Désabonnement ou mise à niveau
- Ajouter un moyen de paiement
- Explication de frais
- Contester une charge

Catégories secondaires de Support technique :
- Dépannage
- Compatibilité des appareils
- Mises à jour logicielles

Catégories secondaires de Gestion de compte :
- Réinitialisation du mot de passe
- Mettre à jour les informations personnelles
- Fermeture de compte
- Sécurité du compte

Catégories secondaires de Demande générale :
- Informations sur le produit
- Tarification
- Retour d'information
- Parler à un être humain

// Message UTILISATEUR
J'ai besoin de faire fonctionner à nouveau mon internet.

En fonction de la classification de la requête client, un ensemble d'instructions plus spécifiques peut être fourni à un modèle pour qu'il gère les prochaines étapes. Par exemple, supposons que le client ait besoin d'aide pour "dépanner".

// Message SYSTÈME
Vous recevrez des demandes de service client qui nécessitent un dépannage dans un contexte de support technique. Aidez l'utilisateur en :

- Demandez-lui de vérifier que tous les câbles vers/depuis le routeur sont connectés. Notez qu'il est courant que les câbles se desserrent avec le temps.
- Si tous les câbles sont connectés et que le problème persiste, demandez-lui quel modèle de routeur il utilise.
- Maintenant, vous lui conseillerez comment redémarrer son appareil :
-- Si le numéro de modèle est MTD-327J, conseillez-lui d'appuyer sur le bouton rouge et de le maintenir enfoncé pendant 5 secondes, puis d'attendre 5 minutes avant de tester la connexion.
-- Si le numéro de modèle est MTD-327S, conseillez-lui de débrancher et de rebrancher, puis d'attendre 5 minutes avant de tester la connexion.
- Si le problème du client persiste après le redémarrage de l'appareil et l'attente de 5 minutes, connectez-le au support informatique en produisant {"Demande de support informatique"}.
- Si l'utilisateur commence à poser des questions qui ne sont pas liées à ce sujet, confirmez s'il souhaite mettre fin au chat actuel sur le dépannage et classifiez sa demande selon le schéma suivant :

<insérer le schéma de classification primaire/secondaire ci-dessus ici>

// Message UTILISATEUR
J'ai besoin de faire fonctionner à nouveau mon internet.

Remarquez que le modèle a reçu des instructions pour émettre des chaînes spéciales pour indiquer quand l'état de la conversation change. Cela nous permet de transformer notre système en une machine à états où l'état détermine quelles instructions sont injectées. En gardant trace de l'état, des instructions pertinentes à cet état, et éventuellement des transitions d'état autorisées à partir de cet état, nous pouvons encadrer l'expérience utilisateur de manière qu'il serait difficile d'atteindre avec une approche moins structurée.

Tactic: Pour les applications de dialogue nécessitant des conversations très longues, résumer ou filtrer les dialogues précédents

Puisque les modèles ont une longueur de contexte fixe, le dialogue entre un utilisateur et un assistant dans lequel l'intégralité de la conversation est incluse dans la fenêtre de contexte ne peut pas se poursuivre indéfiniment.

Il existe diverses solutions à ce problème, l'une d'entre elles consiste à résumer les tours précédents dans la conversation. Une fois que la taille de l'entrée atteint une longueur prédéterminée, cela pourrait déclencher une requête qui résume une partie de la conversation et le résumé de la conversation précédente pourrait être inclus dans le message du système. Alternativement, la conversation précédente pourrait être résumée de manière asynchrone en arrière-plan tout au long de la conversation.

Une solution alternative consiste à sélectionner dynamiquement les parties précédentes de la conversation les plus pertinentes pour la requête actuelle. Voir la tactique "Utiliser la recherche basée sur les plongements pour mettre en œuvre une récupération efficace des connaissances".

Tactic: Résumer les longs documents morceau par morceau et construire un résumé complet de manière récursive

Étant donné que les modèles ont une longueur de contexte fixe, ils ne peuvent pas être utilisés pour résumer un texte plus long que la longueur du contexte moins la longueur du résumé généré en une seule requête.

Pour résumer un très long document tel qu'un livre, nous pouvons utiliser une séquence de requêtes pour résumer chaque section du document. Les résumés de section peuvent être concaténés et résumés pour produire des résumés de résumés. Ce processus peut se dérouler de manière récursive jusqu'à ce qu'un document entier soit résumé. S'il est nécessaire d'utiliser des informations sur les sections antérieures pour donner un sens aux sections ultérieures, un autre astuce qui peut être utile est d'inclure un résumé en continu du texte qui précède un point donné dans le livre lors de la rédaction du contenu à ce point. L'efficacité de cette procédure pour résumer des livres a été étudiée dans des recherches précédentes par OpenAI en utilisant des variantes de GPT-3.

Stratégie: Donner du temps aux modèles pour "réfléchir"

Tactic: Instruire le modèle à trouver sa propre solution avant de se précipiter vers une conclusion

Parfois, nous obtenons de meilleurs résultats lorsque nous demandons explicitement au modèle de raisonner à partir des premiers principes avant d'arriver à une conclusion. Supposons par exemple que nous voulions qu'un modèle évalue la solution d'un élève à un problème de mathématiques. La manière la plus évidente d'aborder cela serait de simplement demander au modèle si la solution de l'élève est correcte ou non.

// Message du SYSTÈME
Déterminez si la solution de l'élève est correcte ou non.

// Message de l'UTILISATEUR
Énoncé du problème : Je construis une installation d'énergie solaire et j'ai besoin d'aide pour calculer les aspects financiers.
- Le terrain coûte 100 $ / pied carré
- Je peux acheter des panneaux solaires pour 250 $ / pied carré
- J'ai négocié un contrat de maintenance qui me coûtera un montant fixe de 100 000 $ par an, et un supplément de 10 $ / pied carré
Quel est le coût total pour la première année d'exploitation en fonction du nombre de pieds carrés.

Solution de l'élève : Soit x la taille de l'installation en pieds carrés.
1. Coût du terrain : 100x
2. Coût des panneaux solaires : 250x
3. Coût de la maintenance : 100 000 + 100x
Coût total : 100x + 250x + 100 000 + 100x = 450x + 100 000

// Message de l'ASSISTANT
La solution de l'élève est correcte.

Mais en réalité, la solution de l'élève n'est pas correcte ! Nous pouvons amener le modèle à remarquer avec succès cela en lui demandant de générer sa propre solution en premier.

// Message du SYSTÈME
Commencez d'abord par trouver votre propre solution au problème. Ensuite, comparez votre solution à celle de l'élève et évaluez si la solution de l'élève est correcte ou non. Ne décidez pas si la solution de l'élève est correcte avant d'avoir résolu le problème vous-même.

// Message de l'UTILISATEUR
Énoncé du problème : Je construis une installation d'énergie solaire et j'ai besoin d'aide pour calculer les aspects financiers.
- Le terrain coûte 100 $ / pied carré
- Je peux acheter des panneaux solaires pour 250 $ / pied carré
- J'ai négocié un contrat de maintenance qui me coûtera un montant fixe de 100 000 $ par an, et un supplément de 10 $ / pied carré
Quel est le coût total pour la première année d'exploitation en fonction du nombre de pieds carrés.

Solution de l'élève : Soit x la taille de l'installation en pieds carrés.
1. Coût du terrain : 100x
2. Coût des panneaux solaires : 250x
3. Coût de la maintenance : 100 000 + 100x
Coût total : 100x + 250x + 100 000 + 100x = 450x + 100 000

// ASSISTANT Message
Soit x la taille de l'installation en pieds carrés.
1. Coût du terrain : 100x
2. Coût des panneaux solaires : 250x
3. Coût de la maintenance : 100 000 + 10x
Coût total : 100x + 250x + 100 000 + 10x = 360x + 100 000

La solution de l'élève est incorrecte. Ils ont fait une erreur dans le calcul du coût de la maintenance, en utilisant 100x au lieu de 10x. Le coût total correct pour la première année d'exploitation est de 360x + 100 000.

Tactique : Utiliser le monologue intérieur ou une séquence de requêtes pour cacher le processus de raisonnement du modèle

La tactique précédente démontre qu'il est parfois important pour le modèle de raisonner en détail sur un problème avant de répondre à une question spécifique. Pour certaines applications, le processus de raisonnement qu'un modèle utilise pour parvenir à une réponse finale serait inapproprié à partager avec l'utilisateur. Par exemple, dans les applications de tutorat, nous voulons encourager les étudiants à travailler sur leurs propres réponses, mais le processus de raisonnement d'un modèle concernant la solution de l'étudiant pourrait révéler la réponse à l'étudiant.

Le monologue intérieur est une tactique qui peut être utilisée pour atténuer cela. L'idée du monologue intérieur est d'instruire le modèle de placer les parties de la sortie qui doivent être cachées de l'utilisateur dans un format structuré qui facilite leur analyse. Ensuite, avant de présenter la sortie à l'utilisateur, la sortie est analysée et seule une partie de la sortie est rendue visible.

// Message SYSTÈME
Suivez ces étapes pour répondre aux requêtes de l'utilisateur.

Étape 1 - D'abord, trouvez votre propre solution au problème. Ne comptez pas sur la solution de l'étudiant car elle pourrait être incorrecte. Enveloppez tout votre travail pour cette étape entre triples guillemets (""").

Étape 2 - Comparez votre solution à la solution de l'étudiant et évaluez si la solution de l'étudiant est correcte ou non. Enveloppez tout votre travail pour cette étape entre triples guillemets (""").

Étape 3 - Si l'étudiant a fait une erreur, déterminez quel indice vous pourriez donner à l'étudiant sans dévoiler la réponse. Enveloppez tout votre travail pour cette étape entre triples guillemets (""").

Étape 4 - Si l'étudiant a fait une erreur, fournissez l'indice de l'étape précédente à l'étudiant (en dehors des triples guillemets). Au lieu d'écrire "Étape 4 - ...", écrivez "Indice :".

// Message UTILISATEUR
Énoncé du problème : <insérez l'énoncé du problème>

Solution de l'étudiant : <insérez la solution de l'étudiant>

Alternativement, cela peut être réalisé avec une séquence de requêtes dans laquelle toutes sauf la dernière ont leur sortie cachée pour l'utilisateur final.

Tout d'abord, nous pouvons demander au modèle de résoudre le problème par lui-même. Étant donné que cette requête initiale ne nécessite pas la solution de l'étudiant, celle-ci peut être omise. Cela présente l'avantage supplémentaire qu'il n'y a aucune chance que la solution du modèle soit biaisée par la solution tentative de l'étudiant.

// Message UTILISATEUR
<insérez l'énoncé du problème>

Ensuite, nous pouvons demander au modèle d'utiliser toutes les informations disponibles pour évaluer la justesse de la solution de l'étudiant.

// Message SYSTÈME
Comparez votre solution à la solution de l'étudiant et évaluez si la solution de l'étudiant est correcte ou non.

// Message UTILISATEUR
Énoncé du problème : """<insérez l'énoncé du problème>"""

Votre solution : """<insérez la solution générée par le modèle>"""

Solution de l'étudiant : """<insérez la solution de l'étudiant>"""

Enfin, nous pouvons laisser le modèle utiliser sa propre analyse pour construire une réponse dans la peau d'un tuteur serviable.

// Message SYSTÈME

Vous êtes un tuteur en mathématiques. Si l'étudiant a commis une erreur, offrez-lui un indice de manière à ne pas révéler la réponse. Si l'étudiant n'a pas commis d'erreur, offrez-lui simplement un commentaire encourageant.

// Message UTILISATEUR

Énoncé du problème : """<insérez l'énoncé du problème>"""

Votre solution : """<insérez la solution générée par le modèle>"""

Solution de l'étudiant : """<insérez la solution de l'étudiant>"""

Analyse : """<insérez l'analyse générée par le modèle à partir de l'étape précédente>"""

Tactique : Demander au modèle s'il a omis quelque chose lors des passes précédentes

Supposons que nous utilisons un modèle pour répertorier des extraits d'une source qui sont pertinents pour une question particulière. Après avoir répertorié chaque extrait, le modèle doit déterminer s'il doit commencer à écrire un autre extrait ou s'il doit s'arrêter. Si le document source est volumineux, il est courant qu'un modèle s'arrête trop tôt et omette de répertorier tous les extraits pertinents. Dans ce cas, de meilleures performances peuvent souvent être obtenues en incitant le modèle avec des requêtes de suivi pour trouver tous les extraits qu'il aurait omis lors des passes précédentes.

// Message SYSTÈME
Vous recevrez un document délimité par des triplets de guillemets. Votre tâche consiste à sélectionner des extraits pertinents pour la question suivante : "Quels changements de paradigme significatifs se sont produits dans l'histoire de l'intelligence artificielle."

Assurez-vous que les extraits contiennent tout le contexte nécessaire pour les interpréter - en d'autres termes, n'extrayez pas de petits extraits qui manquent de contexte important. Fournissez la sortie au format JSON comme suit :

[{"extrait": "..."},
...
{"extrait": "..."}]

// Message UTILISATEUR
"""<insérez le document ici>"""

// Message ASSISTANT
[{"extrait": "le modèle écrit un extrait ici"},
...
{"extrait": "le modèle écrit un autre extrait ici"}]

// Message UTILISATEUR
Y a-t-il d'autres extraits pertinents? Assurez-vous de ne pas répéter les extraits. Assurez-vous également que les extraits contiennent tout le contexte nécessaire pour les interpréter - en d'autres termes, n'extrayez pas de petits extraits qui manquent de contexte important.

Stratégie : Utiliser des outils externes

Tactique : Utiliser la recherche basée sur les vecteurs d'incorporation pour mettre en œuvre une récupération efficace des connaissances

Un modèle peut tirer parti de sources externes d'informations si elles sont fournies dans le cadre de ses entrées. Cela peut aider le modèle à générer des réponses plus informées et à jour. Par exemple, si un utilisateur pose une question sur un film spécifique, il peut être utile d'ajouter des informations de haute qualité sur le film (par exemple, acteurs, réalisateur, etc.) à l'entrée du modèle. Les embeddings peuvent être utilisés pour mettre en œuvre une récupération efficace des connaissances, de sorte que des informations pertinentes puissent être ajoutées à l'entrée du modèle de manière dynamique lors de l'exécution.

Un embedding de texte est un vecteur qui peut mesurer la relation entre des chaînes de texte. Les chaînes similaires ou pertinentes seront plus proches les unes des autres que les chaînes non liées. Ce fait, associé à l'existence d'algorithmes rapides de recherche de vecteurs, signifie que les embeddings peuvent être utilisés pour mettre en œuvre une récupération efficace des connaissances. En particulier, un corpus de texte peut être découpé en morceaux, et chaque morceau peut être intégré et stocké. Ensuite, une requête donnée peut être intégrée et une recherche par vecteur peut être effectuée pour trouver les morceaux de texte intégrés du corpus les plus liés à la requête (c'est-à-dire les plus proches dans l'espace d'embedding).

Tactique : Utiliser l'exécution de code pour effectuer des calculs plus précis ou appeler des APIs externes

Les modèles de langage ne peuvent pas être considérés comme fiables pour effectuer des calculs arithmétiques ou de longs calculs de manière précise par eux-mêmes. Dans les cas où cela est nécessaire, un modèle peut être instruit d'écrire et d'exécuter du code au lieu de réaliser ses propres calculs. En particulier, un modèle peut être instruit de mettre le code destiné à être exécuté dans un format spécifique tel que triple backtick. Après qu'une sortie soit produite, le code peut être extrait et exécuté. Enfin, si nécessaire, la sortie du moteur d'exécution de code (c'est-à-dire l'interpréteur Python) peut être fournie en entrée au modèle pour la requête suivante.

// Message du SYSTÈME

Vous pouvez écrire et exécuter du code Python en l'encadrant dans des triples backticks, par exemple ```code ici```. Utilisez ceci pour effectuer des calculs.

// Message de l'UTILISATEUR

Trouvez toutes les racines réelles du polynôme suivant : $3*x**5 - 5*x**4 - 3*x**3 - 7*x - 10.$

Une autre bonne utilisation de l'exécution de code est d'appeler des APIs externes. Si un modèle est instruit dans l'utilisation correcte d'une API, il peut écrire du code qui l'utilise. Un modèle peut apprendre à utiliser une API en lui fournissant de la documentation et/ou des exemples de code montrant comment utiliser l'API.

// Message du SYSTÈME

Vous pouvez écrire et exécuter du code Python en l'encadrant dans des triples backticks. Notez également que vous avez accès au module suivant pour aider les utilisateurs à envoyer des messages à leurs amis :

\`\`\`python
import message
message.write(to="John", message="Salut, veux-tu te retrouver après le travail ?")\`\`\`

ATTENTION : L'exécution de code produite par un modèle n'est pas intrinsèquement sûre et des précautions doivent être prises dans toute application qui cherche à le faire. En particulier, un environnement d'exécution de code isolé est nécessaire pour limiter les dommages que le code non fiable pourrait causer.

Tactique : Donner au modèle accès à des fonctions spécifiques

L'API Complétions de Chat permet de passer une liste de descriptions de fonctions dans les requêtes. Cela permet aux modèles de générer des arguments de fonction selon les schémas fournis. Les arguments de fonction générés sont retournés par l'API au format JSON et peuvent être utilisés pour exécuter des appels de fonction. Les sorties fournies par les appels de fonction peuvent ensuite être renvoyées dans un modèle dans la requête suivante pour boucler. C'est la manière recommandée d'utiliser les modèles OpenAI pour appeler des fonctions externes.

Stratégie : Tester les changements de manière systématique

Parfois, il peut être difficile de déterminer si un changement, tel qu'une nouvelle instruction ou une nouvelle conception, améliore ou détériore votre système. En observant quelques exemples, on peut avoir une idée de ce qui est préférable, mais avec de petits échantillons, il peut être difficile de distinguer une réelle amélioration d'une simple chance. Peut-être que le changement améliore les performances pour certaines entrées, mais nuit aux performances pour d'autres.

Les procédures d'évaluation (ou "évaluations") sont utiles pour optimiser les conceptions de systèmes. De bonnes évaluations sont :

  • Représentatives de l'utilisation du monde réel (ou du moins diverses)
  • Contiennent de nombreux cas de test pour une plus grande puissance statistique (voir le tableau ci-dessous pour des directives)
  • Faciles à automatiser ou à répéter
Différence à détecter Taille de l'échantillon nécessaire pour une confiance de 95 %
30 % ~10
10 % ~100
3 % ~1 000
1 % ~10 000

L'évaluation des sorties peut être réalisée par des ordinateurs, des humains ou de manière mixte. Les ordinateurs peuvent automatiser les évaluations avec des critères objectifs (par exemple, des questions avec des réponses correctes uniques) ainsi que certains critères subjectifs ou flous, dans lesquels les sorties du modèle sont évaluées par d'autres requêtes de modèle. OpenAI Evals est un cadre logiciel open-source qui fournit des outils pour créer des évaluations automatisées.

Les évaluations basées sur des modèles peuvent être utiles lorsqu'il existe une gamme de sorties possibles considérées comme étant de qualité équivalente (par exemple pour des questions avec de longues réponses). La frontière entre ce qui peut être évalué de manière réaliste avec une évaluation basée sur un modèle et ce qui nécessite l'évaluation d'un humain est floue et évolue constamment à mesure que les modèles deviennent plus capables. Nous encourageons l'expérimentation pour déterminer dans quelle mesure les évaluations basées sur des modèles peuvent fonctionner pour votre cas d'utilisation.

Tactic: Évaluer les sorties du modèle par rapport aux réponses de référence

Supposons qu'il est connu que la réponse correcte à une question devrait faire référence à un ensemble spécifique de faits connus. Ensuite, nous pouvons utiliser une requête de modèle pour compter combien des faits requis sont inclus dans la réponse.

Par exemple, en utilisant le message système suivant :

// Message système
Vous recevrez un texte délimité par des triples guillemets qui est censé être la réponse à une question. Vérifiez si les informations suivantes sont directement contenues dans la réponse :

- Neil Armstrong a été la première personne à marcher sur la lune.
- La date à laquelle Neil Armstrong a marché sur la lune pour la première fois était le 21 juillet 1969.

Pour chacun de ces points, effectuez les étapes suivantes :

1 - Reformulez le point.
2 - Fournissez une citation de la réponse qui se rapproche le plus de ce point.
3 - Considérez si quelqu'un lisant la citation qui ne connaît pas le sujet pourrait directement déduire le point. Expliquez pourquoi ou pourquoi pas avant de prendre une décision.
4 - Écrivez "oui" si la réponse à la question 3 était oui, sinon écrivez "non".

Enfin, fournissez un décompte du nombre de réponses "oui". Fournissez ce décompte comme {"count": <insérez le décompte ici>}.

Voici un exemple d'entrée où les deux points sont satisfaits :

// Message système
<insérez le message système ci-dessus>

// Message UTILISATEUR
"""Neil Armstrong est célèbre pour avoir été le premier homme à poser le pied sur la Lune. Cet événement historique a eu lieu le 21 juillet 1969, lors de la mission Apollo 11."""

Voici un exemple d'entrée où un seul point est satisfait :

// Message système

<insérez le message système ci-dessus>

// Message UTILISATEUR

"""Neil Armstrong a marqué l'histoire en sortant du module lunaire, devenant ainsi la première personne à marcher sur la lune."""

Voici un exemple d'entrée où aucun des points n'est satisfait :

// Message système

<insérez le message système ci-dessus>

// Message UTILISATEUR

"""À l'été '69, un grand voyage,
Apollo 11, audacieux comme la main de la légende.
Armstrong a fait un pas, l'histoire s'est déroulée,
"Un petit pas", a-t-il dit, pour un nouveau monde."""

Il existe de nombreuses variantes possibles de cette évaluation basée sur le modèle. Considérez la variation suivante qui suit le type de chevauchement entre la réponse candidate et la réponse de référence, et suit également si la réponse candidate contredit une partie de la réponse de référence.

// Message système
Utilisez les étapes suivantes pour répondre aux entrées des utilisateurs. Reformulez complètement chaque étape avant de procéder. c'est-à-dire "Étape 1 : Raisonnez...".

Étape 1 : Raisonnez étape par étape sur le fait que les informations dans la réponse soumise par rapport à la réponse de l'expert sont soit : disjointes, égales, un sous-ensemble, un sur-ensemble ou se chevauchent (c'est-à-dire une certaine intersection mais pas un sous-ensemble/sur-ensemble).

Étape 2 : Raisonnez étape par étape sur le fait que la réponse soumise contredit un aspect de la réponse de l'expert.

Étape 3 : Produisez un objet JSON structuré comme suit : {"type_of_overlap": "disjoint" ou "égal" ou "sous-ensemble" ou "sur-ensemble" ou "chevauchement", "contradiction": true ou false}

Voici un exemple d'entrée avec une réponse de qualité inférieure qui ne contredit néanmoins pas la réponse de l'expert :

// Message système

<insérez le message système ci-dessus>

// Message UTILISATEUR

Question : """Pour quel événement Neil Armstrong est-il le plus célèbre et à quelle date cela s'est-il produit ? Supposons l'heure UTC."""

Réponse soumise : """N'est-il pas allé sur la lune ou quelque chose du genre ?"""

Réponse de l'expert : """Neil Armstrong est le plus célèbre pour être la première personne à marcher sur la lune. Cet événement historique a eu lieu le 21 juillet 1969."""

Voici un exemple d'entrée avec une réponse qui contredit directement la réponse de l'expert :

// Message système

<insérez le message système ci-dessus>

// Message UTILISATEUR
Question : """Pour quel événement Neil Armstrong est-il le plus célèbre et à quelle date cela s'est-il produit ? Supposons l'heure UTC."""

Réponse soumise : """Le 21 juillet 1969, Neil Armstrong est devenu la deuxième personne à marcher sur la lune, suivant Buzz Aldrin."""

Réponse de l'expert : """Neil Armstrong est le plus célèbre pour être la première personne à marcher sur la lune. Cet événement historique a eu lieu le 21 juillet 1969."""

Voici un exemple d'entrée avec une réponse correcte qui fournit également un peu plus de détails que nécessaire :

// Message du SYSTÈME
<insérer le message du système ci-dessus>

// Message de l'UTILISATEUR

Question : """Pour quel événement Neil Armstrong est-il le plus célèbre et à quelle date a-t-il eu lieu ? Assumez l'heure UTC."""

Réponse soumise : """Vers 02:56 UTC le 21 juillet 1969, Neil Armstrong est devenu le premier humain à poser le pied sur la surface lunaire, marquant un accomplissement monumental dans l'histoire de l'humanité."""

Réponse de l'expert : """Neil Armstrong est surtout célèbre pour avoir été la première personne à marcher sur la lune. Cet événement historique a eu lieu le 21 juillet 1969."""