{"id":570856,"date":"2025-05-30T08:42:03","date_gmt":"2025-05-30T07:42:03","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=pycharm&#038;p=570856"},"modified":"2025-06-02T14:27:27","modified_gmt":"2025-06-02T13:27:27","slug":"comment-creer-des-chatbots-avec-langchain","status":"publish","type":"pycharm","link":"https:\/\/blog.jetbrains.com\/fr\/pycharm\/2025\/05\/comment-creer-des-chatbots-avec-langchain\/","title":{"rendered":"Comment cr\u00e9er des chatbots avec LangChain"},"content":{"rendered":"<p><em>Ce article a \u00e9t\u00e9 \u00e9crit par <a href=\"https:\/\/blog.jetbrains.com\/pycharm\/2024\/08\/how-to-build-chatbots-with-langchain\/#author\" data-type=\"link\" data-id=\"https:\/\/blog.jetbrains.com\/pycharm\/2024\/08\/how-to-build-chatbots-with-langchain\/#author\">Dido Grigorov<\/a>, ing\u00e9nieur en deep learning et programmeur Python ayant 17 ans d&#8217;exp\u00e9rience dans ce domaine.<\/em><\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone wp-image-572424 size-full\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/05\/PC-social-BlogFeatured-1280x720-2x-21.png\" alt=\"\" width=\"2559\" height=\"1439\" \/><\/figure>\n<p>Les chatbots ont \u00e9volu\u00e9 et ils sont aujourd&#8217;hui bien plus que de simples outils de questions\/r\u00e9ponses. La puissance des grands mod\u00e8les de langage (LLM) leur permet de comprendre le contexte des conversations pour g\u00e9n\u00e9rer des r\u00e9ponses naturelles et pertinentes de type humain, ce qui en fait des outils pr\u00e9cieux pour les applications de support client et d&#8217;autres types d&#8217;assistance virtuelle.\u00a0<\/p>\n<p>Le framework open source LangChain simplifie le processus de cr\u00e9ation de ces chatbots conversationnels en fournissant des outils pour une int\u00e9gration des mod\u00e8les fluide, la gestion du contexte et l&#8217;ing\u00e9nierie des prompts.<\/p>\n<p>Dans cet article, nous allons voir comment LangChain fonctionne et comment les chatbots interagissent avec les LLM. Nous vous guidons \u00e9galement \u00e9tape par \u00e9tape dans la cr\u00e9ation d&#8217;un chatbot capable de tenir compte du contexte pour fournir des r\u00e9ponses pr\u00e9cises et pertinentes, en utilisant LangChain et GPT-3.<\/p>\n<p><!--more--><\/p>\n<h2 class=\"wp-block-heading\"><strong>Que sont les chatbots dans le domaine des <\/strong>LLM<strong>\u00a0?<\/strong><\/h2>\n<p>Dans le domaine des LLM, les chatbots sont des logiciels de pointe qui peuvent simuler des conversations de type humain avec des utilisateurs via des interfaces textuelles ou vocales. Ces chatbots exploitent les capacit\u00e9s avanc\u00e9es des LLM, qui sont des r\u00e9seaux neuronaux entra\u00een\u00e9s \u00e0 partir d&#8217;une \u00e9norme quantit\u00e9 de donn\u00e9es textuelles afin de pouvoir donner des r\u00e9ponses naturelles de type humain \u00e0 une grande vari\u00e9t\u00e9 de prompts.<\/p>\n<p>Les chatbots bas\u00e9s sur des LLM peuvent notamment prendre en compte le contexte de la conversation lorsqu&#8217;ils g\u00e9n\u00e8rent une r\u00e9ponse. Ainsi, ils sont capables de rester coh\u00e9rents au cours de plusieurs \u00e9changes et de traiter des requ\u00eates complexes pour produire des r\u00e9sultats en phase avec les attentes et intentions des utilisateurs. De plus, ces chatbots \u00e9valuent le ton des messages de l&#8217;utilisateur d&#8217;un point de vue \u00e9motionnel et ajustent leurs r\u00e9ponses en cons\u00e9quence.<\/p>\n<p>Les chatbots sont hautement adaptables et personnalis\u00e9s. Ils apprennent de leurs interactions avec les utilisateurs afin d&#8217;am\u00e9liorer leurs r\u00e9ponses en fonction des pr\u00e9f\u00e9rences et des besoins individuels.\u00a0<\/p>\n<h2 class=\"wp-block-heading\"><strong>Qu&#8217;est-ce que LangChain ?<\/strong><\/h2>\n<p>LangChain est un framework open source qui a \u00e9t\u00e9 d\u00e9velopp\u00e9 pour cr\u00e9er des applications utilisant des grands mod\u00e8les de langage (LLM). Il fournit des outils et des abstractions pour mieux personnaliser les informations produites \u00e0 partir de ces mod\u00e8les avec pr\u00e9cision et pertinence.\u00a0<\/p>\n<p>Le terme de \u00ab\u00a0cha\u00eenes de prompts \u00bb est couramment utilis\u00e9 dans les contenus au sujet des LLM. Une cha\u00eene de prompts d\u00e9signe une s\u00e9quence de prompts ou d&#8217;instructions utilis\u00e9e dans le contexte de l&#8217;intelligence artificielle et du machine learning dans le but de guider le mod\u00e8le d&#8217;IA au cours d&#8217;un processus comportant de multiples \u00e9tapes, afin de g\u00e9n\u00e9rer des r\u00e9sultats plus pr\u00e9cis, d\u00e9taill\u00e9s ou pertinents. Cette m\u00e9thode peut-\u00eatre employ\u00e9e pour diff\u00e9rents types de t\u00e2ches, comme l&#8217;\u00e9criture, la r\u00e9solution de probl\u00e8mes ou la g\u00e9n\u00e9ration de code.\u00a0<\/p>\n<p>Les d\u00e9veloppeurs peuvent cr\u00e9er de nouvelles cha\u00eenes de prompts avec LangChain, ce qui est l&#8217;un des principaux points forts du framework. Ils peuvent m\u00eame modifier des templates de prompts existants sans avoir \u00e0 r\u00e9-entra\u00eener le mod\u00e8le en utilisant de nouveaux ensembles de donn\u00e9es.<\/p>\n<h2 class=\"wp-block-heading\"><strong>Comment fonctionne LangChain ?<\/strong><\/h2>\n<p>LangChain est un framework con\u00e7u pour simplifier le d\u00e9veloppement des applications qui utilisent des mod\u00e8les de langage. Il offre une suite d&#8217;outils qui aide les d\u00e9veloppeurs \u00e0 cr\u00e9er et \u00e0 g\u00e9rer efficacement les applications recourant au traitement du langage naturel (NLP) et \u00e0 des LLM. En d\u00e9finissant les \u00e9tapes n\u00e9cessaires pour atteindre le r\u00e9sultat voulu (qu&#8217;il s&#8217;agisse d&#8217;un chatbot, d&#8217;automatisation de t\u00e2ches, d&#8217;assistant virtuel, d&#8217;assistance client ou autre), les d\u00e9veloppeurs peuvent adapter les LLM \u00e0 des contextes m\u00e9tiers sp\u00e9cifiques de fa\u00e7on flexible en utilisant LangChain.\u00a0<\/p>\n<p>Voici une pr\u00e9sentation g\u00e9n\u00e9rale de la fa\u00e7on dont LangChain fonctionne.<\/p>\n<h3 class=\"wp-block-heading\"><strong>Int\u00e9gration de mod\u00e8les<\/strong><\/h3>\n<p>LangChain prend en charge diff\u00e9rents mod\u00e8les de langage, notamment ceux de <em>OpenAI, Hugging Face, Cohere, Anyscale, Azure Models, Databricks, Ollama, Llama, GPT4All, Spacy, Pinecone, AWS Bedrock et MistralAI<\/em>. Les d\u00e9veloppeurs peuvent facilement passer d&#8217;un mod\u00e8le \u00e0 un autre ou utiliser plusieurs mod\u00e8les dans une seule application. Ils ont \u00e9galement la possibilit\u00e9 de cr\u00e9er leurs propres solutions d&#8217;int\u00e9gration de mod\u00e8les, ce qui leur permet de tirer parti des capacit\u00e9s sp\u00e9cifiques d&#8217;applications donn\u00e9es.<\/p>\n<h3 class=\"wp-block-heading\"><strong>Cha\u00eenes<\/strong><\/h3>\n<p>Le concept de base de LangChain repose sur les <strong>cha\u00eenes<\/strong>, qui r\u00e9unissent diff\u00e9rents composants d&#8217;IA pour g\u00e9n\u00e9rer des r\u00e9ponses en fonction du contexte. Une cha\u00eene repr\u00e9sente un ensemble d&#8217;actions automatis\u00e9es entre le prompt d&#8217;un utilisateur et la sortie finale du mod\u00e8le. LangChain fournit deux types de cha\u00eenes\u00a0:<\/p>\n<ul>\n<li>Les <strong>cha\u00eenes s\u00e9quentielles\u00a0:<\/strong> ces cha\u00eenes permettent d&#8217;utiliser la sortie d&#8217;un mod\u00e8le ou d&#8217;une fonction comme entr\u00e9e pour un autre mod\u00e8le ou une autre fonction, ce qui est particuli\u00e8rement utile pour cr\u00e9er des processus avec de multiples \u00e9tapes qui d\u00e9pendent les unes des autres.<\/li>\n<li>Les <strong>cha\u00eenes parall\u00e8les\u00a0:<\/strong> elles permettent d&#8217;ex\u00e9cuter simultan\u00e9ment plusieurs t\u00e2ches dont les r\u00e9sultats sont fusionn\u00e9s \u00e0 la fin, ce qui est id\u00e9al pour les t\u00e2ches qui peuvent \u00eatre divis\u00e9es en sous-t\u00e2ches compl\u00e8tement ind\u00e9pendantes.<\/li>\n<\/ul>\n<h3 class=\"wp-block-heading\"><strong>M\u00e9moire<\/strong><\/h3>\n<p>LangChain facilite le stockage et la r\u00e9cup\u00e9ration d&#8217;informations au cours de diverses interactions. Il s&#8217;agit d&#8217;un atout essentiel dans les cas o\u00f9 on a besoin d&#8217;assurer la persistance du contexte, pour les chatbots ou les agents interactifs par exemple. Deux types de m\u00e9moire sont fournis\u00a0:<\/p>\n<ul>\n<li>La <strong>m\u00e9moire \u00e0 court terme<\/strong>\u00a0: pour aider \u00e0 conserver une trace des sessions r\u00e9centes.<\/li>\n<li>La <strong>m\u00e9moire \u00e0 long terme<\/strong>\u00a0: pour conserver les informations provenant de sessions pr\u00e9c\u00e9dentes afin que le syst\u00e8me puisse se rappeler des \u00e9changes pass\u00e9s et des pr\u00e9f\u00e9rences de l&#8217;utilisateur.<\/li>\n<\/ul>\n<h3 class=\"wp-block-heading\"><strong>Outils et utilitaires<\/strong><\/h3>\n<p>LangChain fournit de nombreux outils, mais les plus utilis\u00e9s sont le Prompt Engineering, les Data Loaders et les Evaluators.\u00a0 En ce qui concerne le Prompt Engineering, LangChain fournit des utilitaires pour d\u00e9velopper des prompts efficaces, ce qui est tr\u00e8s important pour obtenir les meilleures r\u00e9ponses des mod\u00e8les de langage.<\/p>\n<p>Si vous voulez charger des fichiers csv, pdf ou d&#8217;un autre format, les <strong>Data Loaders<\/strong> permettent de charger et de pr\u00e9-traiter diff\u00e9rents types de donn\u00e9es afin de pouvoir les utiliser dans les interactions de mod\u00e8les.<\/p>\n<p>L&#8217;\u00e9valuation est un aspect essentiel du travail avec les mod\u00e8les de machine learning et de LLM. C&#8217;est pourquoi LangChain fournit des <strong>Evaluators<\/strong>\u00a0: des outils permettant de tester les mod\u00e8les de langage et les cha\u00eenes pour que les r\u00e9sultats g\u00e9n\u00e9r\u00e9s r\u00e9pondent aux crit\u00e8res requis, ce qui peut inclure\u00a0:<\/p>\n<p><strong>Crit\u00e8res pour les ensembles de donn\u00e9es\u00a0:<\/strong><\/p>\n<ul>\n<li><strong>Exemples s\u00e9lectionn\u00e9s manuellement\u00a0:<\/strong> commencez avec des entr\u00e9es diversifi\u00e9es et de haute qualit\u00e9.<\/li>\n<li><strong>Fichiers journaux d&#8217;historique\u00a0:<\/strong> utiliser des donn\u00e9es et des avis d&#8217;utilisateur r\u00e9els.<\/li>\n<li><strong>Donn\u00e9es synth\u00e9tiques\u00a0: <\/strong>g\u00e9n\u00e9rer des exemples sur la base des donn\u00e9es initiales.<\/li>\n<\/ul>\n<p><strong>Types d&#8217;\u00e9valuations\u00a0:<\/strong><\/p>\n<ul>\n<li><strong>Humaine\u00a0:<\/strong> \u00e9valuations et retours manuels.<\/li>\n<li><strong>Heuristique\u00a0:<\/strong> fonctions bas\u00e9es sur des r\u00e8gles, avec ou sans r\u00e9f\u00e9rences.<\/li>\n<li><strong>LLM en tant que juge\u00a0: <\/strong>les LLM \u00e9valuent les r\u00e9sultats en fonction de crit\u00e8res cod\u00e9s.<\/li>\n<li><strong>Par paires\u00a0: <\/strong>Comparaison de deux meilleurs r\u00e9sultats pour choisir le meilleur.<\/li>\n<\/ul>\n<p><strong>\u00c9valuations de l&#8217;application\u00a0:<\/strong><\/p>\n<ul>\n<li><strong>Tests unitaires\u00a0:<\/strong> v\u00e9rifications rapides bas\u00e9es sur l&#8217;heuristique.<\/li>\n<li><strong>Tests de r\u00e9gression\u00a0: <\/strong>mesure des variations des performances au fil du temps.<\/li>\n<li><strong>Back-testing\u00a0: <\/strong>R\u00e9execution des donn\u00e9es de production sur de nouvelles versions.<\/li>\n<li><strong>\u00c9valuation en ligne\u00a0: <\/strong>\u00c9valuation en temps r\u00e9el, souvent \u00e0 des fins de protection et de classification.<\/li>\n<\/ul>\n<p><strong>Agents<\/strong><strong><br \/><\/strong>Les agents LangChain sont essentiellement des entit\u00e9s autonomes qui exploitent les LLM pour interagir avec les utilisateurs, effectuer des t\u00e2ches et prendre des d\u00e9cisions sur la base d&#8217;entr\u00e9es en langage naturel.<\/p>\n<p>Les <strong>agents bas\u00e9s sur l&#8217;action<\/strong> utilisent des mod\u00e8les de langage pour d\u00e9cider des actions optimales pour des t\u00e2ches pr\u00e9d\u00e9finies. Les <strong>agents interactifs<\/strong> ou les applications interactives telles que les chatbots utilisent ces agents, qui prennent \u00e9galement en compte les entr\u00e9es fournies par l&#8217;utilisateur et la m\u00e9moire stock\u00e9e lors de la r\u00e9ponse aux requ\u00eates.<\/p>\n<h2 class=\"wp-block-heading\"><strong>Comment les chatbots fonctionnent-ils avec les LLM ?<\/strong><\/h2>\n<p>Les LLM qui sont derri\u00e8re les chatbots utilisent la compr\u00e9hension du langage naturel (NLU) et la g\u00e9n\u00e9ration de langage naturel (NLG), ces mod\u00e8les ayant \u00e9t\u00e9 pr\u00e9-entra\u00een\u00e9s sur un tr\u00e8s grand volume de donn\u00e9es textuelles.<\/p>\n<h3 class=\"wp-block-heading\"><strong>Compr\u00e9hension du langage naturel (NLU)<\/strong><\/h3>\n<ul>\n<li><strong>Prise en compte du contexte\u00a0:<\/strong> les LLM sont capables de comprendre les subtilit\u00e9s, les allusions et les r\u00e9f\u00e9rences dans une conversation, et suivre les conversations d\u2019une session \u00e0 l\u2019autre. Cela permet aux chatbots de faire des r\u00e9ponses logiques et contextualis\u00e9es aux questions des clients.<\/li>\n<li><strong>Reconnaissance des intentions\u00a0: <\/strong>ces mod\u00e8les doivent \u00eatre capables de comprendre l&#8217;intention des utilisateurs \u00e0 partir de leurs demandes, que leur formulation soit tr\u00e8s sp\u00e9cifique ou g\u00e9n\u00e9rale. Ils peuvent discerner ce que les utilisateurs souhaitent obtenir et d\u00e9terminer la meilleure fa\u00e7on de les aider \u00e0 atteindre cet objectif.<\/li>\n<li><strong>Analyse des sentiments\u00a0: <\/strong>les chatbots savent identifier l&#8217;\u00e9motion de l&#8217;utilisateur en fonction du ton employ\u00e9 et s&#8217;adapter en cons\u00e9quence, ce qui permet de renforcer le niveau d&#8217;engagement de l&#8217;utilisateur.<\/li>\n<\/ul>\n<h3 class=\"wp-block-heading\"><strong>G\u00e9n\u00e9ration en langage naturel (NLU)<\/strong><\/h3>\n<ul>\n<li><strong>G\u00e9n\u00e9ration de la r\u00e9ponse\u00a0: <\/strong>les r\u00e9ponses fournies par les LLM sont correctes, aussi bien en termes de grammaire que de contexte. Cela est d\u00fb au fait que ces r\u00e9ponses imitent les communications humaines, les mod\u00e8les ayant \u00e9t\u00e9 entra\u00een\u00e9s sur de grandes quantit\u00e9s de donn\u00e9es textuelles en langage naturel.<\/li>\n<li><strong>Cr\u00e9ativit\u00e9 et flexibilit\u00e9\u00a0:<\/strong> les chatbots bas\u00e9s sur des LLM sont capables de fournir des \u00e9l\u00e9ments de r\u00e9ponse vari\u00e9s : ils peuvent non seulement r\u00e9pondre \u00e0 des questions simples, mais aussi raconter une histoire, \u00e9crire un po\u00e8me ou donner une description d\u00e9taill\u00e9e d&#8217;un probl\u00e8me technique sp\u00e9cifique.<\/li>\n<\/ul>\n<h3 class=\"wp-block-heading\"><strong>Personnalisation et adaptabilit\u00e9<\/strong><\/h3>\n<ul>\n<li><strong>Apprendre \u00e0 partir des interactions\u00a0: <\/strong>les chatbots personnalisent l&#8217;interaction, car ils ont la capacit\u00e9 d&#8217;apprendre \u00e0 partir du comportement des utilisateurs, ainsi que de leurs choix. En ce sens, ils apprennent constamment, ce qui rend leurs r\u00e9ponses plus efficaces et plus pr\u00e9cises.<\/li>\n<li><strong>Adaptation \u00e0 diff\u00e9rents domaines\u00a0: <\/strong>les LLM peuvent \u00eatre optimis\u00e9s en fonction de domaines ou de sp\u00e9cialit\u00e9s, ce qui permet aux chatbots de r\u00e9pondre comme des experts en relations clients, support technique ou soins de sant\u00e9.<\/li>\n<\/ul>\n<p>Les LLM sont capables de comprendre et de g\u00e9n\u00e9rer du texte en plusieurs langues et peuvent donc \u00eatre utilis\u00e9s pour des applications dans diff\u00e9rents contextes linguistiques.<\/p>\n<h2 class=\"wp-block-heading\"><strong>Cr\u00e9er votre chatbot avec LangChain en cinq \u00e9tapes<\/strong><\/h2>\n<p>Dans ce projet, il s&#8217;agit de cr\u00e9er un chatbot qui tire parti de GPT-3 pour rechercher des r\u00e9ponses dans des documents. Tout d&#8217;abord, nous r\u00e9cup\u00e9rons le contenu d&#8217;articles en ligne, les divisons en petits morceaux, calculons leurs embeddings et les stockons dans Deep Lake. Ensuite, nous utilisons une requ\u00eate utilisateur pour r\u00e9cup\u00e9rer les morceaux les plus pertinents de Deep Lake, qui sont ensuite incorpor\u00e9s dans un prompt pour g\u00e9n\u00e9rer la r\u00e9ponse finale avec le LLM.<\/p>\n<p>Il est important de noter qu&#8217;utiliser des LLM comporte un risque de g\u00e9n\u00e9rer des \u00ab hallucinations \u00bb ou de fausses informations. Si cela n&#8217;est pas acceptable pour de nombreux cas du domaine de l&#8217;assistance client, le chatbot peut toutefois \u00eatre utile pour aider les op\u00e9rateurs \u00e0 cr\u00e9er des r\u00e9ponses qu&#8217;ils pourront v\u00e9rifier avant de les envoyer aux utilisateurs.<\/p>\n<p>Ensuite, nous allons voir comment g\u00e9rer les conversations avec GPT-3 et fournir des exemples d\u00e9montrant l&#8217;efficacit\u00e9 de ce workflow.<\/p>\n<h3 class=\"wp-block-heading\"><strong>\u00c9tape 1\u00a0: Cr\u00e9ation de projet, conditions pr\u00e9alables et installation des biblioth\u00e8ques requises<\/strong><\/h3>\n<p>Commencez par cr\u00e9er votre projet PyCharm pour le chatbot. Ouvrez <a href=\"https:\/\/www.jetbrains.com\/fr-fr\/pycharm\/\" target=\"_blank\" rel=\"noopener\" data-type=\"link\" data-id=\"https:\/\/www.jetbrains.com\/pycharm\/\">PyCharm<\/a> et cliquez sur \u00ab\u00a0Nouveau projet\u00a0\u00bb. Puis, donnez un nom \u00e0 votre projet.<\/p>\n<figure class=\"wp-block-image size-full is-style-default\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-504042\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/08\/unnamed-1.png\" alt=\"Cr\u00e9er un projet PyCharm\" width=\"780\" height=\"638\" \/><\/figure>\n<p>Une fois le projet configur\u00e9, connectez-vous au <a href=\"https:\/\/platform.openai.com\/docs\/overview\" target=\"_blank\" rel=\"noopener\">site web de l&#8217;API OpenAI Platform<\/a> (ou inscrivez-vous sur le site web OpenAI) et g\u00e9n\u00e9rez votre cl\u00e9 \u00ab\u00a0<code>OPENAI_API_KEY<\/code>\u00a0\u00bb. Pour ce faire, allez dans la section \u00ab\u00a0API Keys\u00a0\u00bb dans le menu de navigation situ\u00e9 \u00e0 gauche et cliquez sur le bouton \u00ab\u00a0+Create new secret key\u00a0\u00bb. N&#8217;oubliez pas de copier votre cl\u00e9.<\/p>\n<p>Ensuite, obtenez votre jeton \u00ab\u00a0<code>ACTIVELOOP_TOKEN<\/code>\u00a0\u00bb en vous inscrivant sur le <a href=\"https:\/\/www.activeloop.ai\/\" target=\"_blank\" rel=\"noopener\">site web Activeloop<\/a>. Une fois connect\u00e9, cliquez simplement sur le bouton \u00ab\u00a0Create API Token\u00a0\u00bb pour acc\u00e9der \u00e0 la page de cr\u00e9ation de jeton. Copiez \u00e9galement ce jeton.<\/p>\n<p>Lorsque vous disposez du jeton et de la cl\u00e9, ouvrez les param\u00e8tres de configuration dans PyCharm en cliquant sur le bouton \u00e0 3 points situ\u00e9 \u00e0 c\u00f4t\u00e9 des boutons run et debug et choisissez \u00ab\u00a0Edit\u00a0\u00bb. La fen\u00eatre suivante doit alors s&#8217;afficher\u00a0:<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-504079\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/08\/unnamed-3.png\" alt=\"Configurations Run\/Debug dans PyCharm\" width=\"1382\" height=\"989\" \/><\/figure>\n<p>Recherchez maintenant le champ \u00ab\u00a0Environment variables\u00a0\u00bb et l&#8217;ic\u00f4ne situ\u00e9e \u00e0 droite de ce champ. Ensuite, cliquez pour afficher la fen\u00eatre suivante\u00a0:<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-544577\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/02\/unnamed-1.png\" alt=\"Variables d'environnement dans PyCharm\" width=\"1382\" height=\"989\" \/><\/figure>\n<p>Cliquez sur le bouton + pour ajouter vos variables d&#8217;environnement en faisant attention \u00e0 leurs noms. Ils doivent \u00eatre identiques \u00e0 ceux mentionn\u00e9s ci-dessus\u00a0: \u00ab\u00a0<code>OPENAI_API_KEY<\/code>\u00a0\u00bb et \u00ab\u00a0<code>ACTIVELOOP_TOKEN<\/code>\u00a0\u00bb. Lorsque que c&#8217;est fait, cliquez sur OK dans la premi\u00e8re fen\u00eatre, puis sur \u00ab\u00a0Apply\u00a0\u00bb et \u00ab\u00a0OK\u00a0\u00bb dans la seconde fen\u00eatre.<\/p>\n<p>C&#8217;est l&#8217;un des avantages de PyCharm que j&#8217;appr\u00e9cie particuli\u00e8rement, car les variables \u00e9tant trait\u00e9es automatiquement, cela \u00e9vite d&#8217;avoir \u00e0 faire des appels suppl\u00e9mentaires, ce qui permet de se concentrer sur la partie cr\u00e9ative du code.<\/p>\n<p><em>Remarque\u00a0: <\/em><strong><em>Activeloop<\/em><\/strong><em> est une entreprise sp\u00e9cialis\u00e9e dans le d\u00e9veloppement d&#8217;infrastructures de donn\u00e9es et d&#8217;outils pour le machine learning et l&#8217;intelligence artificielle. L&#8217;entreprise a pour objectif de simplifier le processus de gestion, de stockage et de traitement des grands ensembles de donn\u00e9es, notamment pour le deep learning et autres utilisations de l&#8217;IA.<\/em><\/p>\n<p><strong><em>Deep Lake<\/em><\/strong><em> est un produit phare d&#8217;Activeloop. Il fournit des capacit\u00e9s de stockage, de gestion et d&#8217;acc\u00e8s efficaces aux donn\u00e9es, optimis\u00e9es pour les grands ensembles de donn\u00e9es souvent utilis\u00e9s pour l&#8217;IA.<\/em><\/p>\n<h4 class=\"wp-block-heading\"><strong>Installer les biblioth\u00e8ques <strong>requises<\/strong><\/strong><\/h4>\n<p>Nous allons utiliser la classe \u00ab\u00a0<code>SeleniumURLLoader<\/code>\u00a0\u00bb de LangChain, qui s&#8217;appuie sur les biblioth\u00e8ques Python \u00ab\u00a0<code>unstructured<\/code>\u00a0\u00bb et \u00ab\u00a0<code>selenium<\/code>\u00a0\u00bb. Installez ces biblioth\u00e8ques en utilisant pip.\u00a0 Il est recommand\u00e9 d&#8217;installer la derni\u00e8re version, m\u00eame si le code a \u00e9t\u00e9 test\u00e9 avec la version 0.7.7.\u00a0<\/p>\n<p>Pour ce faire, utilisez la commande suivante dans le terminal de PyCharm\u00a0:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">pip install unstructured selenium<\/pre>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-544604\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/02\/Install-Selenium-1.png\" alt=\"\" width=\"1385\" height=\"991\" \/><\/figure>\n<p>Nous allons maintenant installer <code>langchain<\/code>, <code>deeplake<\/code> et <code>openai<\/code>. Utilisez cette commande dans votre terminal (m\u00eame fen\u00eatre que pour Selenium) et patientez un peu pendant l&#8217;installation\u00a0:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">pip install langchain==0.0.208 deeplake openai==0.27.8 psutil tiktoken<\/pre>\n<p>Pour vous assurer que les biblioth\u00e8ques sont correctement install\u00e9es, ajoutez les lignes suivantes \u00e0 notre application de chatbot et cliquez sur le bouton Run\u00a0:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from langchain.embeddings.openai import OpenAIEmbeddings\n\nfrom langchain.vectorstores import DeepLake\n\nfrom langchain.text_splitter import CharacterTextSplitter\n\nfrom langchain import OpenAI\n\nfrom langchain.document_loaders import SeleniumURLLoader\n\nfrom langchain import PromptTemplate<\/pre>\n<p>Vous pouvez \u00e9galement installer vos biblioth\u00e8ques \u00e0 partir des param\u00e8tres de PyCharm. Ouvrez-les et allez dans la section Project -&gt; Python Interpreter. Appuyez sur le bouton +, recherchez votre paquet et appuyez sur le bouton \u00ab\u00a0Install Package\u00a0\u00bb. Une fois que c&#8217;est pr\u00eat, fermez et cliquez sur \u00ab\u00a0Apply\u00a0\u00bb puis sur \u00ab\u00a0OK\u00a0\u00bb dans la fen\u00eatre suivante.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-503888\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/08\/image-38.png\" alt=\"Interpr\u00e9teur Python dans PyCharm\" width=\"1012\" height=\"759\" \/><\/figure>\n<h3 class=\"wp-block-heading\"><strong>\u00c9tape 2\u00a0: R\u00e9partition du contenu en morceaux et calcul de leurs embeddings<\/strong><\/h3>\n<p>Comme indiqu\u00e9 pr\u00e9c\u00e9demment, notre chatbot va \u00ab\u00a0communiquer\u00a0\u00bb \u00e0 partir du contenu d&#8217;articles en ligne, c&#8217;est pourquoi j&#8217;ai choisi Digitaltrends.com comme source de donn\u00e9es et s\u00e9lectionn\u00e9 8 articles pour commencer. Tous ces articles sont organis\u00e9s dans une liste Python et affect\u00e9s \u00e0 une variable appel\u00e9e \u00ab\u00a0articles\u00a0\u00bb.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">articles = ['https:\/\/www.digitaltrends.com\/computing\/claude-sonnet-vs-gpt-4o-comparison\/',\n           'https:\/\/www.digitaltrends.com\/computing\/apple-intelligence-proves-that-macbooks-need-something-more\/',\n           'https:\/\/www.digitaltrends.com\/computing\/how-to-use-openai-chatgpt-text-generation-chatbot\/',\n           'https:\/\/www.digitaltrends.com\/computing\/character-ai-how-to-use\/',\n           'https:\/\/www.digitaltrends.com\/computing\/how-to-upload-pdf-to-chatgpt\/']<\/pre>\n<p>Nous chargeons les documents \u00e0 partir des URL fournies et les divisons en morceaux en utilisant le \u00ab\u00a0<code>CharacterTextSplitter<\/code>\u00a0\u00bb avec une taille de morceau de 1\u00a0000 et sans chevauchement\u00a0:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># Use the selenium to load the documents\nloader = SeleniumURLLoader(urls=articles)\ndocs_not_splitted = loader.load()\n\n# Split the documents into smaller chunks\ntext_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)\ndocs = text_splitter.split_documents(docs_not_splitted)<\/pre>\n<p>Si vous ex\u00e9cutez le code \u00e0 ce stade, si tout fonctionne correctement, vous devez obtenir le r\u00e9sultat suivant \u00a0:<\/p>\n<p><em><code>[Document(page_content=\"techcrunchnntechcrunchnnWe, TechCrunch, are part of the Yahoo family of brandsThe sites and apps that we own and operate, including Yahoo and AOL, and our digital advertising service, Yahoo Advertising.Yahoo family of brands.nn\u00a0 \u00a0 When you use our sites and apps, we use nnCookiesCookies (including similar technologies such as web storage) allow the operators of websites and apps to store and read information from your device. Learn more in our cookie policy.cookies to:nnprovide our sites and apps to younnauthenticate users, apply security measures, and prevent spam and abuse, andnnmeasure your use of our sites and appsnn\u00a0 \u00a0 If you click '\", metadata={'source':\u00a0\u2026\u2026\u2026\u2026\u2026]<\/code><\/em><\/p>\n<p>Ensuite, nous g\u00e9n\u00e9rons les embeddings avec OpenAIEmbeddings et les enregistrons dans un r\u00e9f\u00e9rentiel de vecteurs Deep Lake h\u00e9berg\u00e9 dans le cloud. Id\u00e9alement, dans un environnement de production, nous pourrions charger l&#8217;int\u00e9gralit\u00e9 d&#8217;un site web ou d&#8217;un cours dans l&#8217;ensemble de donn\u00e9es de Deep Lake, afin de pouvoir r\u00e9aliser des recherches sur des milliers, voire des millions de documents.\u00a0<\/p>\n<p>En exploitant un ensemble de donn\u00e9es Deep Lake sans serveur dans le cloud, des applications situ\u00e9es \u00e0 diff\u00e9rents endroits peuvent acc\u00e9der de fa\u00e7on fluide et transparente \u00e0 un ensemble de donn\u00e9es centralis\u00e9, sans avoir \u00e0 configurer un r\u00e9f\u00e9rentiel de vecteurs sur une machine d\u00e9di\u00e9e.<\/p>\n<h4 class=\"wp-block-heading\"><strong>Pourquoi a-t-on besoin d&#8217;embeddings et de documents en morceaux ?<\/strong><\/h4>\n<p>Lors de la cr\u00e9ation de chatbots avec LangChain, les embeddings et le chunking des documents sont des techniques essentielles pour des risons d&#8217;efficacit\u00e9, de pr\u00e9cision et de performances du chatbot.<\/p>\n<p>Les <strong>embeddings<\/strong> sont des repr\u00e9sentations vectorielles de texte (mots, phrases, paragraphes ou documents) qui capturent sa s\u00e9mantique. Ils encapsulent le contexte et la signification des mots sous forme num\u00e9rique. Cela permet au chatbot de comprendre et de g\u00e9n\u00e9rer des r\u00e9ponses contextualis\u00e9es en capturant les nuances, les synonymes et les relations entre les mots.<\/p>\n<p>Les embeddings permettent \u00e9galement au chatbot d&#8217;identifier et de r\u00e9cup\u00e9rer rapidement les r\u00e9ponses ou les informations les plus pertinentes \u00e0 partir d&#8217;une base de connaissances, car ils permettent de corr\u00e9ler les demandes des utilisateurs avec les morceaux les plus proches du point de vue s\u00e9mantique, m\u00eame si la formulation est diff\u00e9rente.<\/p>\n<p>Le <strong>chunking, <\/strong>quant \u00e0 lui<strong>,<\/strong> consiste \u00e0 diviser les grands documents en \u00e9l\u00e9ments ou blocs plus petits, plus faciles \u00e0 g\u00e9rer. Plus ces morceaux sont petits, plus ils sont faciles \u00e0 traiter et \u00e0 analyser, notamment par rapport aux grands documents monolithiques. Cela permet d&#8217;acc\u00e9l\u00e9rer le temps de r\u00e9ponse du chatbot.<\/p>\n<p>Le chunking des documents est \u00e9galement important en termes de pertinence de la sortie, car lorsqu&#8217;un utilisateur pose une question, la r\u00e9ponse se trouve le plus souvent dans une partie sp\u00e9cifique du document. Le chunking permet au syst\u00e8me de localiser et de r\u00e9cup\u00e9rer uniquement les sections pertinentes et le chatbot peut ainsi donner des r\u00e9ponses plus pr\u00e9cises.<\/p>\n<p>Nous allons maintenant revenir \u00e0 notre application et mettre \u00e0 jour le code suivant en incluant votre ID d&#8217;organisation Activeloop. N&#8217;oubliez pas que, par d\u00e9faut, votre ID d&#8217;organisation correspond \u00e0 votre nom d&#8217;utilisateur.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># TODO: use your organization id here. (by default, org id is your username)\nmy_activeloop_org_id = \"didogrigorov\"\nmy_activeloop_dataset_name = \"jetbrains_article_dataset\"\ndataset_path = f\"hub:\/\/{my_activeloop_org_id}\/{my_activeloop_dataset_name}\"\ndb = DeepLake(dataset_path=dataset_path, embedding_function=embeddings)\n\n\n# add documents to our Deep Lake dataset\ndb.add_documents(docs)<\/pre>\n<p>L&#8217;une des autres fonctionnalit\u00e9s de PyCharm que j&#8217;adore est la possibilit\u00e9 d&#8217;ajouter des notes TODO (\u00e0 faire) directement dans les commentaires du code Python. Lorsque vous tapez TODO en majuscules, vos notes vont dans une section de PyCharm qui permet de toutes\u00a0les visualiser :<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># TODO: use your organization id here. (by default, org id is your username)<\/pre>\n<p>Et quand vous cliquez dessus, PyCharm vous indique directement o\u00f9 elles se trouvent dans votre code. Je trouve cela tr\u00e8s pratique pour les d\u00e9veloppeurs et je l&#8217;utilise tout le temps\u00a0:<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-503899\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/08\/image-39.png\" alt=\"Notes TODO dans les commentaires de code Python dans PyCharm\" width=\"1445\" height=\"993\" \/><\/figure>\n<p>Si vous ex\u00e9cutez le code \u00e0 ce stade, vous devez normalement obtenir le r\u00e9sultat suivant\u00a0:<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-504068\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/08\/unnamed-2.png\" alt=\"Ex\u00e9cution du code de chatbot dans PyCharm\" width=\"1377\" height=\"989\" \/><\/figure>\n<p>La m\u00e9thode similarity_search fournie par le r\u00e9f\u00e9rentiel de vecteurs de Deep Lake permet de trouver les morceaux qui correspondent le mieux \u00e0 une requ\u00eate donn\u00e9e\u00a0:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># Check the top relevant documents to a specific query\nquery = \"how to check disk usage in linux?\"\ndocs = db.similarity_search(query)\nprint(docs[0].page_content)<\/pre>\n<h3 class=\"wp-block-heading\"><strong>\u00c9tape 3\u00a0: Cr\u00e9er le prompt pour GPT-3<\/strong><\/h3>\n<p>Nous allons concevoir un template de prompt qui int\u00e8gre le prompting de r\u00f4le, les donn\u00e9es de la base de connaissance pertinentes et la demande de l&#8217;utilisateur. Ce template cr\u00e9e une persona de chatbot correspondant \u00e0 un agent d&#8217;assistance particuli\u00e8rement comp\u00e9tent. Il accepte deux variables d&#8217;entr\u00e9e\u00a0: chunks_formatted, qui contient les extraits pr\u00e9-format\u00e9s des articles, et query, qui repr\u00e9sente la question du client. L&#8217;objectif est de produire une r\u00e9ponse pr\u00e9cise bas\u00e9e uniquement sur les morceaux donn\u00e9s, afin d&#8217;\u00e9viter les informations fabriqu\u00e9es ou incorrectes.<\/p>\n<h3 class=\"wp-block-heading\"><strong>\u00c9tape 4\u00a0: Cr\u00e9er la fonctionnalit\u00e9 de chatbot<\/strong><\/h3>\n<p>Pour g\u00e9n\u00e9rer une r\u00e9ponse, nous commen\u00e7ons par extraire les morceaux (les 3 premiers par exemple) les plus similaires \u00e0 la requ\u00eate de l&#8217;utilisateur. Ces chunks sont ensuite format\u00e9s pour cr\u00e9er un prompt, qui est envoy\u00e9 au mod\u00e8le GPT-3 avec la valeur 0 comme param\u00e8tre de temp\u00e9rature.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># user question\nquery = \"How to check disk usage in linux?\"\n\n# retrieve relevant chunks\ndocs = db.similarity_search(query)\nretrieved_chunks = [doc.page_content for doc in docs]\n\n# format the prompt\nchunks_formatted = \"nn\".join(retrieved_chunks)\nprompt_formatted = prompt.format(chunks_formatted=chunks_formatted, query=query)\n\n# generate answer\nllm = OpenAI(model=\"gpt-3.5-turbo-instruct\", temperature=0)\nanswer = llm(prompt_formatted)\nprint(answer)<\/pre>\n<p>Si tout fonctionne correctement, vous devez obtenir\u00a0:<\/p>\n<p><em><code>To upload a PDF to ChatGPT, first log into the website and click the paperclip icon next to the text input field. Then, select the PDF from your local hard drive, Google Drive, or Microsoft OneDrive. Once attached, type your query or question into the prompt field and click the upload button. Give the system time to analyze the PDF and provide you with a response.<\/code><\/em><\/p>\n<h3 class=\"wp-block-heading\"><strong>\u00c9tape 5\u00a0: Cr\u00e9er un historique de conversation<\/strong><\/h3>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># Create conversational memory\nmemory = ConversationBufferMemory(memory_key=\"chat_history\", input_key=\"input\")\n\n# Define a prompt template that includes memory\ntemplate = \"\"\"You are an exceptional customer support chatbot that gently answers questions.\n\n{chat_history}\n\nYou know the following context information.\n\n{chunks_formatted}\n\nAnswer the following question from a customer. Use only information from the previous context information. Do not invent stuff.\n\nQuestion: {input}\n\nAnswer:\"\"\"\n\nprompt = PromptTemplate(\n    input_variables=[\"chat_history\", \"chunks_formatted\", \"input\"],\n    template=template,\n)\n\n# Initialize the OpenAI model\nllm = OpenAI(openai_api_key=\"YOUR API KEY\", model=\"gpt-3.5-turbo-instruct\", temperature=0)\n\n# Create the LLMChain with memory\nchain = LLMChain(\n    llm=llm,\n    prompt=prompt,\n    memory=memory\n)\n\n# User query\nquery = \"What was the 5th point about on the question how to remove spotify account?\"\n\n# Retrieve relevant chunks\ndocs = db.similarity_search(query)\nretrieved_chunks = [doc.page_content for doc in docs]\n\n# Format the chunks for the prompt\nchunks_formatted = \"nn\".join(retrieved_chunks)\n\n# Prepare the input for the chain\ninput_data = {\n    \"input\": query,\n    \"chunks_formatted\": chunks_formatted,\n    \"chat_history\": memory.buffer\n}\n\n# Simulate a conversation\nresponse = chain.predict(**input_data)\n\nprint(response)<\/pre>\n<p>Nous allons parcourir le code sous un angle plus conversationnel.<\/p>\n<p>Pour commencer, nous allons cr\u00e9er une m\u00e9moire conversationnelle en utilisant \u00ab\u00a0<code>ConversationBufferMemory<\/code>\u00a0\u00bb. Cela permet \u00e0 notre chatbot de m\u00e9moriser l&#8217;historique du chat en cours, en utilisant \u00ab\u00a0<code>input_key=\u201dinput\u201d<\/code>\u00a0\u00bb pour g\u00e9rer les entr\u00e9es des utilisateurs.<\/p>\n<p>Ensuite, nous concevons un mod\u00e8le de prompt. Ce template sert de script pour le chatbot et contient des sections pour l&#8217;historique du chat, les blocs que nous avons collect\u00e9s et la question de l&#8217;utilisateur (entr\u00e9e). Cette structure aide le chatbot \u00e0 savoir exactement de quel contexte il dispose et \u00e0 quelle question il doit r\u00e9pondre.<\/p>\n<p>Ensuite, nous passons \u00e0 l&#8217;initialisation de notre cha\u00eene de mod\u00e8le de langage, ou \u00ab\u00a0<code>LLMChain<\/code>\u00a0\u00bb. Cette op\u00e9ration est comparable \u00e0 l&#8217;assemblage de composants\u00a0: nous prenons notre mod\u00e8le de prompt, le mod\u00e8le de langage et la m\u00e9moire qui ont \u00e9t\u00e9 configur\u00e9s plus t\u00f4t, et nous les combinons dans un seul workflow.<\/p>\n<p>Lorsqu&#8217;il est temps de traiter la requ\u00eate de l&#8217;utilisateur, nous pr\u00e9parons l&#8217;entr\u00e9e. Cela implique la cr\u00e9ation d&#8217;un dictionnaire qui inclut la question de l&#8217;utilisateur (\u00ab\u00a0<code>input<\/code>\u00a0\u00bb) et les blocs d&#8217;information pertinents (\u00ab\u00a0<code>chunks_formatted<\/code>\u00a0\u00bb). Cette configuration permet de s&#8217;assurer que le chatbot dispose de toutes les informations n\u00e9cessaires pour fournir une r\u00e9ponse sur la base d&#8217;informations solides.<\/p>\n<p>Enfin, nous g\u00e9n\u00e9rons une r\u00e9ponse. Nous appelons la m\u00e9thode \u00ab\u00a0<code>chain.predict<\/code>\u00a0\u00bb et transf\u00e9rons nos donn\u00e9es d&#8217;entr\u00e9e pr\u00e9par\u00e9es. La m\u00e9thode traite cette entr\u00e9e au moyen du workflow que nous avons cr\u00e9\u00e9 et nous obtenons la r\u00e9ponse du chatbot, que nous allons ensuite afficher.<\/p>\n<p>Cette approche permet \u00e0 notre chatbot de maintenir une conversation fluide et inform\u00e9e, qui tient compte des interactions pass\u00e9es et fournit des r\u00e9ponses pertinentes en fonction du contexte.<\/p>\n<p>Une autre astuce de PyCharm qui m&#8217;a beaucoup aid\u00e9 \u00e0 construire cette fonctionnalit\u00e9 est la possibilit\u00e9 de placer mon curseur sur une m\u00e9thode, d&#8217;appuyer sur la touche \u00ab\u00a0CTRL\u00a0\u00bb et de cliquer dessus.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-544616\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/02\/put-my-cursor-over-a-method.gif\" alt=\"Placer un curseur sur une m\u00e9thode\" width=\"1200\" height=\"805\" \/><\/figure>\n<h2 class=\"wp-block-heading\"><strong>En conclusion<\/strong><\/h2>\n<p>GPT-3 excelle dans la cr\u00e9ation de chatbots conversationnels capables de r\u00e9pondre \u00e0 des questions sp\u00e9cifiques en fonction d&#8217;informations contextuelles fournies dans le prompt. Cependant, s&#8217;assurer que le mod\u00e8le g\u00e9n\u00e8re les r\u00e9ponses uniquement sur la base de ce contexte peut \u00eatre difficile, car il a souvent tendance \u00e0 \u00ab halluciner \u00bb, c&#8217;est-\u00e0-dire \u00e0 g\u00e9n\u00e9rer de nouvelles informations potentiellement fausses. L&#8217;impact de ces fausses informations varie selon les cas d&#8217;utilisation.<\/p>\n<p>En r\u00e9sum\u00e9, nous avons d\u00e9velopp\u00e9 un syst\u00e8me de r\u00e9ponse aux questions qui tient compte du contexte en utilisant LangChain, suivant le code et les strat\u00e9gies fournis. Ce processus inclut le fractionnement des documents en blocs, le calcul de leurs embeddings, l&#8217;impl\u00e9mentation d&#8217;un extracteur pour trouver des blocs similaires, la cr\u00e9ation d&#8217;un prompt pour GPT-3 et l&#8217;utilisation du mod\u00e8le GPT-3 pour la g\u00e9n\u00e9ration de texte. Cette approche met en \u00e9vidence l&#8217;int\u00e9r\u00eat de l&#8217;utilisation de GPT-3 pour cr\u00e9er des chatbots puissants et capables de prendre en compte le contexte, et montre l&#8217;importance de rester vigilant quant aux risques de g\u00e9n\u00e9ration de fausses informations.<\/p>\n<h2 id=\"author\" class=\"wp-block-heading\"><strong>\u00c0 propos de l&#8217;auteur<\/strong><\/h2>\n<div class=\"about-author \">\n<div class=\"about-author__box\">\n<div class=\"row\">\n<div class=\"about-author__box-img\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/08\/dido-grigorov.jpeg\" alt=\"Dido Grigorov\" \/><\/div>\n<div class=\"about-author__box-text\">\n<h4>Dido Grigorov<\/h4>\n<p><i><span style=\"font-weight: 400;\">Dido est un ing\u00e9nieur en Deep Learning et un programmeur Python exp\u00e9riment\u00e9, avec 17 ans d&#8217;exp\u00e9rience dans ce domaine. Il m\u00e8ne actuellement des \u00e9tudes avanc\u00e9es \u00e0 la prestigieuse universit\u00e9 de Stanford, o\u00f9 il suit notamment dans un programme d&#8217;IA b\u00e9n\u00e9ficiant du mentorat d&#8217;experts prestigieux tels qu&#8217;Andrew Ng, Christopher Manning, Fei-Fei Li et Chelsea Finn, qui fournissent \u00e0 Dido des informations pr\u00e9cieuses et un mentorat de qualit\u00e9.<\/span><\/i><\/p>\n<p><i><span style=\"font-weight: 400;\">La passion de Dido pour l&#8217;intelligence artificielle se traduit notamment par son implication dans son au travail et dans l&#8217;exp\u00e9rimentation. Au fil des ann\u00e9es, il a d\u00e9velopp\u00e9 une solide expertise dans la conception, l&#8217;impl\u00e9mentation et l&#8217;optimisation de mod\u00e8les de machine learning. Sa ma\u00eetrise de Python lui a permis de r\u00e9soudre des probl\u00e8mes complexes et de contribuer \u00e0 des solutions d&#8217;IA novatrices dans diff\u00e9rents domaines.<\/span><\/i><\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n\n    <div class=\"about-author \">\n        <div class=\"about-author__box\">\n            <div class=\"row\">\n                <div class=\"about-author__box-img\">\n                    <img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2021\/03\/evgenia-200x200.jpg\" width=\"200\" height=\"200\" alt=\"Evgenia Verbina\" loading=\"lazy\"  class=\"avatar avatar-200 wp-user-avatar wp-user-avatar-200 photo avatar-default\">\n                <\/div>\n                <div class=\"about-author__box-text\">\n                                            <h4>Evgenia Verbina<\/h4>\n                                                        <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n","protected":false},"author":813,"featured_media":572424,"comment_status":"closed","ping_status":"closed","template":"","categories":[952,1401],"tags":[6230,8556,8557],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/pycharm\/570856"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/pycharm"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/types\/pycharm"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/users\/813"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/comments?post=570856"}],"version-history":[{"count":10,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/pycharm\/570856\/revisions"}],"predecessor-version":[{"id":572451,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/pycharm\/570856\/revisions\/572451"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/media\/572424"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/media?parent=570856"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/categories?post=570856"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/tags?post=570856"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/cross-post-tag?post=570856"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}