Contenido del curso

Introducción a LangChain

Chats y memoria con LangChain

Chatbot que extrae datos del cliente con LangChain

Resumen

Cuando construyes un chatbot que atiende clientes, necesitas recordar datos puntuales: nombre, dirección, teléfono o el número de garantía del producto. La Conversation Entity Memory de LangChain resuelve justo eso, porque extrae entidades de la charla con ayuda de un modelo de lenguaje y las guarda en una estructura lista para consultar.

¿Qué es Conversation Entity Memory y para qué sirve?

Es un tipo de memoria que detecta y almacena entidades clave dentro de una conversación. Piensa en un asesor de ventas digital: si a alguien se le rompió la lavadora, tu bot necesita saber qué pasó, cuándo la compró y quién la atendió. Esa información se vuelve oro para el seguimiento.

¿Qué son las entidades en un chatbot? Son datos concretos que aparecen en la conversación: nombres de personas, direcciones, teléfonos, fechas, números de garantía. La memoria los identifica con un modelo de IA y los guarda como pares clave-valor [02:25].

El punto interesante es que la extracción no es automática por reglas. Detrás hay un modelo que interpreta el texto, decide qué es entidad y qué no, y la asocia con el contexto en el que apareció.

¿Cómo se configura el prompt para una memoria con entidades?

Antes de escribir tu propio prompt, conviene revisar el que LangChain trae por defecto. Lo importas desde la librería de conversation prompts como Entity Memory Conversation Template y, al imprimirlo con el argumento template, ves su estructura interna [01:36].

Ese template incluye tres variables que debes respetar siempre:

  • Entities: las entidades detectadas hasta el momento.
  • History: el historial de la conversación.
  • Input: la pregunta o mensaje actual del usuario.

Con ese formato como base, puedes redactar uno personalizado. En el ejemplo se construye un asistente de ventas para una empresa de máquinas de micheladas, con dos objetivos claros: primero intentar resolver el problema, y si no se puede, agendar una visita técnica pidiendo celular y dirección [03:25]. Además, se le pide hablar con la chispa de una persona nacida en Tepito, México, y siempre preguntar la fecha de compra, el número de garantía y quién atendió originalmente al cliente.

¿Cómo creas tu propio PromptTemplate?

Importas PromptTemplate desde la librería de prompts y le pasas dos cosas: las input_variables (que son entities, history e input) y el template con tu texto en español. Así nace el prompt_tepito_entities, listo para enchufarse a la cadena.

¿Cómo se arma la ConversationChain con dos modelos de lenguaje?

Aquí viene un detalle clave: necesitas dos modelos, no uno. Uno conversa con el cliente, y otro extrae las entidades para la memoria [06:15].

  1. Importa ConversationChain desde la librería de cadenas de LangChain.
  2. Instancia un modelo de chat, por ejemplo ChatGPT 3.5 de OpenAI, para la conversación.
  3. Inicializa un modelo de lenguaje simple con OpenAI, usando model_name="text-davinci-003", temperature=0 y max_tokens=256, para que detecte entidades [07:18].
  4. Crea la memoria con ConversationEntityMemory(llm=llm).
  5. Arma la cadena con tu prompt, el modelo de chat, la memoria y verbose=True para ver qué pasa por dentro.

¿Por qué la memoria pide un modelo de lenguaje aparte? Porque la detección de entidades es una tarea de IA: el modelo lee la conversación, decide qué fragmentos son entidades y los guarda con su descripción. Sin un LLM, esa lógica no existe [06:35].

Un detalle práctico: si escribes temperatura en lugar de temperature, LangChain te avisa del parámetro mal nombrado. Corriges, vuelves a inicializar y listo.

¿Cómo se ve la memoria llenándose en una conversación real?

La charla arranca con un mensaje tipo: Qué onda, mi máquina para hacer micheladas no está funcionando, ando enojado [08:25]. En la primera ronda, las secciones de contexto y conversación actual aparecen vacías. Normal, todavía no hay datos.

En el segundo turno, el cliente suelta: Lo compré en 2015, tiene un número de garantía 0X y me atendió Carlos. Ahí la memoria empieza a poblarse. 0X se asocia al número de garantía y Carlos se identifica como la persona que atendió al humano en 2015 [09:45].

Cuando el cliente pide agendar la visita y comparte su celular y Parque Bolívar 22, la memoria refina las entradas. Algunas entidades quedan más completas que otras al inicio, y se enriquecen conforme avanza la plática.

¿Cómo generas un reporte final de entidades?

Usas pprint de la librería pprint para imprimir el diccionario de forma legible y accedes al almacén con conversation.memory.entity_store [12:08]. El resultado es un reporte con cada clave y su descripción contextual:

  • 0X: número de garantía de la máquina comprada en 2015.
  • Carlos: persona que atendió al humano cuando compró la máquina.
  • Parque Bolívar: dirección del humano, ubicada en el número 22.
  • Número de celular del cliente.

Ese reporte es justo lo que necesita el equipo de seguimiento para cerrar el caso, agendar al técnico o escalar la incidencia. Y aunque el ejemplo gira en torno a máquinas de micheladas, el patrón aplica a soporte técnico, ventas, reservas o cualquier flujo donde los datos del cliente importen.

¿Qué entidades te gustaría que tu propio chatbot capturara? Cuéntame en los comentarios cómo lo adaptarías a tu caso de uso.

      Chatbot que extrae datos del cliente con LangChain