Integrar una base vectorial con memoria conversacional es el paso definitivo para construir un asistente inteligente que responda exclusivamente con la información que tú has cargado. A lo largo de este recorrido se conectan todas las piezas: el prompt contextualizado, el retriever, el modelo de lenguaje y el historial de chat, formando una cadena RAG completa y funcional.
¿Cómo se crea un prompt contextualizado para el asistente?
Una vez que los documentos están indexados en el espacio vectorial, el siguiente paso es construir un prompt contextualizado que le indique al modelo cómo debe comportarse [1:12]. Este prompt cumple varias funciones:
- Instruir al modelo para que responda según el historial del chat.
- Considerar la última pregunta del usuario cuando contenga información relevante.
- Evitar responder si la información no se encuentra ni en el historial ni en el contexto cargado.
- Mantener un tono profesional en cada respuesta.
Para armarlo se utiliza Chat Prompt Template con el método from_messages, que recibe una lista con tres elementos: el system prompt (las instrucciones del sistema), un Message Placeholder que aloja el chat_history y finalmente la entrada del humano representada por la variable input [1:48].
¿Qué papel juegan Message Placeholder y Chat History?
El componente Message Placeholder actúa como un contenedor dinámico donde se inyecta el historial de la conversación. Cada vez que el usuario hace una nueva pregunta, ese historial se actualiza automáticamente, lo que permite al modelo recordar intercambios anteriores y mantener coherencia en sus respuestas [2:25].
¿Cómo se integran el retriever, el LLM y el prompt en un RAG chain?
Con el prompt contextualizado listo, se procede a unir las tres piezas fundamentales en un solo objeto [3:30]:
- Large Language Model (LLM): el motor que genera las respuestas.
- Retriever: la conexión al espacio vectorial donde están los documentos.
- Prompt contextualizado: las instrucciones que guían la generación.
Primero se crea un QA prompt (question answering), que sigue la misma estructura de system, Message Placeholder y human input [4:05]. Luego, con el módulo para trabajar con documentos, se construye el chain pasándole el LLM y este último prompt.
El RAG chain resultante combina la recuperación de documentos relevantes con la generación de respuestas, asegurando que toda la información provenga exclusivamente de lo que se ha cargado previamente [4:50].
¿Cómo se añade el historial de sesión a la cadena?
Para gestionar la memoria se utiliza un diccionario que almacena cada session ID junto con su conversación asociada [5:30]. La cadena final, llamada Conversational RAG Chain, se construye utilizando el historial de mensajes y recibe cuatro parámetros clave:
- El RAG chain ya creado.
- La función
get_session_history para recuperar conversaciones previas.
- La llave
input con la consulta del usuario.
- La llave
chat_history para el historial y output_message_key para la respuesta.
Al invocar el chain con el método invoke, se le pasa tanto la pregunta como la configuración de sesión, por ejemplo session_id: "abc123" [6:20].
¿Qué hacer cuando el modelo no devuelve la respuesta esperada?
Un problema frecuente al trabajar en Google Colaboratory es que el modelo responda que no tiene información, aun cuando los documentos están cargados correctamente [7:00]. La solución consiste en desconectar y borrar el tiempo de ejecución desde el menú "Entorno de ejecución" y volver a ejecutar todas las celdas desde el inicio, incluyendo la carga de las API keys.
Este comportamiento está ligado a los servidores de Google y no al código en sí. Si estás seguro de que cada paso está bien escrito, reiniciar el entorno suele resolver el problema [7:25].
Tras el reinicio, al preguntar "¿Cuál es la receta de avena con frutas?", el asistente devuelve exactamente la información del documento cargado: una taza de avena, una taza de leche de almendras, una cucharada de miel y frutas frescas [8:10]. No inventa ni trae datos de fuentes externas, lo que confirma que el sistema RAG funciona correctamente.
Para mejorar la legibilidad de las respuestas, se recomienda envolver la salida con print(), lo que estructura mejor el texto en el notebook. También es importante recordar que el modelo puede variar ligeramente su redacción en cada ejecución, ya que se le ha dado libertad creativa dentro de los límites del contexto proporcionado [8:35].
El reto a partir de aquí es seleccionar un problema real y alimentar el espacio vectorial con documentos especializados, como bibliografía de inteligencia artificial, para que el asistente enseñe esos temas de forma conversacional. Comparte tu idea en los comentarios y explora todo el potencial de LangChain combinado con RAG.