Partager via


Concepts et considérations importants pour les développeurs qui créent des solutions d’IA génératives

Les grands modèles de langage (LLMs) sont étonnants, mais même ils ont leurs limitations. Les développeurs doivent comprendre ces limitations, ce que les llMs sont capables de « sortir de la boîte de dialogue » et comment les ajuster pour obtenir les meilleurs résultats pour les solutions d’IA génératives qu’ils créent. Cet article identifie plusieurs défis et facteurs de limitation, et explique les façons courantes de surmonter ces défis et de prendre le contrôle du 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

Les défis ou limitations les plus importants à connaître lors de l’utilisation de machines virtuelles llms :

  • Réduction des connaissances - En raison du coût élevé de la formation d’un LLM, leur corps de connaissances est limité à ce qu’ils ont été formés à un moment donné dans le temps. Sans plug-ins ou autres hébergements, ils n’ont pas accès à des informations en temps réel, ni à des données privées.

  • Hallucination - Un LLM utilise des probabilités statistiques et un peu aléatoire pour générer des informations. Il existe des mécanismes 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 lesquelles ils ont été formés, mais il est possible qu’ils créent des réponses qui ne sont pas exactes.

  • Transparence - Encore une fois, en raison de la façon dont les modèles sont formés, ils n’ont plus accès aux connaissances fondamentales sur lesquelles ils ont été formés. Et même s’ils l’ont fait, il n’y a aucune garantie que l’information était honnête et fondée en premier lieu. En outre, il n’existe aucune étape de vérification pour s’assurer que la réponse générée est exacte.

  • Aucune connaissance spécifique de domaine - Similaire à « limite des connaissances , si vous avez des informations privées comme des documents d’entreprise internes uniquement, le LLM n’a pas été formé sur ces informations et n’a donc aucune connaissance spécifique du 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 les façons dont vous pouvez compléter l’emplacement à partir duquel le LLM obtient ses données.

Comprendre où les machines virtuelles ll 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.

Diagramme illustrant trois types de génération de récupération différents avec la génération de récupération en haut corrélé avec les connaissances les plus préentraînées, puis la génération augmentée par récupération, puis la génération centrée sur la récupération au bas, corrélée avec les connaissances les plus récupérées.

  • Récupération hors génération (ROG) : il s’agit de la façon traditionnelle dont fonctionnent les modules LLMs, où le modèle génère des réponses basées uniquement sur les connaissances sur lesquelles il a été formé, sans accéder ou récupérer des informations externes pendant le processus de génération. Les connaissances du modèle sont statiques, 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 l’information facilement disponible sur Internet.

  • Génération augmentée de récupération (RAG) : combine les fonctionnalités dégénératives des llMs avec la possibilité de récupérer des informations à partir de bases de données externes ou de documents en temps réel. Le modèle interroge une source externe pour rechercher des informations pertinentes, qu’il utilise ensuite pour informer sa réponse. Cette approche permet au modèle de fournir des informations plus précises et à jour qu’il ne le pourrait à partir de ses connaissances préentraînés uniquement. 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 des données privées, 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 récupération hors génération (ROG) est ChatGPT. En revanche, si nécessaire, Copilot (via Bing) étend le LLM à l’aide de sources externes provenant de sources d’actualités (et fournissant des liens vers ces sources).

À première vue, la génération d’extraction augmentée (RAG) et la génération centrée sur la récupération (RCG) ressemblent, 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 les informations récupérées au sein du processus de génération.

Dans les systèmes 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. Ici, l’aspect génératif du modèle de langage reste central à la réponse, tandis que les données récupérées agissent comme un élément de soutien pour améliorer la précision ou la profondeur.

Les systèmes RCG, d’autre part, mettent davantage l’accent sur les informations récupérées elle-même. Dans ces systèmes, les données récupérées sont souvent la pièce centrale de la réponse, avec le rôle du modèle génératif principalement pour 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 aider à choisir la bonne approche pour des applications spécifiques, en équilibrant la nécessité d’une synthèse créative par rapport au besoin de précision et de fidélité au matériau source.

Comprendre les facteurs qui influencent le fonctionnement de l’inférence

Étant donné que vous êtes probablement familiarisé avec l’interface utilisateur web de ChatGPT, comprendre comment il fonctionne pour répondre aux questions peut vous aider à comprendre les concepts qui seront essentiels lors de la création de fonctionnalités d’IA génératives dans vos propres applications.

