Skip to main content

Conversation Buffer Window Memory

ConversationBufferWindowMemory keeps a sliding window of the most recent K interactions in a conversation. This can be useful for limiting the memory size, rather than storing the full history.

Usage​

Let's explore the basics of using this memory type.

First we initialize the memory, setting the window size k. The default is k=10.

from langchain.memory import ConversationBufferWindowMemory

memory = ConversationBufferWindowMemory(k=5)

We can then save chat messages to the memory. This adds them to the buffer.

memory.save_context({"input": "Hello"}, {"output": "Hi there!"})

To load the memory, we call load_memory_variables. This will return the most recent k messages.

memory.load_memory_variables({})
{'history': 'Human: Hello\nAI: Hi there!'}

We can also return the messages as a list by setting return_messages=True.

memory = ConversationBufferWindowMemory(k=5, return_messages=True)

memory.load_memory_variables({})
{'history': [HumanMessage(content='Hello'), AIMessage(content='Hi there!')]}

Edge Case Behavior​

If k is set higher than the current length of the message history, load_memory_variables will return the full history rather than truncating.

For example:

memory = ConversationBufferWindowMemory(k=10)

memory.save_context({"input": "Hi"}, {"output": "Hello!"})

memory.load_memory_variables({})

This will return:

{'history': 'Human: Hi\nAI: Hello!'}

Rather than truncating since k > number of messages.

Initializing from Existing Messages​

Rather than saving messages within the chain, we can initialize the memory directly from a ChatMessageHistory.

from langchain.memory import ChatMessageHistory

history = ChatMessageHistory()
history.add_user_message("Hello")
history.add_ai_message("Hi there!")

memory = ConversationBufferWindowMemory.from_messages(chat_memory=history)

Now when we load variables, it will include the initialized messages.

Using in a Chain​

Let's look at using this memory type in a conversation chain.

We'll initialize the memory and chain:

from langchain.llms import OpenAI
from langchain.chains import ConversationChain

memory = ConversationBufferWindowMemory(k=2)
chain = ConversationChain(
llm=OpenAI(),
memory=memory
)

Now when we call predict, the prompt will be augmented with the messages saved to memory.

chain.predict(input="Hello")

chain.predict(input="How are you?")

The second prediction's prompt will contain the previous message history based on the window k:

Human: How are you?
AI: I'm doing great, thanks for asking!

Summary​

The key points of ConversationBufferWindowMemory are:

  • It maintains a sliding window of the most recent k messages
  • k controls how much history is retained
  • Can be initialized from existing ChatMessageHistory
  • Works seamlessly in conversation chains
  • If k is higher than current history, full history is returned