Lesson 11 of 20

Memory & Knowledge

Short-term vs Long-term Memory

3 min read

Effective agents need both types of memory: short-term for the current conversation and long-term for persistent knowledge across sessions.

Memory Types Overview

Type Scope Storage Use Case
Short-term Current session In-memory Conversation context
Long-term Across sessions Database/Vector store User preferences, facts
Episodic Past experiences Vector store Similar past situations
Semantic Facts & concepts Knowledge graph Domain knowledge

Short-term Memory

Keeps track of the current conversation:

from langchain.memory import ConversationBufferMemory

# Simple buffer - stores all messages
memory = ConversationBufferMemory()
memory.save_context(
    {"input": "My name is Alice"},
    {"output": "Nice to meet you, Alice!"}
)

# Window buffer - keeps last N exchanges
from langchain.memory import ConversationBufferWindowMemory
memory = ConversationBufferWindowMemory(k=10)

# Summary memory - summarizes older messages
from langchain.memory import ConversationSummaryMemory
memory = ConversationSummaryMemory(llm=llm)

Long-term Memory

Persists information across sessions:

import json
from datetime import datetime

class LongTermMemory:
    def __init__(self, user_id, db):
        self.user_id = user_id
        self.db = db

    def remember(self, key, value, metadata=None):
        """Store a fact about the user"""
        self.db.upsert({
            "user_id": self.user_id,
            "key": key,
            "value": value,
            "metadata": metadata,
            "updated_at": datetime.now()
        })

    def recall(self, key):
        """Retrieve a stored fact"""
        return self.db.query(
            user_id=self.user_id,
            key=key
        )

    def search(self, query):
        """Semantic search through memories"""
        embedding = embed(query)
        return self.db.vector_search(
            user_id=self.user_id,
            embedding=embedding,
            top_k=5
        )

Combining Memory Types

A production agent typically uses multiple memory systems:

class AgentMemory:
    def __init__(self, user_id):
        # Short-term: current conversation
        self.conversation = ConversationBufferWindowMemory(k=20)

        # Long-term: user facts
        self.user_facts = LongTermMemory(user_id, facts_db)

        # Episodic: past conversations
        self.episodes = VectorStore(f"episodes_{user_id}")

    def get_context(self, query):
        """Build context from all memory types"""
        context = {
            "recent": self.conversation.load_memory_variables({}),
            "user_info": self.user_facts.recall("preferences"),
            "similar_past": self.episodes.search(query, k=3)
        }
        return context

    def save_interaction(self, input, output):
        """Save to both short and long-term"""
        # Short-term
        self.conversation.save_context(
            {"input": input},
            {"output": output}
        )

        # Extract and store facts
        facts = extract_facts(input, output)
        for fact in facts:
            self.user_facts.remember(fact.key, fact.value)

Memory Extraction

Automatically extract memorable information:

def extract_facts(conversation):
    """Use LLM to extract facts worth remembering"""
    prompt = """
    Extract key facts from this conversation that should be remembered:
    - User preferences
    - Important dates/events
    - Stated goals or needs

    Conversation: {conversation}

    Facts (JSON format):
    """
    return llm.generate(prompt.format(conversation=conversation))

Best Practices

Practice Why It Matters
Scope memory appropriately Don't store everything
Add timestamps Know when info was learned
Enable forgetting Remove outdated info
Respect privacy Handle personal data carefully
Test recall accuracy Verify memory retrieval

Next, we'll discuss keeping agents current with knowledge cutoffs and updates. :::

Quiz

Module 3: Memory & Knowledge

Take Quiz