ChatGPT The Helper !
ChatGPT The Helper !

ChatGPT The Helper !

Published
June 6, 2024

Automatisation de l’Aide sur le Serveur Discord d'iMot3k : Une Révolution Grâce à ChatGPT

Bienvenue chers lecteurs ! Aujourd'hui, je vous emmène dans les coulisses d'une transformation numérique que j'ai mise en place sur notre serveur communautaire Discord. En tant qu'Administrateur Système / DevOps et passionné de technologie, j'étais déterminé à améliorer l'expérience utilisateur sur le serveur d'iMot3k, un YouTuber tech qui rassemble des milliers de passionnés. Ce projet m'a conduit à exploiter la puissance de l'intelligence artificielle au service de la communauté. Installez-vous confortablement, car je vous raconte ce voyage fascinant de l'idéation à la réalisation.

Les Défis de la Modération d’un Serveur Discord

Avant de plonger dans les détails techniques, il est essentiel de comprendre les défis que je devais affronter. En tant que modérateur et membre actif du serveur comptant plus de 4000 membres, je faisais face à un problème commun à de nombreuses communautés en ligne : un afflux incessant de questions récurrentes et souvent basiques. Ces "questions Google", des interrogations simples pouvant être résolues par une recherche rapide sur internet, encombraient le salon d’aide et consommaient énormément de temps.
Combien de fois ai-je répondu à la question : "Pourquoi mon ordinateur est lent ?" Spoiler : Souvent, la solution est de fermer ces 50 onglets Chrome…
Malheureusement, cette situation créait une frustration générale. Les novices en technologie attendaient des réponses et les membres expérimentés se lassaient de répéter les mêmes explications. Il était crucial de trouver une solution pour libérer du temps et permettre à chacun de se concentrer sur des discussions plus engageantes et complexes.

La Solution : Intégration de ChatGPT

La réponse à ce problème est venue sous la forme de ChatGPT, un modèle de langage développé par OpenAI. Avec ses capacités impressionnantes de compréhension et de génération de texte, il était l'outil parfait pour automatiser l'assistance et répondre de manière pertinente aux questions fréquemment posées. Voici comment l'idée s'est transformée en un projet concret et fonctionnel.

Le Point de Départ : Un Fichier Initial Basique

Le projet a commencé avec un fichier Python relativement simple. Utilisant la bibliothèque nextcord, ce fichier initial permettait au bot de se connecter à Discord et de fournir quelques fonctionnalités de base. Voici les premières lignes de code du bot :
import os import re import logging import datetime from openai import OpenAI, AsyncOpenAI import nextcord from nextcord.ext import commands # Initialisation des variables d'environnement FORUM_CHANNEL_IDS = os.getenv('FORUM_CHANNEL_IDS', '').split(',') BOT_TOKEN = os.getenv('BOT_TOKEN') GPT_CHANNEL_ID = os.getenv('GPT_CHANNEL_ID') # Initialisation de l'API OpenAI openai_client = OpenAI(api_key=os.getenv('OPENAI_API_KEY')) async_openai_client = AsyncOpenAI(api_key=os.getenv('OPENAI_API_KEY')) logging.basicConfig(level=logging.INFO, format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p', handlers=[logging.StreamHandler(), logging.FileHandler("thread_log.txt")]) bot = commands.Bot(command_prefix="§") @bot.event async def on_ready(): print(f"We have logged in as {bot.user}") await bot.change_presence(activity=nextcord.Game(name="t'aider dans les forums")) bot.message_context = {}

Étape 1 : Définir les Besoins et les Objectifs

Avant de plonger dans le code, il était essentiel de définir clairement mes besoins et mes objectifs. Je souhaitais que le bot puisse :
  1. Répondre automatiquement aux nouvelles discussions (threads) créées dans les forums spécifiques.
  1. Offrir des réponses précises et pédagogiques, notamment en analysant les images postées par les utilisateurs.
  1. Gérer les interactions en temps réel, tout en maintenant des coûts raisonnables.
  1. Fournir un suivi et des logs détaillés pour améliorer continuellement ses performances.

Étape 2 : Intégration avec OpenAI

Pour transformer le bot en un assistant virtuel intelligent, j'ai intégré les capacités de ChatGPT. Voici les étapes clés de cette intégration :

Initialisation du Client OpenAI

La première tâche était d'initialiser le client OpenAI et de gérer les clés API. Voici comment j'ai configuré cette partie :
# Assurez-vous que la clé API est définie api_key = os.getenv('OPENAI_API_KEY') if not api_key: raise ValueError("La clé API 'OPENAI_API_KEY' n'est pas définie dans les variables d'environnement.") # Initialiser le client OpenAI client = OpenAI(api_key=api_key)

Création des Événements et Commandes Slash

