Cas pratique · NLP · Python

Créer un chatbot hybride en Python avec NLTK et GPT-4.1 mini

Combinez la puissance de NLTK (traitement classique) avec GPT-4.1 mini (IA générative) pour créer un chatbot intelligent, économique et facile à déployer.

Niveau : intermédiaire | Temps de lecture : 20 min | Outils : Python, NLTK, OpenAI API | Coût : ~0,04 EUR pour le test

1. Introduction

Les chatbots sont omniprésents : service client, assistance virtuelle, FAQ interactives. Deux approches existent :

NLTK
Classique (règles, intentions)
Simple, gratuit, prévisible
GPT
Génératif (IA)
Naturel, flexible, conversationnel

Notre chatbot hybride combine le meilleur des deux mondes :

  • NLTK pour les intentions simples (salutations, aide, au revoir) → rapide, gratuit, sans API
  • GPT-4.1 mini pour les questions complexes et la conversation naturelle → intelligent, contextuel
Coût estimé :

Pour ce cas pratique, vous n'aurez besoin que de quelques centimes d'euros (environ 0,04 EUR). La clé API OpenAI est protégée par variable d'environnement.

Schéma du chatbot hybride : utilisateur → NLTK (intentions simples) → GPT (conversation)

Image AVIF à créer – schéma de l'architecture du chatbot hybride.

2. Prérequis

2.1 Installer Python

Téléchargez Python 3.10 ou supérieur sur python.org.

2.2 Installer les bibliothèques

Terminal
pip install nltk openai python-dotenv

2.3 Télécharger les ressources NLTK

Python
import nltk
nltk.download('punkt')
nltk.download('stopwords')

2.4 Obtenir une clé API OpenAI

Créez un compte sur platform.openai.com et ajoutez 5 USD de crédits prépayés.

Conseil sécurité :

Ne mettez jamais votre clé API en dur dans le code. Nous allons utiliser un fichier .env.

3. Étape 1 : Chatbot basé sur NLTK (règles + intentions)

chatbot_nltk.py
import nltk
import re
from nltk.tokenize import word_tokenize

# Téléchargement des ressources (une seule fois)
nltk.download('punkt', quiet=True)
nltk.download('stopwords', quiet=True)

# Définition des intentions et des réponses
intents = {
    "salutation": {
        "mots": ["bonjour", "salut", "coucou", "hello", "hi"],
        "reponse": "Bonjour ! Comment puis-je vous aider aujourd'hui ?"
    },
    "aide": {
        "mots": ["aide", "help", "que peux-tu faire", "fonctionnalités"],
        "reponse": "Je peux répondre à vos questions, vous saluer, vous aider. Tapez 'au revoir' pour quitter."
    },
    "au_revoir": {
        "mots": ["au revoir", "bye", "salut", "à plus", "quit", "exit"],
        "reponse": "Au revoir ! Passez une excellente journée."
    },
    "merci": {
        "mots": ["merci", "thanks", "thank you"],
        "reponse": "Avec plaisir ! N'hésitez pas si vous avez d'autres questions."
    }
}

def detecter_intention(texte):
    """Détecte l'intention de l'utilisateur en fonction des mots-clés"""
    texte = texte.lower()
    tokens = word_tokenize(texte, language='french')
    
    for intent_name, intent_data in intents.items():
        for mot in intent_data["mots"]:
            if mot in texte or mot in tokens:
                return intent_name, intent_data["reponse"]
    
    return None, None

# Boucle de conversation
def chatbot_nltk():
    print("Chatbot NLTK (tapez 'au revoir' pour quitter)")
    print("-" * 50)
    
    while True:
        user_input = input("Vous : ").strip()
        
        if not user_input:
            continue
            
        intention, reponse = detecter_intention(user_input)
        
        if intention == "au_revoir":
            print(f"Assistant : {reponse}")
            break
        elif reponse:
            print(f"Assistant : {reponse}")
        else:
            print("Assistant : Désolé, je n'ai pas compris. Pouvez-vous reformuler ?")

