Aller au contenu

Chatbot avec mémoire

Simple LLM avec Groq

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

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.

Uniquement si vous ne l’avez pas encore fait

Suivre le tutoriel ici…

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

Info

N’oubliez pas de déclarer vos “credentials” dans n8n afin que le composant puisse fonctionner normalement.

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.

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”.

Info

N’oubliez pas de déclarer vos “credentials” dans n8n afin que le composant puisse fonctionner normalement.

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

Fenêtre de terminal
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

Fenêtre de terminal
docker compose up -d

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

Fenêtre de terminal
# 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

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

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

Fenêtre de terminal
git reset --hard
docker compose up -d --remove-orphans
docker volume rm tuto-n8n-simple_redis_storage_mem

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

Fenêtre de terminal
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

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

Copiez-coller le workflow dans n8n…

Chatbot avec mémoire
{
  "name": "Grocq with Redis",
  "nodes": [
    {
      "parameters": {
        "model": "llama3-groq-8b-8192-tool-use-preview",
        "options": {},
        "requestOptions": {}
      },
      "id": "6d86ea5c-a261-4f48-82e1-da8320a5a6dd",
      "name": "Groq Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatGroq",
      "typeVersion": 1,
      "position": [
        820,
        420
      ],
      "credentials": {
        "groqApi": {
          "id": "u4SobGEjjuXQixeQ",
          "name": "Groq account"
        }
      }
    },
    {
      "parameters": {
        "requestOptions": {}
      },
      "id": "6907b7b2-8d82-41d4-8736-f104826d7a81",
      "name": "Redis Chat Memory",
      "type": "@n8n/n8n-nodes-langchain.memoryRedisChat",
      "typeVersion": 1.2,
      "position": [
        960,
        420
      ],
      "credentials": {
        "redis": {
          "id": "wWb5QYSGlU3ORgUe",
          "name": "Redis account"
        }
      }
    },
    {
      "parameters": {
        "requestOptions": {}
      },
      "id": "93008494-1b42-4aab-8b5b-4c881089c0ef",
      "name": "Wikipedia",
      "type": "@n8n/n8n-nodes-langchain.toolWikipedia",
      "typeVersion": 1,
      "position": [
        1060,
        420
      ]
    },
    {
      "parameters": {},
      "id": "40147443-e116-43cf-91cd-9332a2db59fb",
      "name": "When chat message received",
      "type": "@n8n/n8n-nodes-langchain.chatTrigger",
      "typeVersion": 1,
      "position": [
        620,
        200
      ],
      "webhookId": "88dae1fe-0fe3-4443-a0a6-843bc2d02332"
    },
    {
      "parameters": {
        "agent": "conversationalAgent",
        "options": {}
      },
      "id": "8780b31a-bb2c-4518-aaf3-54ce2997e4be",
      "name": "AI Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 1.6,
      "position": [
        840,
        200
      ]
    }
  ],
  "pinData": {},
  "connections": {
    "Groq Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "AI Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Redis Chat Memory": {
      "ai_memory": [
        [
          {
            "node": "AI Agent",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "Wikipedia": {
      "ai_tool": [
        [
          {
            "node": "AI Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "When chat message received": {
      "main": [
        [
          {
            "node": "AI Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "63d5135b-4d23-411f-bf3d-bbe0aad1bbbb",
  "meta": {
    "templateCredsSetupCompleted": true,
    "instanceId": "366d92472788798a2a8c91dff5608f9b248c880970d12dcd224edfaeeb4a3df8"
  },
  "id": "NjsXIL9CS6JKbIqD",
  "tags": []
}

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