Ensuite, j'ai mis en place des événements et des commandes pour interagir avec le bot. Par exemple, l'événement on_thread_create permettait au bot de répondre automatiquement aux nouvelles discussions créées dans des forums spécifiques :
class AutoReply(commands.Cog): def __init__(self, bot): self.bot = bot @commands.Cog.listener() async def on_thread_create(self, thread: nextcord.Thread): if thread.parent_id not in auto_reply_forum_ids: return # Récupération du premier message du thread messages = await thread.history(limit=1).flatten() if not messages: logger.warning(f"Aucun message trouvé dans le thread: {thread.name} (ID: {thread.id})") return base_message = messages[0] base_content = f"Pseudo: {base_message.author.name}\nTitre: {thread.name}\nContenu du thread: {base_message.content}" logger.info(f"Thread créé par {base_message.author.name} (ID: {base_message.author.id}) dans le forum (ID: {thread.parent_id})") image_urls = [a.url for a in base_message.attachments if a.url.endswith(('png', 'jpeg', 'jpg', 'gif', 'webp'))] response = client.chat.completions.create( model="gpt-4o", messages=[ {"role": "system", "content": "Date du jour : {datetime.datetime.now()}"}, {"role": "system", "content": "Tu es un expert ..."}, {"role": "user", "content": base_content} ] ) embed_content = response.choices[0].message.content.strip() embed = Embed(title="Réponse de iBot-GPT", description=embed_content, color=0x454FBF) await thread.send(embed=embed)

Étape 3 : Optimisation de la Gestion des Messages et des Fichiers

Un autre défi consistait à gérer efficacement les messages et les fichiers, notamment les images. J'ai ajouté la capacité d'analyser les images postées et de générer des descriptions contextuelles pertinentes. Voici comment j'ai fait :
# Analyse des images et ajout du contexte au message descriptions = {} image_cost = 0 for attachment in base_message.attachments: file_extension = attachment.filename.split('.')[-1].lower() if file_extension in SUPPORTED_IMAGE_FORMATS: try: image_size = attachment.size if image_size > 512 * 512: image_cost += 0.002125 # Coût pour images plus grandes que 512x512 else: image_cost += 0.001275 # Coût pour images jusqu'à 512x512 response = client.chat.completions.create( model="gpt-4o", messages=[ {"role": "user", "content": [ {"type": "text", "text": "Décris cette image du point de vue d'une aide informatique."}, {"type": "image_url", "image_url": {"url": attachment.url}} ]} ], max_tokens=500 ) description = response.choices[0].message.content descriptions[attachment.url] = description except Exception as e: logger.error(f"Erreur lors de l'appel à l'API d'OpenAI pour la description de l'image: {e}", exc_info=True) descriptions[attachment.url] = "Description non disponible." else: descriptions[attachment.url] = f"[Fichier non supporté: {attachment.filename}]" await asyncio.sleep(1) # Petite pause pour éviter les rate limits

Étape 4 : Amélioration des Logs et de la Configuration

Pour assurer un suivi et une maintenance efficaces, j'ai ajouté une gestion avancée des logs et des configurations pour contrôler les droits d'accès et les options de personnalisation via des variables d'environnement. Voici un exemple de ma configuration de logging :
# Configuration du logger logger = logging.getLogger('bot') logger.setLevel(logging.INFO) formatter = logging.Formatter('%(asctime)s [%(name)s] %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p') stream_handler = logging.StreamHandler() stream_handler.setFormatter(formatter) file_handler = logging.FileHandler("bot_log.txt") file_handler.setFormatter(formatter) logger.addHandler(stream_handler) logger.addHandler(file_handler)

Étape 5 : Optimisation et Calcul des Coûts

Le calcul précis des coûts et l'optimisation des interactions étaient cruciaux pour maintenir des frais raisonnables tout en offrant des réponses de qualité :
# Calcul du coût des tokens input_cost = prompt_tokens * 0.000005 # Coût approximatif des tokens de prompt de GPT-4o output_cost = completion_tokens * 0.000015 # Coût approximatif des tokens de completion de GPT-4o total_cost = input_cost + output_cost + image_cost embed.set_footer(text=f"Total Tokens: {response.usage.total_tokens} | Coût: {total_cost:.6f} USD")

Étape 6 : Module de Commande "Ask-GPT"