if __name__ == "__main__":
    chatbot_nltk()

Test :

Exécution
Chatbot NLTK (tapez 'au revoir' pour quitter)
--------------------------------------------------
Vous : Bonjour
Assistant : Bonjour ! Comment puis-je vous aider aujourd'hui ?
Vous : Quel temps fait-il ?
Assistant : Désolé, je n'ai pas compris. Pouvez-vous reformuler ?
Vous : Merci
Assistant : Avec plaisir ! N'hésitez pas si vous avez d'autres questions.
Vous : Au revoir
Assistant : Au revoir ! Passez une excellente journée.

Démonstration du chatbot NLTK en console

capture de l'exécution du chatbot NLTK (sans la clé API).

4. Étape 2 : Intégration de GPT-4.1 mini

Attention Sécurité :

Ne montrez jamais votre clé API dans les captures. Nous utilisons un fichier .env pour la stocker.

4.1 Créer le fichier .env

.env (à la racine du projet)
OPENAI_API_KEY=sk-proj-votre-cle-ici
Pour la capture :

Floutez ou masquez la valeur de la clé (remplacez par sk-proj-***).

4.2 Chatbot GPT simple

chatbot_gpt.py
import os
from openai import OpenAI
from dotenv import load_dotenv

# Charger la clé API depuis .env
load_dotenv()
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))

def chatbot_gpt():
    print("Chatbot GPT-4.1 mini (tapez 'quit' pour quitter)")
    print("-" * 50)
    
    # Historique de la conversation
    messages = [
        {"role": "system", "content": "Tu es un assistant utile, amical et concis. Tu réponds en français."}
    ]
    
    while True:
        user_input = input("Vous : ").strip()
        
        if user_input.lower() in ["quit", "exit", "au revoir"]:
            print("Assistant : Au revoir !")
            break
        
        if not user_input:
            continue
        
        messages.append({"role": "user", "content": user_input})
        
        response = client.chat.completions.create(
            model="gpt-4.1-mini",
            messages=messages,
            max_tokens=500,
            temperature=0.7
        )
        
        assistant_response = response.choices[0].message.content
        print(f"Assistant : {assistant_response}")
        messages.append({"role": "assistant", "content": assistant_response})

if __name__ == "__main__":
    chatbot_gpt()

Test :

Exécution
Chatbot GPT-4.1 mini (tapez 'quit' pour quitter)
--------------------------------------------------
Vous : Quel temps fait-il à Paris aujourd'hui ?
Assistant : Je ne dispose pas d'accès en temps réel aux conditions météorologiques. Pour connaître la météo à Paris, je te suggère de consulter un site comme Météo-France ou d'activer la météo sur ton téléphone.
Vous : Comment créer un chatbot ?
Assistant : Pour créer un chatbot, tu peux utiliser des bibliothèques Python comme NLTK pour les règles simples, ou intégrer une API comme OpenAI pour une conversation naturelle. Commence par définir les intentions, puis choisis ton approche.
Vous : Merci !
Assistant : Avec plaisir ! N'hésite pas si tu as d'autres questions.
Vous : quit
Assistant : Au revoir !

Démonstration du chatbot GPT-4.1 mini en console

capture de l'exécution (sans la clé API visible).

5. Étape 3 : Chatbot hybride (NLTK + GPT)

Principe :

NLTK détecte d'abord les intentions simples (salutations, aide, au revoir). Si aucune intention n'est trouvée, on appelle GPT pour une réponse naturelle.

chatbot_hybride.py
import os
import nltk
from nltk.tokenize import word_tokenize
from openai import OpenAI
from dotenv import load_dotenv

# Charger la clé API
load_dotenv()
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))

# Télécharger les ressources NLTK
nltk.download('punkt', quiet=True)
nltk.download('stopwords', quiet=True)

