Concepts clés et considérations à prendre en compte pour la création de solutions d’IA génératives
Les modèles de langage volumineux (LLMs) sont étonnants, mais ils ont des limitations. En tant que développeur, vous devez comprendre ces limitations, ce que les LLMs sont capables de faire prêts à l'emploi et comment les modifier pour obtenir les meilleurs résultats pour les solutions d'IA générative que vous développez. Cet article identifie plusieurs défis et facteurs limitatifs des LLM. Il explique les façons courantes de surmonter les défis et de contrôler le processus de génération de contenu, quel que soit le type de fonctionnalités d’IA générative que vous créez dans votre application.
Défis d’ingénierie lors de l’utilisation de llms
La liste suivante récapitule les défis ou limitations les plus importants à connaître lorsque vous travaillez avec des llMs :
le seuil des connaissances: en raison du coût élevé de la formation d’un LLM, le corps des connaissances d’un LLM est limité à ce qu’il a été formé à un moment donné. Sans plug-ins ou autres hébergements, un LLM n’a pas accès aux informations en temps réel et ne peut pas accéder aux données privées.
Hallucination: un LLM utilise des probabilités statistiques et un peu de hasard pour générer des informations. Les mécanismes sont en place pour maintenir les réponses générées alignées sur l’intention de l’homme dans les questions posées et les informations sur lesquels un LLM a été formé, mais il est possible qu’un LLM crée des réponses qui ne sont pas exactes.
Transparence: Également, à cause de la manière dont un LLM est entraîné, il n’a plus accès aux connaissances fondamentales sur lesquelles il a été formé. Même s’il l’a fait, il n’y a aucune garantie que l’information était honnête et fondée pour commencer. En outre, aucune étape de vérification n’est effectuée pour s’assurer que la réponse générée est exacte.
Aucune connaissance spécifique à un domaine: comme pour le découpage des connaissances, si vous disposez d’informations privées telles que des documents d’entreprise internes uniquement, le LLM n’a pas été formé sur ces informations. Il n’a aucune connaissance des données spécifiques au domaine.
Que pouvez-vous faire pour atténuer les défis ou problèmes possibles avec les machines virtuelles locales et obtenir les meilleurs résultats possibles pour aider vos utilisateurs et votre organisation ? Commencez par comprendre comment vous pouvez enrichir les sources de données d’un LLM.
Où les llms obtiennent leurs informations
Un bon point de départ pour obtenir les meilleurs résultats d’un LLM est de comprendre où ou comment les llMs obtiennent leurs informations. Les catégories suivantes représentent différentes approches de la façon dont les llMs interagissent avec différentes sources d’informations pour générer des réponses.
Récupération hors génération (ROG) : Les LLM traditionnels utilisent ce modèle. Le modèle génère des réponses basées uniquement sur les connaissances sur laquelle il a été formé, sans accéder ni récupérer d’informations externes pendant le processus de génération. Les connaissances du modèle sont statiques et limitées à ce qui a été inclus dans ses données d’apprentissage jusqu’à la date de coupure. En plus de l’écriture créative, il peut répondre à des questions sur les informations facilement disponibles sur Internet.
Génération augmentée par récupération (RAG) : Combine les capacités génératives des LLM avec la capacité de récupérer des informations à partir de bases de données ou de documents externes en temps réel. Le modèle interroge une source externe pour trouver des informations pertinentes. Il utilise ensuite les informations pour former sa réponse. Cette approche permet au modèle de fournir des informations plus précises et plus récentes qu'en utilisant uniquement ses connaissances préformées. Les cas d’usage incluent la vérification des faits, la réponse aux questions basées sur des données en temps réel ou la réponse à des questions basées sur des données privées et spécifiques au domaine.
génération centrée sur la récupération (RCG): met encore plus l’accent sur le contenu récupéré en externe, structurant souvent les réponses autour des informations extraites de sources externes. Le modèle peut incorporer directement de grands segments de texte récupérés dans ses sorties, les modifier ou les annoter pour qu’ils correspondent à la requête de l’utilisateur. Cette approche peut être considérée comme un hybride entre les méthodes de récupération et de régénération, où l’équilibre peut fortement favoriser les informations récupérées par rapport aux propres capacités génératives du modèle. Les cas d’usage incluent la synthèse d’un document plus long, l’aide à la recherche pour fournir des comparaisons et des explorations thématiques sur plusieurs documents similaires, ainsi que la compilation ou le classement de différentes sources de matériel dans une sortie combinée.
Un bon exemple de ROG est ChatGPT. En revanche, Copilot (via Bing) étend un LLM à l’aide de sources externes provenant de sources d’actualités (et en fournissant des liens vers ces sources).
À première vue, RAG et RCG apparaissent similaires, car les deux impliquent l’intégration d’informations externes dans le processus de génération de langage. Toutefois, ils diffèrent de la façon dont ils hiérarchisent et utilisent des informations récupérées dans le processus de génération.
Dans un système RAG, la récupération de données externes est utilisée pour augmenter les fonctionnalités de génération d’un modèle de langage préentraîné. Les informations récupérées fournissent des données plus contextuelles ou spécifiques que le modèle utilise pour informer ses réponses. Dans un système RAG, l’aspect génératif du modèle de langage reste central à la réponse. Les données récupérées agissent comme un élément de soutien pour améliorer la précision ou la profondeur.
Un système RCG met davantage l’accent sur les informations récupérées elle-même. Dans un système RCG, les données récupérées sont souvent la pièce centrale de la réponse, et le rôle du modèle génératif consiste principalement à affiner, mettre en forme ou améliorer légèrement le texte récupéré. Cette approche est utilisée en particulier lorsque l’exactitude et la pertinence directe des informations sont primordiales, et une synthèse ou une extrapolation moins créative est nécessaire.
Les mécanismes de récupération externe des données qui alimentent à la fois RAG et RCG sont abordés dans les articles sur le stockage des incorporations vectorielles de documents par rapport au réglage précis d’un LLM, les deux approches courantes pour compléter les connaissances disponibles pour le LLM en fonction de sa formation initiale.
Comprendre les distinctions entre les modèles de récupération peut vous aider à choisir la bonne approche pour des applications spécifiques. Il vous aide à équilibrer la nécessité d’une synthèse créative par rapport à la précision et à la fidélité au matériau source.
Facteurs qui affectent le fonctionnement de l’inférence
Étant donné que vous êtes probablement familiarisé avec l’interface utilisateur web de ChatGPT, la compréhension de son fonctionnement pour répondre aux questions peut vous aider à comprendre les concepts essentiels lorsque vous créez des fonctionnalités d’IA génératives dans vos propres applications.
Lorsqu'un utilisateur discute avec ChatGPT, la conception de l'interface utilisateur vous donne l'illusion d'une session de chat de longue durée qui maintient l'état au cours de plusieurs échanges entre vous et le GML. En réalité, pour une session de chat donnée, toutes les requêtes et toutes les réponses du GML (également appelées complétions) sont envoyées à chaque nouvelle requête. À mesure que votre conversation se développe, vous envoyez de plus en plus de texte au LLM pour traitement. À chaque nouvelle requête, vous envoyez toutes les requêtes et réponses précédentes. ChatGPT utilise le contexte de la session de conversation entière, et pas seulement l’invite actuelle, lorsqu’elle compose une réponse à votre invite actuelle. La session de conversation entière est appelée fenêtre de contexte.
Une fenêtre de contexte a une limite de longueur qui varie selon la version de ChatGPT avec laquelle vous travaillez. Toute partie de votre conversation qui dépasse la limite de longueur de la fenêtre de contexte est ignorée lorsque ChatGPT compose une réponse à votre dernière invite.
De longues conversations peuvent sembler une bonne idée au début, mais de longues fenêtres de contexte peuvent affecter la quantité de calcul requise pour traiter l’invite et composer une complétion. La taille des fenêtres de contexte affecte la latence de la réponse et le coût d’OpenAI pour traiter la requête.
Qu’est-ce que la limite de fenêtre de contexte de ChatGPT ? Autrement dit, combien de mots ChatGPT peut-il utiliser ?
La limite de fenêtre de contexte dépend du modèle, de la version et de l’édition LLM que vous utilisez. En outre, les longueurs de contexte sont mesurées en jetons, et non en mots. Les jetons sont les plus petites unités de texte que le modèle peut comprendre et générer. Ces unités peuvent être des mots, des parties de mots (comme des syllabes ou des tiges), ou même des caractères individuels. Les jetons sont au cœur du traitement du langage naturel (NLP).
L’utilisation de jetons affecte deux considérations importantes pour les développeurs :
- Limite maximale de la fenêtre de contexte
- Le prix par requête et par achèvement
Qu’est-ce que la jetonisation ?
La tokenisation est le processus de conversion de texte en jetons. Il s’agit d’une étape cruciale de la préparation des données pour l’apprentissage automatique ou l’inférence (processus de génération de résultats à partir de prompts) avec un LLM. Le processus implique plusieurs étapes, notamment la décomposition du texte complexe en éléments gérables (jetons), que le modèle peut ensuite traiter. Ce processus peut être simple, comme le fractionnement de texte par espaces et ponctuation, ou plus complexe, impliquant des algorithmes sophistiqués pour gérer différents langages, morphologies (structure des mots) et des syntaxes (disposition des mots). Les chercheurs et les développeurs LLM décident de la méthode de tokenisation en fonction de ce qu’ils essaient d’accomplir.
La page OpenAI tokenizer explique plus en détail la tokenisation. La page comporte même une calculatrice qui illustre la façon dont une phrase ou un paragraphe se décompose en jetons.
Comme la note au bas de la page du tokeniseur OpenAI l'indique, dans les textes anglais classiques, un jeton équivaut à environ quatre caractères. En moyenne, 100 jetons sont environ 75 mots ou trois quarts d’un mot par jeton.
La page De tokenizer OpenAI parle également de tiktoken, un package pour Python et JavaScript que vous pouvez utiliser pour estimer par programmation le nombre de jetons requis pour envoyer une invite spécifique à l’API OpenAI.
L’utilisation des jetons affecte la facturation
Chaque API Azure OpenAI a une méthodologie de facturation différente. Pour le traitement et la génération de texte avec l'API Chat Completions, vous êtes facturé en fonction du nombre de jetons que vous envoyez en tant que requête et du nombre de jetons qui sont générés en tant que résultat (achèvement).
Chaque modèle LLM (par exemple, GPT-3.5, GPT-3.5 Turbo ou GPT-4) a généralement un prix différent, qui reflète la quantité de calcul requise pour traiter et générer des jetons. Plusieurs fois, le prix est présenté comme « prix par 1 000 jetons » ou « prix par million de jetons ».
Ce modèle de tarification a un effet significatif sur la façon dont vous concevez les interactions utilisateur et la quantité de prétraitement et de post-traitement que vous ajoutez.
Les invites du système et les invites de l'utilisateur
Jusqu'à présent, la discussion a porté uniquement sur les requêtes des utilisateurs. Une invite utilisateur est le type d’invite qui compose l’échange entre un utilisateur et ChatGPT.
OpenAI a introduit le message système (également appelé instructions personnalisées ). Une invite système est un ensemble global d’instructions que vous définissez et ajoutez à toutes vos conversations de chat. Considérez-le comme un ensemble d’instructions meta que vous souhaitez que le LLM observe toujours chaque fois que vous démarrez une nouvelle session de conversation. Par exemple, vous pouvez définir l’invite système sur « toujours répondre sous la forme poétique du haiku ». À partir de là, chaque nouvelle invite à ChatGPT entraîne un haiku contenant la réponse.
Bien que « répondre sous forme de haïku » ne soit pas un exemple utile, il illustre l'idée que vous pouvez influencer la réponse d'un LLM à votre requête en modifiant la requête elle-même.
Pourquoi voulez-vous modifier l’invite de l’utilisateur ? Si vous créez une fonctionnalité ou une application d’IA générative pour un public professionnel, qui peut inclure des employés de l’entreprise, des clients et des partenaires, vous souhaitez sans aucun doute ajouter des protections pour limiter l’étendue des rubriques ou domaines auxquels il peut répondre.
Toutefois, la modification de l’invite utilisateur n’est qu’une seule méthode pour améliorer l’expérience de génération de texte pour les utilisateurs.
Méthodes permettant d’améliorer l’expérience de génération de texte pour les utilisateurs dans ChatGPT
Pour améliorer les résultats de la génération de texte, les développeurs sont limités à l'amélioration de l'invite, et il existe de nombreuses techniques d'ingénierie des requêtes qui peuvent être utiles. Toutefois, si vous créez votre propre application IA générative, il existe plusieurs façons d’améliorer l’expérience de génération de texte pour les utilisateurs, et vous souhaiterez peut-être expérimenter l’implémentation de toutes ces applications :
- Modifier par programme les requêtes de l'utilisateur.
- Implémentez un pipeline d’inférence.
- Retrieval-Augmented Génération (décrite dans d’autres articles).
- Réglage précis (abordé dans d’autres articles).
Modifier par programme les requêtes utilisateur
Pour ajouter une invite système à une conversation utilisateur, vous n’utilisez pas d’API spéciale. Il suffit d'ajouter des instructions à la requête en fonction des besoins.
Mais vous pouvez utiliser quelques techniques pour améliorer les requêtes de l'utilisateur :
- Amorçage contextuel : Créez des requêtes système qui définissent explicitement le contexte de la conversation dans le domaine. Cette approche consiste à fournir une brève description ou un ensemble d’instructions au début de chaque interaction. Les instructions guident l’IA pour rester dans le domaine du problème.
- conseils basés sur des exemples: dans l’invite initiale, incluez des exemples de types de questions et réponses pertinents pour votre domaine. Cette approche aide l’IA à comprendre le type de réponse à attendre.
Vous pouvez utiliser n’importe quelle technique d’ingénierie rapide. Si vous pouvez le faire de manière programmatique, vous pouvez améliorer la requête de l'utilisateur en son nom.
L'inconvénient de cette approche est que plus la requête est longue, plus le coût de chaque appel au GML est élevé. Même si, cette approche est probablement l’approche la moins coûteuse décrite par cet article.
Implémenter un pipeline d’inférence
L'étape suivante, au-delà de la modification programmatique de la requête de l'utilisateur, consiste à créer un pipeline d'inférence complet.
Un pipeline d’inférence est un processus de bout en bout qui « nettoie » l’entrée brute (comme du texte ou une image) avant de l’utiliser pour réaliser votre invite principale (pré-traitement) ou vérifie le résultat final pour s’assurer qu’il répond aux besoins de l’utilisateur avant de l’afficher (post-traitement).
Le prétraitement peut impliquer la vérification des mots clés, le scoring de pertinence ou la transformation de la requête pour mieux s’adapter au langage de domaine attendu. Par exemple, vous pouvez analyser l’invite initiale envoyée par l’utilisateur. Commencez par demander au LLM si l’invite est logique, si elle se trouve dans les limites de ce que vous êtes prêt à accepter, si elle est basée sur un prémisse erroné ou si elle doit être réécrite pour éviter certains biais. Si le GML analyse la requête et trouve des problèmes, vous pouvez aller plus loin. Vous pouvez demander au LLM de reformuler l’invite pour améliorer potentiellement la réponse.
Le posttraitement peut impliquer la validation de la pertinence et de l’adéquation de la réponse au domaine. Cela peut inclure la suppression ou le signalement des réponses qui ne correspondent pas aux exigences du domaine. Par exemple, vous souhaiterez peut-être inspecter l’achèvement fourni par le LLM pour vous assurer qu’il répond à vos exigences en matière de qualité et de sécurité. Vous pouvez demander au LLM d’évaluer la réponse pour voir si elle répond en fait aux exigences que vous lui avez demandées de respecter. Dans le cas contraire, vous pouvez demander au GML de modifier l'achèvement. Répétez ces étapes jusqu’à ce que vous ayez un résultat satisfaisant.
Il existe une mise en garde pour ajouter des étapes de prétraitement : chaque fois que vous ajoutez un appel à un LLM dans votre pipeline d’inférence, vous augmentez la latence globale (temps de réponse) et le coût de chaque interaction avec l’utilisateur. En tant que développeur de logiciels expérimenté, vous êtes probablement déjà conscient de ces types de compromis qui affectent le budget, les performances et l’efficacité d’un système logiciel.
Pour plus d'informations sur les étapes spécifiques à suivre pour construire un pipeline d'inférence, voir Construire un système de génération augmentée par récupération avancée.
Autres facteurs qui influencent les achèvements
Au-delà de la modification programmatique de la requête, de la création d'un pipeline d'inférence et d'autres techniques, d'autres détails sont abordés dans Augmenter un modèle de grande langue avec la génération augmentée par la recherche et le réglage fin. En outre, vous pouvez modifier les paramètres lorsque vous effectuez des appels à l’API Azure OpenAI.
Pour passer en revue les paramètres obligatoires et facultatifs à passer qui peuvent affecter divers aspects de la terminaison, voir la documentation du point de terminaison Chat. Si vous utilisez un Kit de développement logiciel (SDK), consultez la documentation du Kit de développement logiciel (SDK) pour la langue que vous utilisez. Vous pouvez expérimenter les paramètres dans le terrain de jeu.
Temperature
: contrôler l’aléatoire de la sortie générée par le modèle. À zéro, le modèle devient déterministe, sélectionnant de façon cohérente le jeton suivant le plus probable dans ses données d’apprentissage. À une température de 1, le modèle cherche un équilibre entre le choix de jetons à probabilité élevée et l’introduction du hasard dans la sortie.Max Tokens
: contrôle la longueur maximale de la réponse. La définition d’une limite supérieure ou inférieure peut affecter les détails et l’étendue du contenu généré.Top P
(échantillonnage du noyau): utilisé avecTemperature
pour contrôler la randomité de la réponse.Top P
limite l’IA à considérer uniquement le pourcentage supérieur de masse de probabilité (P
) quand il génère chaque jeton. Les valeurs inférieures entraînent un texte plus ciblé et prévisible. Des valeurs plus élevées permettent une plus grande diversité.Frequency Penalty
: réduit la probabilité que le modèle répète la même ligne ou expression. L’augmentation de cette valeur permet d’éviter la redondance dans le texte généré.Presence Penalty
: Encourage le modèle à introduire de nouveaux concepts et termes dans l'achèvement.Presence Penalty
est utile pour générer des sorties plus diversifiées et créatives.Stop Sequences
: vous pouvez spécifier une ou plusieurs séquences pour indiquer à l’API d’arrêter de générer plus de jetons.Store Sequences
est utile pour contrôler la structure de la sortie, par exemple pour terminer un achèvement à la fin d'une phrase ou d'un paragraphe.Logit Bias
: Vous permet de modifier la probabilité d'apparition de mots spécifiques dans la complétion.Logit Bias
pouvez être utilisé pour guider l’achèvement dans une certaine direction ou pour supprimer du contenu spécifique.
Les protections de Microsoft OpenAI
En plus de garder les réponses du LLM liées à des domaines ou des sujets spécifiques, vous êtes probablement préoccupé par les types de questions que vos utilisateurs posent au LLM. Il est important de prendre en compte les types de réponses qu’il génère.
Tout d’abord, les appels d’API à Microsoft OpenAI Services filtrent automatiquement le contenu que l’API trouve potentiellement offensant et signale cela à vous dans de nombreuses catégories de filtrage.
Vous pouvez utiliser directement l’API de modération OpenAI pour vérifier directement le contenu potentiellement dangereux.
Ensuite, vous pouvez utiliser Azure AI Content Safety pour faciliter la modération du texte, la modération des images, la détection des risques de jailbreak et la détection de matériel protégé. Cela combine une expérience de configuration, de configuration et de création de rapports du portail avec du code que vous pouvez ajouter à votre application pour identifier le contenu dangereux.
Considérations finales relatives à la conception de l’application
Comprendre la tokenisation, la tarification, les fenêtres contextuelles et l’implémentation d’améliorations programmatiques pour améliorer l’expérience de génération de texte des utilisateurs affecte la façon dont vous concevez votre système d’INTELLIGENCE artificielle générative.
Voici une courte liste des éléments à prendre en compte et d’autres points à prendre en compte dans cet article susceptibles d’affecter vos décisions de conception d’application :
- Évaluez la nécessité d’utiliser le dernier modèle IA par rapport aux considérations relatives aux coûts. Les modèles moins coûteux peuvent suffire pour les besoins de votre application. Équilibrez les performances avec les contraintes budgétaires.
- Envisagez d’optimiser la longueur de la fenêtre de contexte pour gérer les coûts sans affecter considérablement l’expérience utilisateur. Réduire les parties inutiles de la conversation peut réduire les frais de traitement tout en conservant des interactions de qualité.
- Évaluez la façon dont la tokenisation et la granularité de vos entrées et sorties affectent les performances. Comprendre comment votre LLM choisi gère la tokenisation peut vous aider à optimiser l’efficacité de vos appels d’API, ce qui peut réduire les coûts et améliorer les temps de réponse.
Si vous souhaitez commencer à expérimenter immédiatement la création d’une solution d’IA générative, nous vous recommandons de jeter un œil à démarrer avec la conversation en utilisant votre propre exemple de données pour Python. Le didacticiel est également disponible dans .NET, Java et JavaScript.