Créer une base de données vectorielle RAG à partir de documents Google Drive avec Gemini et Supabase

Avancé

Ceci est unDocument Extraction, AI RAGworkflow d'automatisation du domainecontenant 16 nœuds.Utilise principalement des nœuds comme Code, Postgres, GoogleDrive, SplitInBatches, ExecuteWorkflowTrigger. Créer une base de données de vecteurs RAG à partir de documents Google Drive en utilisant Gemini et Supabase

Prérequis
  • Informations de connexion à la base de données PostgreSQL
  • Informations d'identification Google Drive API
  • URL et Clé API Supabase
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": "a243f35537ecbb3a29ba49c4cf2200720075b362bcc7d02523f79748238bcfd6"
  },
  "nodes": [
    {
      "id": "97927b62-d8b9-4c98-b3d1-160c81c524e5",
      "name": "Embeddings Google Gemini4",
      "type": "@n8n/n8n-nodes-langchain.embeddingsGoogleGemini",
      "position": [
        208,
        320
      ],
      "parameters": {},
      "credentials": {
        "googlePalmApi": {
          "id": "VCZQfcHNj0rHxcNf",
          "name": "GEMINI_API_KUDDUS"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "a9afa4ed-5e53-423c-9521-a79b17dbdde1",
      "name": "Chargeur de données par défaut2",
      "type": "@n8n/n8n-nodes-langchain.documentDefaultDataLoader",
      "position": [
        384,
        304
      ],
      "parameters": {
        "options": {},
        "dataType": "binary"
      },
      "typeVersion": 1.1
    },
    {
      "id": "478d1053-af37-451e-9baf-7708f43653fa",
      "name": "Exécuter une requête SQL",
      "type": "n8n-nodes-base.postgres",
      "position": [
        -624,
        48
      ],
      "parameters": {
        "query": "DROP TABLE IF EXISTS documents CASCADE;\n\nCREATE EXTENSION IF NOT EXISTS vector;\n\nCREATE TABLE IF NOT EXISTS documents (\n  id bigserial PRIMARY KEY,\n  content text,\n  metadata jsonb,\n  embedding vector(768)\n);\n\nCREATE OR REPLACE FUNCTION match_documents(\n  query_embedding vector(768),\n  match_count int DEFAULT NULL,\n  filter jsonb DEFAULT '{}'::jsonb\n)\nRETURNS TABLE (\n  id bigint,\n  content text,\n  metadata jsonb,\n  similarity double precision\n)\nLANGUAGE sql\nAS $$\n  SELECT\n    d.id,\n    d.content,\n    d.metadata,\n    1 - (d.embedding <=> query_embedding) AS similarity\n  FROM documents d\n  WHERE (filter = '{}'::jsonb OR d.metadata @> filter)\n  ORDER BY d.embedding <=> query_embedding\n  LIMIT match_count;\n$$;\n",
        "options": {},
        "operation": "executeQuery"
      },
      "credentials": {
        "postgres": {
          "id": "KbYSAyR6T3ljhFKn",
          "name": "Postgres account"
        }
      },
      "typeVersion": 2.6
    },
    {
      "id": "7e4395b7-b822-41b6-aac3-0d4c2e3a749b",
      "name": "Code en JavaScript",
      "type": "n8n-nodes-base.code",
      "position": [
        -848,
        48
      ],
      "parameters": {
        "jsCode": "// Get the Drive_Folder_link from the workflow input\nconst driveUrl = $input.first().json.Drive_Folder_link;\n\n// Extract Google Drive folder/file ID from URL\nfunction getDriveId(url) {\n  const folderMatch = url.match(/\\/folders\\/([a-zA-Z0-9_-]+)/);\n  const fileMatch = url.match(/\\/file\\/d\\/([a-zA-Z0-9_-]+)/);\n  return folderMatch ? folderMatch[1] : (fileMatch ? fileMatch[1] : null);\n}\n\n// Process input items\nreturn items.map(item => {\n  const chatInput = item.json.chatInput || driveUrl || '';\n  const driveId = getDriveId(chatInput);\n\n  return {\n    json: {\n      originalInput: chatInput,\n      folderId: driveId,\n      driveId: driveId\n    }\n  };\n});\n"
      },
      "typeVersion": 2
    },
    {
      "id": "3a4041d1-25ac-4ab4-974e-a5460c9a8ffa",
      "name": "Lorsqu'exécuté par un autre workflow",
      "type": "n8n-nodes-base.executeWorkflowTrigger",
      "position": [
        -1056,
        48
      ],
      "parameters": {
        "inputSource": "jsonExample",
        "jsonExample": "{\n  \"Drive_Folder_link\": \"https://drive.google.com/drive/folders/example\"\n}"
      },
      "typeVersion": 1.1
    },
    {
      "id": "92141102-016e-4e8a-b69f-f09d0522924d",
      "name": "Note adhésive1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1504,
        -128
      ],
      "parameters": {
        "color": 5,
        "width": 368,
        "height": 512,
        "content": "# 📁 Drive to Supabase Vector Store for Study RAG\n\nProcesses Google Drive folder files into Supabase vector embeddings for RAG applications.\n\n**Flow:** Drive URL → Parse ID → Init DB → Fetch Files → Loop → Download → Embed → Store\n\n**Requirements:**\n- Google Drive OAuth2\n- Supabase + Postgres credentials\n- Google Gemini API key\n\n**Input:** `{\"Drive_Folder_link\": \"your_drive_url\"}`\n**Output:** Vector embeddings in Supabase documents table\n"
      },
      "typeVersion": 1
    },
    {
      "id": "6960ace8-fd01-4f9e-acfc-05185a0b197f",
      "name": "Note adhésive",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1104,
        208
      ],
      "parameters": {
        "width": 176,
        "height": 128,
        "content": "**Trigger Node** - Starts workflow when called from another n8n workflow. Accepts Drive folder URL as input.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "2befa4d1-ded3-4eeb-93ec-acdc9a9e22fb",
      "name": "Note adhésive2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -864,
        208
      ],
      "parameters": {
        "width": 150,
        "height": 128,
        "content": "**Extract Folder ID** - Parses Google Drive URL using regex to extract folder/file ID for API calls.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "e71b4968-43de-477f-9de6-474cd471c405",
      "name": "Note adhésive3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -656,
        208
      ],
      "parameters": {
        "width": 176,
        "content": "**Initialize Database** - Creates Supabase vector table with pgvector extension and match_documents search function. ⚠️ Drops existing table!\n"
      },
      "typeVersion": 1
    },
    {
      "id": "4ac27951-096f-44ba-8e66-be73b3c0d380",
      "name": "Boucler sur les éléments",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        -192,
        48
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "d556d5eb-6216-4e39-bf8f-07a948fcbb0d",
      "name": "Rechercher fichiers et dossiers",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        -416,
        48
      ],
      "parameters": {
        "filter": {
          "folderId": {
            "__rl": true,
            "mode": "id",
            "value": "={{ $('Code in JavaScript').item.json.folderId }}"
          }
        },
        "options": {},
        "resource": "fileFolder"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "id": "CVN95k3ctbjWs60e",
          "name": "Google_Drive_gaming"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "db2f57b6-1aa9-4926-a211-7362d5d4533e",
      "name": "Insérer dans Supabase Vectorstore",
      "type": "@n8n/n8n-nodes-langchain.vectorStoreSupabase",
      "position": [
        256,
        48
      ],
      "parameters": {
        "mode": "insert",
        "options": {
          "queryName": "match_documents"
        },
        "tableName": {
          "__rl": true,
          "mode": "list",
          "value": "documents",
          "cachedResultName": "documents"
        }
      },
      "credentials": {
        "supabaseApi": {
          "id": "OweRv8RLSfhKJyfg",
          "name": "Supabase account"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "09addf62-6c1a-4af4-a5d5-6b2323f64886",
      "name": "Télécharger le fichier",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        48,
        64
      ],
      "parameters": {
        "fileId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $json.id }}"
        },
        "options": {
          "googleFileConversion": {
            "conversion": {
              "docsToFormat": "text/plain"
            }
          }
        },
        "operation": "download"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "id": "CVN95k3ctbjWs60e",
          "name": "Google_Drive_gaming"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "0c929411-a2d2-49ff-ab92-09aeece9d892",
      "name": "Note adhésive4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -432,
        224
      ],
      "parameters": {
        "width": 176,
        "height": 128,
        "content": "**List Drive Files** - Retrieves all files from the specified Google Drive folder using extracted folder ID.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "b2b6df82-5145-4719-b3bc-a5501e31ed08",
      "name": "Note adhésive5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        16,
        -112
      ],
      "parameters": {
        "width": 150,
        "content": "**List Drive Files** - Retrieves all files from the specified Google Drive folder using extracted folder ID.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "0d6c2252-f11a-4a12-978c-b121c68c8663",
      "name": "Note adhésive6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        240,
        -208
      ],
      "parameters": {
        "color": 7,
        "height": 240,
        "content": "**Store Embeddings** - Generates 768-dim vectors via Gemini and inserts documents into Supabase for semantic search.\n**AI Embeddings** - Converts text to 768-dimensional vectors using Google Gemini text-embedding-004 model.\n**Document Loader** - Extracts and formats text from binary files for the embedding generator.\n"
      },
      "typeVersion": 1
    }
  ],
  "pinData": {},
  "connections": {
    "09addf62-6c1a-4af4-a5d5-6b2323f64886": {
      "main": [
        [
          {
            "node": "db2f57b6-1aa9-4926-a211-7362d5d4533e",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "4ac27951-096f-44ba-8e66-be73b3c0d380": {
      "main": [
        [],
        [
          {
            "node": "09addf62-6c1a-4af4-a5d5-6b2323f64886",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "7e4395b7-b822-41b6-aac3-0d4c2e3a749b": {
      "main": [
        [
          {
            "node": "478d1053-af37-451e-9baf-7708f43653fa",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "478d1053-af37-451e-9baf-7708f43653fa": {
      "main": [
        [
          {
            "node": "d556d5eb-6216-4e39-bf8f-07a948fcbb0d",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "a9afa4ed-5e53-423c-9521-a79b17dbdde1": {
      "ai_document": [
        [
          {
            "node": "db2f57b6-1aa9-4926-a211-7362d5d4533e",
            "type": "ai_document",
            "index": 0
          }
        ]
      ]
    },
    "d556d5eb-6216-4e39-bf8f-07a948fcbb0d": {
      "main": [
        [
          {
            "node": "4ac27951-096f-44ba-8e66-be73b3c0d380",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "97927b62-d8b9-4c98-b3d1-160c81c524e5": {
      "ai_embedding": [
        [
          {
            "node": "db2f57b6-1aa9-4926-a211-7362d5d4533e",
            "type": "ai_embedding",
            "index": 0
          }
        ]
      ]
    },
    "db2f57b6-1aa9-4926-a211-7362d5d4533e": {
      "main": [
        [
          {
            "node": "4ac27951-096f-44ba-8e66-be73b3c0d380",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "3a4041d1-25ac-4ab4-974e-a5460c9a8ffa": {
      "main": [
        [
          {
            "node": "7e4395b7-b822-41b6-aac3-0d4c2e3a749b",
            "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é ?

Avancé - Extraction de documents, RAG IA

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é
Avancé
Nombre de nœuds16
Catégorie2
Types de nœuds9
Description de la difficulté

Adapté aux utilisateurs avancés, avec des workflows complexes contenant 16+ nœuds

Auteur
Mantaka Mahir

Mantaka Mahir

@mantakamahir

Al Automation Expert || Al Agents || n8n || Python || LangChain || Helping businesses scale revenue and reduce costs with Al driven automation .

Liens externes
Voir sur n8n.io

Partager ce workflow

Catégories

Catégories: 34