FitBot — Un agent de chatbot de remise en forme
FitBot - A fitness chatbot agent
Comment créer un agent de chatbot exploité par l’appel de fonction d’OpenAI
Introduction
À une époque où la conscience de la santé est au premier plan et la recherche d’un mode de vie équilibré est devenue une aspiration universelle, la nutrition se présente indéniablement comme un pilier central.
Cependant, la nature complexe des régimes alimentaires et la richesse écrasante des données nutritionnelles constituent souvent des obstacles sur notre chemin vers l’atteinte de cet équilibre. Un exemple courant d’une telle situation est rencontré par les personnes atteintes de diabète, qui ont besoin d’une orientation nutritionnelle cohérente et précise pour gérer efficacement leur taux de sucre dans le sang. Ne serait-il pas transformateur d’avoir accès à un assistant nutritionnel personnalisé à notre disposition numérique ?
Dans ce contexte, l’exploitation de la technologie pour aider à l’orientation nutritionnelle devient non seulement bénéfique mais essentielle. En intégrant l’intelligence artificielle de pointe (IA) à une base de données nutritionnelles complète, il est possible de créer un outil puissant qui peut aider les individus dans leur parcours de santé.
**Le code de ce projet se trouve dans ce dépôt GitHub : lien**
- LLMs en IA conversationnelle Construction de chatbots et d’assistants plus intelligents
- Franchir les barrières dans l’adaptation de domaine sans source l’impact de NOTELA sur les domaines de la bioacoustique et de la vision
- Surfer SEO Critique Le meilleur outil SEO IA ? (Juillet 2023)
Aperçu du projet
Le cœur du projet consiste à construire un chatbot, nommé FitBot, qui est alimenté par les fonctions d’OpenAI et qui est basé sur le cadre ReAct (Raisonnement et Action) (Figure 1).
Il est conçu pour fournir des informations nutritionnelles et des conseils en interprétant les habitudes alimentaires de l’utilisateur et en intégrant une API de données nutritionnelles.
Approche technique
En exploitant le cadre ReAct, FitBot conserve la nature interactive d’une conversation et peut fournir une explication détaillée pour chaque conseil donné. Il se connecte également à une base de données nutritionnelles externe, garantissant des conseils alimentaires précis et à jour.