# Intentions NLTK
intents = {
    "salutation": {
        "mots": ["bonjour", "salut", "coucou", "hello", "hi"],
        "reponse": "Bonjour ! Comment puis-je vous aider ?"
    },
    "aide": {
        "mots": ["aide", "help", "que peux-tu faire"],
        "reponse": "Je peux répondre à vos questions, vous saluer, vous aider. Je suis un chatbot hybride NLTK + GPT."
    },
    "au_revoir": {
        "mots": ["au revoir", "bye", "quit", "exit"],
        "reponse": "Au revoir ! Passez une excellente journée."
    },
    "merci": {
        "mots": ["merci", "thanks"],
        "reponse": "Avec plaisir !"
    }
}

def detecter_intention_nltk(texte):
    """Détecte l'intention avec NLTK"""
    texte = texte.lower()
    for intent_name, intent_data in intents.items():
        for mot in intent_data["mots"]:
            if mot in texte:
                return intent_name, intent_data["reponse"]
    return None, None

def reponse_gpt(texte, historique):
    """Appelle GPT-4.1 mini pour une réponse naturelle"""
    messages = [
        {"role": "system", "content": "Tu es un assistant utile, amical et concis. Tu réponds en français."}
    ]
    messages.extend(historique)
    messages.append({"role": "user", "content": texte})
    
    response = client.chat.completions.create(
        model="gpt-4.1-mini",
        messages=messages,
        max_tokens=500,
        temperature=0.7
    )
    return response.choices[0].message.content

def chatbot_hybride():
    print("Chatbot Hybride (NLTK + GPT-4.1 mini)")
    print("   Tapez 'au revoir' pour quitter")
    print("-" * 55)
    
    historique = []
    
    while True:
        user_input = input("Vous : ").strip()
        
        if not user_input:
            continue
        
        # 1. Détection par NLTK
        intention, reponse_nltk = detecter_intention_nltk(user_input)
        
        if intention == "au_revoir":
            print(f"Assistant : {reponse_nltk}")
            break
        elif reponse_nltk:
            print(f"Assistant : {reponse_nltk}")
            historique.append({"role": "user", "content": user_input})
            historique.append({"role": "assistant", "content": reponse_nltk})
        else:
            # 2. Appel à GPT
            reponse = reponse_gpt(user_input, historique)
            print(f"Assistant : {reponse}")
            historique.append({"role": "user", "content": user_input})
            historique.append({"role": "assistant", "content": reponse})

if __name__ == "__main__":
    chatbot_hybride()

Test :

Exécution
Chatbot Hybride (NLTK + GPT-4.1 mini)
   Tapez 'au revoir' pour quitter
-------------------------------------------------------
Vous : Bonjour
Assistant : Bonjour ! Comment puis-je vous aider ?
Vous : Quelle est la capitale de la France ?
Assistant : La capitale de la France est Paris.
Vous : Merci
Assistant : Avec plaisir !
Vous : Au revoir
Assistant : Au revoir ! Passez une excellente journée.

Démonstration du chatbot hybride

capture de l'exécution du chatbot hybride (sans clé API).

6. Sécurité : protéger sa clé API

Conseils pour vos captures d'écran :
  • Ne jamais montrer la clé API en clair (sk-proj-...)
  • Flouter la zone de la clé dans vos captures
  • Utiliser un fichier .env (pas de clé en dur dans le code)
  • Ajouter .env au .gitignore (si vous utilisez Git)
  • Montrer la variable d'environnement masquée : OPENAI_API_KEY=***
.gitignore
.env
__pycache__/
*.pyc

Colab avec clé masquée

capture  Google Colab avec la clé floutée.

7. Améliorations possibles

Ajouter la mémoire contextuelle

Notre version hybride garde déjà l'historique. Vous pouvez limiter la taille pour éviter des coûts trop élevés.

Ajouter une interface web (Streamlit)

