Créer un chatbot IA avec n8n : base documentaire, mémoire et sessionId
Le besoin
Une école de formation voulait permettre à ses apprenants de trouver rapidement des réponses sur ses formations, son programme et son fonctionnement. Une FAQ statique existait déjà, mais personne ne la lisait : on préfère poser sa question directement.
L'objectif : un agent conversationnel intégré au site, qui répond uniquement à partir de la documentation de l'école, se souvient de ce qui a été dit plus tôt dans l'échange, et ne mélange jamais les conversations de deux personnes connectées en même temps.
Pourquoi n8n : tout le chatbot tient dans un seul workflow visuel. Pas de serveur à coder, et l'équipe peut voir chaque conversation dans l'onglet Executions pour comprendre pourquoi l'agent a répondu ce qu'il a répondu.
L'architecture en un coup d'œil
Chat Trigger — "Réception message apprenant"
↓
AI Agent — "Agent formations"
├── Chat Model → le modèle de langage (Claude, par exemple)
├── Memory → l'historique de la conversation
└── Tool → la base documentaire de l'école
Le nœud AI Agent est le chef d'orchestre. Il reçoit le message, consulte la mémoire, décide s'il a besoin d'aller chercher une information dans la documentation, puis formule sa réponse avec le modèle de langage. Les trois briques se branchent sous lui, comme des sous-nœuds.
1. Écrire un prompt système qui cadre l'agent
C'est l'étape la plus importante, et la plus souvent bâclée. Sans consignes claires, l'agent répondra à tout, y compris en inventant. Le prompt système (champ System Message de l'AI Agent) doit définir son rôle, ses limites et son ton :
Tu es l'assistant de l'école. Tu réponds aux questions des apprenants
sur les formations, le programme, les dates et le fonctionnement de l'école.
Règles :
- Tu t'appuies uniquement sur la documentation fournie par l'outil "Base formations".
- Si l'information n'y figure pas, tu le dis clairement et tu proposes
de contacter l'équipe pédagogique par e-mail.
- Tu réponds en français, de façon courte et concrète.
- Tu ne donnes jamais d'avis personnel ni d'information sur d'autres écoles.
La consigne « si l'information n'y figure pas, dis-le » est indispensable. Un modèle de langage préfère toujours donner une réponse plausible plutôt que d'avouer qu'il ne sait pas. C'est cette règle qui transforme un chatbot sympathique en outil fiable.
2. Brancher la base documentaire
Pour que l'agent réponde à partir des vraies informations de l'école, il faut lui donner accès à une source de vérité. Deux approches selon le volume :
Petite documentation
- Un Google Sheet structuré (question, réponse, catégorie)
- Branché comme outil de l'agent
- Facile à mettre à jour par l'équipe, sans compétence technique
Grosse documentation
- Des PDF et pages découpés en morceaux
- Stockés dans une base vectorielle
- L'agent ne récupère que les passages pertinents
Pour une école avec quelques dizaines de questions récurrentes, le Google Sheet suffit largement. C'est aussi le plus simple à maintenir : quand une date de rentrée change, l'équipe modifie une cellule, et l'agent est à jour immédiatement.
Nomme et décris bien l'outil. L'agent choisit d'utiliser un outil en lisant sa description. « Base formations : contient le programme, les dates, les tarifs et les modalités d'inscription de chaque formation » fonctionne bien mieux que « Google Sheets ».
3. Ajouter la mémoire
Sans mémoire, chaque message est traité comme le premier. L'apprenant demande « Quelles sont les dates de la formation cybersécurité ? », puis « Et le tarif ? »... et l'agent ne sait pas de quelle formation on parle.
Le sous-nœud Simple Memory règle ça : il garde les derniers échanges et les renvoie au modèle à chaque nouveau message. Le réglage Context Window Length définit combien d'échanges sont conservés. Entre 5 et 10 suffit pour une conversation de support, et ça limite le nombre de tokens envoyés à chaque appel.
La Simple Memory est stockée dans la mémoire de n8n : elle disparaît si l'instance redémarre. Pour un chatbot en production avec beaucoup de trafic, préfère une mémoire persistante comme Postgres Chat Memory ou Redis Chat Memory.
4. Le sessionId : ne jamais mélanger les conversations
C'est le point qui pose le plus de questions. La mémoire est rangée par identifiant de session : chaque sessionId correspond à une conversation. Si deux apprenants partagent le même identifiant, ils partagent la même mémoire... et l'un reçoit des réponses liées aux questions de l'autre.
Le sessionId doit donc être unique par visiteur, et stable pendant toute sa conversation. Côté site, on le génère une fois et on le conserve dans le navigateur :
function getSessionId() {
let id = sessionStorage.getItem("chat-session-id");
if (!id) {
id = crypto.randomUUID();
sessionStorage.setItem("chat-session-id", id);
}
return id;
}
Ce sessionId est envoyé avec chaque message. Dans la Simple Memory, le champ Session Key indique où le trouver :
{{ $json.sessionId }}
Si tu utilises le widget de chat officiel de n8n (@n8n/chat) avec le nœud Chat Trigger, le sessionId est généré et transmis automatiquement. Ce code n'est utile que si tu construis ta propre interface de chat.
5. Tester les cas qui piègent
Avant la mise en ligne, je teste systématiquement ces scénarios :
| Test | Comportement attendu |
|---|---|
| Question absente de la documentation | L'agent dit qu'il ne sait pas et oriente vers l'équipe |
| Question de suivi (« Et le tarif ? ») | L'agent comprend de quelle formation on parle |
| Deux onglets en navigation privée | Deux conversations totalement séparées |
| Question hors sujet | L'agent recentre poliment sur l'école |
| Tentative de détourner le prompt | L'agent garde son rôle et ses règles |
En résumé
| Brique | Rôle |
|---|---|
| Prompt système | Définir le rôle, les limites et le ton de l'agent |
| Base documentaire | Donner une source de vérité, facile à mettre à jour |
| Mémoire | Comprendre les questions de suivi |
| sessionId | Une conversation par visiteur, jamais de mélange |
| Tests ciblés | Vérifier les cas limites avant la mise en ligne |
Le résultat : un assistant disponible 24 h/24, qui répond à partir des vraies informations de l'école, et qui libère l'équipe pédagogique des questions répétitives. Le tout sans écrire de backend.
