Buckets:

HuggingFaceDocBuilder's picture
|
download
raw
11 kB
# Créons notre premier agent avec smolagents
Dans la section précédente, nous avons appris comment créer des agents à partir de zéro en utilisant du code Python, et nous avons **vu à quel point ce processus peut être fastidieux**. Heureusement, de nombreuses bibliothèques d'agents simplifient ce travail en **se chargeant de la majeure partie du travail lourd pour vous**.
Dans ce tutoriel, **vous allez créer votre tout premier agent** capable d'exécuter des actions telles que la génération d'images, la recherche sur le web, la vérification de fuseaux horaires et bien plus encore !
Vous publierez également votre agent **sur un *Space* Hugging Face afin de le partager avec vos amis et collègues**.
C'est parti !
## Qu'est-ce que smolagents ?
Pour créer cet agent, nous allons utiliser `smolagents`, une bibliothèque qui **fournit un cadre facilitant le développement d'agents**.
Cette bibliothèque légère est conçue pour être simple, tout en masquant une grande partie de la complexité liée à la construction d'un agent, permettant ainsi de vous concentrer sur la conception du comportement de l'agent.
Nous approfondirons smolagents dans la prochaine unité. En attendant, vous pouvez également consulter cet article de blog ou le dépôt GitHub de la bibliothèque.
Brièvement, `smolagents` est une bibliothèque se concentrant sur les **agents générant du code** (via la classe `CodeAgent`), un type d'agent qui exécute des **"actions"** via des blocs de code, puis **"observe"** les résultats en exécutant le code.
Voici un exemple de ce que nous allons construire !
Nous avons équipé notre agent d'un **outil de génération d'images** et lui avons demandé de générer une image d'un chat.
L'agent dans `smolagents` aura les **mêmes comportements que celui personnalisé que nous avons construit précédemment** : il va **réfléchir, agir et observer cycliquement** jusqu'à parvenir à une réponse finale :
Excitant, n'est-ce pas ?
## Construisons notre agent !
Pour commencer, dupliquez ce *Space* : https://huggingface.co/spaces/agents-course/First_agent_template
> Merci à Aymeric pour ce patron ! 🙌
Dupliquer signifie **créer une copie locale sur votre propre profil** :
Après la duplication, vous devrez ajouter votre *token* d'API Hugging Face pour que votre agent puisse accéder à l'API du modèle :
1. Tout d'abord, obtenez votre *token* Hugging Face sur [https://hf.co/settings/tokens](https://hf.co/settings/tokens) avec la permission d'inférer, si vous n'en avez pas déjà un.
2. Allez dans votre *Space* dupliqué et cliquez sur l'onglet **Settings**.
3. Descendez jusqu'à la section **Variables and Secrets** et cliquez sur **New Secret**.
4. Créez un secret avec le nom `HF_TOKEN` et collez votre token comme valeur.
5. Cliquez sur **Save** pour stocker votre *token* en toute sécurité.
Tout au long de cette leçon, le seul fichier (actuellement incomplet) que vous aurez à modifier est le **"app.py"**. Vous pouvez consulter l'[original ici](https://huggingface.co/spaces/agents-course/First_agent_template/blob/main/app.py). Pour trouver le vôtre, allez dans votre copie du *Space*, cliquez sur l'onglet `Files` puis sur `app.py` dans la liste des répertoires.
Analysons le code ensemble :
- Le fichier commence par quelques importations de bibliothèques simples mais nécessaires
```python
from smolagents import CodeAgent, DuckDuckGoSearchTool, FinalAnswerTool, InferenceClientModel, load_tool, tool
import datetime
import requests
import pytz
import yaml
```
Comme indiqué précédemment, nous utiliserons directement la classe **CodeAgent** de **smolagents**.
### Les outils
Entrons maintenant dans le vif du sujet avec les outils ! Si vous souhaitez un rappel sur les outils, n'hésitez pas à consulter la section [Outils](tools) du cours.
```python
@tool
def my_custom_tool(arg1: str, arg2: int) -> str: # il est important de spécifier le type de retour
# Conservez ce format pour la description de l'outil et des arguments, mais n'hésitez pas à modifier l'outil
"""Un outil qui ne fait encore rien
Arguments:
arg1: le premier argument
arg2: le deuxième argument
"""
return "Quelle magie allez-vous créer ?"
@tool
def get_current_time_in_timezone(timezone: str) -> str:
"""Un outil qui récupère l'heure locale actuelle dans un fuseau horaire spécifié.
Arguments:
timezone: Une chaîne représentant un fuseau horaire valide (par exemple, 'America/New_York').
"""
try:
# Créer l'objet fuseau horaire
tz = pytz.timezone(timezone)
# Obtenir l'heure actuelle dans ce fuseau horaire
local_time = datetime.datetime.now(tz).strftime("%Y-%m-%d %H:%M:%S")
return f"L'heure locale actuelle dans {timezone} est : {local_time}"
except Exception as e:
return f"Erreur lors de la récupération de l'heure pour le fuseau horaire '{timezone}' : {str(e)}"
```
Les outils sont ce que nous vous encourageons à construire dans cette section ! Nous vous donnons deux exemples :
1. Un **outil factice non fonctionnel** que vous pouvez modifier pour créer quelque chose d'utile.
2. Un **outil réellement fonctionnel** qui récupère l'heure actuelle quelque part dans le monde.
Pour définir votre outil, il est important de :
1. Fournir des types d'entrée et de sortie pour votre fonction, comme dans `get_current_time_in_timezone(timezone: str) -> str:`
2. Fournir une **docstring bien formatée**. `smolagents` s'attend à ce que tous les arguments aient une **description textuelle dans la docstring**.
### L'agent
Il utilise [`Qwen/Qwen2.5-Coder-32B-Instruct`](https://huggingface.co/Qwen/Qwen2.5-Coder-32B-Instruct) comme moteur LLM. C'est un modèle très performant auquel nous accéderons via l'API *serverless*.
```python
final_answer = FinalAnswerTool()
model = InferenceClientModel(
max_tokens=2096,
temperature=0.5,
model_id='Qwen/Qwen2.5-Coder-32B-Instruct',
custom_role_conversions=None,
)
with open("prompts.yaml", 'r') as stream:
prompt_templates = yaml.safe_load(stream)
# Nous créons notre CodeAgent
agent = CodeAgent(
model=model,
tools=[final_answer], # ajoutez vos outils ici (ne supprimez pas final_answer)
max_steps=6,
verbosity_level=1,
grammar=None,
planning_interval=None,
name=None,
description=None,
prompt_templates=prompt_templates
)
GradioUI(agent).launch()
```
Cet agent utilise toujours l'`InferenceClient` que nous avons vu dans une section précédente derrière la classe **InferenceClientModel** !
Nous fournirons des exemples plus détaillés lors de la présentation du *framework* dans l'Unité 2. Pour l'instant, vous devez vous concentrer sur **l'ajout de nouveaux outils à la liste des outils** en utilisant le paramètre `tools` de votre agent.
Par exemple, vous pourriez utiliser `DuckDuckGoSearchTool` qui a été importé dans la première ligne du code, ou vous pouvez examiner `image_generation_tool` qui est chargé depuis le Hub plus tard dans le code.
**Ajouter des outils donnera de nouvelles capacités à votre agent**, alors soyez créatif !
### Le *prompt système*
Le *prompt* système de l'agent est stocké dans un fichier `prompts.yaml` séparé. Ce fichier contient des instructions prédéfinies qui guident le comportement de l'agent.
Le stockage des *prompts* dans un fichier YAML permet une personnalisation et une réutilisation aisées pour différents agents ou cas d'utilisation.
Vous pouvez consulter la [structure des fichiers du *Space*](https://huggingface.co/spaces/agents-course/First_agent_template/tree/main) pour voir où se trouve le fichier `prompts.yaml` et comment il est organisé dans le projet.
Le fichier complet **"app.py"** :
```python
from smolagents import CodeAgent, DuckDuckGoSearchTool, InferenceClientModel, load_tool, tool
import datetime
import requests
import pytz
import yaml
from tools.final_answer import FinalAnswerTool
from Gradio_UI import GradioUI
# Voici un exemple d'un outil qui ne fait encore rien. Épatez-nous avec votre créativité !
@tool
def my_custom_tool(arg1: str, arg2: int) -> str: # il est important de spécifier le type de retour
# Conservez ce format pour la description de l'outil et des arguments, mais n'hésitez pas à modifier l'outil
"""Un outil qui ne fait encore rien
Arguments:
arg1: le premier argument
arg2: le deuxième argument
"""
return "Quelle magie allez-vous créer ?"
@tool
def get_current_time_in_timezone(timezone: str) -> str:
"""Un outil qui récupère l'heure locale actuelle dans un fuseau horaire spécifié.
Arguments:
timezone: Une chaîne représentant un fuseau horaire valide (par exemple, 'America/New_York').
"""
try:
# Créer l'objet fuseau horaire
tz = pytz.timezone(timezone)
# Obtenir l'heure actuelle dans ce fuseau horaire
local_time = datetime.datetime.now(tz).strftime("%Y-%m-%d %H:%M:%S")
return f"L'heure locale actuelle dans {timezone} est : {local_time}"
except Exception as e:
return f"Erreur lors de la récupération de l'heure pour le fuseau horaire '{timezone}' : {str(e)}"
final_answer = FinalAnswerTool()
model = InferenceClientModel(
max_tokens=2096,
temperature=0.5,
model_id='Qwen/Qwen2.5-Coder-32B-Instruct',
custom_role_conversions=None,
)
# Importer l'outil depuis le Hub
image_generation_tool = load_tool("agents-course/text-to-image", trust_remote_code=True)
with open("prompts.yaml", 'r') as stream:
prompt_templates = yaml.safe_load(stream)
agent = CodeAgent(
model=model,
tools=[final_answer], # ajoutez vos outils ici (ne supprimez pas final_answer)
max_steps=6,
verbosity_level=1,
grammar=None,
planning_interval=None,
name=None,
description=None,
prompt_templates=prompt_templates # Transmettre le prompt du système à CodeAgent
)
GradioUI(agent).launch()
```
Votre **objectif** est de vous familiariser avec le *Space* et l'agent.
Actuellement, l'agent dans le patron **n'utilise aucun outil, alors essayez de lui fournir certains des outils préfabriqués ou même de créer de nouveaux outils vous-même !**
Nous attendons avec impatience vos incroyables agents dans le canal Discord **#agents-course-showcase**!
---
Félicitations, vous avez construit votre premier Agent ! N'hésitez pas à le partager avec vos amis et collègues.
Comme c'est votre première tentative, il est tout à fait normal qu'il soit un peu bogué ou lent. Dans les unités futures, nous apprendrons à construire de meilleurs agents.
La meilleure façon d'apprendre est d'essayer, alors n'hésitez pas à le mettre à jour, à ajouter plus d'outils, à essayer avec un autre modèle, etc.
Dans la prochaine section, vous allez remplir le quiz final et obtenir votre certificat !

Xet Storage Details

Size:
11 kB
·
Xet hash:
f0da0eefff5e8f2362b1f675104c78622fc83321de733b6a30399fb2e45d34ac

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