You don't have access to this class

Keep learning! Join and start boosting your career

Aprovecha el precio especial y haz tu profesi贸n a prueba de IA

Antes: $249

Currency
$209
Suscr铆bete

Termina en:

1 D铆as
9 Hrs
37 Min
8 Seg

Chat con historial

11/26
Resources

In this class, we have explored how LangChain handles chat history, allowing the language model to maintain continuous context during a conversation. This functionality is key to building intelligent conversational systems, as the chat history stores previous interactions, allowing the model to generate more accurate, contextual and personalized responses.

Importance of Chat History

The chat history acts as a memory that stores every message exchanged between the user and the model. This allows the model:

  • Remember important details that were mentioned in previous interactions.
  • Maintain consistency in the conversation, providing more personalized and relevant responses.
  • Enable a more natural conversation, as it can reference what was previously discussed without the user repeating information.

2. Creating History

To manage the chat history, we first create an empty list that will store each message generated during the interaction. This list contains not only the content of the messages, but also the role (user, system or AI model) to identify who generated each part of the dialog.

  • System Message: This is the initial message that sets the context or behavior of the model. For example, you can set it up so that the model knows to act as a "helpful assistant".
  • Human Message: Each question or comment made by the user is stored in the history with this role.
  • AI Message: The answers generated by the model are also stored in the history, which ensures that the full context is maintained.

3. Conversation Cycle

In each interaction, the basic flow is as follows:

  1. The system checks if there is an initial message (System Message) in the history. If not, one is added to give context to the wizard.
  2. The user asks a question, which is stored as a Human Message.
  3. The model generates a response based on the history, and this is stored as an AI Message.
  4. The entire history is updated and can be reused in future interactions.

This process is repeated continuously, adding each new interaction to the history, which ensures that the model maintains the context of the entire conversation.

4. Execution and Debugging

During the exercise, we saw how to interact with the model in real time and how the conversation history is updated with each new message. We showed how to print and review the complete history, which contains the system context, user input and model responses. This history allows the wizard to recall and track each query in a logical and consistent manner.

5. Using Chains for Customization

In addition to basic message storage, LangChain offers the ability to integrate chains (component chains) to customize interactions and responses. For example, you can add chains that include additional functions, such as search tools, machine translation or parsers that format the model output. These strings allow responses to be further tailored to the user's needs and the context of the conversation.

LangChain's chat history management is essential for building advanced conversational systems that can remember and reference previous interactions. This not only improves the quality and relevance of responses, but also provides a more fluid and natural experience for the user.

This type of conversational flow is critical in applications such as:

  • Virtual assistants: which must remember user preferences.
  • Customer service chatbots: That need to maintain the context of previous problems to offer more efficient solutions.
  • Educational systems: Where the assistant can remember what the student has already learned or consulted.

The challenge I leave you with is to explore how to integrate chains into your application so that you can customize the model's responses based on the conversation history. This will allow you to take full advantage of LangChain's flexibility and power to create smarter and more effective conversational experiences.

Contributions 12

Questions 0

Sort by:

Want to see more contributions, questions and answers from the community?

