Guía de Vectorización: Google Docs y Sheets a Supabase
Esta guía te enseñará cómo preparar tu base de datos en Supabase y cómo configurar los flujos en n8n para convertir tus documentos (Google Docs) y hojas de cálculo (Google Sheets) en "vectores" que la Inteligencia Artificial pueda entender.
¿Qué son los Vectores y cuándo usarlos?
Antes de empezar, es importante entender qué estamos haciendo.
🧬 ¿Qué es un Vector? (Velocidad y Precisión)
Piensa en la vectorización como un índice inteligente y ultra-rápido para tu Agente. Su función principal es permitir que la IA encuentre el dato exacto en milisegundos sin tener que leerse todo el documento cada vez.
- Mejores Tiempos de Respuesta: En lugar de procesar un manual de 100 páginas, el sistema de vectores le entrega al Agente solo el párrafo exacto que necesita. Esto hace que la respuesta sea casi instantánea.
- Mayor Precisión: Al buscar por "significado" (vectores) y no por palabras exactas, el Agente encuentra la respuesta correcta incluso si el usuario pregunta con faltas de ortografía o usando sinónimos.
✅ ¿Cuándo SÍ vectorizar para tu Bot?
El objetivo principal es no saturar la memoria (Context Window) de tu Agente y ahorrar costos.
- Documentos Extensos: Si tu información ocupa más de 2 o 3 páginas de Word/Docs. Si intentas pasarle todo el manual completo al bot en cada mensaje, se confundirá, será lento y te costará mucho dinero.
- Catálogos Grandes (Sheets): Si tienes una lista de precios o inventario con más de 50 filas/productos. Vectorizar permite que el bot encuentre "Zapatillas rojas" entre 2,000 productos en milisegundos.
- Búsqueda Semántica: Cuando necesitas que el bot entienda la intención del usuario ("quiero algo cómodo para correr") y busque en tu base de datos el producto que mejor encaje, aunque no tenga la palabra "cómodo" en el título.
❌ ¿Cuándo NO es necesario vectorizar?
Si la información es corta, es mucho mejor y más preciso dársela directamente en las instrucciones (System Prompt) del Agente.
- Información Breve: Si tu documento tiene menos de 2 páginas. Es más eficiente que el bot lo tenga siempre presente en su memoria inmediata.
- Listas Pequeñas: Un menú de restaurante con 20 platos o una lista de 10 sucursales. No hace falta vectorizar, cabe perfectamente en el prompt.
1. Preparación de Supabase (SQL)
Antes de tocar n8n, necesitamos crear la estructura en Supabase donde se guardará la información. Esto se hace mediante un "Script SQL".
Pasos:
- Entra a tu proyecto de Supabase.
- Ve al apartado de SQL Editor (icono de hoja con código en la barra lateral).
- Crea una New Query.
- Copia y pega el siguiente código en el editor.
- ⚠️ IMPORTANTE: Debes cambiar la palabra
documentspor un nombre único para este cliente (ej.documents_empresa_x). Si no lo haces, mezclarás datos de todos tus clientes.- Presiona Ctrl + F (Buscar) y luego la flechita para abrir Replace (o Ctrl + H).
- Busca:
documents - Reemplaza con:
documents_nombre_cliente(ej.documents_pizzeria_luigi) - Dale a Replace All.
- Una vez modificado el nombre, haz clic en RUN.

-- Create a table to store your documents
create table documents (
id bigserial primary key,
content text, -- corresponds to Document.pageContent
metadata jsonb, -- corresponds to Document.metadata
embedding vector(1536) -- 1536 works for OpenAI embeddings, change if needed
);
-- Create a function to search for documents
create function match_documents (
query_embedding vector(1536),
match_count int default null,
filter jsonb DEFAULT '{}'
) returns table (
id bigint,
content text,
metadata jsonb,
similarity float
)
language plpgsql
as $$
#variable_conflict use_column
begin
return query
select
id,
content,
metadata,
1 - (documents.embedding <=> query_embedding) as similarity
from documents
where metadata @> filter
order by documents.embedding <=> query_embedding
limit match_count;
end;
$$;2. Flujo de Vectorización: Google Docs
Este flujo toma un documento de texto, borra la información vieja para evitar duplicados y sube la nueva versión vectorizada.

