Chat Messages con OpenAI

Clase 5 de 26Curso de Agentes AI

Contenido del curso

Resumen

Construir conversaciones estructuradas con modelos de lenguaje como GPT requiere comprender cómo asignar roles a cada parte del diálogo y cómo controlar la cantidad de contexto que el modelo recibe. Aquí se explica paso a paso cómo utilizar Human message, AI message y System message dentro de LangChain, y cómo la utilidad Trim messages permite optimizar el rendimiento del modelo recortando el historial de forma inteligente.

¿Cómo se estructura una conversación con System, Human y AI message?

Para trabajar con estos tipos de mensajes se importan desde langchain_core.messages las clases AIMessage, HumanMessage y SystemMessage [01:10]. Cada una representa un rol específico dentro del flujo conversacional.

  • SystemMessage define la personalidad o instrucción base del modelo. Por ejemplo: "Eres un asistente útil". Este mensaje se establece al inicio y condiciona el comportamiento de todas las respuestas posteriores [01:25].
  • HumanMessage contiene la consulta o solicitud del usuario, como "¿Me ayudas a organizar las tareas del día?" [01:50].
  • AIMessage representa la respuesta del modelo. En un flujo manual, se redacta la respuesta esperada, por ejemplo: "Claro, ¿qué tareas necesitas completar hoy?" [02:10].

Este formato de roles —sistema, humano, inteligencia artificial— se repite de forma alternada para simular una conversación completa. En el ejemplo, el humano agrega detalles como "enviar un correo importante, hacer ejercicio y estudiar para un examen" [02:35], y el modelo responde con una lista organizada de tareas [03:05].

¿Qué sucede al pasar los mensajes al modelo con Invoke?

Todo el flujo de conversación se puede enviar directamente al modelo mediante el método Invoke [03:30]. Al ejecutar modelo.invoke(messages), GPT-4o procesa el historial completo y genera una respuesta coherente. En el ejemplo, el modelo no solo lista las tareas, sino que propone un horario y asigna prioridades, ya que no se han establecido restricciones de tokens ni de creatividad [04:00].

Imprimir respuesta.content en lugar del objeto completo mejora la legibilidad de la salida [03:55].

¿Para qué sirve Trim messages en LangChain?

A medida que una conversación crece, el historial de mensajes puede exceder la ventana de contexto del modelo o consumir tokens innecesarios. La función trim_messages permite recortar ese historial de forma controlada [04:40].

Se importa desde langchain_core.messages y recibe varios parámetros clave:

  • messages: la lista completa de mensajes de la conversación.
  • max_tokens: el límite máximo de tokens que se desea conservar. Por ejemplo, 45 tokens solo retendrá una porción muy pequeña del historial [05:10].
  • strategy: define desde dónde se recorta. La estrategia "last" conserva los últimos mensajes dentro del límite de tokens, priorizando la parte más reciente de la conversación [05:20].
  • token_counter: el modelo que se usa para contar tokens, en este caso ChatOpenAI(model="gpt-4o") [05:35].

¿Cómo afecta el límite de tokens a la respuesta?

Con un límite de 45 tokens, el resultado fue únicamente el último AIMessage con la lista de tareas [05:55]. Al reducirlo a 10 tokens, la salida quedó vacía porque ningún mensaje individual cabe en ese espacio [06:10]. Al aumentar a 100 tokens, se recuperaron los mensajes más recientes con suficiente contexto [06:20].

Este comportamiento demuestra que el parámetro max_tokens actúa como un filtro: el modelo solo "ve" los mensajes que caben dentro de ese presupuesto de tokens, contados de atrás hacia adelante cuando la estrategia es last.

¿Cómo incluir o excluir el System message del recorte?

El parámetro include_system acepta True o False [06:55]. Cuando se activa, el SystemMessage se preserva siempre, sin importar el recorte, garantizando que el modelo mantenga sus instrucciones de comportamiento. Esto resulta esencial en aplicaciones donde la personalidad del asistente no debe perderse aunque se limite el historial.

Además de estos parámetros, existen opciones adicionales para definir desde qué punto del historial iniciar o terminar el recorte, lo que brinda un control granular sobre la memoria de la conversación [07:15].

Gestionar el contexto de esta manera es fundamental para evitar el consumo excesivo de tokens y para que el modelo enfoque su atención en la información más relevante. ¿Qué estrategia crees que funcionaría mejor en una aplicación con conversaciones muy largas? Comparte tu opinión.