Aller au contenu

Chatbot avec mémoire

Objectif du Workflow

Simple LLM avec Groq

Ce simple workflow permet de mettre en oeuvre un robot de chat avec des connaissances plutôt agnostiques.

Description du workflow

Le Workflow comporte peu de composants :

  • Un chat permettant l'interaction avec l'utilisateur.
  • Un LLM, ici des modèles proposés gratuitement par la société Groq permettant de réaliser de l'inférence à partir des données provenant du chat.
  • Une base de donnée simple s'appuyant sur "Redis" pour stocker les données.
  • Un tool wikipedia permettant d'aiguiller les requêtes vers la célèbre encyclopedie interactive.

A faire avant de commencer

Installer n8n

Uniquement si vous ne l'avez pas encore fait

Suivre le tutoriel ici...

Clé API Groq

Se connecter sur la console Groq et obtenir un clé API afin de renseigner les "credentials" dans n8n.

Invite de loginInvite de login

Confirmation d'envoi de courrielConfirmation d'envoi de courriel

Courriel de confirmationCourriel de confirmation

Menu des clés APIMenu des clés API

Création d'un clé APICréation d'un clé API

API généréeAPI générée

Gestion des clés APIGestion des clés API

Information

N'oubliez pas de déclarer vos "credentials" dans n8n afin que le composant puisse fonctionner normalement.

Installer Redis localement

Il est impératif de créer un nouveau service "Redis" local afin de pouvoir stocker les éléments conversationnels du chat en tant que mémoire.

Fichiers utilisés

Voici les lignes à ajouter dans votre docker-compose.yml initial de n8n.

...
  redis_mem:
    image: redis:6-alpine
    container_name: redis_mem
    restart: always
    volumes:
      - redis_storage_mem:/data
    command: redis-server --requirepass mypassword
    healthcheck:
      test: ['CMD', 'redis-cli', 'ping']
      interval: 5s
      timeout: 5s
      retries: 10
    networks:
      - web
Danger

Il est impératif de changer le mot de passe de votre instance "Redis".

Information

N'oubliez pas de déclarer vos "credentials" dans n8n afin que le composant puisse fonctionner normalement.

Mise en oeuvre

Copie des fichiers directement depuis git et ajout dans notre docker-compose.yml

cd tuto-n8n-simple
URL="https://gitea.ia86.cc/perso/tuto-n8n-chatbotv1/raw/branch/main/docker-compose.add.yml"
CONTENT="$(wget -qO- "${URL}")\n\nvolumes:\n%VOL%"
CONTENT_ESCAPED=$(echo "${CONTENT}" | awk '{printf "%s\\n", $0}' | sed 's/\\/\\\\/g; s/\//\\\//g')
LABEL=$(echo "${CONTENT}"|head -1|sed "s/#=== //")
VOLUME=$(echo "${CONTENT}"|grep " \+volumes:$" -A1|grep -v " \+volumes:"|sed 's/ *- *\([a-zA-Z0-9_-]*\):.*/\1/')
echo -en "$(cat docker-compose.yml|sed "s/^volumes:$/${CONTENT_ESCAPED}/"|sed "s/%VOL%./  ${VOLUME}: #${LABEL}/")" > docker-compose.yml

(re)Lancement de la pile docker-compose

docker compose up -d

Vérification du bon fonctionnement, il doit y avoir un nouveau conteneur redis_mem

# docker ps
CONTAINER ID   IMAGE                            COMMAND                  CREATED         STATUS                   PORTS                    NAMES
e8a2e9c503a7   redis:6-alpine                   "docker-entrypoint.s…"   5 seconds ago   Up 5 seconds (healthy)   6379/tcp                 redis_mem
a921b6c6d5a9   docker.n8n.io/n8nio/n8n:1.46.0   "tini -- /docker-ent…"   2 hours ago     Up 2 hours (healthy)     0.0.0.0:5678->5678/tcp   n8n
07fedd9f82e1   redis:6-alpine                   "docker-entrypoint.s…"   2 hours ago     Up 2 hours (healthy)     6379/tcp                 n8n_redis
ce562b350902   postgres:16                      "docker-entrypoint.s…"   2 hours ago     Up 2 hours (healthy)     5432/tcp                 n8n_postgresql

Suppression de Redis (optionnel)

Si vous ne souhaitez plus utiliser redis pour stocker les conversations antérieures ou si vous souhaitez supprimer complètement ce workflow.

Retour à ma version initiale de n8n

En utilisant Git, retour à la version initiale et suppression des conteneurs orphelins

git reset --hard
docker compose up -d --remove-orphans
docker volume rm tuto-n8n-simple_redis_storage_mem

Suppression uniquement de redis_mem

Dans le cas où vous auriez installé autre chose entre temps...et vous ne souhaitez pas revenir à la version initiale de n8n

NAME="redis_mem"
CONTENT=$(cat docker-compose.yml|sed "/#=== ${NAME}/,/#===/d"|grep -v "#${NAME}")
echo "${CONTENT}" > docker-compose.yml
docker compose up -d --remove-orphans
docker volume rm tuto-n8n-simple_redis_storage_mem

Ressources

Plan des services et ressources utilisés

flowchart TD
    C[docker-compose.yml] --> D[n8n_postgresql]
    C --> E[n8n_redis]
    C --> F[n8n]
    C --> L[redis_mem]
    D -->|Volumes| G[db_storage:/var/lib/postgresql/data]
    E -->|Volumes| H[redis_storage:/data]
    F -->|Volumes| I[n8n_storage:/home/node/.n8n]
    L -->|Volumes| M[redis_storage_mem:/data]
    D -->|Networks| J[web]
    E -->|Networks| J
    F -->|Networks| J
    F -->|Networks| K[internet]
    L -->|Networks| J

    style C fill:#bbf,stroke:#333,stroke-width:2px
    style D fill:#cfc,stroke:#333,stroke-width:2px
    style E fill:#cfc,stroke:#333,stroke-width:2px
    style F fill:#cfc,stroke:#333,stroke-width:2px
    style G fill:#ffc,stroke:#333,stroke-width:1px
    style H fill:#ffc,stroke:#333,stroke-width:1px
    style I fill:#ffc,stroke:#333,stroke-width:1px
    style J fill:#fcc,stroke:#333,stroke-width:1px
    style K fill:#fcc,stroke:#333,stroke-width:1px
    style L fill:#cfc,stroke:#333,stroke-width:1px
    style M fill:#ffc,stroke:#333,stroke-width:2px

Workflow

Copiez-coller le workflow dans n8n...

Configuration finale dans n8n

Il convient de rajouter les "credentials" et finaliser la configuration du workflow.

Ajout "credentials" GroqAjout "credentials" Groq

Choix du LLM GroqChoix du LLM Groq

Ajout "credentials" RedisAjout "credentials" Redis

Lancer le chatLancer le chat

Chatter avec l'IAChatter avec l'IA