Los modelos de chat de OpenAI, como chatGPT-3.5, son herramientas poderosas para interactuar con usuarios de manera fluida y eficiente. Estos modelos ofrecen un enfoque diferente y más dinámico en la forma en que se procesan las interacciones en comparación con los modelos de lenguaje tradicionales. Veamos paso a paso cómo trabajar con estos modelos.
¿Qué se necesita para empezar?
Para comenzar a trabajar con los modelos de chat de OpenAI, es necesario contar con dos herramientas clave: OpenAI y LangChain. Ambas se pueden instalar fácilmente utilizando el gestor de paquetes pip:
pip install openai langchain
Además, es crucial obtener una API key de OpenAI. Esta clave está disponible en el sitio web para desarrolladores de OpenAI y debe ser configurada previamente en tu entorno de trabajo.
¿Cómo configurar el modelo de chat?
Una vez que hayas instalado las herramientas y configurado la API key, el siguiente paso es importar e instanciar el modelo de chat correspondiente. En este caso, utilizamos chatGPT-3.5 Turbo:
from chatmodels import chatOpenAI
# Configuración del modelochat_model = chatOpenAI( api_key='tu_openai_api_key', model_name='GPT-3.5-Turbo', temperature=0)
Al establecer la temperatura en 0, indicamos al modelo que buscamos respuestas directas y específicas, en vez de contenido creativo.
¿Qué tipos de mensajes se manejan?
Los modelos de chat funcionan con diferentes tipos de mensajes, organizados en listas. Estos mensajes son:
System Message: Proporciona contexto desde el sistema, no es generada por el usuario.
Human Message: Mensaje introducido por el usuario que interactúa con el chat.
AI Message: La respuesta que el modelo genera basándose en los mensajes anteriores.
El siguiente ejemplo muestra cómo configurar esta lista:
# Creación de mensajesmensajes =[{'type':'system','content':'Eres un asistente en un call center de reparación de lavadoras.'},{'type':'human','content':'Oye, necesito ayuda. ¿Cómo estás?'},{'type':'ai','content':'Estoy bien, gracias. ¿En qué te puedo ayudar?'},{'type':'human','content':'Quiero reparar mi lavadora.'}]
¿Cómo sigue la conversación?
La idea detrás de estos modelos es seguir el flujo natural de una conversación. Aquí simulamos la interacción agregando nuevos mensajes a la lista y recibiendo respuestas del modelo:
# Actualizar la conversaciónnueva_respuesta = chat_model(mensajes)# Añadir las respuestas a la lista de mensajesmensajes.append({'type':'ai','content': nueva_respuesta.content})# Supongamos que se añade otro mensaje humanomensajes.append({'type':'human','content':'¿Por qué se descompuso?'})# Obtener una nueva respuesta del modelorespuesta_final = chat_model(mensajes)print(respuesta_final.content)
¿Cuáles son las ventajas de estos modelos?
Usar modelos de chat en lugar de modelos de lenguaje tradicionales es más beneficioso cuando se necesita una interacción constante con los clientes. Son especialmente útiles en aplicaciones como:
Asistentes virtuales
Centros de atención al cliente
Chatbots interactivos
Estos modelos están perfectamente diseñados para mantener el contexto a lo largo de las interacciones, lo que los hace más efectivos y perspicaces en comparación con sus homólogos de lenguaje simple.
En este curso hay varias clases con 0 comentarios. Eso significa o que estamos entendiendo todo o no estamos entendiendo nada 😅
o que muy pocos estudiantes han tomado el curso :thinking:
En este punto ya no.... Es más como el curso está desactualizado, muchas funciones están deprecadas y te toca aprender leyendo la documentación y el curso. Ta buenísimo!!
¿como se puede diferenciar y guardar el historial de conversaciones de dos usuarios que le escriben al chatbot al mismo tiempo?
Se pudiera atacar el problema desde una arquitectura de ChatBots. Por ejemplo, podemos tener los siguientes aspectos y dependerá del producto para proveer de la mejor UX al emplear ciertas estrategias tanto en presentación como en la lógica de negocio.
.
Identificadores de Asistencia. Empleamos IDs que puedan etiquetar y relacionar aspectos importantes entre las conversaciones, por ejemplo un ID de conversación enter Usuario y Session.
Sesiones. La sesiones son importantes porque te permiten generar registros o Logs de las conversaciones y poder aplicar métricas (ya sea de satisfacción por respuesta o de errores).
Almacenamiento. Así como una conversación de WhatsApp, o similares, se puede generar un backup de las conversaciones y para reducir la latencia, implementar un sistema de caché.
Microservicios. Emplear una arquitectura de microservicios puede permitir una gestión más eficaz de las conversaciones, especialmente en sistemas complejos con un gran número de usuarios concurrentes.
.
Siendo claros, no es un tema de LangChain sino de la arquitectura y estrategias de Ingeniería de Software que permiten desarrollar un producto de este estilo.
📝 Historial de Mensajes
.
ℹ️ Summary
Esta guía proporciona un caso de uso sobre "Memory Context", cuando es necesario gestionar un historial de mensajes para proveer contexto a un LLM.
.
🗂️ Background
LangChain proporciona varias utilidades para la memorización. Sin embargo, ChatMessagehistory es la base sobre la mayoría, ya que abstrae métodos para guardar mensajes Humanos (HumanMessage) , mensajes AI (AIChatMessage), mensaje contextuales (SystemMessage), y luego recuperarlos todos.
.
Posteriormente, el historial puede ser almacenado en diferentes soluciones, como Redis, para mantener una persistencia de cada uno.
.
Enlaces auxiliares:
Memory
.
🎯 Problem
Implementar un "Memory Context" utilizando TypeScript para generar un historial de mensajes para implementar en un asistente de chat.
.
🚧 Solution
LanChain provee de la clase ChatMessageHistory para abstraer cada mensaje, según sea el origen de su existencia (Usuario, AI, etc.).
import { ChatMessageHistory } from 'langchain/memory'
import { HumanMessage, AIMessage, SystemMessage } from 'langchain/schema'
const chatHistory = new ChatMessageHistory([
new SystemMessage(
'You are an assistant in a washing machine repair Call Center.',
),
new HumanMessage('How are you? I need some help'),
new AIMessage("I'm fine thanks. How can I help you?"),
new HumanMessage('I want to repair a wash machine'),
])
Dicho historial, es operable mediante una abstracción de memorización. Cada memorización posee su estrategia de diseño según sea el requerimiento.
La memorización BufferMemory, extrae de ChatMessageHistory para obtener su contexto para, finalmente, integrarlo en un modelo LLM de nuestra preferencia.
const memory = new BufferMemory({
chatHistory,
})
🍻 Discussion
De manera provisional, no es recomendable compartir el mismo historial o instancia de memoria entre dos cadenas de LangChain, una instancia de memoria representa el historial de una única conversación.
.
Así mismo, para su persistencia, es recomendable emplear una solución de almacenamiento según sea el beneficio de cada motor, por ejemplo Redis para una implementación en caché por sesión.
import { ConversationChain } from 'langchain/chains'
import { ChatOpenAI } from 'langchain/chat_models/openai'
import { BufferMemory, ChatMessageHistory } from 'langchain/memory'
import { HumanMessage, AIMessage, SystemMessage } from 'langchain/schema'
const API_TOKEN = // 👈 Enter the API Token from OpenAI
const llm = new ChatOpenAI({
maxTokens: -1,
modelName: 'gpt-4',
temperature: 0,
openAIApiKey: API_TOKEN,
})
const chatHistory = new ChatMessageHistory([
new SystemMessage(
'You are an assistant in a washing machine repair Call Center.',
),
new HumanMessage('How are you? I need some help'),
new AIMessage("I'm fine thanks. How can I help you?"),
new HumanMessage('I want to repair a wash machine'),
])
const memory = new BufferMemory({
chatHistory,
})
const chain = new ConversationChain({
llm,
memory,
})
const response = await chain.call({ input: 'Why did it break down?' })
console.log(response)
El concepto principal de está clase, es la lista, que almacena mensajes, de 3 diferentes tipos, y dependiendo de los tipos de mensaje que se agreguen a está lista, la conversación va ir tomando su rumbo.