
Recientemente he finalizado mis estudios del Máster en Data Science & Big Data Analytics, y como proyecto final, mi equipo y yo nos enfrentamos a un reto: mejorar la atención al cliente de MAPFRE en materia de seguros de hogar mediante un chatbot.
Chatbot y RAG
Los chatbots son una tecnología que ha cobrado mucho protagonismo en los últimos años. Hoy en día es muy común ver chatbots en diferentes sectores como la atención al cliente, la educación o la salud. Modelos avanzados como ChatGPT, Gemini o Llama han mejorado la interacción con la inteligencia artificial, pero presentan una limitación importante: no siempre ofrecen información actualizada ni precisa.
Estos modelos se entrenan con grandes cantidades de datos previamente recopilados, lo que restringe su conocimiento al momento en que fueron desarrollados. Como resultado, pueden generar respuestas erróneas o directamente inventadas, fenómeno conocido como alucinación.
Para abordar este desafío, surge RAG (Retrieval-Augmented Generation), un enfoque que combina inteligencia generativa con acceso a fuentes de información externas. Gracias a esta técnica, un chatbot puede consultar bases de datos y documentos en tiempo real, asegurando respuestas más precisas y fiables.
Cómo construir un chatbot con RAG: paso a paso
El proceso para construir un chatbot con RAG consta de 2 fases principales:
- La creación de la base de datos y gestión de los datos
- La recuperación de la información y construcción de la interfaz
El proyecto que desarrollamos fue utilizando LlamaIndex para la gestión de los datos y Chainlit como interfaz.

Ilustración 1. Esquema del proceso de un chatbot con RAG
Fase 1: Creación de base de datos
Este proceso se realiza cada vez que se actualizan o añaden nuevos documentos. Consiste en la transformación de los documentos en representaciones numéricas vectoriales, de esta manera su recuperación posterior es mucho más eficiente.
Carga de documentos
El primer paso es cargar todos los documentos que utilizará el chatbot. Para ello utilizamos la clase SimpleDirectoryReader de LlamaIndex.

Ilustración 2. Carga de documentos
Generación de chunks
Los chunks son fragmentos de texto en los que los documentos se dividen, que se generan para hacer la información más manejable. Existen diferentes técnicas para dividir los documentos como por ejemplo hacerlo por número de caracteres fijo. Sin embargo, lo habitual es utilizar técnicas más avanzadas, como la clase SemanticSplitterNodeParser de LlamaIndex, que divide el texto considerando su similitud semántica.

Ilustración 3. Generación de chunks
Generación de embeddings
El siguiente paso es crear los embeddings, representaciones numéricas del texto que permiten medir la relación entre palabras en un espacio vectorial. Cuanto más similares sean dos términos, más cercanos estarán sus vectores.
Por ejemplo, en una representación simplificada, «Perro» y «Gato» aparecerían más próximos entre sí que «Londres», ya que los dos primeros comparten una categoría semántica (animales), mientras que el tercero pertenece a un concepto diferente (ciudad).

Ilustración 4. Representación vectorial de palabras

Ilustración 5. Ejemplo de modelo de embeddings de Gemini
Almacenamiento de los embeddings
Para que el chatbot pueda recuperar información rápidamente, los embeddings deben almacenarse de forma eficiente junto con un índice que facilite su búsqueda. Esto se gestiona con la clase VectorStoreIndex de LlamaIndex.
Dependiendo del tamaño del proyecto, los embeddings pueden guardarse en una base de datos vectorial o, en casos más pequeños como este, en archivos JSON.