Lorsqu’un utilisateur discute avec ChatGPT, la conception de l’interface utilisateur donne l’illusion d’une session de conversation longue qui maintient l’état au cours de plusieurs échanges back-and-forth entre vous et le LLM. En réalité, pour une session de conversation donnée, toutes les invites et toutes les réponses du LLM (également appelées achèvements) sont envoyées avec chaque nouvelle invite. Ainsi, à mesure que votre conversation augmente, vous envoyez de plus en plus de texte au LLM pour traiter , toutes les invites et les achèvements précédents. ChatGPT utilise le contexte de toute la session de conversation , pas seulement l’invite actuelle, lors de la composition d’une réponse à votre invite actuelle. La session de conversation entière est appelée fenêtre de contexte.

Il existe une limite de longueur de fenêtre de contexte en fonction de la version de ChatGPT avec laquelle vous travaillez. Toute partie de votre conversation de conversation qui dépasse la limite de longueur de la fenêtre de contexte est ignorée lors de la composition d’une réponse à votre dernière invite.

De longues conversations peuvent sembler une bonne idée au début, mais les fenêtres contextuelles longues peuvent affecter la quantité de calcul requise pour traiter l’invite et composer une saisie semi-automatique. Cela affecte la latence de la réponse et le coût d’OpenAI pour traiter la demande.

Qu’est-ce que la limite de fenêtre de contexte de ChatGPT ? Ou plutôt, combien de mots peut-il utiliser ChatGPT ? 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
  • Prix par invite et achèvement

Qu’est-ce que la jetonisation ?

« Tokenization » 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 ou l’inférence (processus de composition des achèvements basés sur des invites) 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. OpenAI a une page utile qui explique plus sur la tokenisation, et même a une calculatrice qui illustre comment une phrase ou un paragraphe se décompose en jetons.

Comme la note en bas de la page De jeton OpenAI indique que, dans les textes en anglais typiques, un jeton équivaut à environ quatre caractères. Cela signifie qu’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 qui vous permet d’estimer par programmation le nombre de jetons que vous utiliserez pour une invite donnée envoyée à 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 De saisie semi-automatique de conversation, vous êtes facturé en fonction du nombre de jetons que vous envoyez en tant qu’invite et du nombre de jetons générés en conséquence (achèvement).

Chaque modèle LLM (ex. gpt-3.5, gpt-3.5-turbo, gpt-4, etc.) 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 impact significatif sur la façon dont vous concevez les interactions utilisateur et la quantité de pré-traitement que vous ajoutez.

Invites système et utilisateur

Jusqu’à ce stade, la discussion s’est concentrée uniquement sur les « invites utilisateur » : les invites qui composent l’échange entre un utilisateur et ChatGPT.

OpenAI a introduit l'« invite système » (également appelée « instructions personnalisées »), qui est un ensemble d’instructions sur-arching que vous définissez et est ajouté à toutes vos conversations de conversation. 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 haiku » n’est pas un exemple utile, il illustre l’idée que vous pouvez influencer l’achèvement d’un LLM à votre invite en modifiant l’invite 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 voudrez sans aucun doute ajouter des protections pour limiter l’étendue des rubriques ou domaines auxquels il est autorisé à répondre.

Toutefois, la modification de l’invite de l’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 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 d’invite qui peuvent vous aider. 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 programmation les invites de l’utilisateur
  • Implémenter un pipeline d’inférence
  • Génération augmentée de récupération (décrite dans d’autres articles)
  • Réglage précis (abordé dans d’autres articles)

Modification programmatique des invites utilisateur

Du point de vue programmatique, il n’existe aucune API spéciale pour l’ajout d’une invite système aux conversations de vos utilisateurs. Vous ajoutez simplement des instructions à l’invite si nécessaire. Toutefois, il existe quelques techniques pour améliorer les invites utilisateur :

  • Priming contextuel : créez des invites système qui définissent explicitement le contexte de la conversation au sein de votre domaine souhaité. Cela implique de fournir une brève description ou un ensemble d’instructions au début de chaque interaction, guidant l’IA pour rester dans le domaine du problème.
  • Conseils basés sur des exemples : incluez des exemples de types de questions et de réponses pertinents pour votre domaine dans l’invite initiale. Cela aide l’IA à comprendre le type de réponses attendues.

De plus, toutes les techniques d’ingénierie rapide peuvent être appliquées. Si vous pouvez effectuer cette opération par programme d’une certaine manière, vous pouvez améliorer l’invite de l’utilisateur en son nom.

La mise en garde à cette approche est que plus l’invite est longue, plus chaque appel est coûteux pour le LLM. Même si c’est probablement le plus bon marché des approches qui seront abordées.

Implémentation d’un pipeline d’inférence

