Anatomía de un sistema RAG: de la ingesta a la respuesta
Construir un asistente de IA que responda preguntas basándose en la documentación interna de tu organización requiere entender la arquitectura subyacente. No se trata solo de conectar un modelo de lenguaje grande (LLM) a una base de datos, sino de orquestar varios componentes que trabajan en conjunto para procesar tu conocimiento y recuperarlo de forma inteligente. Comprender la "anatomía" de un sistema RAG es fundamental para diseñar una solución robusta que evite alucinaciones y proporcione respuestas precisas y citadas.
Las dos fases del RAG: indexación e inferencia
Un sistema RAG se puede dividir conceptualmente en dos fases principales, cada una con sus propios procesos y componentes. Estas fases operan en momentos distintos y tienen objetivos diferentes, pero son interdependientes para el funcionamiento global del sistema.
- Fase de Indexación (Offline): Esta fase se encarga de preparar tu base de conocimiento para que sea "buscable" por el LLM. Es un proceso que generalmente se ejecuta fuera de línea, es decir, no en tiempo real cuando un usuario hace una pregunta. Implica tomar tus documentos, procesarlos y almacenarlos en un formato optimizado para la búsqueda semántica. Piensa en esto como la creación de un índice gigante y muy inteligente de toda tu documentación. Se ejecuta cuando actualizas o añades documentos a tu conocimiento empresarial.
- Fase de Inferencia (Online): Esta fase es la que interactúa directamente con el usuario. Se ejecuta en tiempo real cada vez que un usuario plantea una pregunta. Su objetivo es tomar la pregunta del usuario, encontrar la información más relevante en tu base de conocimiento previamente indexada y utilizarla para generar una respuesta coherente y fundamentada con el LLM. Aquí es donde el sistema RAG "responde" con tus datos.
Componentes clave de la fase de indexación (offline)
Para que tu conocimiento sea útil para un LLM, primero debe ser procesado y almacenado de una manera que permita una recuperación eficiente y significativa. Aquí te detallamos los componentes principales que actúan en la fase de indexación:
- Ingesta de Documentos: Este es el punto de entrada de tu conocimiento al sistema RAG. Implica la recolección de documentos de diversas fuentes (bases de datos, PDFs, wikis internas, sitios web, etc.) y su conversión a un formato estandarizado, generalmente texto plano. La ingesta debe ser capaz de manejar diferentes tipos de archivos y estructuras de datos.
- Chunking (Troceado): Los LLMs tienen límites en la cantidad de texto que pueden procesar de una sola vez (su "ventana de contexto"). Por eso, los documentos largos deben dividirse en fragmentos más pequeños y manejables, conocidos como "chunks". El chunking es crucial para asegurar que cada fragmento contenga información semánticamente coherente y relevante, sin ser demasiado grande ni demasiado pequeño.
- Embeddings: Una vez que tienes tus chunks de texto, necesitas una forma de representar su significado. Los embeddings son vectores numéricos (listas de números) que capturan la información semántica de un texto. Textos con significados similares tendrán embeddings "cercanos" en un espacio multidimensional. Este proceso convierte el lenguaje humano en un formato que las computadoras pueden comparar matemáticamente.
- Base Vectorial (Vector Database): Es una base de datos especializada diseñada para almacenar y buscar eficientemente estos vectores de embeddings. A diferencia de una base de datos relacional tradicional, que busca por valores exactos o rangos, una base vectorial busca por "similitud" entre vectores. Cuando se le da un vector de consulta (por ejemplo, el embedding de la pregunta de un usuario), puede encontrar rápidamente los chunks cuyos embeddings son más similares, es decir, los chunks que son semánticamente más relevantes.
Componentes clave de la fase de inferencia (online)
Cuando un usuario hace una pregunta, la fase de inferencia entra en acción para encontrar la respuesta utilizando el conocimiento previamente indexado. Estos son los componentes que orquestan el proceso de respuesta:
- Retriever (Recuperador): Este componente es el cerebro de la búsqueda. Toma la pregunta del usuario (también convertida en un embedding) y la utiliza para consultar la base vectorial. Su función es identificar y recuperar los chunks de documentos más relevantes de la base vectorial que podrían contener la respuesta a la pregunta. Puede usar diferentes estrategias de búsqueda, como la similitud coseno entre vectores.
- Reranker (Reordenador): A menudo, el retriever puede traer varios chunks que son semánticamente similares, pero no todos son igualmente relevantes o útiles para la pregunta específica. El reranker es un modelo más pequeño y especializado que toma los chunks recuperados por el retriever y los reordena según su verdadera relevancia para la pregunta del usuario. Esto asegura que los chunks más útiles sean los que finalmente se pasen al generador, mejorando la calidad de la respuesta.
- Generador (LLM): Una vez que tenemos los chunks más relevantes y reordenados, estos se pasan al Generador, que es un Modelo de Lenguaje Grande (LLM) de propósito general —el de OpenAI, el de Anthropic o el de Google; la versión concreta da igual aquí—. El LLM recibe la pregunta original del usuario junto con los chunks de contexto recuperados. Su tarea es leer esta información y sintetizar una respuesta coherente, precisa y bien fundamentada, basándose exclusivamente en el contexto proporcionado por los chunks. También es responsable de citar las fuentes de donde extrajo la información.
Ejemplo: ¿Cuál es nuestra política de teletrabajo?
Imaginemos que un usuario de tu empresa pregunta al chatbot: "¿Cuál es nuestra política de teletrabajo?". Veamos el flujo completo a través de un sistema RAG:
- Pregunta del Usuario: El usuario escribe: "¿Cuál es nuestra política de teletrabajo?"
- Conversión a Embedding (Fase de Inferencia - Retriever): El sistema toma la pregunta del usuario y la convierte en un vector numérico (embedding) utilizando el mismo modelo de embeddings que se usó durante la fase de indexación. Este vector representa el significado semántico de la pregunta.
- Búsqueda en Base Vectorial (Fase de Inferencia - Retriever): El embedding de la pregunta se envía a la base vectorial. La base vectorial busca rápidamente los chunks de documentos almacenados cuyos embeddings son más similares al embedding de la pregunta. Por ejemplo, podría encontrar chunks de un documento PDF titulado "Manual de Políticas de Recursos Humanos" y un documento de la intranet llamado "Guía de Teletrabajo 2024".
- Recuperación de Chunks Relevantes (Fase de Inferencia - Retriever): El retriever extrae, digamos, los 10 chunks más similares de la base vectorial. Estos chunks contienen pasajes de texto que hablan sobre teletrabajo, requisitos, horarios, etc.
- Reordenamiento de Chunks (Fase de Inferencia - Reranker): Los 10 chunks recuperados se pasan al reranker. El reranker los evalúa en función de su relevancia directa para la pregunta "¿Cuál es nuestra política de teletrabajo?" y los reordena. Podría determinar que los chunks que explican los "requisitos para solicitar teletrabajo" son más relevantes que los que solo mencionan "beneficios del teletrabajo". Selecciona los 3 o 4 chunks más relevantes y los prioriza.
- Generación de Respuesta (Fase de Inferencia - Generador): Los chunks reordenados (por ejemplo, los 3 o 4 más relevantes) se envían al LLM junto con la pregunta original del usuario. El LLM recibe un prompt similar a:
"Basándote EXCLUSIVAMENTE en el siguiente contexto, responde a la pregunta: '¿Cuál es nuestra política de teletrabajo?'. Si la información no está en el contexto, indica que no la sabes. Cita tus fuentes.
Contexto:
[Chunk 1: 'La política de teletrabajo de la empresa X establece que los empleados elegibles pueden solicitar...']
[Chunk 2: 'Los requisitos para el teletrabajo incluyen tener un puesto que permita...']
[Chunk 3: 'La solicitud debe realizarse a través del portal de RRHH con al menos 15 días de anticipación...']
Pregunta: ¿Cuál es nuestra política de teletrabajo?"
- Respuesta Citada: El LLM procesa esta información y genera una respuesta concisa, estructurada y basada en los chunks proporcionados, citando los documentos de donde extrajo cada parte de la información. Por ejemplo: "Nuestra política de teletrabajo permite a los empleados elegibles solicitar esta modalidad, siempre que su puesto lo permita [Manual de RRHH, pág. 25]. Las solicitudes deben presentarse con 15 días de antelación a través del portal de RRHH [Guía de Teletrabajo 2024, sección 3.1]."
Errores comunes al conceptualizar un sistema RAG
Al diseñar o implementar un sistema RAG, es fácil caer en ciertas trampas que pueden comprometer su efectividad. Conocer estos errores te ayudará a evitarlos:
- Subestimar la importancia del chunking: Pensar que cualquier división de texto funciona. Un chunking deficiente (demasiado grande o demasiado pequeño, o que rompe la coherencia semántica) lleva a que el retriever no encuentre la información correcta o que el LLM no tenga suficiente contexto para generar una buena respuesta. La calidad del chunking impacta directamente en la precisión del sistema.
- Ignorar la necesidad de un reranker: Creer que la base vectorial y el retriever son suficientes para obtener los documentos más relevantes. El retriever es bueno para la similitud semántica general, pero un reranker añade una capa extra de precisión contextual, filtrando "falsos positivos" y priorizando los chunks que realmente contienen la respuesta. Sin un reranker, es común que el LLM reciba ruido o información subóptima.
- No gestionar los metadatos: Olvidar que los documentos tienen metadatos (autor, fecha, tipo de documento, permisos). Estos metadatos son cruciales para filtros de búsqueda avanzados, control de acceso y para mejorar la citación de fuentes. Integrarlos desde la fase de ingesta es clave para un sistema RAG robusto.
- Tratar el RAG como un "plug and play": Pensar que es solo conectar un LLM a una base vectorial. Un sistema RAG efectivo requiere un diseño cuidadoso de cada componente, desde la estrategia de chunking y el modelo de embeddings, hasta la configuración del retriever y el prompting del generador. Cada paso necesita ser optimizado para tu caso de uso específico.
- No validar la calidad de las fuentes: Asumir que toda la información ingresada es correcta y actualizada. Si los documentos fuente contienen errores o están desactualizados, el sistema RAG los propagará. La fase de ingesta debe incluir, idealmente, mecanismos de validación o un proceso de curación de contenido para asegurar la calidad de la base de conocimiento.
Tu tarea
Para consolidar tu comprensión de la arquitectura RAG, te proponemos el siguiente ejercicio práctico:
- Dibuja tu propio diagrama: En una hoja de papel o usando una herramienta de diagramación (como Lucidchart, Miro o incluso Paint), dibuja un diagrama de alto nivel de un sistema RAG básico. Utiliza bloques para representar los componentes principales que hemos visto en esta lección.
- Etiqueta las fases: Asegúrate de diferenciar claramente las dos fases principales: "Fase de Indexación (Offline)" y "Fase de Inferencia (Online)".
- Describe cada componente: Al lado de cada bloque de componente (por ejemplo, 'Ingesta', 'Chunking', 'Base Vectorial', 'Retriever', 'Reranker', 'Generador'), escribe una frase corta con tus propias palabras que describa su función principal dentro del sistema.
- Traza el flujo de una pregunta: Usa flechas para indicar el flujo de datos desde que un documento es ingerido hasta que una pregunta de usuario es respondida, pasando por todos los componentes.