Código del Flujo (Copiar y Pegar en n8n)
{
"nodes": [
{
"parameters": {
"dataType": "binary",
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.documentDefaultDataLoader",
"typeVersion": 1,
"position": [
208,
240
],
"id": "44d7c18e-18e9-45ae-988a-29967d1af72e",
"name": "Default Data Loader"
},
{
"parameters": {
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.embeddingsOpenAi",
"typeVersion": 1.2,
"position": [
-16,
224
],
"id": "d5a3da84-c3ef-4384-900e-6a10909ed472",
"name": "Embeddings OpenAI1",
"credentials": {
"openAiApi": {
"id": "C0sFmtnHeO8C5RUZ",
"name": "Estolcomo"
}
}
},
{
"parameters": {},
"type": "n8n-nodes-base.manualTrigger",
"typeVersion": 1,
"position": [
-832,
32
],
"id": "9c8cbb93-3d51-4c7f-952f-cc5288fa622f",
"name": "When clicking ‘Execute workflow’"
},
{
"parameters": {
"method": "DELETE",
"url": "https://supabaserest.botinfy.com/documents_estocolmo_whatsapp",
"sendQuery": true,
"queryParameters": {
"parameters": [
{
"name": "select",
"value": "*"
},
{
"name": "id",
"value": "gt.0"
}
]
},
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "apikey",
"value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzdXBhYmFzZSIsImlhdCI6MTc0NTA5NzY2MCwiZXhwIjo0OTAwNzcxMjYwLCJyb2xlIjoic2VydmljZV9yb2xlIn0.Bz4y6IK6IoHY9iU9PvJmgI78M8zZHxSlKA1QTWHCVg4"
},
{
"name": "Authorization",
"value": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzdXBhYmFzZSIsImlhdCI6MTc0NTA5NzY2MCwiZXhwIjo0OTAwNzcxMjYwLCJyb2xlIjoic2VydmljZV9yb2xlIn0.Bz4y6IK6IoHY9iU9PvJmgI78M8zZHxSlKA1QTWHCVg4"
}
]
},
"options": {
"allowUnauthorizedCerts": true
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
-448,
288
],
"id": "39f73689-bb93-482f-ab42-2189d2ea4465",
"name": "borrarViejaDB"
},
{
"parameters": {
"operation": "download",
"fileId": {
"__rl": true,
"value": "https://docs.google.com/document/d/1JKJ-wym2KYU2B8-ELSKP5yFJIkwz72BhaD5GDIz3ee8/edit?tab=t.0",
"mode": "url"
},
"options": {}
},
"type": "n8n-nodes-base.googleDrive",
"typeVersion": 3,
"position": [
-240,
-16
],
"id": "8a43b428-7ac4-4460-bdc8-b5d0045b0631",
"name": "descargarNuevaDBDesdeDocs",
"credentials": {
"googleDriveOAuth2Api": {
"id": "xoB1knw4kQ5Q0Ud2",
"name": "Google Drive account DIEGO"
}
}
},
{
"parameters": {
"mode": "insert",
"tableName": {
"__rl": true,
"value": "documents_estocolmo_whatsapp",
"mode": "list",
"cachedResultName": "documents_estocolmo_whatsapp"
},
"embeddingBatchSize": 1000,
"options": {
"queryName": "match_documents_estocolmo_whatsapp"
}
},
"type": "@n8n/n8n-nodes-langchain.vectorStoreSupabase",
"typeVersion": 1.1,
"position": [
64,
-16
],
"id": "2509fc65-3c6f-4bc2-9e70-110a7c980a3c",
"name": "ActualizarDBConDocs",
"credentials": {
"supabaseApi": {
"id": "LYeLwe1lQS9TclPX",
"name": "Supabase account Diego"
}
}
},
{
"parameters": {
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.textSplitterRecursiveCharacterTextSplitter",
"typeVersion": 1,
"position": [
208,
432
],
"id": "e9cbcc4b-3262-4109-a410-b92ee1bcd9b0",
"name": "Recursive Character Text Splitter"
}
],
"connections": {
"Default Data Loader": {
"ai_document": [
[
{
"node": "ActualizarDBConDocs",
"type": "ai_document",
"index": 0
}
]
]
},
"Embeddings OpenAI1": {
"ai_embedding": [
[
{
"node": "ActualizarDBConDocs",
"type": "ai_embedding",
"index": 0
}
]
]
},
"When clicking ‘Execute workflow’": {
"main": [
[
{
"node": "borrarViejaDB",
"type": "main",
"index": 0
}
]
]
},
"borrarViejaDB": {
"main": [
[
{
"node": "descargarNuevaDBDesdeDocs",
"type": "main",
"index": 0
}
]
]
},
"descargarNuevaDBDesdeDocs": {
"main": [
[
{
"node": "ActualizarDBConDocs",
"type": "main",
"index": 0
}
]
]
},
"ActualizarDBConDocs": {
"main": [
[]
]
},
"Recursive Character Text Splitter": {
"ai_textSplitter": [
[
{
"node": "Default Data Loader",
"type": "ai_textSplitter",
"index": 0
}
]
]
}
}
}3. Flujo de Vectorización: Google Sheets
Este flujo es similar al anterior, pero optimizado para hojas de cálculo (Excel/Sheets), ideal para listas de precios o inventarios.

Código del Flujo (Copiar y Pegar en n8n)
{
"nodes": [
{
"parameters": {},
"type": "n8n-nodes-base.manualTrigger",
"typeVersion": 1,
"position": [
448,
-192
],
"id": "9c8cbb93-3d51-4c7f-952f-cc5288fa622f",
"name": "When clicking ‘Execute workflow’"
},
{
"parameters": {
"method": "DELETE",
"url": "=https://supabaserest.botinfy.com/documents_fashioncapitol",
"sendQuery": true,
"queryParameters": {
"parameters": [
{
"name": "select",
"value": "*"
},
{
"name": "id",
"value": "gt.0"
}
]
},
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "apikey",
"value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzdXBhYmFzZSIsImlhdCI6MTc0NTA5NzY2MCwiZXhwIjo0OTAwNzcxMjYwLCJyb2xlIjoic2VydmljZV9yb2xlIn0.Bz4y6IK6IoHY9iU9PvJmgI78M8zZHxSlKA1QTWHCVg4"
},
{
"name": "Authorization",
"value": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzdXBhYmFzZSIsImlhdCI6MTc0NTA5NzY2MCwiZXhwIjo0OTAwNzcxMjYwLCJyb2xlIjoic2VydmljZV9yb2xlIn0.Bz4y6IK6IoHY9iU9PvJmgI78M8zZHxSlKA1QTWHCVg4"
}
]
},
"options": {
"allowUnauthorizedCerts": true
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
720,
-32
],
"id": "c4ef013e-61b6-48ed-ac2b-090bf0144d3f",
"name": "borrarViejaDB1"
},
{
"parameters": {
"operation": "download",
"fileId": {
"__rl": true,
"value": "https://docs.google.com/spreadsheets/d/1nEDMhrUiSUEMCXrRwBOqr4HQ5I60xZlh-M2eJsbu-8w/edit?gid=0#gid=0",
"mode": "url"
},
"options": {
"googleFileConversion": {
"conversion": {}
}
}
},
"type": "n8n-nodes-base.googleDrive",
"typeVersion": 3,
"position": [
960,
-64
],
"id": "83363a85-d1f4-4e08-8551-764e08402fbd",
"name": "descargarNuevaDBDesdeDocs1",
"credentials": {
"googleDriveOAuth2Api": {
"id": "xoB1knw4kQ5Q0Ud2",
"name": "Google Drive account DIEGO"
}
}
},
{
"parameters": {
"dataType": "binary",
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.documentDefaultDataLoader",
"typeVersion": 1,
"position": [
1408,
224
],
"id": "6072b2df-033b-4ca5-ab2d-90ebd16e91af",
"name": "Default Data Loader1"
},
{
"parameters": {
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.embeddingsOpenAi",
"typeVersion": 1.2,
"position": [
1248,
208
],
"id": "1ab3a542-c6ca-46b2-b8fa-563c51893318",
"name": "Embeddings OpenAI",
"credentials": {
"openAiApi": {
"id": "huLOoXQmbxhcFmPb",
"name": " OpenAI: MOXYE"
}
}
},
{
"parameters": {
"mode": "insert",
"tableName": {
"__rl": true,
"value": "documents_primeshoes_info_tiendas",
"mode": "list",
"cachedResultName": "documents_primeshoes_info_tiendas"
},
"options": {
"queryName": "match_documents_primeshoes_info_tiendas"
}
},
"type": "@n8n/n8n-nodes-langchain.vectorStoreSupabase",
"typeVersion": 1.1,
"position": [
1280,
-64
],
"id": "083577d1-1231-41ad-8a78-dfb5d2c0580e",
"name": "ActualizarDBConDocs1",
"credentials": {
"supabaseApi": {
"id": "LYeLwe1lQS9TclPX",
"name": "Supabase account Diego"
}
}
},
{
"parameters": {
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.textSplitterRecursiveCharacterTextSplitter",
"typeVersion": 1,
"position": [
1424,
464
],
"id": "6c46f6b6-8bbf-457f-903e-33c9db31a6d8",
"name": "Recursive Character Text Splitter1"
}
],
"connections": {
"When clicking ‘Execute workflow’": {
"main": [
[
{
"node": "borrarViejaDB1",
"type": "main",
"index": 0
}
]
]
},
"borrarViejaDB1": {
"main": [
[
{
"node": "descargarNuevaDBDesdeDocs1",
"type": "main",
"index": 0
}
]
]
},
"descargarNuevaDBDesdeDocs1": {
"main": [
[
{
"node": "ActualizarDBConDocs1",
"type": "main",
"index": 0
}
]
]
},
"Default Data Loader1": {
"ai_document": [
[
{
"node": "ActualizarDBConDocs1",
"type": "ai_document",
"index": 0
}
]
]
},
"Embeddings OpenAI": {
"ai_embedding": [
[
{
"node": "ActualizarDBConDocs1",
"type": "ai_embedding",
"index": 0
}
]
]
},
"Recursive Character Text Splitter1": {
"ai_textSplitter": [
[
{
"node": "Default Data Loader1",
"type": "ai_textSplitter",
"index": 0
}
]
]
}
}
}4. Explicación de los Nodos y Configuración
Aquí te explicamos qué hace cada parte del rompecabezas y qué debes modificar para cada cliente.
🛑 Nodo HTTP Request (borrarViejaDB) - ¡PELIGRO!
Este nodo es crítico. Su función es BORRAR toda la información que había antes en la tabla de Supabase para luego subir la nueva.
- ¿Por qué? Si no borras lo viejo, al subir el documento actualizado, tendrás la información duplicada (la vieja + la nueva).
- ⚠️ CUIDADO: Asegúrate de que la URL apunte a la tabla correcta. Si te equivocas de tabla, borrarás la base de datos de otro cliente.
📄 Nodo Google Drive (descargarNuevaDB)
Se conecta a tu Google Drive y descarga el archivo.
- Configuración por Cliente: Debes cambiar el
File IDo la URL del archivo para que apunte al documento del cliente específico.
✂️ Recursive Character Text Splitter
Este nodo "pica" el documento en pedacitos pequeños para que la IA pueda leerlos.
- Chunk Size (Tamaño del trozo): Define qué tan grandes son los pedazos de texto.
- Valor recomendado:
1000caracteres. Si es muy pequeño, se pierde contexto; si es muy grande, se pierde precisión.
- Valor recomendado:
- Chunk Overlap (Superposición): Es la cantidad de caracteres que se repiten entre un trozo y el siguiente.
- Valor recomendado:
100o200. Sirve para que no se corten frases a la mitad y la IA entienda la continuidad.
- Valor recomendado:
🧠 Embeddings OpenAI
Es el traductor. Convierte el texto (palabras) en vectores (números) que la base de datos entiende.
🗄️ Supabase Vector Store (ActualizarDB)
Es quien guarda finalmente la información en la tabla.
- Table Name: Aquí debes escribir el nombre de la tabla que creaste en el paso 1 (ej.
documents_cliente_x). - Embedding Batch Size: Controla cuántas filas se suben a la vez.
- Valor recomendado:
1000. Si pones un número muy bajo, tardará mucho. Si es muy alto, puede dar error de timeout.
- Valor recomendado:
5. ¿Qué debo cambiar para cada cliente?
Cada vez que implementes esto para un nuevo cliente, debes modificar obligatoriamente:
En el nodo
borrarViejaDB:- Cambia la URL para que termine en el nombre de la tabla del nuevo cliente.
- Actualiza las credenciales (
apikeyyAuthorization) en los Headers si usas un proyecto de Supabase distinto.
En el nodo
descargarNuevaDB:- Cambia el File ID por el enlace del Google Doc/Sheet del nuevo cliente.
En el nodo
ActualizarDBConDocs:- Cambia el Table Name por el nombre de la tabla del nuevo cliente.
- Asegúrate de que las credenciales de Supabase sean las correctas.
💡 Consejos de Vectorización
- Limpieza: Antes de subir un Google Doc, asegúrate de que esté bien redactado, sin faltas de ortografía graves y con estructura clara.
- Sheets: Para listas de precios, asegúrate de que la primera fila tenga los encabezados claros (Producto, Precio, Descripción).