Construir un chatbot de base de conocimiento con Jotform, RAG en Supabase, Together AI y Gemini

Intermedio

Este es unautomatización que contiene 15 nodos.Utiliza principalmente nodos como Code, Supabase, Aggregate, HttpRequest, JotFormTrigger. Construye un chatbot de base de conocimiento usando Jotform, RAG en Supabase, Together AI y Gemini

Requisitos previos
  • URL y Clave de API de Supabase
  • Pueden requerirse credenciales de autenticación para la API de destino
  • Clave de API de Google Gemini

Categoría

-
Vista previa del flujo de trabajo
Visualización de las conexiones entre nodos, con soporte para zoom y panorámica
Exportar flujo de trabajo
Copie la siguiente configuración JSON en n8n para importar y usar este flujo de trabajo
{
  "meta": {
    "instanceId": "93f396852104089b8670e7494b0f3668b420464668ae4a8c1d6b4b5799f8e3ef",
    "templateCredsSetupCompleted": true
  },
  "nodes": [
    {
      "id": "1c57da69-7af2-47c8-8bc2-92e49449bd81",
      "name": "Dividir en Fragmentos",
      "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": "Incrustar Documento Subido",
      "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": "Guardar la Incrustación en la BD",
      "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": "Agregar",
      "type": "n8n-nodes-base.aggregate",
      "position": [
        2064,
        64
      ],
      "parameters": {
        "options": {},
        "fieldsToAggregate": {
          "fieldToAggregate": [
            {
              "fieldToAggregate": "chunk"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "4ce2ab5b-bb1e-46ce-9dd8-2cfdee5510a2",
      "name": "Buscar Incrustaciones",
      "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": "Incrustar Mensaje de Usuario",
      "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": "Agente de 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": "Extraer Texto de Archivo PDF",
      "type": "n8n-nodes-base.extractFromFile",
      "position": [
        2000,
        -496
      ],
      "parameters": {
        "options": {},
        "operation": "pdf"
      },
      "typeVersion": 1
    },
    {
      "id": "490c541e-fae8-4965-9840-9e13d562acdd",
      "name": "Cuando se recibe un mensaje de 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": "Nota Adhesiva",
      "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": "Nota Adhesiva1",
      "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": "Activador de 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": "Capturar Nueva Base de Conocimientos",
      "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": "Capturar el Enlace del Archivo de Base de Conocimientos Subido",
      "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
          }
        ]
      ]
    }
  }
}
Preguntas frecuentes

¿Cómo usar este flujo de trabajo?

Copie el código de configuración JSON de arriba, cree un nuevo flujo de trabajo en su instancia de n8n y seleccione "Importar desde JSON", pegue la configuración y luego modifique la configuración de credenciales según sea necesario.

¿En qué escenarios es adecuado este flujo de trabajo?

Intermedio

¿Es de pago?

Este flujo de trabajo es completamente gratuito, puede importarlo y usarlo directamente. Sin embargo, tenga en cuenta que los servicios de terceros utilizados en el flujo de trabajo (como la API de OpenAI) pueden requerir un pago por su cuenta.

Información del flujo de trabajo
Nivel de dificultad
Intermedio
Número de nodos15
Categoría-
Tipos de nodos10
Descripción de la dificultad

Adecuado para usuarios con experiencia intermedia, flujos de trabajo de complejidad media con 6-15 nodos

Enlaces externos
Ver en n8n.io

Compartir este flujo de trabajo

Categorías

Categorías: 34