🚘 Test-drive de LangChain ⛓️: mon retour d’expérience 🤯

Suite à l’article de mon très estimé collègue de Squad, Tristan, ainsi qu’à son constant partage, chez Reboot Conseil, des découvertes qu’il fait sur le framework depuis qu’il s’y intéresse (et je l’en remercie vivement pour cela), j’ai décidé d’enfin mettre les mains dans le cambouis et de découvrir les composants de cet incroyable outil.

Tristan avait écrit lors de son précédent article:

Toutefois, malgré son potentiel remarquable, la complexité de LangChain peut poser des défis, en particulier pour ceux moins versés dans la programmation avancée.

Tristan, très estimé AI squad member

Je le confirme: c’est assez confusant quand on s’y met, mais comme avec beaucoup de softs et concepts de notre métier de développeur, ça finit par faire « click » au bout d’un moment.

Définition de « click »: compréhension minimale mais suffisante d’un concept hyper important, qui décharge une soudaine vague de dopamine dans le cerveau qui souhaite comprendre ledit concept.

Ce moment est arrivé aujourd’hui pour moi, alors je profite de mon excitation actuelle pour vous résumer le potentiel de LangChain de la perspective du développeur que je suis, que j’ai aperçu lors de mon parcours exploratoire de sa documentation et de divers Jupyter notebooks pertinents.

Qu’est-ce que LangChain ?

LangChain est un framework qui se présente comme une « boîte à outils permettant de construire des applications contextuelles et intelligentes à l’aide d’abstractions » .

Qu’est-ce que ça veut dire concrètement ? Hé bien, avec Python ou Javascript, vous allez pouvoir utiliser des classes, méthodes, et divers pipelines et configurations pour construire des applications qui font un usage extensif des LLMs, et maintenant des LMMs.

Prenez le LLM dont vous êtes familier, par example GPT-4, et faites-en une application « agentic » et « context-aware » (ce sont les termes que vous retrouverez souvent lorsque l’on parle d’agents autonomes).

« agentic »

On dit d’une IA qu’elle devient agentique lorsqu’elle est capable de comprendre, raisonner, et utiliser des données spécifiques pour exécuter une action qui lui fait sens.

« context-aware »

Un système « context-aware » est capable de récupérer des données à la demande depuis diverses sources de données ou d’autres systèmes en se basant sur l’input de l’utilisateur. C’est, concrètement, ce que font les développeurs de logiciels depuis des années mais, dans le contexte de LangChain, cela signifie que l’on peut brancher ou un ou plusieurs systèmes ou sources de données, voire d’autres LLMs, au dit système afin d’apporter une réponse plus précise et opportune à l’utilisateur.

Exemples de cas d’utilisation de LangChain

  • augmenter un LLM (GPT-4, Mistral, Gemini, Llama, etc.) en lui permettant d’accéder à des fichiers, des bases de données, d’autres LLMs, des applications, des réseaux, etc. de votre choix
  • permettre à des LLMs d’interagir avec leur environnement en les dotant de la capacité de prendre des décisions
  • utiliser des LLMs pour décider de quelle action entreprendre dans un pipeline de tâches donné

Une liste des meilleures intégrations de LangChain est maintenue dans ce repository GitHub, vous allez voir, ça dépote !

LangChain: une approche modulaire

Vous l’avez compris, LangChain permet d’augmenter des systèmes avec des LLMs en vous proposant toutes sortes d’outils pour ce faire. Son architecture modulaire favorise la construction d’applications complexes basées sur les LLMs, en facilitant la connexion des modèles à diverses sources de données et agents décisionnels.

Parmi ces modules vous trouverez des:

  • Agents : abstractions permettant aux LLMs de communiquer avec leur environnement et de prendre des décisions
  • Chaînes : ou séries d’actions exécutables par un agent
  • Modèles: interfaces pour différents types de modèles d’IA, y compris les LLMs, des modèles de chat, d’incorporation de texte, etc.
  • Documents: il s’agit de textes non structurés avec métadonnées arbitraire
  • etc.

C’est en combinant ces modules, et bien d’autres disponibles, que vous pourrez construire vos applications agentiques.

Les examples de chaînes que nous allons voir

Vous trouverez dans ce notebook mes expérimentations liées à LangChain, j’y essaie plusieurs composants du framework avec PaLM2 (le dernier LLM de Google avant Gemini) en LLM sous-jacent.

Toute la partie setup nécessite un projet sur Google Cloud et un fichier .env, jetez un oeil au repo et mettez à jour les valeurs propres à votre projet 😉

Nous allons nous pencher ici principalement sur quelques cas d’usage d’utilisation de chaînes:

  • une chaîne séquentielle => appels successifs à un ou des LLMs avec, à chaque appel, le résultat du précédent appel en input (ou le prompt initial si c’est le premier appel)
  • une chaîne de résumé (summarization chain) => une automatisation du résumés de documents successifs, quelle que soit leur longueur
  • une chaîne de type questions/réponses (question answering chain) => l’idée est ici de pouvoir poser un set de questions/réponses à un LLM en lui donnant comme consigne explicite de ne considérer qu’une source de données désignée

Vous allez le voir, les chaînes constituent un concept très puissant (à tel point que je pense qu’il s’agit de l’évolution naturelle de notre métier de software developer) qui permet de créer des interactions plutôt complexes sans avoir à écrire tout le code sous-jacent.

A ce jour, LangChain utilise le LCEL (LangChain Expression Language) pour aider le développer à définir ces interactions. Commençons par la chaîne séquentielle:

Exemple de chaîne séquentielle

La chaîne séquentielle est pertinente pour de nombreux (voire tous) cas d’usage: on prend l’output d’un LLM et on génère un autre output avec le même ou un autre LLM, dans l’exemple de mon notebook:

  • je créé un template de prompt (une autre abstraction de LangChain) pour donner au LLM la personae d’un dramaturge qui écrit des synopsis pour des histoires pour enfants à partir d’un titre en input
  • je créé un autre template de prompt, cette fois avec la personae d’un bot représentant un écrivain sombre et torturé
  • je chaîne ensuite les deux prompts dynamiques et leurs résultats pour obtenir en résultat final une histoire un peu glauque à la Tim Burton (ce qui est plutôt jouissif)

Cet exemple simple est complexifiable à l’infini et, Fêtes obligent, je me suis laissé emporter avec cet exemple ^^ je me dois toutefois de rappeler que c’est parfaitement pertinent d’envisager toutes sortes de pipelines business dans le cadre plus sérieux du travail (même si dans l’IA squad on s’éclate).

Dans cet exemple, on voit qu’il est très facile de « piper » des éléments à une chaîne d’interactions LLM, j’utilise ici RunnablePassThrough afin de pouvoir récupérer les étapes avant l’output final.

Dans ce contexte créer une instance de LLM (par exemple celui utilisé dans la chain) est rendu aussi très facile =>

**Synopsis: A Cute Christmas Tale**

It’s Christmas Eve, and the young reindeer, Prancer, is feeling very excited. He can’t wait to help Santa deliver presents to all the good little boys and girls around the world. But when he arrives at the North Pole, he discovers that Santa is missing! Prancer is determined to find Santa and save Christmas. He sets off on a journey, meeting all sorts of interesting characters along the way, including a wise old owl, a friendly snowman, and a mischievous elf. As Prancer gets closer to finding Santa, he learns the true meaning of Christmas. He discovers that it’s not about presents or decorations, but about love, kindness, and helping others. In the end, Prancer finds Santa and they deliver the presents together. It’s a Christmas that Prancer will never forget!

PaLM2 en mode cute

**A Dark Christmas Tale**

It’s Christmas Eve, and the young reindeer, Prancer, is feeling very excited. He can’t wait to help Santa deliver presents to all the good little boys and girls around the world. But when he arrives at the North Pole, he discovers that Santa is missing! Prancer is determined to find Santa, but he soon realizes that the North Pole is not as magical as he thought. The elves are overworked and exhausted, the reindeer are restless and hungry, and the air is filled with a sense of dread. As Prancer searches for Santa, he uncovers a dark secret that threatens to destroy Christmas. He learns that Santa has been kidnapped by the evil Krampus, a demon who punishes naughty children. Krampus is planning to use Santa’s magic to spread fear and darkness throughout the world. Prancer must find a way to stop Krampus and save Santa before it’s too late. He faces many challenges along the way, but he is determined to succeed. In the end, Prancer triumphs over Krampus and saves Christmas. But the experience has left him with a dark secret of his own. He knows that the world is not as innocent as he once thought, and that there are forces of evil that are always lurking in the shadows.

PaLM2 un chouya plus dark

Exemple de summarization chain

Nous avons tous, à un moment ou un autre de notre journée de travail, besoin de résumer du contenu textuel. Les documents à résumer peuvent provenir de sources et être de nature différentes. Les LLMs sont un puissant outil pour augmenter notre productivité en ce sens, car ils sont très versatiles à cet égard.

Or, bien que la technologie évolue sans cesse (notamment avec les windows à 32k tokens et plus), on doit toujours faire attention à la limite de contexte que peut absorber un LLM lorsqu’on le nourrit de documents à résumer.

LangChain rend cette tâche, et la management de context afférent, très faciles. Dans l’exemple ci-dessous:

  • je prends deux pages d’accueil liées, celles du site de Reboot Conseil et de ce blog
  • je merge ensuite le contenu textuel de ces deux sites
  • cette fusion est ensuite splittée en tokens ingestables en un appel de LLM (la longueur variant selon le modèle considéré)
  • je créé ensuite un prompt template expliquant au bot qu’il doit de manière itérative prendre le contenu textuel en cours et le résumé précédent pour générer un résumé final => la longueur de documents successifs n’est plus un obstacle pour générer des résumés pertinents

Voici les étapes susmentionnées =>

Le résultat est très concluant, comme vous le verrez dans le notebook: on peut instrumenter LangChain et n’importe quel LLM pour créer un next-gen web scraper avec très peu de lignes de code !

Exemple de chaîne de questions/réponses

Enfin, dans notre dernier example, nous allons ré utiliser le même contenu scrapé très facilement grâce aux classes de LangChain pour poser une question sur ce qui a été scrapé.

Dans le notebook, j’utilise FAISS, une librairie de recherche efficiente de vecteurs pour récupérer les informations pertinentes dans le contenu scrappé, transformé préalablement en embeddings (rappel sur les embeddings disponible dans cet article) =>

Conclusion

Avec ces trois petits cas d’usage qui ne font qu’introduire le set de possibilités offert par LangChain, on se rend compte très vite de l’intérêt de développer son expertise dans l’utilisation de ce framework, aujourd’hui dominant dans l’instrumentation de LLMs. Vous avez une idée ? un projet ? N’hésitez pas à nous contacter et nous nous ferons un plaisir de vous construire de super agents intelligents 🤖

Partager l'article:

Autres articles