![](https://www.plantuml.com/plantuml/png/XLJTJXiz4BtVfnZbkui0mQUg52xA3qf4fI9L81vWy0uRWzTE_HCrhNYOFW0N5NUzgTHziSxQctWtWE26zVZCp3bdnZbs7gqFjIhSlTHpj5Y39U5HLuhWHm7yTuhYlh8cwFBCA6FXlydkT7zw4k-cHliKlL4CItXZIx8TTdTt_-3zwHfx9RyJxBtBPx_aFZT6bSL3qUEWZN-r_NHl-c5oy6QhJLgv_VzjBnIUhwzTG2jDKMJHey_yNynGQZYReOTpwHYv704wo5U9Mo_h6NQMlZla1lfgwJpLS47EOKKHxsAeYxoKS-t8mYSz3pxY0n_ZwINiXIb9mIMvkT4krQ_Rq2eISnvQ7pe7O7lxOq_U8Kpqedb4q84M2AIznHAB363uIY63JrIDWdGBxA8ILL6i00mUocjJAaiLGatQuHr1IU1aYy1-LXQPcmnoGcBVpnaAxUTPZWLo7e412SQJZwjcPJNpO6wVJM4y7evgF3xaw3PyiMPkh9168mYZFNtp1gIMWeMp4Y2LZOXcSz_c9onGD8zc9vQOt54zL-OGHXDc1a43HWku63I_lLIZdO9q6Tz2HrFHRMJPd_rud1TZnUuYEUIYqCwZBS3c5vQoD0vmartxwg16pTt9ClcrfasgvqRX5lpz8vgdsYHHxcYJQFPpE8p8ThYQAyQNwzbKBGKi4TXVMCzf2sxGSJHvgGV-0efG1uNb6sovGMa0bw54onndPddqkiNTHaNAv-jEPuOhapSTxRnRAgx1Wgn38Pid3I8Xqzj9xotF0fPPMU9yugWA5k5h873KZQB2_YZIa6Abs-0Px43oZKNHhY6vlfHZ_cn_rVy1) ### 1. **Langchain Chat History**: * El historial del chat es la pieza central que almacena todas las interacciones entre el usuario y el modelo. 2. **System Message**: * Si el historial est谩 vac铆o, se agrega un mensaje de sistema como "Eres un asistente 煤til" para proporcionar un contexto inicial para el modelo. 3. **User Input**: * Cada mensaje del usuario se guarda en el historial, lo que garantiza que el contexto de la conversaci贸n se mantenga y se use en interacciones futuras. 4. **Model Response**: * El modelo genera una respuesta basada en todo el historial, lo que permite que las respuestas est茅n m谩s alineadas con el contexto previo. La respuesta tambi茅n se almacena en el historial. 5. **Chat History**: * El historial completo de la conversaci贸n se va acumulando, manteniendo un registro de todas las interacciones. Esto asegura que la inteligencia artificial pueda proporcionar respuestas m谩s precisas y personalizadas en funci贸n de todo lo discutido anteriormente.
Es aqui donde entend铆 el : " por qu茅?"
Si les gusta crear un nuevo colab por cada clase y tienen error al importar la librer铆a, lo resuelven con: `!pip install -qU langchain-openai langchain`
Fue retador pero se logro , en los modelos de memoria me llamaron la atenci贸n 3 * BufferWindowMemory, Es ideal para mantener el hilo de la conversaci贸n actual, pero tiene la limitaci贸n de que los mensajes m谩s antiguos se pierden definitivamente. * ConversationEntityMemory, Es 煤til para aplicaciones que necesitan persistir datos espec铆ficos a lo largo del tiempo, como fechas o preferencias. y el mejor/peor de de todos * CombinedMemory, permite combinar memorias , lo pensaba en usar para combinar lo mejor de los 2 modelos anteriores, ejemplo quiero que el modelo recuerde lo max posible pero que no sea tan costoso , si quieres que sea fiel y recuerde todo usas BufferWindowMemory y defines un limite de 100 pero aunque recuerda todo, que pasa si tenia algo muy importante hace 101 mensajes, no lo va a recordar, para solucionar este problema que tal si lo fusionamos con ConversationEntityMemory para que aquellos mensajes que no recuerde el modelo tengamos un resumen de ellos y tenemos lo mejor de los 2 mundos, contexto importante antiguo y buen hilo de la conversaci贸n actual, pero un problema al fusionar los modelos que no logre solucionar fue que entraban en conflicto con history, a pesar de modificar su memory\_key, seguian en conflicto, luego de mirar mas en la documentaci贸n encontr茅 la solucion C贸mo agregar memoria a los chatbots <https://python.langchain.com/docs/how_to/chatbots_memory/#automatic-history-management> Usa LangGraph para poder manejar la persistencia de la informaci贸n y se le puede definir al modelo quiero que recuerdes los ultimos 4 mensajes de la conversaci贸n y haz un resumen de los anteriores y funciona !!, dejo el code por si lo quieren probar %pip install --upgrade --quiet langchain langchain-openai langgraph ```python %pip install --upgrade --quiet langchain langchain-openai langgraph !pip install --upgrade langchain openai langchain-openai tiktoken import getpass import os if not os.environ.get("OPENAI_API_KEY"): os.environ["OPENAI_API_KEY"] = getpass.getpass("Enter your OpenAI API key: ") from langchain_openai import ChatOpenAI model = ChatOpenAI( model_name='gpt-4o', temperature=0.7 ) from langchain_core.messages import AIMessage, HumanMessage, SystemMessage demo_ephemeral_chat_history = [ HumanMessage(content="Excelente, recuerda el n煤mero 3"), AIMessage(content="隆Entendido! N煤mero 3 recordado"), HumanMessage(content="Hola, 驴c贸mo est谩s?"), AIMessage(content="隆Hola! Estoy aqu铆 y listo para ayudarte. 驴Y t煤?"), HumanMessage(content="Me gusta el color azul"), AIMessage(content="Genial recordare esto"), HumanMessage(content="Mi dia especial es el viernes, 6 de diciembre de 2024"), AIMessage(content="Entendido recordare esto") ] from langchain_core.messages import HumanMessage, RemoveMessage from langgraph.checkpoint.memory import MemorySaver from langgraph.graph import START, MessagesState, StateGraph workflow = StateGraph(state_schema=MessagesState) # Define the function that calls the model def call_model(state: MessagesState): system_prompt = ( "Tu eres un asistente virtual" "Recordaras lo mas relevante del usuario" ) system_message = SystemMessage(content=system_prompt) message_history = state["messages"][:-1] # exclude the most recent user input # Summarize the messages if the chat history reaches a certain size if len(message_history) >= 2: last_human_message = state["messages"][-1] # Invoke the model to generate conversation summary summary_prompt = ( "Resume los mensajes de chat anteriores en una lista con los detalles importantes a recordar del usuario " "Incluye los mas relevante del usuario" ) summary_message = model.invoke( message_history + [HumanMessage(content=summary_prompt)] ) # Delete messages that we no longer want to show up delete_messages = [RemoveMessage(id=m.id) for m in state["messages"]] # Re-add user message human_message = HumanMessage(content=last_human_message.content) # Call the model with summary & response response = model.invoke([system_message, summary_message, human_message]) message_updates = [summary_message, human_message, response] + delete_messages else: message_updates = model.invoke([system_message] + state["messages"]) return {"messages": message_updates} # Define the node and edge workflow.add_node("model", call_model) workflow.add_edge(START, "model") # Add simple in-memory checkpointer memory = MemorySaver() app = workflow.compile(checkpointer=memory) app.invoke( { "messages": demo_ephemeral_chat_history + [HumanMessage("Cual es mi numero importante")] }, config={"configurable": {"thread_id": "1"}}, ) ```Os dejo una imagen del code ![](https://static.platzi.com/media/user_upload/image-b9be5dc5-1c80-46c6-8e30-0f1ec8cbeee0.jpg) ![](https://static.platzi.com/media/user_upload/image-671be3c1-c6b2-48b7-8144-fe3dd2184b3b.jpg)![](https://static.platzi.com/media/user_upload/image-dbde3252-b0cc-4786-aa34-6f596ff0cdb0.jpg)
Y todo esa conversacion se puede enlazar a whatsapp por asi decirlo? En el caso sea whatsapp bussiness de esa manera un cliente si pregunta por algun producto no solo le dira opciones si no tambien podria responder cosas del producto o cualquier pregunta aleatoria del cliente.
en est谩s 煤ltimas clases se ha usado openai, mi pregunta es se puede hacer esto mismo usando hugginface?
LangChain no proporciona una metodolog铆a espec铆fica para mantener un resumen de la conversaci贸n, pero puedes implementar una estrategia a trav茅s del historial de chat. Almacena cada interacci贸n en una lista y, en cada nuevo mensaje, puedes generar un resumen basado en el contenido previo. Esto permite mantener un contexto din谩mico y el seguimiento de la conversaci贸n. La personalizaci贸n de respuestas se puede lograr utilizando "chains" para mejorar los resultados basados en el historial.
Hola, inclui un Prompt Template, variables dinamicas y el chat history en un solo codigo para consolidar conceptos y hacer el reto. Al principio pense que podia utilizar un chain, pero no fue necesario (Con lo que hemos visto del curso, me di cuenta que se requiere quiza unos tipos de chat memory mas avanzados que permitan crear el chain, por ahora pienso que esta bien para consolidar las bases) ```python #Paso 1 Importamos las librerias #Importamos el chatmodel con sus hiperparametros from langchain_google_genai import ChatGoogleGenerativeAI llm = ChatGoogleGenerativeAI( model = "gemini-1.5-pro", temperature= 0, max_tokens= None, timeout=None, max_retries= 2 ) # Aca los esquemas de roles y el prompt Template, son importantes from langchain_core.messages import AIMessage, HumanMessage, SystemMessage from langchain.prompts import SystemMessagePromptTemplate #Esta libreria para indicar place holders dinamicos cuando solo definimos el system Message from langchain_core.prompts import ChatPromptTemplate #Paso 2 Creamos el prompt Template #Establecer el System Message y el Humman Message de esta manera es mucho mejor puesto que genera mejor legibilidad, una manipulaci贸n mas facil (mas adelante se necesitaria) prompt = SystemMessagePromptTemplate.from_template("Eres un profesor de {input_language}. Ayuda a los estudiantes a hablar fluidamente desde el espa帽ol. Ellos te pasar谩n frases en espa帽ol, y t煤 las traducir谩s correctamente a {input_language}. S茅 formal y servicial en todo momento.") #Paso 3 Creamos el historial del chat chat_history = [] #Paso 4 definimos los place holders dinamicos y les damos formato prompt_with_context= prompt.format( input_language = "Frances" ) #Paso 5 a帽ade el mensaje del sistema difinido en el prompt template al chat history chat_history.append(prompt_with_context) #Paso 6 Capturamos la entrada del usuario query = input('Escribe una pregunta: ') #Paso 7 A帽adimos esta entrada del usuario al chat history como Humman Message chat_history.append(HumanMessage(content=query)) #Paso 8 Generar la respuesta utilizando el LLM #Cuando invokamos chat_history, se debe Mantener un orden en el chat history, debe ser primero System message, Human Message y ya despues se agrea AI message response = llm.invoke(chat_history) chat_history.append(AIMessage(content= response.content)) print(response.content) #Paso 9 nueva pregunta #Paso 9.1 Capturamos la entrada del usuario query = input('Nueva pregunta: ') #Paso 9.2 A帽adimos esta entrada del usuario al chat history como Humman Message chat_history.append(HumanMessage(content=query)) #Paso 10 saber si el modelo tiene memoria response = llm.invoke(chat_history) chat_history.append(AIMessage(content= response.content)) print(response.content) #Paso 11 validas todo lo que hay en chat_history ````#Paso 1 Importamos las librerias #Importamos el chatmodel con sus hiperparametros` `from langchain_google_genai import` ChatGoogleGenerativeAI `llm = ChatGoogleGenerativeAI(` ` model = "gemini-1.5-pro",` ` temperature= 0,` ` max_tokens= None,` ` timeout=None,` ` max_retries= 2` `)` `# Aca los esquemas de roles y el prompt Template, son importantes` `from langchain_core.messages import AIMessage, HumanMessage,` SystemMessage `from langchain.prompts import SystemMessagePromptTemplate #Esta libreria para indicar place holders dinamicos cuando solo definimos el system Message` `from langchain_core.prompts import` ChatPromptTemplate `#Paso 2 Creamos el prompt Template` `#Establecer el System Message y el Humman Message de esta manera es mucho mejor puesto que genera mejor legibilidad, una manipulaci贸n mas facil (mas adelante se necesitaria)` `prompt = SystemMessagePromptTemplate.from_template("Eres un profesor de {input_language}. Ayuda a los estudiantes a hablar fluidamente desde el espa帽ol. Ellos te pasar谩n frases en espa帽ol, y t煤 las traducir谩s correctamente a {input_language}. S茅 formal y servicial en todo momento.")` `#Paso 3 Creamos el historial del chat` `chat_history = []` `#Paso 4 definimos los place holders dinamicos y les damos formato` `prompt_with_context= prompt.format(` ` input_language = "Frances"` `)` `#Paso 5 a帽ade el mensaje del sistema difinido en el prompt template al chat history` `chat_history.append(prompt_with_context)` `#Paso 6 Capturamos la entrada del usuario` `query = input('Escribe una pregunta: ')` `#Paso 7 A帽adimos esta entrada del usuario al chat history como Humman Message` `chat_history.append(HumanMessage(content=query))` `#Paso 8 Generar la respuesta utilizando el LLM` `#Cuando invokamos chat_history, se debe Mantener un orden en el chat history, debe ser primero System message, Human Message y ya despues se agrea AI message` `response = llm.invoke(chat_history)` `chat_history.append(AIMessage(content= response.content))` `print(response.content)` `#Paso 9 nueva pregunta` `#Paso 9.1 Capturamos la entrada del usuario` `query = input('Nueva pregunta: ')` `#Paso 9.2 A帽adimos esta entrada del usuario al chat history como Humman Message` `chat_history.append(HumanMessage(content=query))` `#Paso 10 saber si el modelo tiene memoria` `response = llm.invoke(chat_history)` `chat_history.append(AIMessage(content= response.content))` `print(response.content)` `#Paso 11 validas todo lo que hay en chat_history`
Hola, inclui un Prompt Template, variables dinamicas y el chat history en un solo codigo para consolidar conceptos y hacer el reto. Al principio pense que podia utilizar un chain, pero no fue necesario (Con lo que hemos visto del curso, me di cuenta que se requiere quiza unos tipos de chat memory mas avanzados que permitan crear el chain, por ahora pienso que esta bien para consolidar las bases) `#Paso 1 Importamos las librerias ` `#Importamos el chatmodel con sus hiperparametros` `from langchain_google_genai import` ChatGoogleGenerativeAI `llm = ChatGoogleGenerativeAI(` ` model = "gemini-1.5-pro",` ` temperature= 0,` ` max_tokens= None,` ` timeout=None,` ` max_retries= 2` `)` `# Aca los esquemas de roles y el prompt Template, son importantes` `from langchain_core.messages import AIMessage, HumanMessage,` SystemMessage `from langchain.prompts import SystemMessagePromptTemplate #Esta libreria para indicar place holders dinamicos cuando solo definimos el system Message` `from langchain_core.prompts import` ChatPromptTemplate `#Paso 2 Creamos el prompt Template` `#Establecer el System Message y el Humman Message de esta manera es mucho mejor puesto que genera mejor legibilidad, una manipulaci贸n mas facil (mas adelante se necesitaria)` `prompt = SystemMessagePromptTemplate.from_template("Eres un profesor de {input_language}. Ayuda a los estudiantes a hablar fluidamente desde el espa帽ol. Ellos te pasar谩n frases en espa帽ol, y t煤 las traducir谩s correctamente a {input_language}. S茅 formal y servicial en todo momento.")` `#Paso 3 Creamos el historial del chat` `chat_history = []` `#Paso 4 definimos los place holders dinamicos y les damos formato` `prompt_with_context= prompt.format(` ` input_language = "Frances"` `)` `#Paso 5 a帽ade el mensaje del sistema difinido en el prompt template al chat history` `chat_history.append(prompt_with_context)` `#Paso 6 Capturamos la entrada del usuario` `query = input('Escribe una pregunta: ')` `#Paso 7 A帽adimos esta entrada del usuario al chat history como Humman Message` `chat_history.append(HumanMessage(content=query))` `#Paso 8 Generar la respuesta utilizando el LLM` `#Cuando invokamos chat_history, se debe Mantener un orden en el chat history, debe ser primero System message, Human Message y ya despues se agrea AI message` `response = llm.invoke(chat_history)` `chat_history.append(AIMessage(content= response.content))` `print(response.content)` `#Paso 9 nueva pregunta` `#Paso 9.1 Capturamos la entrada del usuario` `query = input('Nueva pregunta: ')` `#Paso 9.2 A帽adimos esta entrada del usuario al chat history como Humman Message` `chat_history.append(HumanMessage(content=query))` `#Paso 10 saber si el modelo tiene memoria` `response = llm.invoke(chat_history)` `chat_history.append(AIMessage(content= response.content))` `print(response.content)` `#Paso 11 validas todo lo que hay en chat_history`
Hola, inclui un Prompt Template, variables dinamicas y el chat history en un solo codigo para consolidar conceptos y hacer el reto. Al principio pense que podia utilizar un chain, pero no fue necesario (Con lo que hemos visto del curso, me di cuenta que se requiere quiza unos tipos de chat memory mas avanzados que permitan crear el chain, por ahora pienso que esta bien para consolidar las bases) ```python #Paso 1 Importamos las librerias #Importamos el chatmodel con sus hiperparametros from langchain_google_genai import ChatGoogleGenerativeAI llm = ChatGoogleGenerativeAI( model = "gemini-1.5-pro", temperature= 0, max_tokens= None, timeout=None, max_retries= 2 ) # Aca los esquemas de roles y el prompt Template, son importantes from langchain_core.messages import AIMessage, HumanMessage, SystemMessage from langchain.prompts import SystemMessagePromptTemplate #Esta libreria para indicar place holders dinamicos cuando solo definimos el system Message from langchain_core.prompts import ChatPromptTemplate #Paso 2 Creamos el prompt Template #Establecer el System Message y el Humman Message de esta manera es mucho mejor puesto que genera mejor legibilidad, una manipulaci贸n mas facil (mas adelante se necesitaria) prompt = SystemMessagePromptTemplate.from_template("Eres un profesor de {input_language}. Ayuda a los estudiantes a hablar fluidamente desde el espa帽ol. Ellos te pasar谩n frases en espa帽ol, y t煤 las traducir谩s correctamente a {input_language}. S茅 formal y servicial en todo momento.") #Paso 3 Creamos el historial del chat chat_history = [] #Paso 4 definimos los place holders dinamicos y les damos formato prompt_with_context= prompt.format( input_language = "Frances" ) #Paso 5 a帽ade el mensaje del sistema difinido en el prompt template al chat history chat_history.append(prompt_with_context) #Paso 6 Capturamos la entrada del usuario query = input('Escribe una pregunta: ') #Paso 7 A帽adimos esta entrada del usuario al chat history como Humman Message chat_history.append(HumanMessage(content=query)) #Paso 8 Generar la respuesta utilizando el LLM #Cuando invokamos chat_history, se debe Mantener un orden en el chat history, debe ser primero System message, Human Message y ya despues se agrea AI message response = llm.invoke(chat_history) chat_history.append(AIMessage(content= response.content)) print(response.content) #Paso 9 nueva pregunta #Paso 9.1 Capturamos la entrada del usuario query = input('Nueva pregunta: ') #Paso 9.2 A帽adimos esta entrada del usuario al chat history como Humman Message chat_history.append(HumanMessage(content=query)) #Paso 10 saber si el modelo tiene memoria response = llm.invoke(chat_history) chat_history.append(AIMessage(content= response.content)) print(response.content) #Paso 11 validas todo lo que hay en chat_history ````#Paso 1 Importamos las librerias ` `#Importamos el chatmodel con sus hiperparametros` `from langchain_google_genai import` ChatGoogleGenerativeAI `llm = ChatGoogleGenerativeAI(` ` model = "gemini-1.5-pro",` ` temperature= 0,` ` max_tokens= None,` ` timeout=None,` ` max_retries= 2` `)` `# Aca los esquemas de roles y el prompt Template, son importantes` `from langchain_core.messages import AIMessage, HumanMessage,` SystemMessage `from langchain.prompts import SystemMessagePromptTemplate #Esta libreria para indicar place holders dinamicos cuando solo definimos el system Message` `from langchain_core.prompts import` ChatPromptTemplate `#Paso 2 Creamos el prompt Template` `#Establecer el System Message y el Humman Message de esta manera es mucho mejor puesto que genera mejor legibilidad, una manipulaci贸n mas facil (mas adelante se necesitaria)` `prompt = SystemMessagePromptTemplate.from_template("Eres un profesor de {input_language}. Ayuda a los estudiantes a hablar fluidamente desde el espa帽ol. Ellos te pasar谩n frases en espa帽ol, y t煤 las traducir谩s correctamente a {input_language}. S茅 formal y servicial en todo momento.")` `#Paso 3 Creamos el historial del chat` `chat_history = []` `#Paso 4 definimos los place holders dinamicos y les damos formato` `prompt_with_context= prompt.format(` ` input_language = "Frances"` `)` `#Paso 5 a帽ade el mensaje del sistema difinido en el prompt template al chat history` `chat_history.append(prompt_with_context)` `#Paso 6 Capturamos la entrada del usuario` `query = input('Escribe una pregunta: ')` `#Paso 7 A帽adimos esta entrada del usuario al chat history como Humman Message` `chat_history.append(HumanMessage(content=query))` `#Paso 8 Generar la respuesta utilizando el LLM` `#Cuando invokamos chat_history, se debe Mantener un orden en el chat history, debe ser primero System message, Human Message y ya despues se agrea AI message` `response = llm.invoke(chat_history)` `chat_history.append(AIMessage(content= response.content))` `print(response.content)` `#Paso 9 nueva pregunta` `#Paso 9.1 Capturamos la entrada del usuario` `query = input('Nueva pregunta: ')` `#Paso 9.2 A帽adimos esta entrada del usuario al chat history como Humman Message` `chat_history.append(HumanMessage(content=query))` `#Paso 10 saber si el modelo tiene memoria` `response = llm.invoke(chat_history)` `chat_history.append(AIMessage(content= response.content))` `print(response.content)` `#Paso 11 validas todo lo que hay en chat_history` ```js ```
![](https://static.platzi.com/media/user_upload/image-a6e37df6-6677-40e6-b1b1-ab5f598bafa2.jpg)
Me dio por hacer lo mismo pero en JS: ```js require('dotenv').config(); const { ChatOpenAI } = require("@langchain/openai"); const { AIMessage, SystemMessage, HumanMessage, trimMessages } = require("@langchain/core/messages"); async function main() { const llm = new ChatOpenAI({ openAIApiKey: process.env.OPENAI_API_KEY, model: "gpt-4", temperature: 0 }); try { const response = await llm.invoke([ { role: "user", content: "Hi im bob" }, { role: "assistant", content: "Hello bob! How can I help you today?" }, { role: "user", content: "Can you tell me a joke?" }, ]); console.log('Respuesta:', response.content); } catch (error) { console.error('Error:', error); } let chat_history = []; if (chat_history.length === 0) { const systemMessage = new SystemMessage("Eres un asistente 煤til."); chat_history.push(systemMessage); } // console.log('Haz una pregunta'); let input = 'Cual es la masa de la tierra?'; chat_history.push(new HumanMessage(input)); try { const response = (await llm.invoke(chat_history)).content; chat_history.push(new AIMessage(response)); chat_history.forEach((message) => { console.log(`${message.role}: ${message.content}`); }); } catch (error) { console.error('Error:', error); } console.log(chat_history); } main().catch(console.error); ```