Pour offrir une réponse personnalisée aux utilisateurs, j'ai créé un module Ask-GPT, permettant de poser des questions spécifiques et de recevoir des réponses détaillées :
class AskGpt(commands.Cog): def __init__(self, bot): self.bot = bot @nextcord.slash_command(name="ask-gpt", description="Pose une question à GPT-4o et reçois une réponse") async def ask_gpt(self, interaction: Interaction, question: str): if any.role.id in ask_gpt_unauthorized_role_ids for role in interaction.user.roles: await interaction.response.send_message("Vous n'avez pas la permission d'utiliser cette commande.", ephemeral=True) return user = interaction.user channel = interaction.channel logger.info(f"Commande /ask-gpt utilisée par {user} dans le salon {channel.name}") await interaction.response.defer(ephemeral=False) system_message = { "role": "system", "content": ( "Tu es un expert en informatique nommé iBot-GPT. " "Si tu reçois une question qui ne concerne pas ce domaine, n'hésite pas à rappeler à l'utilisateur que ce serveur est axé sur l'informatique. " "Assure-toi toujours de t'adresser en tutoyant l'utilisateur. " "Pour améliorer la lisibilité, utilise le markdown pour mettre le texte en forme (gras, italique, souligné), en mettant en gras les parties importantes." ) } user_message = {"role": "user", "content": question} try: response = client.chat.completions.create( model="gpt-4o", messages=[system_message, user_message], max_tokens=1500 ) answer = response.choices[0].message.content total_tokens = response.usage.total_tokens prompt_tokens = response.usage.prompt_tokens completion_tokens = response.usage.completion_tokens input_cost = prompt_tokens * 5 / 1_000_000 # coût des tokens d'entrée output_cost = completion_tokens * 15 / 1_000_000 # coût des tokens de sortie total_cost = input_cost + output_cost embed = Embed(title="Réponse de iBot-GPT", description=answer, color=0x454FBF) embed.set_footer(text=f"Total Tokens: {total_tokens} | Coût Total: {total_cost:.6f} USD") await interaction.followup.send(embed=embed) except Exception as e: logger.error(f"Erreur lors de l'appel à l'API d'OpenAI: {e}", exc_info=True) await interaction.followup.send( content="Une erreur s'est produite lors de l'appel à l'API d'OpenAI.", )

Amélioration Continue et Suivi des Performances

Au cœur de ce projet se trouve une philosophie d'amélioration continue. Grâce à la configuration avancée des logs, je peux surveiller les performances du bot, identifier les domaines d'amélioration et optimiser les interactions pour garantir que les utilisateurs obtiennent les meilleures réponses possibles.

Les Défis des Modèles de Langage : Hallucinations et Faux Positifs

Bien que ChatGPT soit un outil formidable, il vient avec son lot de défis. L'un des problèmes majeurs des modèles de langage comme GPT est leur tendance à "halluciner". En d'autres termes, ces modèles peuvent parfois générer des réponses extrêmement convaincantes, même lorsqu'elles sont fausses.
Pour atténuer ce problème, mon bot ne génère qu'une seule réponse initiale lorsqu'un nouvel utilisateur poste une question. Cela incite les experts sur le serveur à intervenir, à corriger les éventuelles erreurs et à fournir des conseils supplémentaires. De cette façon, je combine la rapidité et l'efficacité de l'IA avec l'expertise humaine pour offrir les meilleures réponses possibles.

Le Module de Résumé : Une Aide pour les Modérateurs

Imaginez cette scène : vous êtes occupé à effectuer une autre tâche importante, et au moment où vous revenez au serveur, vous êtes accueilli par un mur de texte provenant de multiples messages. Que faire ? Faire défiler sans fin ou appeler votre assistant IA préféré, iBot-GPT, pour obtenir un résumé instantané.
Le module de résumé est conçu spécifiquement pour aider les modérateurs à obtenir rapidement le contexte des conversations. Bien que principalement destiné à la modération, il est difficile de nier l'attrait d'un assistant capable de résumer parfaitement le contexte alors que nous étions occupés à d'autres tâches.

Résultats et Impact sur la Communauté

Depuis le déploiement du bot, les résultats ont été exceptionnels. J'ai observé une amélioration significative dans la gestion des questions sur le serveur :
  1. Réponses Plus Rapides et Pertinentes : Les utilisateurs reçoivent des réponses instantanées et précises, ce qui réduit le temps d'attente et améliore l'expérience utilisateur.
  1. Allègement de la Charge des Modérateurs : Les modérateurs peuvent maintenant se concentrer sur des tâches plus complexes et engageantes, sans être encombrés par des questions répétitives.
  1. Amélioration de la Qualité des Discussions : La communauté engage désormais des discussions plus profondes et techniques, enrichissant ainsi le contenu du serveur.
  1. Suivi et Optimisation Continue : Grâce aux logs détaillés, je peux surveiller les performances du bot et apporter des améliorations continues pour répondre aux besoins de la communauté.
En conclusion, l'intégration de ChatGPT dans notre serveur Discord a non seulement résolu le problème des "questions Google", mais a aussi transformé l'expérience globale pour tous les membres. Ce projet exemplifie la façon dont l'innovation technologique peut être mise au service d'une communauté pour améliorer la qualité des interactions et l'efficacité de la modération.
Merci d'avoir pris le temps de lire cet article. J'espère que mon expérience vous inspire et vous fournit des idées pour vos propres projets technologiques. N'hésitez pas à partager vos commentaires, questions ou suggestions. Pour ceux d'entre vous intéressés par cette solution, je suis à votre disposition pour toute assistance ou conseil.
Pour les curieux, mon projet est open source et libre de réutilisation. Vous pouvez suivre le développement, contribuer et l'utiliser pour vos propres besoins en visitant notre repository GitHub. Notez que le projet est encore en construction, il évolue constamment pour répondre aux besoins de notre communauté.

Yann Solliard - Administrateur Système / DevOps et Passionné de Technologie

Sources

ChatGPT The Helper ! Data
ChatGPT The Helper ! Data