Adapter les projets LLM existants pour utiliser LangChain

Adapt existing LLM projects to use LangChain.

La refactorisation des appels OpenAI en quelque chose de plus puissant avec LangChain

Photo de JJ Ying sur Unsplash

Félicitations, vous avez un concept de preuve de concept LLM fonctionnel dont vous êtes fier et prêt à montrer au monde ! Peut-être avez-vous utilisé la bibliothèque OpenAI directement ou peut-être utilisez-vous un autre modèle de base et des transformateurs HuggingFace. Quoi qu’il en soit, vous avez travaillé dur et vous recherchez la prochaine étape. Cela peut signifier la refactorisation du code, l’ajout de la prise en charge de plusieurs modèles de base ou l’ajout de fonctionnalités avancées telles que des agents ou une base de données vectorielle. C’est là que LangChain intervient.

LangChain est un framework open source pour travailler avec des LLMs et développer des applications basées sur eux. Il existe des versions en Python et en JavaScript et il prend en charge plusieurs modèles de base et fournisseurs de LLM. Il dispose également d’un certain nombre de fonctions utilitaires pour gérer des tâches courantes telles que le découpage de documents ou l’interaction avec des bases de données vectorielles. Convaincu que c’est quelque chose qui vaut la peine d’être vérifié ? Jetez un coup d’œil à cet excellent article qui est un excellent point de départ pour comprendre ce qui est possible :

Se lancer avec LangChain : Guide du débutant pour construire des applications alimentées par LLM

Un tutoriel LangChain pour construire n’importe quoi avec de grands modèles de langage en Python

towardsdatascience.com

Cet article ne sera pas axé sur le développement à partir de zéro, mais plutôt sur la refactorisation d’une application existante. Il supposera également une certaine compréhension de base de LangChain, mais il y aura des liens vers la documentation pertinente. Plus précisément, je vais examiner la refactorisation d’un projet que j’ai écrit appelé AdventureGPT, un agent autonome pour jouer au jeu d’aventure textuel Colossal Cave Adventure de 1977. Si vous êtes intéressé à en savoir plus sur ce projet, consultez mon article précédent à ce sujet :

AdventureGPT : Utilisation d’agents soutenus par LLM pour jouer à des jeux d’aventure textuels

betterprogramming.pub

Il y avait plusieurs domaines sur lesquels j’étais le plus intéressé à effectuer une refactorisation :

  1. Utilisation de Chains au lieu d’appels OpenAI directs
  2. Remplacement des utilitaires de document sur mesure par la gestion de document/données de LangChain

Chacun de ces points sera abordé tour à tour.

Commençons par ce qu’est une chaîne. Une chaîne est une méthode permettant de combiner plusieurs techniques de manipulation de prompts en une seule unité qui aboutit à un seul appel de modèle de base. Une fois que vous avez une chaîne de travail, les chaînes peuvent être combinées et utilisées ensemble pour accomplir des tâches plus complexes.

LangChain offre plusieurs types de chaînes différents, cet article se concentre sur LLMChain et ConversationChain. LLMChain est le type de chaîne le plus simple, combinant des modèles de prompts avec les objets LLM que LangChain prend en charge. ConversationChains offre des flux de travail conversationnels personnalisés tels que des chatbots. Une des principales caractéristiques de ConversationChain est sa capacité à inclure la mémoire et à stocker les parties précédentes de la conversation sans effort dans le prompt.

Les modèles de prompts sont l’une des fonctionnalités les plus puissantes de LangChain, vous permettant d’inclure des variables à l’intérieur des prompts. Lors de l’exécution manuelle de cette tâche, on pourrait utiliser des f-strings combinées à la concaténation de chaînes et à une utilisation prudente des méthodes __repr__ personnalisées pour prendre vos données et les insérer dans un prompt pour un modèle de base. Avec le modèle de prompt, vous pouvez formater une chaîne en échappant les variables entre crochets. C’est tout ce que vous avez à faire.

En fonction du type de chaîne que vous créez, certaines variables sont définies par défaut, telles que l’historique conversationnel ou l’entrée de l’utilisateur. Cela peut entraîner une complexité considérable. Dans un prompt de conversation traditionnel, il y a des messages du système, de l’assistant IA et de l’utilisateur ou de l’humain. Lors de la rédaction de prompts manuellement, vous utilisez des libellés tels que “Système”, “Humain” et “IA” pour étiqueter chacun de ces messages pour le prompt. LangChain peut s’occuper de cela pour vous, vous permettant d’utiliser la méthode ChatPromptTemplate from_messages pour spécifier chaque message comme une liste d’objets, permettant un niveau d’abstraction supérieur et une inclusion et une mise en forme automatiques de l’historique.

Tout ce pouvoir a un coût de complexité. Au lieu d’adapter simplement les prompts avec du texte, il faut lire la documentation approfondie et éventuellement étendre le code existant pour s’adapter à un cas d’utilisation spécifique. Par exemple, les prompts de conversation ont tendance à inclure uniquement l’entrée de l’utilisateur et l’historique de la conversation en tant que variables. Cependant, je voulais inclure un contexte de jeu supplémentaire dans mon prompt pour mon PlayerAgent, qui était responsable de l’interaction avec le monde du jeu. Après avoir ajouté les variables supplémentaires à mon prompt, j’ai été accueilli avec l’erreur suivante :

Obtention de variables d'entrée de prompt inattendues. Le prompt attend ['completed_tasks', 'input', 'history', 'objective'], mais a reçu ['history'] en tant qu'entrées depuis la mémoire, et en tant que clé d'entrée normale. (type=value_error)

