Un agente conversacional que responde preguntas sobre tus documentos de Google Drive, orquestado con n8n y potenciado por IA.
Las organizaciones a menudo tienen grandes volúmenes de conocimiento almacenados en documentos (PDFs, Docs, etc.) dentro de Google Drive. Acceder a una información específica puede ser lento y tedioso, requiriendo búsquedas manuales.
Este agente RAG automatiza el proceso, permitiendo a los usuarios "chatear" con sus documentos. Simplemente hacen una pregunta en lenguaje natural, y el agente busca la información relevante en Google Drive y genera una respuesta precisa y contextualizada.
- Orquestación con n8n: Flujo de trabajo robusto y visualmente gestionable que se encarga de todo el proceso.
- Base de Conocimiento en Google Drive: Utiliza tus documentos existentes en Google Drive como fuente de verdad.
- Base de Datos Vectorial con Supabase: Almacena eficientemente los embeddings de los documentos para búsquedas semánticas rápidas.
- Modelo de Lenguaje (LLM): Integrado con modelos como los de OpenAI para generar respuestas coherentes y contextualizadas.
- Ingesta de Datos: Procesa los documentos de Google Drive, los divide, genera embeddings y los almacena en Supabase.
- Inferencia/Preguntas: Recibe una pregunta, busca la información más relevante en la base de datos vectorial y genera una respuesta.
- Fácil de Desplegar: Utiliza Docker para un entorno de desarrollo y despliegue sencillo.
El siguiente diagrama ilustra cómo interactúan los componentes del sistema:
graph TD
subgraph "Usuario"
A[👤 Usuario Final]
end
subgraph "Plataforma de Orquestación"
B(⚙️ n8n Workflow)
end
subgraph "Fuentes y Almacenamiento"
C[📄 Google Drive]
D[(🐘 Supabase/pgvector)]
end
subgraph "Servicios de IA"
E[🧠 LLM & Embedding Model]
end
A -- 1. Hace una pregunta --> B
B -- 2. Crea embedding de la pregunta --> E
B -- 3. Busca chunks relevantes --> D
D -- 4. Devuelve chunks --> B
B -- 5. Construye prompt con contexto --> E
E -- 6. Genera respuesta --> B
B -- 7. Devuelve respuesta --> A
C -- "Proceso de Ingesta" --> B
B -- "Proceso de Ingesta" --> D
Sigue estos pasos para poner en marcha el agente en tu entorno local.
- Docker y Docker Compose: Asegúrate de tenerlos instalados.
- Cuenta de n8n: Puedes usar n8n Cloud o una instancia local (este repo la incluye).
- Cuenta de Supabase: Crea un proyecto en Supabase.
- Cuenta de Google Cloud: Para configurar las credenciales de la API de Google Drive.
- Clave de API de OpenAI: O del proveedor de LLM que prefieras.
git clone [https://github.com/renebell0/n8n-rag-agent-google-drive-supabase.git](https://github.com/renebell0/n8n-rag-agent-google-drive-supabase.git)
cd n8n-rag-agent-google-drive-supabase- Ve a tu proyecto de Supabase.
- En el
SQL Editor, ejecuta la siguiente consulta para habilitar la extensiónpgvector:CREATE EXTENSION IF NOT EXISTS vector;
- Crea una tabla para almacenar los documentos y sus embeddings. Ejecuta esto en el
SQL Editor:CREATE TABLE documents ( id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, content TEXT, embedding VECTOR(1536), -- El tamaño depende del modelo, 1536 es para text-embedding-ada-002 de OpenAI metadata JSONB, created_at TIMESTAMPTZ DEFAULT NOW() );
- Crea una función para realizar la búsqueda por similitud:
CREATE OR REPLACE FUNCTION match_documents ( query_embedding VECTOR(1536), match_threshold FLOAT, match_count INT ) RETURNS TABLE ( id BIGINT, content TEXT, metadata JSONB, similarity FLOAT ) LANGUAGE sql STABLE AS $$ SELECT documents.id, documents.content, documents.metadata, 1 - (documents.embedding <=> query_embedding) AS similarity FROM documents WHERE 1 - (documents.embedding <=> query_embedding) > match_threshold ORDER BY similarity DESC LIMIT match_count; $$;
-
Crea un archivo
.enva partir del ejemplo:cp src/.env.example src/.env
-
Edita el archivo
src/.envy añade tus credenciales:# Credenciales de Supabase (obtenidas del dashboard de tu proyecto) SUPABASE_URL="https://<tu-proyecto>.supabase.co" SUPABASE_KEY="<tu-llave-anon-publica>" # Credenciales de OpenAI OPENAI_API_KEY="sk-..." # Credenciales de Google (ver siguiente paso) # ... # Configuración de n8n (puedes dejar los valores por defecto) N8N_HOST="localhost" N8N_PORT=5678
- Ve a la Consola de Google Cloud.
- Crea un nuevo proyecto.
- Habilita la API de Google Drive.
- Ve a "Credenciales", haz clic en "Crear credenciales" y selecciona "ID de cliente de OAuth".
- Elige "Aplicación de escritorio" como tipo de aplicación.
- Descarga el archivo JSON con tus credenciales.
- En n8n, tendrás que crear una nueva credencial de "Google OAuth2 API" y subir este archivo JSON.
Desde el directorio src, ejecuta:
docker-compose up -dEsto iniciará una instancia de n8n accesible en http://localhost:5678.
- Abre n8n en tu navegador (
http://localhost:5678). - Crea un nuevo flujo de trabajo (
Workflow). - Importa el archivo
n8n-rag-agent-google-drive-supabase.jsondesde este repositorio. - Verás el flujo de trabajo en el editor de n8n.
- Configura las credenciales: Haz clic en cada nodo que tenga una advertencia (Google Drive, Supabase, OpenAI) y selecciona o crea las credenciales correspondientes.
- Para Supabase, necesitarás crear una credencial de tipo "Header Auth" usando tu
SUPABASE_KEY. - Para Google, usa el método OAuth2 que configuraste.
- Para OpenAI, usa tu clave de API.
- Para Supabase, necesitarás crear una credencial de tipo "Header Auth" usando tu
- Activa el flujo de trabajo usando el interruptor en la parte superior derecha.
El repositorio contiene dos flujos de trabajo principales que, aunque pueden estar en un solo JSON, representan lógicas separadas:
Este flujo se encarga de poblar la base de datos.
- Configura el nodo de Google Drive para que apunte a la carpeta que contiene tus documentos.
- Ejecútalo manualmente la primera vez.
- El flujo leerá los archivos, los dividirá en
chunks(fragmentos), generará los embeddings para cadachunky los guardará en tu tabladocumentsde Supabase.
Diagrama del Flujo de Ingesta:
sequenceDiagram
participant n8n as n8n Workflow
participant GDrive as Google Drive
participant OpenAI as OpenAI API
participant Supabase as Supabase DB
n8n->>GDrive: Listar/Descargar archivos de la carpeta
GDrive-->>n8n: Devuelve archivos
n8n->>n8n: Divide los documentos en chunks
loop Por cada chunk
n8n->>OpenAI: Solicitar embedding para el chunk
OpenAI-->>n8n: Devuelve vector de embedding
n8n->>Supabase: Guardar chunk y su embedding
end
Este flujo se activa para responder a las consultas del usuario. Generalmente, comienza con un nodo Webhook.
- Envía una petición POST al URL del webhook con tu pregunta en el cuerpo (body). Por ejemplo:
{ "question": "¿Cuál fue el ingreso total en el último trimestre?" } - El flujo de trabajo se activará, buscará la información relevante en Supabase, construirá un prompt y obtendrá una respuesta del LLM.
- La respuesta será devuelta en la respuesta del webhook.
Diagrama del Flujo de Inferencia:
sequenceDiagram
participant User
participant Webhook as n8n Webhook
participant OpenAI as OpenAI API
participant Supabase as Supabase DB
participant LLM as LLM (OpenAI)
User->>Webhook: POST /webhook con {"question": "..."}
Webhook->>OpenAI: Crear embedding para la pregunta
OpenAI-->>Webhook: Devuelve vector
Webhook->>Supabase: Buscar vectores similares (match_documents)
Supabase-->>Webhook: Devuelve chunks de contexto
Webhook->>LLM: Enviar prompt (pregunta + contexto)
LLM-->>Webhook: Genera respuesta final
Webhook-->>User: Devuelve la respuesta
Las contribuciones son bienvenidas. Si deseas mejorar este proyecto, por favor:
- Haz un Fork del repositorio.
- Crea una nueva rama (
git checkout -b feature/nueva-funcionalidad). - Realiza tus cambios y haz commit (
git commit -m 'Añade nueva funcionalidad'). - Haz push a tu rama (
git push origin feature/nueva-funcionalidad). - Abre un Pull Request.
Este proyecto está bajo la Licencia MIT. Consulta el archivo LICENSE para más detalles.