Retour aux articles

Créer un chatbot IA avec n8n : base documentaire, mémoire et sessionId

  • n8n
  • IA

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

text
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 :

text
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 :

javascript
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 :

text
{{ $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.