🚘 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