Async pour LangChain et LLMs
Async for LangChain and LLMs
Comment faire fonctionner les chaînes LangChain avec des appels asynchrones à LLMs pour accélérer le temps d’exécution d’une chaîne longue séquentielle
Dans cet article, je vais expliquer comment utiliser des appels asynchrones à LLMs pour des flux de travail longs en utilisant LangChain. Nous passerons par un exemple avec le code complet et comparerons l’exécution séquentielle avec les appels asynchrones.
Voici un aperçu du contenu. Si vous le souhaitez, vous pouvez passer à la section qui vous intéresse :
- Concepts de base : qu’est-ce que LangChain
- Comment exécuter une chaîne synchrone avec LangChain
- Comment exécuter une chaîne asynchrone unique avec LangChain
- Conseils concrets pour les flux de travail longs avec des chaînes asynchrones.
Alors commençons !
Concepts de base : qu’est-ce que Langchain
LangChain est une plateforme de développement d’applications alimentées par des modèles linguistiques. Voilà la définition officielle de LangChain. Cette plateforme a été récemment créée et est déjà utilisée comme norme de l’industrie pour la création d’outils alimentés par des LLMs.
- Visualiser la validation croisée de Sklearn K-Fold, Shuffle & Split, et Time Series Split
- Créez votre propre application de chat GPT en utilisant Spring Boot
- EDA avec Polars Guide étape par étape des fonctions d’agrégation et d’analyse (Partie 2)
Elle est open-source et bien entretenue, avec de nouvelles fonctionnalités qui sortent très rapidement.
La documentation officielle peut être trouvée ici et le dépôt GitHub ici.
Un inconvénient que nous avons avec cette bibliothèque est que, comme les fonctionnalités sont nouvelles, nous ne pouvons pas utiliser Chat GPT pour nous aider efficacement à construire du nouveau code. Cela signifie donc que nous devons travailler de manière “ancienne” en lisant de la documentation, en parcourant des forums et des tutoriels.
La documentation de LangChain est très bonne, cependant il n’y a pas beaucoup d’exemples pour certains points spécifiques.
J’ai rencontré ce problème avec l’asynchrone pour les chaînes longues.
Voici les principales ressources que j’ai utilisées pour en savoir plus sur la plateforme :
- Cours d’intelligence artificielle et d’apprentissage profond : Chat LangChain avec vos données ;
- Documentation officielle ;
- Chaîne Youtube.
(ps. Ils sont tous gratuits)
Comment exécuter une chaîne synchrone avec LangChain
Laissez-moi donc vous expliquer le problème que j’ai rencontré : j’ai un tableau de données avec beaucoup de lignes et pour chacune de ces lignes, je dois exécuter plusieurs invites (chaînes) vers un LLM et renvoyer le résultat dans mon tableau de données.
Lorsque vous avez plusieurs lignes, disons 10 000, en exécutant 3 invites pour chacune et chaque réponse (si le serveur n’est pas surchargé) prenant environ 3 à 5 secondes, vous finissez par attendre des jours pour que le flux de travail soit terminé.
Voici les étapes principales et le code pour construire une chaîne synchrone et mesurer le temps sur un sous-ensemble de données.
Pour cet exemple, je vais utiliser l’ensemble de données Wine Reviews, sous licence. L’objectif ici est d’extraire des informations des critiques écrites.
Je veux extraire un résumé de la critique, le sentiment principal et les 5 principales caractéristiques de chaque vin.
Pour cela, j’ai créé deux chaînes, une pour le résumé et le sentiment, et une autre qui utilise le résumé en entrée pour extraire les caractéristiques.
Voici le code pour l’exécuter :
Temps d’exécution (10 exemples) :
Chaîne de résumé (séquentielle) exécutée en 22,59 secondes. Chaîne de caractéristiques (séquentielle) exécutée en 22,85 secondes.
Si vous voulez en savoir plus sur les composants que j’utilise, je vous recommande vivement de regarder le cours d’intelligence artificielle et d’apprentissage profond.
Les principaux points à retenir de ce code sont les blocs de construction d’une chaîne, comment l’exécuter de manière séquentielle et le temps qu’il a fallu pour terminer cette boucle. Il est important de se rappeler que cela a pris environ 45 secondes pour 10 exemples et l’ensemble de données complet contient 130 000 lignes. Donc, l’implémentation asynchrone est le nouvel espoir pour exécuter cela dans un délai raisonnable.
Maintenant que le problème est posé et la référence établie, voyons comment nous pouvons optimiser ce code pour le faire fonctionner beaucoup plus rapidement.
Comment exécuter une seule chaîne asynchrone avec LangChain
Pour cela, nous allons utiliser une ressource appelée appels asynchrones. Pour expliquer cela, je vais d’abord expliquer brièvement ce que fait le code et où le temps est trop long.
Dans notre exemple, nous parcourons chaque ligne du dataframe, extrayons des informations des lignes, les ajoutons à notre invite, et appelons l’API GPT pour obtenir une réponse. Après la réponse, nous la parsemons simplement et l’ajoutons à nouveau au dataframe.
Le principal goulot d’étranglement ici est lorsque nous appelons l’API GPT car notre ordinateur doit attendre inactif la réponse de cette API (environ 3 secondes). Le reste des étapes est rapide et peut encore être optimisé, mais ce n’est pas l’objectif de cet article.
Donc, au lieu d’attendre inactif pour la réponse, que se passerait-il si nous envoyions tous les appels à l’API en même temps ? De cette façon, nous n’aurions à attendre qu’une seule réponse, puis les traiter. Cela s’appelle des appels asynchrones à l’API.
De cette façon, nous effectuons le prétraitement et le post-traitement de manière séquentielle, mais les appels à l’API n’ont pas besoin d’attendre que la dernière réponse revienne avant d’envoyer la suivante.
Voici donc le code pour les chaînes asynchrones :
Dans ce code, nous utilisons la syntaxe Python de async et await. LangChain nous donne également le code pour exécuter la chaîne de manière asynchrone, avec la fonction arun(). Donc, au début, nous traitons d’abord chaque ligne séquentiellement (peut être optimisé) et créons plusieurs “tâches” qui attendront la réponse de l’API en parallèle, puis nous traitons la réponse dans le format final souhaité séquentiellement (peut également être optimisé).
Temps d’exécution (10 exemples) :
La chaîne Summary (asynchrone) a été exécutée en 3,35 secondes. La chaîne Characteristics (asynchrone) a été exécutée en 2,49 secondes.
Comparé au séquentiel :
La chaîne Summary (séquentielle) a été exécutée en 22,59 secondes. La chaîne Characteristics (séquentielle) a été exécutée en 22,85 secondes.
Nous pouvons constater une amélioration d’environ 10 fois du temps d’exécution. Donc, pour les charges de travail importantes, je recommande vivement d’utiliser cette méthode. De plus, mon code est rempli de boucles for qui peuvent également être optimisées davantage pour améliorer les performances.
Le code complet de ce tutoriel peut être trouvé dans ce référentiel Github.
Conseils réels pour les flux de travail longs avec des chaînes asynchrones.
Quand j’ai dû exécuter cela, j’ai rencontré certaines limitations et quelques obstacles, que je souhaite partager avec vous.
Les notebooks ne sont pas amicaux avec l’asynchrone
Lorsque vous exécutez des appels asynchrones sur des notebooks Jupyter, vous pouvez rencontrer certains problèmes. Cependant, demandez simplement à Chat GPT et il pourra probablement vous aider avec cela. Le code que j’ai créé est destiné à exécuter de gros volumes de travail dans un fichier .py, il peut donc nécessiter quelques modifications pour s’exécuter dans un notebook.
Trop de clés de sortie
Le premier problème était que ma chaîne avait plusieurs clés en sortie et à ce moment-là, la fonction arun() n’acceptait que des chaînes ayant une seule clé en sortie. Donc, pour résoudre ce problème, j’ai dû diviser ma chaîne en deux chaînes distinctes.
Toutes les chaînes ne peuvent pas être asynchrones
J’avais une logique d’utilisation d’une base de données vectorielle pour les exemples et les comparaisons dans mon invite, et cela nécessitait que les exemples soient comparés séquentiellement et ajoutés à la base de données. Cela rendait impossible l’utilisation de l’asynchrone pour ce lien dans la chaîne complète.
Manque de contenu
Pour cette question spécifique, le meilleur contenu que j’ai pu trouver était la documentation officielle sur l’asynchrone, et j’ai construit à partir de là pour mon cas d’utilisation. Donc, si vous l’exécutez et découvrez de nouvelles choses, partagez-les avec le monde !
Conclusion
LangChain est un outil très puissant pour créer des applications basées sur LLM. Je recommande vivement d’apprendre ce framework et de suivre les cours mentionnés ci-dessus.
Pour le sujet spécifique de l’exécution de chaînes, pour les charges de travail élevées, nous avons vu le potentiel d’amélioration que les appels asynchrones peuvent apporter, donc ma recommandation est de prendre le temps de comprendre ce que le code fait et d’avoir une classe modèle (comme celle fournie dans mon code) et de l’exécuter de manière asynchrone!
Pour les charges de travail réduites ou les applications qui ne nécessitent qu’un seul appel à une API, il n’est pas nécessaire de le faire de manière asynchrone, mais si vous avez une classe modèle, ajoutez simplement une fonction de synchronisation pour pouvoir utiliser facilement l’une ou l’autre.
Merci de m’avoir lu.
Le code complet peut être trouvé ici.
Si vous aimez le contenu et souhaitez me soutenir, vous pouvez m’offrir un café :
Gabriel Cassimiro est un Data Scientist partageant du contenu gratuit à la communauté
Hey 👋 Je viens de créer une page ici. Vous pouvez maintenant m’offrir un café !
www.buymeacoffee.com
Voici quelques autres articles qui pourraient vous intéresser :
Résoudre l’environnement Unity avec l’apprentissage par renforcement profond
Projet de bout en bout avec le code d’une implémentation PyTorch d’un agent d’apprentissage par renforcement profond.
towardsdatascience.com
Détection d’objets avec un modèle TensorFlow et OpenCV
Utilisation d’un modèle entraîné pour identifier des objets sur des images statiques et des vidéos en direct
towardsdatascience.com
We will continue to update IPGirl; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles
- Correction des biais dans les systèmes de reconnaissance faciale une approche novatrice
- Voici les outils d’IA que j’utilise en plus de mes compétences pour gagner 10 000 dollars par mois – Pas de conneries
- L’interpréteur de code ChatGPT est désormais disponible pour tous les utilisateurs Plus
- Créez un Chatbot FAQ personnalisé avec BERT
- Comment l’intelligence artificielle renforce la confiance zéro
- Un conte de fées du biais inductif
- Comment concevoir un modèle dbt à partir de zéro