Transformez votre chatbot en application web avec Streamlit en quelques lignes de code.

Ajouter la reconnaissance d'entités (NER)

Utilisez spaCy pour extraire des informations spécifiques (dates, lieux, noms).

Personnaliser le système prompt

Modifiez le rôle système pour adapter la personnalité du chatbot (ex: "Tu es un expert en data science").

Extension Streamlit (optionnelle) :
app.py
import streamlit as st
from chatbot_hybride import reponse_gpt

st.title("Chatbot Hybride")
user_input = st.text_input("Vous :")
if user_input:
    reponse = reponse_gpt(user_input, [])
    st.write(f"Assistant : {reponse}")

8. Code source complet

Le code complet est disponible dans les étapes précédentes. Voici la structure finale du projet :

Arborescence
mon_chatbot/
├── .env                    # Contient OPENAI_API_KEY=...
├── chatbot_nltk.py         # Version NLTK only
├── chatbot_gpt.py          # Version GPT only
├── chatbot_hybride.py      # Version hybride (recommandée)
├── requirements.txt        # Dépendances
└── .gitignore              # Exclut .env
requirements.txt
nltk==3.9.1
openai==1.58.0
python-dotenv==1.0.1
streamlit==1.35.0  # optionnel

9. FAQ — Chatbot NLTK et GPT

Quel est le coût réel d'utilisation de GPT-4.1 mini ?

Pour ce cas pratique, environ 0,04 EUR. Pour un usage plus intensif, comptez 0,40 USD par million de tokens en entrée et 1,60 USD par million en sortie. Une conversation typique de 10 échanges coûte moins de 0,01 EUR.

Puis-je utiliser un autre modèle que GPT-4.1 mini ?

Oui. Vous pouvez remplacer gpt-4.1-mini par gpt-4.1, gpt-3.5-turbo, ou tout autre modèle OpenAI. Les prix varient.

Comment flouter ma clé API sur les captures ?

Utilisez un logiciel de retouche d'image (GIMP, Paint.NET, Photoshop) ou l'outil de masquage de votre capture d'écran (Snip & Sketch sur Windows, Preview sur Mac). Vous pouvez aussi remplacer la valeur par *** dans le code avant capture.

Le chatbot hybride est-il plus lent ?

Les intentions NLTK sont quasi instantanées. GPT ajoute une latence de 1 à 3 secondes (selon la connexion). L'ensemble reste fluide pour un usage conversationnel.

Puis-je déployer ce chatbot sur un site web ?

Oui. Utilisez Flask ou FastAPI pour créer une API, puis un frontend en HTML/JavaScript. Attention à ne pas exposer votre clé API côté client.

Que faire si j'atteins la limite de tokens ?

Réduisez max_tokens (par exemple à 300) ou nettoyez l'historique pour garder seulement les derniers échanges.

10. Conclusion

Ce cas pratique vous a montré comment créer un chatbot hybride alliant la simplicité de NLTK (gratuit, rapide) et l'intelligence de GPT-4.1 mini (conversation naturelle). Pour moins de 5 USD de crédits prépayés (dont seulement 0,04 USD utilisés pour ce test), vous disposez d'un chatbot fonctionnel et extensible.

À retenir

  • NLTK : pour les intentions simples et rapides (gratuit)
  • GPT-4.1 mini : pour les questions complexes et la conversation naturelle
  • Hybride : le meilleur des deux mondes
  • Sécurité : fichier .env + flouter les captures
  • Coût : 4,60 EUR de crédits (valables 1 an), ~0,04 EUR pour ce cas pratique
Pour aller plus loin : Découvrez notre article C'est quoi le NLTK ? pour approfondir le NLP classique, ou l'IA expliquée simplement pour comprendre les modèles comme GPT.
 

Recevez la veille IA & Data qui compte vraiment

 

    Analyses claires, outils concrets et tendances IA sans bruit.     Rejoignez les lecteurs de IANA Data.