Construire un chatbot de base de connaissances avec Jotform, RAG sur Supabase, Together AI et Gemini

Intermédiaire

Ceci est uncontenant 15 nœuds.Utilise principalement des nœuds comme Code, Supabase, Aggregate, HttpRequest, JotFormTrigger. Construire un chatbot de base de connaissances avec Jotform, RAG sur Supabase, Together AI et Gemini

Prérequis
  • URL et Clé API Supabase
  • Peut nécessiter les informations d'identification d'authentification de l'API cible
  • Clé API Google Gemini

Catégorie

-
Aperçu du workflow
Visualisation des connexions entre les nœuds, avec support du zoom et du déplacement
Exporter le workflow
Copiez la configuration JSON suivante dans n8n pour importer et utiliser ce workflow
{
  "meta": {
    "instanceId": "93f396852104089b8670e7494b0f3668b420464668ae4a8c1d6b4b5799f8e3ef",
    "templateCredsSetupCompleted": true
  },
  "nodes": [
    {
      "id": "1c57da69-7af2-47c8-8bc2-92e49449bd81",
      "name": "Découpage en Segments",
      "type": "n8n-nodes-base.code",
      "position": [
        2192,
        -496
      ],
      "parameters": {
        "jsCode": "const text = $input.first().json.text;\nconst chunkSize = 1000;\n\nlet chunks = [];\nfor (let i = 0; i < text.length; i += chunkSize) {\n  chunks.push({\n    json: { chunk: text.slice(i, i + chunkSize) }\n  });\n}\n\nreturn chunks;\n\n"
      },
      "typeVersion": 2
    },
    {
      "id": "d5ed1aaf-6089-4731-980d-b5c356b22403",
      "name": "Embedding du Document Téléchargé",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        2416,
        -496
      ],
      "parameters": {
        "url": "https://api.together.xyz/v1/embeddings",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "sendHeaders": true,
        "authentication": "genericCredentialType",
        "bodyParameters": {
          "parameters": [
            {
              "name": "model",
              "value": "BAAI/bge-large-en-v1.5"
            },
            {
              "name": "input",
              "value": "={{ $json.chunk }}"
            }
          ]
        },
        "genericAuthType": "httpBearerAuth",
        "headerParameters": {
          "parameters": [
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        }
      },
      "credentials": {
        "httpBearerAuth": {
          "id": "ePx2TlbqIiRjDGfW",
          "name": "Together API"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "0b1c609f-e335-4541-8dae-e3517ec4bb63",
      "name": "Sauvegarder l'Embedding en Base de Données",
      "type": "n8n-nodes-base.supabase",
      "position": [
        2624,
        -496
      ],
      "parameters": {
        "tableId": "RAG",
        "fieldsUi": {
          "fieldValues": [
            {
              "fieldId": "chunk",
              "fieldValue": "={{ $('Splitting into Chunks').item.json.chunk }}"
            },
            {
              "fieldId": "embeddings",
              "fieldValue": "={{ JSON.stringify($json.data[0].embedding) }}"
            }
          ]
        }
      },
      "credentials": {
        "supabaseApi": {
          "id": "sNLLVD1n1FkMp81B",
          "name": "abhi.vaar"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "3a39d174-434e-4c81-921c-8a354fad5ebe",
      "name": "Agrégation",
      "type": "n8n-nodes-base.aggregate",
      "position": [
        2064,
        64
      ],
      "parameters": {
        "options": {},
        "fieldsToAggregate": {
          "fieldToAggregate": [
            {
              "fieldToAggregate": "chunk"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "4ce2ab5b-bb1e-46ce-9dd8-2cfdee5510a2",
      "name": "Recherche d'Embeddings",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1840,
        64
      ],
      "parameters": {
        "url": "https://enter-your-supabase-host/rest/v1/rpc/matchembeddings1",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "authentication": "predefinedCredentialType",
        "bodyParameters": {
          "parameters": [
            {
              "name": "=query_embedding",
              "value": "={{ $json.data[0].embedding }}"
            },
            {
              "name": "match_count",
              "value": "5"
            }
          ]
        },
        "nodeCredentialType": "supabaseApi"
      },
      "credentials": {
        "supabaseApi": {
          "id": "sNLLVD1n1FkMp81B",
          "name": "abhi.vaar"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "76c8df3f-cf64-4848-b077-d04e9de88d12",
      "name": "Embedding du Message Utilisateur",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1616,
        64
      ],
      "parameters": {
        "url": "https://api.together.xyz/v1/embeddings",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "authentication": "genericCredentialType",
        "bodyParameters": {
          "parameters": [
            {
              "name": "model",
              "value": "BAAI/bge-large-en-v1.5"
            },
            {
              "name": "input",
              "value": "={{ $json.chatInput }}"
            }
          ]
        },
        "genericAuthType": "httpBearerAuth"
      },
      "credentials": {
        "httpBearerAuth": {
          "id": "ePx2TlbqIiRjDGfW",
          "name": "Together API"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "d8dba80c-597e-470b-852b-6d53363238bc",
      "name": "Google Gemini Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "position": [
        2272,
        288
      ],
      "parameters": {
        "options": {}
      },
      "credentials": {
        "googlePalmApi": {
          "id": "qsaK3VMNWQDWLweQ",
          "name": "Google Gemini(PaLM) Api account"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "f74c0006-15e0-4f48-8c02-b0b765154c5b",
      "name": "Agent IA",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        2272,
        64
      ],
      "parameters": {
        "text": "=You are a helpful and professional customer support agent. Use the following context to answer the user's question. \n\nHandle greetings without the need of the context...\n\nContext:\n{{ $json.chunk }}\n\nUser's message:\n{{ $('When chat message received').item.json.chatInput }}\n\nFormat your reply in WhatsApp style:\n- Use _italics_ for emphasis\n- Use *bold* for key points\n- Use • for bullet lists (no markdown dashes or hashes)\n- Keep responses short, clear, and conversational, like real WhatsApp support\n- Avoid markdown headers or code blocks\n\nGive a clear, accurate, and friendly response based only on the context.  \nIf the answer cannot be found in the context, reply: _\"I don't know based on the provided information.\"_\n",
        "options": {},
        "promptType": "define"
      },
      "typeVersion": 2.2
    },
    {
      "id": "81c63733-c5c8-4a4d-b634-e3d93d9bb1c6",
      "name": "Extraire le Texte du Fichier PDF",
      "type": "n8n-nodes-base.extractFromFile",
      "position": [
        2000,
        -496
      ],
      "parameters": {
        "options": {},
        "operation": "pdf"
      },
      "typeVersion": 1
    },
    {
      "id": "490c541e-fae8-4965-9840-9e13d562acdd",
      "name": "À la Réception d'un Message Chat",
      "type": "@n8n/n8n-nodes-langchain.chatTrigger",
      "position": [
        1392,
        64
      ],
      "webhookId": "2032c492-7d92-4d79-b545-5e0b9807253f",
      "parameters": {
        "options": {}
      },
      "typeVersion": 1.3
    },
    {
      "id": "8add4f5e-d2f8-4ea8-a6e1-6d4912d60393",
      "name": "Note Adhésive",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1296,
        -768
      ],
      "parameters": {
        "width": 1584,
        "height": 512,
        "content": "### Part 1: Feeding the AI Knowledge (The \"Librarian\" part)\n\nThis part of the workflow runs whenever someone uploads a new PDF contract using your Jotform form. Its only job is to read, understand, and store the information from that document.\n\n* A user uploads a PDF contract through a JotForm, which is then downloaded.\n* The system extracts the raw text and splits it into smaller, more manageable chunks.\n* Each text chunk is converted into a numerical representation, called an embedding, that captures its semantic meaning.\n* These embeddings and their original text are stored in a Supabase vector database, effectively creating a searchable knowledge library.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "d764c67f-cca8-476e-8d63-78d2733f6b64",
      "name": "Note Adhésive1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1296,
        -208
      ],
      "parameters": {
        "width": 1600,
        "height": 656,
        "content": "---\n\n### Part 2: Asking the AI a Question (The \"Researcher\" part)\n\nThis part of the workflow runs whenever a user sends a message in a chat interface. Its job is to find the right information from the library and generate an answer.\n\n* A user asks a question, which the system converts into a numerical embedding to understand its meaning.\n* This embedding is used to search a vector database, retrieving the most relevant chunks of text from the stored documents.\n* The retrieved text chunks are then provided to an AI agent as the sole context for answering the question.\n* The AI generates a precise and accurate answer based only on the provided context, ensuring it doesn't invent information."
      },
      "typeVersion": 1
    },
    {
      "id": "d1f68d16-6baa-4420-8606-dbc7ca5791c7",
      "name": "Déclencheur JotForm",
      "type": "n8n-nodes-base.jotFormTrigger",
      "position": [
        1376,
        -496
      ],
      "webhookId": "52c8e2e7-7277-4dfd-8336-c3857f945102",
      "parameters": {
        "form": "252862840518058",
        "onlyAnswers": false
      },
      "credentials": {
        "jotFormApi": {
          "id": "4612J1BsqtC505ac",
          "name": "secondary"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "8f035b6b-c3c0-449a-acb4-0c359c309e32",
      "name": "Récupérer la Nouvelle Base de Connaissances",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1584,
        -496
      ],
      "parameters": {
        "url": "=https://api.jotform.com/submission/{{ $json.submissionID }}?apiKey=enter-your-jotfomr-api",
        "options": {}
      },
      "typeVersion": 4.2
    },
    {
      "id": "b826edc5-d97f-498c-bea1-b3f3d1430635",
      "name": "Récupérer le Lien du Fichier de Base de Connaissances Téléchargé",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1792,
        -496
      ],
      "parameters": {
        "url": "={{ $json.content.answers['6'].answer[0] }}",
        "options": {
          "response": {
            "response": {
              "responseFormat": "file"
            }
          }
        },
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "APIKEY",
              "value": "enter-your-jotfomr-api"
            }
          ]
        }
      },
      "typeVersion": 4.2
    }
  ],
  "pinData": {},
  "connections": {
    "f74c0006-15e0-4f48-8c02-b0b765154c5b": {
      "main": [
        []
      ]
    },
    "3a39d174-434e-4c81-921c-8a354fad5ebe": {
      "main": [
        [
          {
            "node": "f74c0006-15e0-4f48-8c02-b0b765154c5b",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "d1f68d16-6baa-4420-8606-dbc7ca5791c7": {
      "main": [
        [
          {
            "node": "8f035b6b-c3c0-449a-acb4-0c359c309e32",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "4ce2ab5b-bb1e-46ce-9dd8-2cfdee5510a2": {
      "main": [
        [
          {
            "node": "3a39d174-434e-4c81-921c-8a354fad5ebe",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "76c8df3f-cf64-4848-b077-d04e9de88d12": {
      "main": [
        [
          {
            "node": "4ce2ab5b-bb1e-46ce-9dd8-2cfdee5510a2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "1c57da69-7af2-47c8-8bc2-92e49449bd81": {
      "main": [
        [
          {
            "node": "d5ed1aaf-6089-4731-980d-b5c356b22403",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "8f035b6b-c3c0-449a-acb4-0c359c309e32": {
      "main": [
        [
          {
            "node": "b826edc5-d97f-498c-bea1-b3f3d1430635",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "d8dba80c-597e-470b-852b-6d53363238bc": {
      "ai_languageModel": [
        [
          {
            "node": "f74c0006-15e0-4f48-8c02-b0b765154c5b",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "81c63733-c5c8-4a4d-b634-e3d93d9bb1c6": {
      "main": [
        [
          {
            "node": "1c57da69-7af2-47c8-8bc2-92e49449bd81",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "490c541e-fae8-4965-9840-9e13d562acdd": {
      "main": [
        [
          {
            "node": "76c8df3f-cf64-4848-b077-d04e9de88d12",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "d5ed1aaf-6089-4731-980d-b5c356b22403": {
      "main": [
        [
          {
            "node": "0b1c609f-e335-4541-8dae-e3517ec4bb63",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "b826edc5-d97f-498c-bea1-b3f3d1430635": {
      "main": [
        [
          {
            "node": "81c63733-c5c8-4a4d-b634-e3d93d9bb1c6",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Foire aux questions

Comment utiliser ce workflow ?

Copiez le code de configuration JSON ci-dessus, créez un nouveau workflow dans votre instance n8n et sélectionnez "Importer depuis le JSON", collez la configuration et modifiez les paramètres d'authentification selon vos besoins.

Dans quelles scénarios ce workflow est-il adapté ?

Intermédiaire

Est-ce payant ?

Ce workflow est entièrement gratuit et peut être utilisé directement. Veuillez noter que les services tiers utilisés dans le workflow (comme l'API OpenAI) peuvent nécessiter un paiement de votre part.

Informations sur le workflow
Niveau de difficulté
Intermédiaire
Nombre de nœuds15
Catégorie-
Types de nœuds10
Description de la difficulté

Adapté aux utilisateurs expérimentés, avec des workflows de complexité moyenne contenant 6-15 nœuds

Liens externes
Voir sur n8n.io

Partager ce workflow

Catégories

Catégories: 34