L’étape suivante au-delà de la modification de l’invite de l’utilisateur consiste à créer un pipeline d’inférence entier.

Un pipeline d’inférence est le processus de bout en bout qui prend une entrée brute (par exemple, du texte ou des images) et « le nettoie » avant de l’utiliser pour effectuer votre invite principale (prétraitement) ou pour vérifier que l’achèvement répond aux besoins de l’utilisateur avant de l’afficher à l’utilisateur (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 et commencer par demander au LLM si l’invite est logique, s’il se trouve dans les limites de ce que vous êtes prêt à accepter, s’il est basé sur un site défectueux ou doit être réécrit pour éviter certains biais. Si le LLM analyse l’invite et trouve des problèmes, vous pouvez aller plus loin : demandez au LLM de réécrire l’invite pour améliorer potentiellement la réponse.

Le post-traitement peut impliquer la validation de la pertinence et de l’adéquation de la réponse au domaine. Cela peut inclure la suppression ou l’indicateur de 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 effet, aux exigences que vous lui avez demandées de respecter. Si ce n’est pas le cas, vous pouvez demander au LLM de modifier la saisie semi-automatique et de répéter cette opération 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 doivent être faits par le leadership qui affectent le budget, les performances et l’efficacité du système logiciel.

L’article Building advanced Retrieval-Augmented Generation systems explore en détail les étapes spécifiques de la création d’un pipeline d’inférence.

D’autres facteurs influencent les achèvements

Au-delà de la modification programmatique de l’invite, de la création d’un pipeline d’inférence et d’autres techniques, des détails supplémentaires sont abordés dans l’augmentation d’un modèle de langage volumineux avec la génération augmentée de récupération et le réglage précis. En outre, il existe des paramètres qui peuvent être modifiés lors d’appels à l’API Azure OpenAI.

La documentation du point de terminaison de conversation répertorie les paramètres obligatoires et facultatifs à passer qui peuvent affecter différents aspects de la saisie semi-automatique. Si vous utilisez plutôt un Kit de développement logiciel (SDK), reportez-vous à la documentation du Kit de développement logiciel (SDK) pour connaître la langue de votre choix. Si vous souhaitez expérimenter les paramètres, vous pouvez le faire dans le terrain de jeu.

  • Température : contrôlez 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 équilibre entre le choix de jetons de probabilité élevée et l’introduction d’un caractère aléatoire dans la sortie.

  • Nombre maximal de jetons : 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é.

  • P supérieur (échantillonnage du noyau) : utilisé avec la température pour contrôler l’aléatoire de la réponse. Le P principal limite l’IA pour considérer uniquement le pourcentage de probabilité supérieur de la masse de probabilité lors de la génération de chaque jeton. Les valeurs inférieures entraînent un texte plus ciblé et prévisible, tandis que les valeurs plus élevées permettent une plus grande diversité.

  • Pénalité de fréquence : 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é.

  • Pénalité de présence : encourage le modèle à introduire de nouveaux concepts et termes dans l’achèvement. La pénalité de présence est utile pour générer des sorties plus diversifiées et créatives.

  • Arrêter les séquences : vous pouvez spécifier une ou plusieurs séquences pour indiquer à l’API d’arrêter la génération de jetons supplémentaires. Les séquences de stockage sont utiles pour contrôler la structure de la sortie, comme mettre fin à une fin à la fin d’une phrase ou d’un paragraphe.

  • Biais logit : vous permet de modifier la probabilité que des jetons spécifiés apparaissent dans la saisie semi-automatique. Logit Bias peut être utilisé pour guider l’achèvement dans une certaine direction ou pour supprimer le contenu non souhaité.

Présentation des protections Microsoft OpenAI

En plus de garder les réponses du LLM liées à des sujets ou domaines spécifiques, vous serez probablement préoccupé par les types de questions que vos utilisateurs posent. 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 qu’il trouve potentiellement offensant et signale cela à vous dans de nombreuses catégories de filtrage.

Vous pouvez utiliser l’API modération d’OpenAI directement pour vérifier explicitement tout contenu pour détecter des contenus potentiellement dangereux.

Deuxièmement, 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 susceptibles d’influencer vos décisions de conception d’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 qui affectent 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, en équilibrant 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 avoir un impact significatif sur l’expérience utilisateur. Réduire les parties inutiles de la conversation pourrait 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’INTELLIGENCE artificielle générative, nous vous recommandons de vous familiariser avec la conversation à l’aide de votre propre exemple de données pour Python. Il existe également des versions du didacticiel disponibles dans .NET, Java et JavaScript.