Ilustración 6. Almacenamiento de embeddings
Fase 2: Recuperación de la información
Una vez construida la base de datos, es necesario implementar un mecanismo eficiente para recuperar la información cuando el usuario realiza una consulta. Para ello, utilizamos Chat Engine de LlamaIndex, que se encarga de:
- Recibir la pregunta del usuario.
- Buscar en la base de datos vectorial los fragmentos más relevantes.
- Generar una respuesta basada en la información recuperada.
Para que el sistema funcione correctamente, es fundamental configurarlo con:
- Un modelo de lenguaje (LLM), responsable de formular las respuestas.
- Un modelo de embeddings, utilizado para realizar búsquedas en el índice. Debe coincidir con el modelo empleado en la creación de los embeddings.
- Un historial de conversación, gestionado mediante la clase ChatMemoryBuffer, que permite al chatbot mantener el contexto en la interacción.
- Un prompt personalizado, donde se establecen reglas y restricciones sobre su comportamiento.

Ilustración 7. Recuperación de la información
Integración con la interfaz de usuario
Con el Chat Engine configurado, el siguiente paso es integrarlo en la interfaz de Chainlit, lo que permite al usuario interactuar con el chatbot de manera fluida e intuitiva.
Gracias a esta arquitectura, obtenemos un chatbot con RAG que:
- Responde únicamente sobre seguros de hogar, garantizando información relevante.
- Accede a documentos indexados y actualizables, asegurando respuestas basadas en datos recientes.
- Mantiene el contexto de la conversación, proporcionando interacciones más coherentes y naturales.
Evaluación del modelo
Para garantizar que el chatbot proporciona respuestas precisas y útiles, es fundamental evaluar su desempeño mediante diferentes métricas. No todos los proyectos requieren medirlas todas, pero conocerlas permite seleccionar las más adecuadas según el caso de uso.
Tabla 1. Métricas de evaluación de un modelo de RAG
Métrica | ¿Qué evalúa? |
Correctness | Grado de precisión de la respuesta en comparación con la realidad. |
Faithfulness | Uso exclusivo de la información proporcionada sin generar datos falsos o inventados. |
Relevance | Adecuación de la respuesta a la pregunta formulada, evitando respuestas demasiado genéricas. |
Conciseness | Claridad y brevedad de la respuesta, eliminando información innecesaria. |
Groundedness | Dependencia de los documentos indexados como base de la respuesta, en lugar de conocimiento previo del modelo. |
Coherence | Correcta construcción gramatical y fluidez en la respuesta. |
Consistency | Mantención de un discurso coherente a lo largo de la conversación sin contradicciones. |
Latency | Velocidad con la que el chatbot genera y entrega la respuesta. |
No todos los proyectos requieren medir todas estas métricas, pero conocerlas permite seleccionar las más adecuadas según el caso de uso.
Conclusión
Desarrollar un chatbot basado en RAG es un proceso en el que hay que considerar muchas variables para que sea exitoso y requiere de una evaluación exhaustiva y continua para asegurar la calidad del producto.
Algunos de los aprendizajes más importantes que me llevo de este proyecto son:
- La importancia de evaluar el chatbot con métricas específicas, que nos permitan ir ajustando los diferentes parámetros en cada fase del proyecto.
- Definir un prompt personalizado adecuado que limite efectivamente el comportamiento del chatbot es muy importante para evitar que nuestro chatbot por ejemplo recomiende productos de la competencia.
- La segmentación semántica mejora la calidad de la recuperación de información, pero hay que controlar la longitud de los chunks para evitar respuestas demasiado largas o imprecisas.
- Elegir un modelo de embeddings adecuado tiene un gran impacto en la recuperación de las respuestas, puesto que con modelos demasiado sencillos probablemente perderemos la capacidad de capturar significado contextual y relaciones semánticas profundas.
Desarrollar este proyecto y haber cursado el Máster en Data Science en The Valley ha sido una experiencia altamente enriquecedora, que me ha permitido profundizar en técnicas avanzadas de inteligencia artificial y gestión de datos. Durante la formación, he adquirido no solo conocimientos teóricos, sino también la capacidad de aplicar soluciones innovadoras en proyectos reales y desafiantes.
No tengo duda de que la base sólida y la visión estratégica que proporciona este máster serán fundamentales para mi desarrollo profesional, permitiéndome afrontar con confianza los retos futuros del mundo de los datos y la inteligencia artificial.