Descarga el Workflow de n8n de esta lección:
En la lección anterior, configuramos un trigger que detectaba archivos nuevos, pero tenía una gran limitación: solo funcionaba para archivos en la carpeta raíz. En esta lección, vamos a rediseñar nuestro flujo para escanear recursivamente el directorio principal y todas sus subcarpetas.
Además, introduciremos un concepto clave, el md5Checksum, que será fundamental para detectar si un archivo ha sido modificado y necesita ser re-indexado en nuestra base de datos vectorial.
Reflexión Importante: Un sistema RAG «real» no solo añade información. Debe ser capaz de manejar actualizaciones y eliminaciones. ¿Qué pasa si un documento se actualiza? ¿O se borra? Nuestra base de datos vectorial quedaría desactualizada. Este es el primer paso para construir esa lógica avanzada.
Paso 1: Refactorizar el Inicio del Flujo
Vamos a reemplazar nuestro trigger anterior por un método de ejecución más controlado. Esto nos da la flexibilidad de ejecutar el escaneo completo manualmente o en un horario programado.
- Desconecta el nodo de «Carga Manual» (formulario) si aún lo tienes. Lo dejaremos de lado mientras construimos la lógica de Google Drive.
- Elimina el nodo trigger de Google Drive que creamos en la lección anterior.
- Añade dos nuevos nodos de inicio (Triggers):
- Un nodo «Execute Workflow» (para pruebas manuales).
- Un nodo «Schedule» (configúralo, por ejemplo, en «Every Day» para un escaneo diario).
- Conecta ambos nodos a la entrada del siguiente paso. Ahora, el flujo puede iniciarse manualmente O de forma programada.
Paso 2: Configurar el Nodo «Search» (Buscar)
El nodo «Download File» que teníamos será útil, pero más adelante. Por ahora, desconéctalo y muévelo al final de tu flujo.
- Añade un nuevo nodo de Google Drive.
- Configúralo de la siguiente manera:
- Resource:
File and Folder - Operation:
Search
- Resource:
- En las opciones, indícale en qué carpeta debe buscar. Selecciona tu carpeta principal (ej. «Documentos Legales RAG»).
- Importante: Marca la opción «Exclude Trashed» (Excluir Papelera) para evitar procesar archivos borrados.
Paso 3: Preparar un Caso de Prueba Realista
Nuestro flujo debe manejar tanto archivos sueltos como carpetas. Vamos a asegurarnos de que tenemos ambos en nuestro directorio raíz.
- Ve a tu carpeta «Documentos Legales RAG» en Google Drive.
- Entra en una de las subcarpetas (ej. «Otros»).
- Toma cualquier archivo PDF y muévelo a la carpeta raíz («Documentos Legales RAG»).
Ahora tienes una mezcla de archivos PDF y subcarpetas en el primer nivel, un escenario perfecto para nuestra prueba.
Paso 4: Obtener Metadatos Avanzados (El Paso Clave)
Por defecto, el nodo «Search» solo devuelve información básica como el nombre y el ID. Necesitamos más datos para nuestra lógica.
- En el nodo «Search» de Google Drive, ve a la sección «Additional Fields» (Campos Adicionales).
- Marca la casilla
*(Asterisco – All Fields). Esto le dice a n8n que traiga toda la información disponible sobre cada archivo y carpeta. - Ejecuta este nodo (
Execute Node).
Al revisar la salida (Output), verás que ahora tenemos muchísima información. Hay dos campos que son vitales para nosotros:
mimeType: Esto nos dice qué tipo de ítem es. Por ejemplo,application/pdfes un archivo PDF, mientras queapplication/vnd.google-apps.folderes una carpeta.md5Checksum: Esta es una «huella digital» única del contenido del archivo. Si el archivo se edita (incluso si se cambia una sola coma), este checksum cambiará. Lo usaremos para saber si un archivo necesita ser actualizado en nuestra base de datos.
Paso 5: Dividir el Flujo con un Nodo «IF»
Ahora que tenemos el mimeType, podemos dividir nuestro flujo. Queremos que el flujo haga una cosa si el ítem es un archivo (procesarlo) y otra si es una carpeta (buscar dentro de ella).
- Añade un nodo «IF» después de tu nodo «Search».
- Configura la condición. Queremos identificar si el ítem NO es una carpeta.
- Condición:
- Value 1:
{{ $json.mimeType }} - Operation:
String->is not equal to - Value 2:
application/vnd.google-apps.folder(Este es el MimeType oficial de Google para una carpeta).
- Value 1:
Al ejecutar el flujo, verás que la salida «true» (verdadera) contiene tu archivo PDF, y la salida «false» (falsa) contiene todas las subcarpetas.
Paso 6: Implementar la «Recursividad» (Escanear Subcarpetas)
Aquí es donde ocurre la magia. Vamos a tomar la salida «false» (la lista de carpetas) y le diremos a n8n que busque dentro de cada una de ellas.
- En la salida «false» del nodo «IF», añade otro nodo de Google Drive.
- Configúralo exactamente igual que el primer nodo «Search»:
- Resource:
File and Folder - Operation:
Search - «Additional Fields»: Marca la casilla
*(All Fields).
- Resource:
- Diferencia Clave: En el campo «Folder ID», no selecciones una carpeta manualmente. Usa una expresión para tomar dinámicamente el ID de la carpeta que viene del nodo «IF»:
{{ $json.id }}.
Este segundo nodo «Search» se ejecutará para cada carpeta que recibió de la salida «false», y su resultado será la lista de archivos que están dentro de esas subcarpetas.
Paso 7: Unir, Probar e Identificar el Siguiente Problema
Ya casi lo tenemos. Ahora solo necesitamos procesar los archivos.
- Conecta la salida «true» del nodo «IF» (los archivos de la raíz) al nodo «Download File» que teníamos guardado.
- Conecta la salida del segundo nodo «Search» (las carpetas y archivos de las subcarpetas) al nodo «IF».
- Finalmente, conecta el nodo «Download File» a tu nodo de Postgres (Vector Store).
Si ejecutas el flujo completo ahora, verás cómo empieza a escanear la raíz, encuentra el archivo, lo descarga y lo inserta. Luego, escanea cada subcarpeta, encuentra todos los archivos dentro de ellas, los descarga y los inserta.
¡Felicidades, hemos logrado la recursividad!
Conclusión y Próximos Pasos
Hemos construido un flujo que escanea un directorio raíz y su primer nivel de subcarpetas, pero hemos creado un nuevo problema crítico: si ejecutamos este flujo de nuevo, volverá a descargar y procesar TODOS los archivos, creando duplicados masivos en nuestra base de datos.
Este es un comportamiento ineficiente y costoso.
En la próxima lección, resolveremos esto. Usaremos el md5Checksum que obtuvimos para comparar los archivos de Google Drive con los que ya tenemos en nuestra base de datos, y solo procesaremos los archivos que sean nuevos o que hayan cambiado.
Acción Requerida: Antes de terminar, desconecta el nodo «Download File» de tu nodo Postgres. No queremos que siga insertando duplicados mientras probamos en la siguiente lección.