Buckets:

HuggingFaceDocBuilder's picture
download
raw
50.5 kB
<meta charset="utf-8" /><meta name="hf:doc:metadata" content="{&quot;title&quot;:&quot;Que sont les outils ?&quot;,&quot;local&quot;:&quot;que-sont-les-outils-&quot;,&quot;sections&quot;:[{&quot;title&quot;:&quot;Que sont les outils d’IA ?&quot;,&quot;local&quot;:&quot;que-sont-les-outils-dia-&quot;,&quot;sections&quot;:[],&quot;depth&quot;:2},{&quot;title&quot;:&quot;Comment fonctionnent les outils ?&quot;,&quot;local&quot;:&quot;comment-fonctionnent-les-outils-&quot;,&quot;sections&quot;:[],&quot;depth&quot;:2},{&quot;title&quot;:&quot;Comment fournir des outils à un LLM ?&quot;,&quot;local&quot;:&quot;comment-fournir-des-outils-à-un-llm-&quot;,&quot;sections&quot;:[{&quot;title&quot;:&quot;Sections d’auto-formatage des outils&quot;,&quot;local&quot;:&quot;sections-dauto-formatage-des-outils&quot;,&quot;sections&quot;:[],&quot;depth&quot;:3},{&quot;title&quot;:&quot;Implémentation générique d’un outil&quot;,&quot;local&quot;:&quot;implémentation-générique-dun-outil&quot;,&quot;sections&quot;:[],&quot;depth&quot;:3},{&quot;title&quot;:&quot;Model Context Protocol (MCP) : une interface d’outils unifiée&quot;,&quot;local&quot;:&quot;model-context-protocol-mcp--une-interface-doutils-unifiée&quot;,&quot;sections&quot;:[],&quot;depth&quot;:3}],&quot;depth&quot;:2}],&quot;depth&quot;:1}">
<link href="/docs/agents-course/pr_673/fr/_app/immutable/assets/0.e3b0c442.css" rel="modulepreload">
<link rel="modulepreload" href="/docs/agents-course/pr_673/fr/_app/immutable/entry/start.6a3cabb6.js">
<link rel="modulepreload" href="/docs/agents-course/pr_673/fr/_app/immutable/chunks/scheduler.505acc25.js">
<link rel="modulepreload" href="/docs/agents-course/pr_673/fr/_app/immutable/chunks/singletons.f87ed60a.js">
<link rel="modulepreload" href="/docs/agents-course/pr_673/fr/_app/immutable/chunks/index.001f95d5.js">
<link rel="modulepreload" href="/docs/agents-course/pr_673/fr/_app/immutable/chunks/paths.cc8cef00.js">
<link rel="modulepreload" href="/docs/agents-course/pr_673/fr/_app/immutable/entry/app.bbc296eb.js">
<link rel="modulepreload" href="/docs/agents-course/pr_673/fr/_app/immutable/chunks/preload-helper.f888915a.js">
<link rel="modulepreload" href="/docs/agents-course/pr_673/fr/_app/immutable/chunks/index.b1175496.js">
<link rel="modulepreload" href="/docs/agents-course/pr_673/fr/_app/immutable/nodes/0.8f31a791.js">
<link rel="modulepreload" href="/docs/agents-course/pr_673/fr/_app/immutable/chunks/each.e59479a4.js">
<link rel="modulepreload" href="/docs/agents-course/pr_673/fr/_app/immutable/nodes/32.f5a19366.js">
<link rel="modulepreload" href="/docs/agents-course/pr_673/fr/_app/immutable/chunks/Heading.aedc5b40.js">
<link rel="modulepreload" href="/docs/agents-course/pr_673/fr/_app/immutable/chunks/MermaidChart.svelte_svelte_type_style_lang.11cb69c9.js">
<link rel="modulepreload" href="/docs/agents-course/pr_673/fr/_app/immutable/chunks/CodeBlock.91f006af.js"><!-- HEAD_svelte-u9bgzb_START --><meta name="hf:doc:metadata" content="{&quot;title&quot;:&quot;Que sont les outils ?&quot;,&quot;local&quot;:&quot;que-sont-les-outils-&quot;,&quot;sections&quot;:[{&quot;title&quot;:&quot;Que sont les outils d’IA ?&quot;,&quot;local&quot;:&quot;que-sont-les-outils-dia-&quot;,&quot;sections&quot;:[],&quot;depth&quot;:2},{&quot;title&quot;:&quot;Comment fonctionnent les outils ?&quot;,&quot;local&quot;:&quot;comment-fonctionnent-les-outils-&quot;,&quot;sections&quot;:[],&quot;depth&quot;:2},{&quot;title&quot;:&quot;Comment fournir des outils à un LLM ?&quot;,&quot;local&quot;:&quot;comment-fournir-des-outils-à-un-llm-&quot;,&quot;sections&quot;:[{&quot;title&quot;:&quot;Sections d’auto-formatage des outils&quot;,&quot;local&quot;:&quot;sections-dauto-formatage-des-outils&quot;,&quot;sections&quot;:[],&quot;depth&quot;:3},{&quot;title&quot;:&quot;Implémentation générique d’un outil&quot;,&quot;local&quot;:&quot;implémentation-générique-dun-outil&quot;,&quot;sections&quot;:[],&quot;depth&quot;:3},{&quot;title&quot;:&quot;Model Context Protocol (MCP) : une interface d’outils unifiée&quot;,&quot;local&quot;:&quot;model-context-protocol-mcp--une-interface-doutils-unifiée&quot;,&quot;sections&quot;:[],&quot;depth&quot;:3}],&quot;depth&quot;:2}],&quot;depth&quot;:1}"><!-- HEAD_svelte-u9bgzb_END --> <p></p> <div class="items-center shrink-0 min-w-[100px] max-sm:min-w-[50px] justify-end ml-auto flex" style="float: right; margin-left: 10px; display: inline-flex; position: relative; z-index: 10;"><div class="inline-flex rounded-md max-sm:rounded-sm"><button class="inline-flex items-center gap-1 h-7 max-sm:h-7 px-2 max-sm:px-1.5 text-sm font-medium text-gray-800 border border-r-0 rounded-l-md max-sm:rounded-l-sm border-gray-200 bg-white hover:shadow-inner dark:border-gray-850 dark:bg-gray-950 dark:text-gray-200 dark:hover:bg-gray-800" aria-live="polite"><span class="inline-flex items-center justify-center rounded-md p-0.5 max-sm:p-0 hover:text-gray-800 dark:hover:text-gray-200"><svg class="sm:size-3.5 size-3" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg></span> <span>Copy page</span></button> <button class="inline-flex items-center justify-center w-6 max-sm:w-5 h-7 max-sm:h-7 disabled:pointer-events-none text-sm text-gray-500 hover:text-gray-700 dark:hover:text-white rounded-r-md max-sm:rounded-r-sm border border-l transition border-gray-200 bg-white hover:shadow-inner dark:border-gray-850 dark:bg-gray-950 dark:text-gray-200 dark:hover:bg-gray-800" aria-haspopup="menu" aria-expanded="false" aria-label="Open copy menu"><svg class="transition-transform text-gray-400 overflow-visible sm:size-3.5 size-3 rotate-0" width="1em" height="1em" viewBox="0 0 12 7" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M1 1L6 6L11 1" stroke="currentColor"></path></svg></button></div> </div> <h1 class="relative group"><a id="que-sont-les-outils-" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#que-sont-les-outils-"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>Que sont les outils ?</span></h1> <img src="https://huggingface.co/datasets/agents-course/course-images/resolve/main/en/unit1/whiteboard-check-2.jpg" alt="Planification de l'Unité 1"> <p data-svelte-h="svelte-1g8bkuz">Un aspect crucial des agents est leur capacité à prendre des <strong>actions</strong>. Comme nous l’avons vu, cela se fait par l’utilisation d’<strong>outils</strong>.</p> <p data-svelte-h="svelte-oqbuss">Dans cette section, nous verrons ce que sont les outils, comment les concevoir efficacement, et comment les intégrer à votre agent via le message système.</p> <p data-svelte-h="svelte-1lpseza">En fournissant à votre agent les bons outils — et en décrivant clairement le fonctionnement de ces outils — vous pouvez augmenter de manière spectaculaire ce que votre IA peut accomplir. Plongeons-nous dedans !</p> <h2 class="relative group"><a id="que-sont-les-outils-dia-" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#que-sont-les-outils-dia-"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>Que sont les outils d’IA ?</span></h2> <p data-svelte-h="svelte-cvxsx9">Un <strong>outil est une fonction fournie au LLM</strong>. Cette fonction doit remplir un <strong>objectif clair</strong>.</p> <p data-svelte-h="svelte-1ldwtbu">Voici quelques outils couramment utilisés dans les agents :</p> <table data-svelte-h="svelte-1d3jabr"><thead><tr><th>Outil</th> <th>Description</th></tr></thead> <tbody><tr><td>Recherche Web</td> <td>Permet à l’agent de récupérer des informations à jour depuis Internet.</td></tr> <tr><td>Génération d’images</td> <td>Crée des images à partir de descriptions textuelles.</td></tr> <tr><td>Recherche</td> <td>Récupère des informations à partir d’une source externe.</td></tr> <tr><td>Interface API</td> <td>Interagit avec une API externe (GitHub, YouTube, Spotify, etc.).</td></tr></tbody></table> <p data-svelte-h="svelte-1578lad">Ce ne sont que des exemples, car en réalité, vous pouvez créer un outil pour n’importe quel cas d’utilisation !</p> <p data-svelte-h="svelte-zavgkk">Un bon outil doit être quelque chose qui <strong>complémente la puissance d’un LLM</strong>.</p> <p data-svelte-h="svelte-x4kr7z">Par exemple, si vous devez effectuer des opérations arithmétiques, fournir une <strong>calculatrice</strong> à votre LLM donnera de meilleurs résultats que de se fier aux capacités natives du modèle.</p> <p data-svelte-h="svelte-1avsaye">De plus, <strong>les LLM prédisent la complétion du <em>prompt</em> en se basant sur leurs données d’entraînement</strong>, ce qui signifie que leur connaissance interne n’inclut que les événements antérieurs à leur entraînement. Par conséquent, si votre agent a besoin de données à jour, vous devez les fournir via un outil.</p> <p data-svelte-h="svelte-1doz4nr">Par exemple, si vous demandez directement à un LLM (sans outil de recherche) la météo d’aujourd’hui, le LLM pourrait inventer une météo aléatoire.</p> <img src="https://huggingface.co/datasets/agents-course/course-images/resolve/main/en/unit1/weather.jpg" alt="Météo"> <ul data-svelte-h="svelte-134oyeu"><li><p>Un outil doit contenir :</p> <ul><li>Une <strong>description textuelle de ce que fait la fonction</strong>.</li> <li>Un <em>appeleur</em> (quelque chose pour effectuer une action).</li> <li>Des <em>arguments</em> avec typage.</li> <li>(Optionnel) Des sorties avec typage.</li></ul></li></ul> <h2 class="relative group"><a id="comment-fonctionnent-les-outils-" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#comment-fonctionnent-les-outils-"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>Comment fonctionnent les outils ?</span></h2> <p data-svelte-h="svelte-2xnaw2">Comme nous l’avons vu, les LLM ne peuvent recevoir que des entrées textuelles et générer des sorties textuelles. Ils ne peuvent pas appeler des outils par eux-mêmes.
Lorsque nous parlons de fournir des outils à un agent, nous entendons enseigner au LLM l’existence de ces outils et lui demander de générer des invocations textuelles en cas de besoin.</p> <p data-svelte-h="svelte-1vubwmk">Par exemple, si nous fournissons un outil pour vérifier le temps qu’il fait à un endroit donné à partir d’internet et que nous demandons ensuite au LLM le temps qu’il fait à Paris, le LLM reconnaîtra qu’il s’agit d’une occasion d’utiliser l’outil « météo ». Au lieu de récupérer les données météorologiques elles-mêmes, le LLM générera un texte pour appeller l’outil, tel que `<code>call weather_tool(&quot;Paris&quot;)</code>.</p> <p data-svelte-h="svelte-t3ocl8">L’agent lit alors cette réponse, identifie qu’un appel d’outil est nécessaire, exécute l’outil au nom du LLM et récupère les données météorologiques réelles.</p> <p data-svelte-h="svelte-10bnu1v">Les étapes de l’appel d’outil ne sont généralement pas montrées à l’utilisateur : l’agent les ajoute à un nouveau message avant de transmettre à nouveau la conversation mise à jour au LLM. Le LLM traite alors ce contexte supplémentaire et génère une réponse naturelle pour l’utilisateur. Du point de vue de l’utilisateur, il semble que le LLM interagisse directement avec l’outil, mais en réalité, c’est l’agent qui gère l’ensemble du processus d’exécution en arrière-plan.</p> <p data-svelte-h="svelte-1imfon4">Nous reviendrons plus en détail sur ce processus dans les prochaines sessions.</p> <h2 class="relative group"><a id="comment-fournir-des-outils-à-un-llm-" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#comment-fournir-des-outils-à-un-llm-"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>Comment fournir des outils à un LLM ?</span></h2> <p data-svelte-h="svelte-1diipdl">La réponse complète peut sembler complexe, mais nous utilisons essentiellement le <em>prompt</em> système pour fournir au modèle des descriptions textuelles des outils disponibles :</p> <img src="https://huggingface.co/datasets/agents-course/course-images/resolve/main/en/unit1/Agent_system_prompt.png" alt="Prompt système pour les outils"> <p data-svelte-h="svelte-1l232mj">Pour que cela fonctionne, nous devons être très précis et rigoureux concernant :</p> <ol data-svelte-h="svelte-mo4qti"><li><strong>Ce que fait l’outil</strong></li> <li><strong>Les entrées exactes qu’il attend</strong></li></ol> <p data-svelte-h="svelte-geocds">C’est la raison pour laquelle les descriptions d’outils sont généralement fournies en utilisant des structures expressives mais précises, telles que des langages informatiques ou du JSON. Il n’est pas <em>nécessaire</em> de procéder ainsi, tout format précis et cohérent fonctionnerait.</p> <p data-svelte-h="svelte-12f7933">Si cela semble trop théorique, voyons cela à travers un exemple concret.</p> <p data-svelte-h="svelte-1b444o6">Nous allons implémenter un outil simplifié <strong>calculatrice</strong> qui se contentera de multiplier deux entiers. Voici une implémentation en Python :</p> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg class="" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg> <div class="absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0"><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent; "></div> Copied</div></button></div> <pre class=""><!-- HTML_TAG_START --><span class="hljs-keyword">def</span> <span class="hljs-title function_">calculator</span>(<span class="hljs-params">a: <span class="hljs-built_in">int</span>, b: <span class="hljs-built_in">int</span></span>) -&gt; <span class="hljs-built_in">int</span>:
<span class="hljs-string">&quot;&quot;&quot;Multiplie deux entiers.&quot;&quot;&quot;</span>
<span class="hljs-keyword">return</span> a * b
<span class="hljs-built_in">print</span>(calculator.to_string())<!-- HTML_TAG_END --></pre></div> <p data-svelte-h="svelte-b5enmt">Ainsi, notre outil s’appelle <code>calculator</code>, il <strong>multiplie deux entiers</strong>, et il requiert les entrées suivantes :</p> <ul data-svelte-h="svelte-ym5xkp"><li><strong><code>a</code></strong> (<em>int</em>): Un entier.</li> <li><strong><code>b</code></strong> (<em>int</em>): Un entier.</li></ul> <p data-svelte-h="svelte-i6tzj8">La sortie de l’outil est un autre nombre entier que nous pouvons décrire ainsi :</p> <ul data-svelte-h="svelte-eem86h"><li>(<em>int</em>): Le produit de <code>a</code> et <code>b</code>.</li></ul> <p data-svelte-h="svelte-1bsj63c">Tous ces détails sont importants. Rassemblons-les dans une chaîne de texte qui décrit notre outil pour que le LLM puisse le comprendre.</p> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg class="" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg> <div class="absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0"><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent; "></div> Copied</div></button></div> <pre class=""><!-- HTML_TAG_START --><span class="hljs-type">Nom</span> de l&#x27;outil: calculator, <span class="hljs-type">Description</span>: <span class="hljs-type">Multiplie</span> deux entiers., <span class="hljs-type">Arguments</span>: a: <span class="hljs-built_in">int</span>, b: <span class="hljs-built_in">int</span>, <span class="hljs-type">Sorties</span>: <span class="hljs-built_in">int</span><!-- HTML_TAG_END --></pre></div> <blockquote data-svelte-h="svelte-xgy7yp"><p><strong>Rappel :</strong> Cette description textuelle est <em>ce que nous voulons que le LLM sache à propos de l’outil</em>.</p></blockquote> <p data-svelte-h="svelte-t0nt59">Lorsque nous passons la chaîne précédente dans l’entrée du LLM, le modèle la reconnaîtra comme un outil et saura quelles entrées fournir et ce qu’il doit attendre en sortie.</p> <p data-svelte-h="svelte-1kxkz2u">Si nous souhaitons fournir des outils supplémentaires, nous devons rester cohérents et utiliser toujours le même format. Ce processus peut être fragile, et nous pourrions accidentellement négliger certains détails.</p> <p data-svelte-h="svelte-ojbeji">Existe-t-il une meilleure méthode ?</p> <h3 class="relative group"><a id="sections-dauto-formatage-des-outils" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#sections-dauto-formatage-des-outils"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>Sections d’auto-formatage des outils</span></h3> <p data-svelte-h="svelte-f16tzr">Notre outil a été écrit en Python, et l’implémentation fournit déjà tout ce dont nous avons besoin :</p> <ul data-svelte-h="svelte-m90lk1"><li>Un nom descriptif de ce qu’il fait : <code>calculator</code></li> <li>Une description plus détaillée, fournie par le commentaire docstring de la fonction : <code>Multiplie deux entiers.</code></li> <li>Les entrées et leur type : la fonction attend clairement deux <code>int</code>.</li> <li>Le type de la sortie.</li></ul> <p data-svelte-h="svelte-1etx7od">Il y a une raison pour laquelle on utilise des langages de programmation : ils sont expressifs, concis et précis.</p> <p data-svelte-h="svelte-fvbzuf">Nous pourrions fournir le code source Python comme <em>spécification</em> de l’outil pour le LLM, mais la manière dont l’outil est implémenté n’a pas d’importance. Tout ce qui compte, c’est son nom, ce qu’il fait, les entrées qu’il attend et la sortie qu’il fournit.</p> <p data-svelte-h="svelte-dbo8tr">Nous tirerons parti des fonctionnalités d’introspection de Python pour exploiter le code source et construire automatiquement une description de l’outil. Tout ce dont nous avons besoin, c’est que l’implémentation de l’outil utilise des annotations de types, des docstrings et des noms de fonction pertinents. Nous écrirons un peu de code pour extraire les parties pertinentes du code source.</p> <p data-svelte-h="svelte-gayksv">Une fois cela fait, il nous suffira d’utiliser un décorateur Python pour indiquer que la fonction <code>calculator</code> est un outil :</p> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg class="" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg> <div class="absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0"><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent; "></div> Copied</div></button></div> <pre class=""><!-- HTML_TAG_START --><span class="hljs-meta">@tool</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">calculator</span>(<span class="hljs-params">a: <span class="hljs-built_in">int</span>, b: <span class="hljs-built_in">int</span></span>) -&gt; <span class="hljs-built_in">int</span>:
<span class="hljs-string">&quot;&quot;&quot;Multiplie deux entiers.&quot;&quot;&quot;</span>
<span class="hljs-keyword">return</span> a * b
<span class="hljs-built_in">print</span>(calculator.to_string())<!-- HTML_TAG_END --></pre></div> <p data-svelte-h="svelte-fc7lom">Notez le décorateur <code>@tool</code> avant la définition de la fonction.</p> <p data-svelte-h="svelte-15dwiii">Avec l’implémentation que nous verrons ensuite, nous serons capables d’extraire automatiquement le texte suivant à partir du code source :</p> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg class="" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg> <div class="absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0"><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent; "></div> Copied</div></button></div> <pre class=""><!-- HTML_TAG_START --><span class="hljs-type">Nom</span> de l&#x27;outil: calculator, <span class="hljs-type">Description</span>: <span class="hljs-type">Multiplie</span> deux entiers., <span class="hljs-type">Arguments</span>: a: <span class="hljs-built_in">int</span>, b: <span class="hljs-built_in">int</span>, <span class="hljs-type">Sorties</span>: <span class="hljs-built_in">int</span><!-- HTML_TAG_END --></pre></div> <p data-svelte-h="svelte-41gbqm">Comme vous pouvez le constater, c’est la même chose que nous avons écrit manuellement précédemment !</p> <h3 class="relative group"><a id="implémentation-générique-dun-outil" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#implémentation-générique-dun-outil"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>Implémentation générique d’un outil</span></h3> <p data-svelte-h="svelte-1ux3i79">Nous créons une classe générique <code>Tool</code> que nous pouvons réutiliser chaque fois que nous avons besoin d’utiliser un outil.</p> <blockquote data-svelte-h="svelte-pi7ybl"><p><strong>Avertissement :</strong> Cette implémentation à titre d’exemple est fictive mais ressemble de près aux implémentations réelles dans la plupart des bibliothèques.</p></blockquote> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg class="" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg> <div class="absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0"><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent; "></div> Copied</div></button></div> <pre class=""><!-- HTML_TAG_START --><span class="hljs-keyword">class</span> <span class="hljs-title class_">Tool</span>:
<span class="hljs-string">&quot;&quot;&quot;
Une classe représentant un morceau de code réutilisable (Outil).
Attributs:
name (str): Nom de l&#x27;outil.
description (str): Une description textuelle de ce que fait l&#x27;outil.
func (callable): La fonction que cet outil encapsule.
arguments (list): Une liste d&#x27;arguments.
outputs (str ou list): Le(s) type(s) de retour de la fonction encapsulée.
&quot;&quot;&quot;</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self,
name: <span class="hljs-built_in">str</span>,
description: <span class="hljs-built_in">str</span>,
func: <span class="hljs-built_in">callable</span>,
arguments: <span class="hljs-built_in">list</span>,
outputs: <span class="hljs-built_in">str</span></span>):
self.name = name
self.description = description
self.func = func
self.arguments = arguments
self.outputs = outputs
<span class="hljs-keyword">def</span> <span class="hljs-title function_">to_string</span>(<span class="hljs-params">self</span>) -&gt; <span class="hljs-built_in">str</span>:
<span class="hljs-string">&quot;&quot;&quot;
Retourne une représentation sous forme de chaîne de l&#x27;outil,
incluant son nom, sa description, ses arguments, et ses sorties.
&quot;&quot;&quot;</span>
args_str = <span class="hljs-string">&quot;, &quot;</span>.join([
<span class="hljs-string">f&quot;<span class="hljs-subst">{arg_name}</span>: <span class="hljs-subst">{arg_type}</span>&quot;</span> <span class="hljs-keyword">for</span> arg_name, arg_type <span class="hljs-keyword">in</span> self.arguments
])
<span class="hljs-keyword">return</span> (
<span class="hljs-string">f&quot;Tool Name: <span class="hljs-subst">{self.name}</span>,&quot;</span>
<span class="hljs-string">f&quot; Description: <span class="hljs-subst">{self.description}</span>,&quot;</span>
<span class="hljs-string">f&quot; Arguments: <span class="hljs-subst">{args_str}</span>,&quot;</span>
<span class="hljs-string">f&quot; Outputs: <span class="hljs-subst">{self.outputs}</span>&quot;</span>
)
<span class="hljs-keyword">def</span> <span class="hljs-title function_">__call__</span>(<span class="hljs-params">self, *args, **kwargs</span>):
<span class="hljs-string">&quot;&quot;&quot;
Invoque la fonction sous-jacente (callable) avec les arguments fournis.
&quot;&quot;&quot;</span>
<span class="hljs-keyword">return</span> self.func(*args, **kwargs)<!-- HTML_TAG_END --></pre></div> <p data-svelte-h="svelte-v6nit1">Cela peut sembler compliqué, mais en y allant pas à pas, nous pouvons voir ce qu’elle fait. Nous définissons une classe <strong><code>Tool</code></strong> qui inclut :</p> <ul data-svelte-h="svelte-19ugnw6"><li><strong><code>name</code></strong> (<em>str</em>): Le nom de l’outil.</li> <li><strong><code>description</code></strong> (<em>str</em>): Une brève description de ce que fait l’outil.</li> <li><strong><code>function</code></strong> (<em>callable</em>): La fonction que l’outil exécute.</li> <li><strong><code>arguments</code></strong> (<em>list</em>): Les paramètres d’entrée attendus.</li> <li><strong><code>outputs</code></strong> (<em>str</em> ou <em>list</em>): Les sorties attendues de l’outil.</li> <li><strong><code>__call__()</code></strong> : Appelle la fonction lorsque l’instance de l’outil est invoquée.</li> <li><strong><code>to_string()</code></strong> : Convertit les attributs de l’outil en une représentation textuelle.</li></ul> <p data-svelte-h="svelte-59sgl4">Nous pourrions créer un outil avec cette classe en utilisant le code suivant :</p> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg class="" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg> <div class="absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0"><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent; "></div> Copied</div></button></div> <pre class=""><!-- HTML_TAG_START -->calculator_tool = Tool(
<span class="hljs-string">&quot;calculator&quot;</span>, <span class="hljs-comment"># nom</span>
<span class="hljs-string">&quot;Multiplie deux entiers.&quot;</span>, <span class="hljs-comment"># description</span>
calculator, <span class="hljs-comment"># fonction à appeler</span>
[(<span class="hljs-string">&quot;a&quot;</span>, <span class="hljs-string">&quot;int&quot;</span>), (<span class="hljs-string">&quot;b&quot;</span>, <span class="hljs-string">&quot;int&quot;</span>)], <span class="hljs-comment"># entrées (noms et types)</span>
<span class="hljs-string">&quot;int&quot;</span>, <span class="hljs-comment"># sortie</span>
)<!-- HTML_TAG_END --></pre></div> <p data-svelte-h="svelte-1glbf26">Mais nous pouvons également utiliser le module <code>inspect</code> de Python pour récupérer toutes les informations pour nous ! C’est ce que fait le décorateur <code>@tool</code>.</p> <blockquote data-svelte-h="svelte-1xl9l5i"><p>Si cela vous intéresse, vous pouvez afficher la section suivante pour voir l’implémentation du décorateur.</p></blockquote> <details><summary data-svelte-h="svelte-14dl2fo">code du décorateur</summary> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg class="" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg> <div class="absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0"><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent; "></div> Copied</div></button></div> <pre class=""><!-- HTML_TAG_START --><span class="hljs-keyword">def</span> <span class="hljs-title function_">tool</span>(<span class="hljs-params">func</span>):
<span class="hljs-string">&quot;&quot;&quot;
Un décorateur qui crée une instance de Tool à partir de la fonction donnée.
&quot;&quot;&quot;</span>
<span class="hljs-comment"># Récupérer la signature de la fonction</span>
signature = inspect.signature(func)
<span class="hljs-comment"># Extraire les paires (nom_param, annotation_param) pour les entrées</span>
arguments = []
<span class="hljs-keyword">for</span> param <span class="hljs-keyword">in</span> signature.parameters.values():
annotation_name = (
param.annotation.__name__
<span class="hljs-keyword">if</span> <span class="hljs-built_in">hasattr</span>(param.annotation, <span class="hljs-string">&#x27;__name__&#x27;</span>)
<span class="hljs-keyword">else</span> <span class="hljs-built_in">str</span>(param.annotation)
)
arguments.append((param.name, annotation_name))
<span class="hljs-comment"># Déterminer l&#x27;annotation de retour</span>
return_annotation = signature.return_annotation
<span class="hljs-keyword">if</span> return_annotation <span class="hljs-keyword">is</span> inspect._empty:
outputs = <span class="hljs-string">&quot;Pas d&#x27;annotation de retour&quot;</span>
<span class="hljs-keyword">else</span>:
outputs = (
return_annotation.__name__
<span class="hljs-keyword">if</span> <span class="hljs-built_in">hasattr</span>(return_annotation, <span class="hljs-string">&#x27;__name__&#x27;</span>)
<span class="hljs-keyword">else</span> <span class="hljs-built_in">str</span>(return_annotation)
)
<span class="hljs-comment"># Utiliser la docstring de la fonction comme description (par défaut si vide)</span>
description = func.__doc__ <span class="hljs-keyword">or</span> <span class="hljs-string">&quot;No description provided.&quot;</span>
<span class="hljs-comment"># Le nom de la fonction devient le nom de l&#x27;outil</span>
name = func.__name__
<span class="hljs-comment"># Retourner une nouvelle instance de Tool</span>
<span class="hljs-keyword">return</span> Tool(
name=name,
description=description,
func=func,
arguments=arguments,
outputs=outputs
)<!-- HTML_TAG_END --></pre></div></details> <p data-svelte-h="svelte-1p3ayi2">Pour réitérer, avec ce décorateur en place, nous pouvons implémenter notre outil comme ceci :</p> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg class="" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg> <div class="absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0"><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent; "></div> Copied</div></button></div> <pre class=""><!-- HTML_TAG_START --><span class="hljs-meta">@tool</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">calculator</span>(<span class="hljs-params">a: <span class="hljs-built_in">int</span>, b: <span class="hljs-built_in">int</span></span>) -&gt; <span class="hljs-built_in">int</span>:
<span class="hljs-string">&quot;&quot;&quot;Multiplie deux entiers.&quot;&quot;&quot;</span>
<span class="hljs-keyword">return</span> a * b
<span class="hljs-built_in">print</span>(calculator.to_string())<!-- HTML_TAG_END --></pre></div> <p data-svelte-h="svelte-bs59s">Et nous pouvons utiliser la méthode <code>to_string</code> de <code>Tool</code> pour récupérer automatiquement un texte adapté à être utilisé comme description d’un outil pour un LLM :</p> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg class="" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg> <div class="absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0"><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent; "></div> Copied</div></button></div> <pre class=""><!-- HTML_TAG_START --><span class="hljs-type">Nom</span> de l&#x27;outil: calculator, <span class="hljs-type">Description</span>: <span class="hljs-type">Multiplie</span> deux entiers., <span class="hljs-type">Arguments</span>: a: <span class="hljs-built_in">int</span>, b: <span class="hljs-built_in">int</span>, <span class="hljs-type">Sorties</span>: <span class="hljs-built_in">int</span><!-- HTML_TAG_END --></pre></div> <p data-svelte-h="svelte-4itkv6">La description est <strong>injectée</strong> dans le <em>prompt</em> système. En reprenant l’exemple avec lequel nous avons commencé cette section, voici à quoi cela ressemblerait après avoir remplacé le <code>tools_description</code> :</p> <img src="https://huggingface.co/datasets/agents-course/course-images/resolve/main/en/unit1/Agent_system_prompt_tools.png" alt="Prompt système pour les outils"> <p data-svelte-h="svelte-g2c2f3">Dans la section sur les <a href="actions">actions</a>, nous en apprendrons davantage sur la façon dont un agent peut <strong>appeler</strong> cet outil que nous venons de créer.</p> <hr> <p data-svelte-h="svelte-1cut2me">Les outils jouent un rôle crucial dans l’amélioration des capacités des agents.</p> <h3 class="relative group"><a id="model-context-protocol-mcp--une-interface-doutils-unifiée" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#model-context-protocol-mcp--une-interface-doutils-unifiée"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>Model Context Protocol (MCP) : une interface d’outils unifiée</span></h3> <p data-svelte-h="svelte-jag5v6"><em>Model Context Protocol</em> (MCP) est un <strong>protocole ouvert</strong> qui standardise la manière dont les applications <strong>fournissent des outils aux LLM</strong>.
MCP offre :</p> <ul data-svelte-h="svelte-cvddem"><li>Une liste croissante d’intégrations pré-construites que votre LLM peut directement utiliser</li> <li>La flexibilité de changer entre fournisseurs et vendeurs de LLM</li> <li>Les meilleures pratiques pour sécuriser vos données dans votre infrastructure</li></ul> <p data-svelte-h="svelte-1qj01zj">Cela signifie que <strong>tout <em>framework</em> intégrant MCP peut utiliser les outils définis dans le protocole</strong>, éliminant le besoin de réimplémenter la même interface d’outils pour chaque <em>framework</em>.</p> <p data-svelte-h="svelte-183ro16">Si vous voulez approfondir MCP, vous pouvez consulter notre <a href="https://huggingface.co/learn/mcp-course/" rel="nofollow">cours gratuit sur MCP</a>.</p> <hr> <p data-svelte-h="svelte-1cut2me">Les outils jouent un rôle crucial dans l’amélioration des capacités des agents.</p> <p data-svelte-h="svelte-13rq5ja">Pour résumer, nous avons appris :</p> <ul data-svelte-h="svelte-1i82t9i"><li><p><em>Ce que sont les outils</em> : des fonctions qui offrent des capacités supplémentaires aux LLM, comme effectuer des calculs ou accéder à des données externes.</p></li> <li><p><em>Comment définir un outil</em> : en fournissant une description textuelle claire, des entrées, des sorties, et une fonction exécutable.</p></li> <li><p><em>Pourquoi les outils sont essentiels</em> : ils permettent aux agents de surmonter les limites de l’entraînement statique des modèles, de gérer des tâches en temps réel, et d’effectuer des actions spécialisées.</p></li></ul> <p data-svelte-h="svelte-k59nnb">Maintenant, nous pouvons passer au <a href="agent-steps-and-structure"><em>workflow</em> de l’agent</a> où vous verrez comment un agent observe, réfléchit et agit. Cela <strong>rassemble tout ce que nous avons vu jusqu’à présent</strong> et prépare le terrain pour créer votre propre agent entièrement fonctionnel.</p> <p data-svelte-h="svelte-gu9wbg">Mais d’abord, il est temps pour un autre court quiz !</p> <a class="!text-gray-400 !no-underline text-sm flex items-center not-prose mt-4" href="https://github.com/huggingface/agents-course/blob/main/units/fr/unit1/tools.mdx" target="_blank"><svg class="mr-1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M31,16l-7,7l-1.41-1.41L28.17,16l-5.58-5.59L24,9l7,7z"></path><path d="M1,16l7-7l1.41,1.41L3.83,16l5.58,5.59L8,23l-7-7z"></path><path d="M12.419,25.484L17.639,6.552l1.932,0.518L14.351,26.002z"></path></svg> <span data-svelte-h="svelte-zjs2n5"><span class="underline">Update</span> on GitHub</span></a> <p></p>
<script>
{
__sveltekit_1b31nyx = {
assets: "/docs/agents-course/pr_673/fr",
base: "/docs/agents-course/pr_673/fr",
env: {}
};
const element = document.currentScript.parentElement;
const data = [null,null];
Promise.all([
import("/docs/agents-course/pr_673/fr/_app/immutable/entry/start.6a3cabb6.js"),
import("/docs/agents-course/pr_673/fr/_app/immutable/entry/app.bbc296eb.js")
]).then(([kit, app]) => {
kit.start(app, element, {
node_ids: [0, 32],
data,
form: null,
error: null
});
});
}
</script>

Xet Storage Details

Size:
50.5 kB
·
Xet hash:
7f229aa38e9fd31e2460f58dcca16d0fcec4eb5ad6cec297d7119ca598f9e735

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.