J’ai fait des recherches et j’ai trouvé un problème existant sur GitHub décrivant exactement le problème que je rencontrais, mais sans résolution claire. Imperturbable, j’ai examiné le code source de la classe ConversationChain et j’ai vu qu’il existait une méthode spécifique utilisée pour valider que seules les variables attendues étaient transmises en tant qu’entrée. J’ai créé une nouvelle classe qui hérite de la classe d’origine et j’ai remplacé la méthode. Avec ma classe CustomConversationChain en main, j’ai ensuite dû spécifier quelle variable devait être utilisée par le ConversationalMemoryBuffer pour l’entrée de l’utilisateur (ou dans mon cas, du jeu) étant donné qu’il y avait plusieurs variables d’entrée. Cela a été assez simple grâce à la variable d’instance input_key et voilà, tout fonctionnait.

Une fois que j’ai terminé de convertir mes appels OpenAI en chaînes, il était temps de revoir la façon dont je gérais l’ingestion de documents. Dans le cadre de ma boucle de jeu, j’ai accepté un chemin vers un texte d’aide qui serait ensuite converti en tâches de jeu à accomplir par le PlayerAgent. Lorsque j’ai ajouté cette fonctionnalité pour la première fois, j’ai simplement transmis l’intégralité du guide pas à pas au prompt et j’ai espéré le meilleur. Mais à mesure que j’ai trouvé des guides plus sophistiqués, cela n’était plus possible car la longueur des guides dépassait la fenêtre contextuelle autorisée par ChatGPT d’OpenAI. Par conséquent, j’ai découpé le texte en morceaux de 500 jetons et j’ai exécuté le prompt plusieurs fois pour convertir les guides pas à pas en tâches de jeu.

Quand j’ai dit que j’ai découpé le texte en morceaux d’environ 500 jetons, je l’ai fait de manière très rudimentaire, en utilisant la méthode split de la chaîne de caractères de Python pour tokenizer le texte (une approximation très approximative qui ne correspond pas à la façon dont la plupart des modèles de langage tokenizent le texte) et j’ai ensuite retransformé le tableau de jetons en une chaîne de caractères à l’aide de la méthode join, encore une fois à partir de la classe String. Bien que cela fonctionne, LangChain offre de meilleures solutions.

LangChain est capable de diviser le texte de différentes manières. La plus pertinente pour la plupart des gens est par jeton, car cela préserve le flux du document. Il existe une page entière de documentation dédiée aux différentes méthodes de découpage des textes par jeton. Plusieurs bibliothèques de traitement du langage naturel sont prises en charge pour la tokenization, mais j’ai choisi la solution native tiktoken de LLM, qui est la première méthode décrite. Il a suffi de quelques lignes de code pour découper le texte de manière plus efficace tout en préservant les espaces.

Ceci n’est qu’une introduction à la préparation des documents que LangChain est capable de faire. Il est également capable de convertir les morceaux de texte en une représentation textuelle appropriée pour le stockage dans une base de données vectorielle et de les récupérer ultérieurement pour les inclure dans le prompt. J’ai l’intention de le faire dans le futur de mon projet, en incluant un morceau pertinent d’un guide fourni pour le PlayerAgent.

LangChain est un puissant framework open source qui offre une gamme de fonctionnalités et de fonctions utilitaires pour travailler avec des modèles de langage et développer des applications basées sur ceux-ci. Que vous utilisiez la bibliothèque OpenAI ou un autre modèle de base, LangChain prend en charge plusieurs modèles de base et fournisseurs de modèles de langage, ce qui en fait un choix polyvalent pour vos projets.

Alors que LangChain peut introduire une certaine complexité par rapport à la gestion brute des prompts, il offre de nombreux avantages et simplifie l’interaction avec les modèles de langage. Il standardise le processus et fournit des outils utiles pour améliorer vos prompts et maximiser le potentiel de votre modèle de langage choisi.

Si vous êtes intéressé par la façon dont LangChain peut être mis en œuvre dans un projet réel, vous pouvez consulter la base de code mise à jour pour AdventureGPT, qui utilise LangChain pour la refonte et l’amélioration de l’application existante.

GitHub – oaguy1/AdventureGPT à langchain

Contribuer au développement d’oaguy1/AdventureGPT en créant un compte sur GitHub.

github.com

En résumé, LangChain est une ressource précieuse pour les développeurs travaillant avec des modèles de langage, offrant un framework complet et une large gamme de fonctionnalités pour améliorer les applications alimentées par des modèles de langage. Explorez LangChain et exploitez tout le potentiel de vos projets basés sur des modèles de langage !

We will continue to update IPGirl; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

AI

Une nouvelle façon de considérer la confidentialité des données

Des chercheurs créent une technique de confidentialité qui protège les données sensibles tout en maintenant les perfo...

Technologie de l'IA

Comment les cyborgs diffèrent-ils de l'IA ?

Les cyborgs et l'IA incarnent tous deux des avancées technologiques. Ils ont des attributs distincts ancrés dans leur...

AI

10 Points clés en Intelligence Artificielle Générative (2024)

Plongez dans le monde de l'IA générative en 2023 avec des informations sur ses applications, son impact et les défis ...

AI

IA et Gestion des Opérations - Un Vrai Mariage Fait au Paradis?

Dans le paysage commercial contemporain, la convergence de l'intelligence artificielle (IA) et de la gestion des opér...

AI

Un bref guide sur l'intelligence artificielle en marketing

Apprenez le rôle de l'intelligence artificielle dans le marketing digital et l'impact des autres outils d'IA sur la p...

AI

Top 10 Vulnérabilités LLM

Les attaquants exploitent les vulnérabilités de LLM pour utiliser des systèmes de PNL à des fins malveillantes. Décou...