En esta lección práctica, construiremos la fase de ingesta de nuestro sistema RAG. Tomaremos un documento grande y complejo y lo procesaremos para almacenarlo de manera óptima en nuestra base de datos vectorial. Para este ejemplo, usaremos Supabase por su flexibilidad y facilidad de uso.
Paso 1: Preparación del Entorno
Antes de comenzar con n8n, necesitamos tener todo nuestro entorno listo.
- El Documento Fuente: Para este ejemplo, usaremos un documento del mundo real: el informe anual de Netflix de 2024. Es un PDF de 84 páginas, complejo y denso, perfecto para un caso de uso realista (esta en inglés pero las respuestas nos la dara en español). Descárgalo de su página de inversores.
- Almacenamiento en la Nube: Sube el PDF a una carpeta en tu Google Drive. Una vez subido, haz clic en «Compartir» y asegúrate de que «Cualquier persona con el enlace» pueda verlo. Copia este enlace.
- Configuración de Supabase:
- Ve a Supabase y crea una cuenta gratuita si aún no la tienes.
- Crea un nuevo proyecto. Asígnale un nombre (ej: «demo-rag») y una contraseña segura para la base de datos (¡guárdala bien!).
- Mientras se crea el proyecto (puede tardar unos minutos), ve a la documentación de Supabase y busca el script SQL para configurar la tabla de vectores. Lo encontrarás en la sección de «Vector Embeddings». Cópialo.
- Una vez que tu proyecto esté listo, ve al «SQL Editor» en el menú de la izquierda, pega el script que copiaste y ejecútalo. Esto creará automáticamente la tabla
documents
con las columnas necesarias:id
,content
,metadata
yembedding
.
- Obtención de Credenciales:
- Supabase: Ve a
Project Settings > API
. Necesitarás dos cosas: la URL del proyecto y la clave secreta del rol de servicio (service_role
secret). - OpenAI: Ve a
platform.openai.com/api-keys
, crea una nueva clave secreta y cópiala.
- Supabase: Ve a
¡Perfecto! Nuestro entorno está listo. Ahora, a n8n.
Paso 2: Construyendo el Flujo en n8n
Nuestro flujo de ingesta constará de dos nodos principales.
- Nodo
Google Drive
(Download File):- Añade un nodo de Google Drive y selecciona la acción «Download File».
- Conecta tus credenciales de Google si es la primera vez.
- Pega la URL del archivo de Netflix que copiaste anteriormente.
- Al probar este nodo, verás que la salida es un archivo binario, que es exactamente lo que necesitamos.
- Nodo
Supabase Vector Store
(Add Documents):- Este es el corazón de nuestro flujo. Añade el nodo y selecciona la acción «Add Documents to Vector Store».
- Conecta tus credenciales: Crea una nueva credencial para Supabase usando la URL y la clave secreta que obtuviste.
- Ve a la documentación del nodo y busca el enlace: quickstart for setting up your vector store. Cópialo.
- Ve al «SQL Editor» en el menú de la izquierda de supabase, pega el script que copiaste y ejecútalo. Esto creará automáticamente la tabla
documents
con las columnas necesarias:id
,content
,metadata
yembedding
. Puedes cambiar el nombre de la tabla.
Muy importante indicar el número de vectores del modelo de embedding que vamos a usar. - Configura el nodo:
- Table Name: Selecciona la tabla
documents
que creamos con el script. - Input Data: Asegúrate de que el nodo de Google Drive esté conectado a la entrada «Document».
- Table Name: Selecciona la tabla
Dentro de este nodo, debemos configurar tres elementos clave: el Document Loader, el Embeddings Model y el Text Splitter.
Paso 3: La Decisión Estratégica – Chunking y Embeddings
- Document Loader: Como nuestra entrada es un archivo binario desde Google Drive, aquí seleccionamos la opción
Load from Binary Data
. Podemos dejar que detecte automáticamente el tipo de archivo (application/pdf
). - Embeddings Model: Aquí elegimos el «traductor» que convertirá el texto en vectores, Vamos a usar OpenAI.
- La Elección:
text-embedding-3-small
vs.text-embedding-3-large
. El modelo «small» es más barato y rápido, mientras que el «large» es más preciso pero más caro. - ¿Cómo decidir? Para un documento financiero tan complejo, podríamos pensar que «large» es mejor. Sin embargo, podemos usar herramientas externas como vectorize.io para evitar conjeturas. Al subir una muestra del documento, esta herramienta puede analizarlo y recomendarnos la configuración óptima. En este caso, la herramienta sugiere que
text-embedding-3-small
ofrece el mejor equilibrio entre relevancia y precisión para este documento específico. ¡Usaremos esa recomendación!
- La Elección:
- Text Splitter: Aquí decidimos cómo dividir el documento en «chunks».
- La Elección: Para un documento jerárquico y complejo como un informe anual, el
Recursive Character Text Splitter
es la mejor opción. Intentará dividir el texto de forma inteligente, respetando párrafos y frases. - Configuración del Chunk: Basándonos en las recomendaciones de
vectorise.io
, estableceremos unChunk Size
de 500 caracteres y unChunk Overlap
de 50 caracteres. Esto nos dará fragmentos pequeños y manejables, con un ligero solapamiento para no perder el contexto entre ellos.
- La Elección: Para un documento jerárquico y complejo como un informe anual, el
Paso 4: Ejecución y Verificación
¡Es hora de ejecutar el flujo completo! Al hacerlo, n8n descargará el PDF, lo cargará, lo dividirá en chunks de 500 caracteres usando la estrategia recursiva y creará un embedding para cada chunk usando el modelo «small». Finalmente, insertará todo en Supabase.
- Resultado en n8n: El flujo finaliza y muestra que ha creado 667 ítems (chunks).
- Verificación en Supabase: Si vamos a nuestro proyecto de Supabase y abrimos el «Table Editor» para la tabla
documents
, veremos los 667 registros.- Columna
content
: Contiene el texto de cada chunk. Podemos ver cómo ha dividido secciones como el índice. - Columna
metadata
: Supabase ha añadido automáticamente metadatos útiles, como el número de página y las líneas del documento original de donde proviene cada chunk. - Columna
embedding
: Esta columna contiene la representación vectorial de cada chunk, ¡el ADN numérico que hace posible la búsqueda semántica!
- Columna
¡Felicidades! Has construido con éxito un flujo de ingesta completa y optimizada. Tu base de conocimiento está lista para ser consultada.