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écisionsChaßnes
: ou sĂ©ries dâactions exĂ©cutables par un agentModĂš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 đ€