Derrière les coulisses avec FitBot
FitBot combine les capacités de GPT-4 d’OpenAI avec le traitement dynamique de ReAct pour comprendre les requêtes alimentaires, suggérer des alternatives appropriées et fournir des conseils personnalisés. Il le fait tout en maintenant un ton conversationnel, rendant les conseils nutritionnels accessibles et engageants.
Ce qui distingue FitBot, c’est sa capacité à interagir avec une base de données nutritionnelles externe. Cela permet à FitBot de fournir des informations précises et à jour aux utilisateurs, garantissant que les conseils donnés sont fiables et basés sur des données précises.
Dans les sections à venir, nous plongerons dans le code et verrons comment les composants de FitBot sont développés et interagissent les uns avec les autres, offrant un aperçu complet du fonctionnement interne de ce projet innovant.
Construction de FitBot : Explication du code
Ce projet comprend quatre scripts principaux utilisés pour traiter les données et les afficher dans une interface utilisateur :
- fitness_agent.py : Ce fichier contient la classe
FitnessAgent
, qui exploite les fonctions d’OpenAI pour permettre les fonctionnalités requises par FitBot. - chatbot.py : Ce fichier contient le code de l’interface utilisateur de FitBot, qui est implémentée à l’aide de la bibliothèque Gradio.
- agents.py : Ce fichier contient la classe
Agent
, qui est utilisée pour gérer les conversations avec l’API d’OpenAI. Ce code est basé sur ce script développé par James Briggs dans la bibliothèque funkagent. - parser.py : Ce fichier contient le code pour analyser les docstrings des fonctions en descriptions de fonctions d’OpenAI.
Définition de nos fonctions
Pour créer un chatbot capable de fournir des conseils nutritionnels et de remise en forme précis et utiles, nous devions prendre en compte les informations les plus précieuses pour l’utilisateur final. C’est la raison derrière la mise en œuvre des fonctions expliquées précédemment.
1. get_nutritional_info
: Cette fonction est cruciale pour tout chatbot axé sur la remise en forme. Les gens manquent souvent d’informations claires sur la teneur nutritionnelle des aliments qu’ils mangent. En utilisant le point de terminaison Nutrition d’API Ninjas pour obtenir des données nutritionnelles en temps réel pour différents aliments, nous pouvons aider les utilisateurs à prendre des décisions alimentaires éclairées. Les données renvoyées peuvent inclure des détails tels que les calories, les protéines, les glucides, les matières grasses, et plus encore, offrant un aperçu complet du profil nutritionnel d’un aliment.
def get_nutritional_info(self, query: str) -> dict:
"""Récupère les informations nutritionnelles pour un aliment spécifique
:param query: L'aliment pour lequel obtenir les informations nutritionnelles
:return: Les informations nutritionnelles de l'aliment
"""
api_url = 'https://api.api-ninjas.com/v1/nutrition?query={}'.format(query)
response = requests.get(api_url, headers={'X-Api-Key': self.nut_api_key})
if response.status_code == requests.codes.ok:
return response.json() # Utilise json au lieu de text pour des données plus structurées
else:
return {"Erreur": response.status_code, "Message": response.text}
2. calculate_bmr
: Le taux métabolique de base (BMR) est une valeur clé pour comprendre le métabolisme d’une personne. Il s’agit de la quantité d’énergie dépensée au repos et est étroitement liée à l’âge, au poids, à la taille et au sexe. La capacité à calculer le BMR donne au chatbot une référence pour aider les utilisateurs à comprendre combien de calories leur corps a besoin pour fonctionner, même sans activité physique.
def calculate_bmr(weight: float, height: float, age: int, gender: str, equation: str = 'mifflin_st_jeor') -> float:
"""Calcule le taux métabolique de base (BMR) pour une personne
:param weight: Le poids de la personne en kg
:param height: La taille de la personne en cm
:param age: L'âge de la personne en années
:param gender: Le sexe de la personne ('homme' ou 'femme')
:param equation: L'équation à utiliser pour le calcul du BMR ('harris_benedict' ou 'mifflin_st_jeor')
:return: Le BMR de la personne
"""
if equation.lower() == 'mifflin_st_jeor':
if gender.lower() == 'homme':
return (10 * weight) + (6.25 * height) - (5 * age) + 5
else: # 'femme'
return (10 * weight) + (6.25 * height) - (5 * age) - 161
else: # 'harris_benedict'
if gender.lower() == 'homme':
return 88.362 + (13.397 * weight) + (4.799 * height) - (5.677 * age)
else: # 'femme'
return 447.593 + (9.247 * weight) + (3.098 * height) - (4.330 * age)
3. calculate_tdee
: Comprendre la Dépense Énergétique Totale Journalière (TDEE) est essentiel pour créer un régime alimentaire ou un plan d’exercice personnalisé. Le TDEE tient compte non seulement du BMR mais également des calories brûlées lors des activités quotidiennes et de l’exercice. Connaître son TDEE peut aider les utilisateurs à planifier plus efficacement leur régime alimentaire et leurs routines d’exercice, que ce soit pour maintenir, perdre ou prendre du poids.
def calculate_tdee(bmr: float, activity_level: str) -> float:
"""Calcule la Dépense Énergétique Totale Journalière (TDEE) pour une personne
:param bmr: Le BMR de la personne
:param activity_level: Le niveau d'activité de la personne ('sédentaire', 'légèrement_actif', 'modérément_actif', 'très_actif', 'super_actif')
:return: Le TDEE de la personne
"""
activity_factors = {
'sédentaire': 1.2,
'légèrement_actif': 1.375,
'modérément_actif': 1.55,
'très_actif': 1.725,
'super_actif': 1.9,
}
return bmr * activity_factors.get(activity_level, 1)
4. calculate_ibw
: Connaître le Poids Corporel Idéal (IBW) peut donner aux utilisateurs un objectif de poids considéré comme sain pour leur taille et leur sexe. Bien que l’IBW ne soit pas une mesure parfaite (elle ne tient pas compte de facteurs tels que la masse musculaire), elle donne aux utilisateurs une idée générale de leur poids optimal pour une santé optimale.
def calculate_ibw(height: float, gender: str) -> float:
"""Calcule le Poids Corporel Idéal (IBW)
:param height: La taille de la personne en pouces
:param gender: Le sexe de la personne ("homme" ou "femme")
:return: Le Poids Corporel Idéal en kg
"""
if gender.lower() == 'homme':
if height <= 60: # 5 pieds = 60 pouces
return 50
else:
return 50 + 2.3 * (height - 60)
elif gender.lower() == 'femme':
if height <= 60:
return 45.5
else:
return 45.5 + 2.3 * (height - 60)
else:
raise ValueError("Genre invalide. Attendu : 'homme' ou 'femme'.")
4. calculate_bmi
: L’indice de masse corporelle (IMC) est un calcul simple utilisant la taille et le poids d’une personne. La formule est IMC = kg/m^2 où kg est le poids d’une personne en kilogrammes et m^2 est sa taille en mètres carrés. L’IMC ne mesure pas directement la graisse corporelle, mais des recherches ont montré que l’IMC est modérément corrélé avec des mesures plus directes de la graisse corporelle. Il fournit une indication utile pour comprendre si une personne est en sous-poids, à un poids sain, en surpoids ou obèse.
def calculate_bmi(poids: float, taille: float) -> float: """Calcule l'indice de masse corporelle (IMC) pour une personne :param poids: Le poids de la personne en kg :param taille: La taille de la personne en cm :return: L'IMC de la personne """ taille_metres = taille / 100 # convertir cm en mètres imc = poids / (taille_metres ** 2) return round(imc, 2) # arrondir à 2 décimales pour plus de lisibilité
Construction de l’Agent : Encapsulation des fonctions
Avec les fonctions essentielles établies, notre prochaine étape consiste à les intégrer dans notre agent de chatbot. Cette encapsulation permet au bot de tirer parti des fonctions et de fournir des réponses pertinentes et précises en fonction des requêtes de l’utilisateur.
Voici comment vous pouvez créer l’agent :
# Instancier l'agentfitness_agent = AgentFitness(clé_api_openai, clé_api_nut)
Vous pouvez vérifier les fonctions avec lesquelles il est enrichi :
# Vous pouvez afficher les instructions de fonction traitéesprint(agent_fitness.fonctions)
Sortie :
[ { "nom":"get_nutritional_info", "description":"Récupère les informations nutritionnelles pour un aliment spécifique", "paramètres":{ "type":"objet", "propriétés":{ "query":{ "description":"L'aliment pour lequel obtenir les informations nutritionnelles", "type":"chaîne" } } }, "requis":[ "query" ] }, { "nom":"calculate_bmr", "description":"Calcule le taux métabolique de base (BMR) pour une personne", "paramètres":{ "type":"objet", "propriétés":{ "weight":{ "description":"Le poids de la personne en kg", "type":"nombre" }, "height":{ "description":"La taille de la personne en cm", "type":"nombre" }, "age":{ "description":"L'âge de la personne en années", "type":"entier" }, "gender":{ "description":"Le sexe de la personne ('homme' ou 'femme')", "type":"chaîne" }, "equation":{ "description":"L'équation à utiliser pour le calcul du BMR ('harris_benedict' ou 'mifflin_st_jeor')", "type":"chaîne" } } }, "requis":[ "weight", "height", "age", "gender", "equation" ] }, { "nom":"calculate_tdee", "description":"Calcule la dépense énergétique quotidienne totale (TDEE) pour une personne", "paramètres":{ "type":"objet", "propriétés":{ "bmr":{ "description":"Le BMR de la personne", "type":"nombre" }, "activity_level":{ "description":"Le niveau d'activité de la personne", "type":"chaîne" } } }, "requis":[ "bmr", "activity_level" ] }]
Interaction avec l’Agent : Conversations avec l’Utilisateur
Après avoir encapsulé nos fonctions définies dans l’AgentFitness, nous pouvons maintenant simuler une conversation avec notre bot. En utilisant la méthode ask()
de la classe AgentFitness, nous pouvons facilement fournir des requêtes d’utilisateur à notre bot et afficher les réponses qu’il génère.
Par exemple, demandons au bot des informations nutritionnelles sur un aliment courant :
# Définir une questionuser_input = "Quelle est la valeur nutritionnelle d'une banane ?"# Obtenir la réponse brute du chatresponse = agent_fitness.ask(user_input)# Afficher la réponse finaletprint(response['choices'][0]['message']['content'])
Sortie :
Une portion de 100 grammes de banane contient généralement :- Calories : 89,4- Lipides totaux : 0,3 grammes, dont les lipides saturés sont de 0,1 gramme- Protéines : 1,1 gramme- Sodium : 1 milligramme- Potassium : 22 milligrammes- Cholestérol : 0 milligramme- Glucides totaux : 23,2 grammes, dont les fibres alimentaires sont de 2,6 grammes et les sucres sont de 12,3 grammesCes valeurs peuvent varier en fonction de la taille exacte et de la maturité de la banane. Notez également que les bananes sont une bonne source de potassium alimentaire et de vitamine C.
Dans cet exemple, FitBot utilise efficacement la fonction get_nutritional_info()
pour récupérer et afficher la valeur nutritionnelle d’une banane.
Le FitBot peut également gérer des demandes plus complexes. Par exemple, il peut calculer la Dépense Energétique Totale Quotidienne (TDEE) d’une personne si les données requises sont fournies :
# Définir une questionuser_input = "Quelle est la TDEE d'un homme de 30 ans, mesurant 180 cm, pesant 80 kg et faisant de l'exercice 3 fois par semaine ?"# Obtenir une réponse de chat bruteresponse = fitness_agent.ask(user_input)# Afficher la réponse finaleprint(response['choices'][0]['message']['content'])
Résultat :
La Dépense Energétique Totale Quotidienne (TDEE) d'un homme de 30 ans mesurant 180 cm, pesant 80 kg et faisant de l'exercice 3 fois par semaine avec un exercice "modéré" selon l'équation de Harris-Benedict serait d'environ 2574 calories par jour. Il s'agit d'une estimation approximative et les résultats individuels peuvent varier en fonction de plusieurs facteurs tels que la vitesse du métabolisme, l'activité physique spécifique, etc. Voici une description simple du processus :1. Calcul du Métabolisme de Base (BMR) - Il s'agit du nombre de calories qu'une personne brûlerait simplement en existant, sans aucune activité. Pour les hommes, l'équation de Harris-Benedict pour calculer le BMR est BMR = 88,362 + (13,397 * poids en kg) + (4,799 * taille en cm) - (5,677 * âge en années)Pour les valeurs données, le BMR est d'environ 1783 calories.2. Ajustement pour l'Activité - Le BMR peut ainsi être ajusté en fonction du niveau d'activité physique à l'aide des multiplicateurs suivants :- Sédentaire (peu ou pas d'exercice) : BMR * 1,2- Légèrement actif (exercice léger/sport 1-3 jours/semaine) : BMR * 1,375- Modérément actif (exercice modéré/sport 3-5 jours/semaine) : BMR * 1,55- Très actif (exercice intense/sport 6-7 jours par semaine) : BMR * 1,725- Super actif (exercice très intense/travail physique & exercice 2 fois par jour) : BMR * 1,9Pour quelqu'un qui fait de l'exercice 3 fois par semaine, nous pouvons prendre le multiplicateur à 1,55 (modérément actif). Ainsi, TDEE = BMR * Multiplicateur d'Activité = 1783 * 1,55 = environ 2764 calories.Remarque : Les besoins caloriques totaux réels peuvent être légèrement supérieurs ou inférieurs car ce calcul ne tient pas compte du rapport muscle/graisse, des types d'activités spécifiques, etc.
Comparons maintenant cette sortie avec le ChatGPT basé sur GPT-4 standard :
TDEE, ou Dépense Energétique Totale Quotidienne, représente le nombre total de calories qu'une personne doit consommer en une journée pour maintenir son poids actuel, en tenant compte de son niveau d'activité physique.Nous devons d'abord calculer le Métabolisme de Base (BMR), qui est la quantité d'énergie dépensée au repos. Il existe plusieurs équations pour calculer le BMR, l'une des plus couramment utilisées étant l'équation de Mifflin-St. Jeor :Pour les hommes : BMR = 10 * poids (kg) + 6,25 * taille (cm) - 5 * âge (ans) + 5Ainsi, pour votre cas :BMR = 10 * 80 kg + 6,25 * 180 cm - 5 * 30 ans + 5BMR = 800 + 1125 - 150 + 5 = 1780 kcal/jourIl s'agit du nombre de calories nécessaires pour maintenir le fonctionnement du corps au repos.Pour inclure l'activité physique dans l'équation, nous multiplions le BMR par le Niveau d'Activité Physique (PAL). Pour quelqu'un qui fait de l'exercice 3 fois par semaine, un PAL courant est de 1,375 (exercice modéré).Ainsi, TDEE = BMR * PALTDEE = 1780 kcal/jour * 1,375 = 2447,5 kcal/jourAinsi, un homme de 30 ans mesurant 180 cm, pesant 80 kg et faisant de l'exercice 3 fois par semaine aurait besoin d'environ 2448 calories par jour pour maintenir son poids actuel. Veuillez noter qu'il s'agit simplement d'une estimation ; les besoins caloriques réels peuvent varier en fonction de nombreux facteurs, notamment la génétique et la composition corporelle. Consultez toujours un professionnel de la santé ou un diététicien agréé pour des conseils personnalisés.
Intégration du Chatbot avec une Interface Utilisateur
Maintenant que nous avons construit notre agent de fitness et l’avons équipé de fonctionnalités utiles, nous souhaitons le présenter dans une interface facile à utiliser.
Pour cela, nous utilisons Gradio, une bibliothèque Python qui nous permet de créer rapidement et facilement des interfaces utilisateur basées sur le web. Dans cette section, nous vous guiderons dans l’intégration de notre chatbot avec une interface utilisateur Gradio.
Voici la structure globale de notre interface :
def main(): openai_api_key = gr.components.Textbox( lines=1, label="Entrez la clé API OpenAI", type="password", ) nut_api_key = gr.components.Textbox( lines=1, label="Entrez la clé API Nutrition", type="password", ) question = gr.components.Textbox( lines=3, label="Entrez votre message", ) output_history = gr.outputs.HTML( label="Conversation mise à jour", ) inputs = [ openai_api_key, nut_api_key, question, ] iface = gr.Interface( fn=partial(get_response), inputs=inputs, outputs=[output_history], title="Agent de Fitness", description="Un chatbot simple utilisant un Agent de Fitness et Gradio avec un historique de conversation", allow_flagging=False, ) iface.launch()if __name__ == "__main__": main()
C’est notre fonction main
, le point d’entrée de notre script. Nous commençons par créer des zones de texte pour que l’utilisateur saisisse sa clé API OpenAI et sa clé API Nutrition. Les clés sont définies comme de type password
pour masquer la saisie. Ensuite, nous fournissons une zone de texte pour que l’utilisateur pose sa question. La réponse du bot sera affichée en HTML dans une zone étiquetée “Conversation mise à jour”.
Les entrées et sorties sont ensuite transmis à l’interface Gradio, qui est lancée lorsque le script est exécuté.
La fonction get_response
interagit avec l’agent de fitness :
def get_response(openai_api_key, nut_api_key, user_input, action=None): set_openai_api_key(openai_api_key) set_nut_api_key(nut_api_key) fitness_agent = FitnessAgent(openai_api_key, nut_api_key) # Obtenir la réponse brute du chat fitness_agent.ask(user_input) memory = fitness_agent.agent.chat_history # Parcourir les messages de ChatMessageHistory et formater la sortie updated_conversation = '<div style="background-color: hsl(30, 100%, 30%); color: white; padding: 5px; margin-bottom: 10px; text-align: center; font-size: 1.5em;">Historique du chat</div>' logger.info(memory) for i, message in enumerate(memory): if i != 0: if message['role'] == 'user': prefix = "Utilisateur : " background_color = "hsl(0, 0%, 40%)" # Fond gris foncé text_color = "hsl(0, 0%, 100%)" # Texte blanc else: prefix = "Chatbot : " background_color = "hsl(0, 0%, 95%)" # Fond blanc text_color = "hsl(0, 0%, 0%)" # Texte noir updated_conversation += f'<div style="color: {text_color}; background-color: {background_color}; margin: 5px; padding: 5px;">{prefix}{message["content"]}</div>' return updated_conversation
Dans get_response
, nous définissons les clés OpenAI et Nutrition API à l’aide des fonctions set_openai_api_key
et set_nut_api_key
, puis nous initialisons notre agent de fitness. Nous appelons ensuite la méthode ask
de l’agent avec la question de l’utilisateur et stockons l’historique de la conversation. Chaque message de l’historique de la conversation est ensuite formaté sous forme de chaîne HTML et ajouté à updated_conversation
. Cette chaîne HTML est renvoyée et affichée dans l’interface Gradio.
Un aperçu de l’interface résultante
Après avoir intégré les calculs essentiels et la logique de conversation, et encapsulé tout cela dans une interface utilisateur visuellement agréable avec Gradio, notre FitBot est prêt à interagir !
Voici à quoi ressemble l’interface finale :

Sur l’interface, vous remarquerez trois champs de saisie où vous pouvez entrer les clés nécessaires pour OpenAI et l’endpoint Nutrition des API Ninjas, ainsi que le message de l’utilisateur à destination de l’Agent Fitness.
Résumé
Cet article détaille la création de FitBot, un Agent Fitness complet utilisant le modèle d’IA puissant GPT-4 d’OpenAI, capable de comprendre et de répondre à des requêtes complexes de l’utilisateur.
Nous avons commencé par construire des fonctions pour calculer des mesures de santé clés telles que le taux métabolique de base (BMR), les dépenses énergétiques quotidiennes totales (TDEE) et l’indice de masse corporelle (IMC). Ces calculs constituent la base de la capacité de l’Agent Fitness à fournir des conseils précis et adaptés en matière de fitness et de nutrition.
Ensuite, nous avons intégré une API Nutrition des API Ninjas. Cela permet à l’Agent Fitness d’accéder et de fournir des informations nutritionnelles précises, un élément crucial pour tout plan de fitness et de régime complet.
Nous avons ensuite présenté comment construire une logique de conversation pour rendre l’Agent Fitness plus interactif. Il est capable de gérer un flux conversationnel, ce qui lui permet de répondre à des requêtes variées de l’utilisateur et de guider efficacement les utilisateurs dans leur parcours de remise en forme.
Enfin, nous avons encapsulé toutes ces fonctionnalités dans une interface utilisateur visuellement attrayante utilisant Gradio. Le résultat est un Agent Fitness qui est non seulement intelligent, mais aussi convivial, offrant des conseils clairs et complets dans un format facilement compréhensible.
TL;DR: Dans cet article, nous avons construit FitBot, un Agent Fitness utilisant le modèle GPT-4 d’OpenAI, capable de fournir des conseils personnalisés en matière de fitness et de nutrition. Nous avons implémenté des fonctions de calcul de mesures de santé clés (BMR, TDEE, IMC), intégré une API Nutrition pour des informations diététiques précises, et le tout dans une interface conviviale utilisant Gradio. Ce projet met en évidence la puissance de l’IA dans le domaine de la santé et du fitness, en simplifiant les calculs complexes, en offrant des conseils personnalisés et en les proposant dans une interface utilisateur attrayante.
Merci de votre lecture !
- Suivez-moi sur Linkedin !
We will continue to update IPGirl; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles
- Doug Fuller, vice-président de l’ingénierie logicielle chez Cornelis Networks – Série d’interviews
- Un expert en neurosciences réclame un Neuroshield.
- Comment expliquerais-tu l’apprentissage automatique à un enfant de 9 ans?
- La société de gestion de BTS, HYBE, se tourne vers l’intelligence artificielle pour sortir des morceaux dans plusieurs langues.
- 3 Différences Pratiques Entre astype() et to_datetime() dans Pandas
- Des chercheurs de KAIST présentent FaceCLIPNeRF un pipeline de manipulation textuelle d’un visage en 3D utilisant NeRF déformable.
- Naviguer dans le dédale de l’adoption de l’IA