Salta el contingut

3.1 Tipus de Memòria en Agents d'IA

Inspiració Cognitiva

L'arquitectura de memòria dels agents d'IA s'inspira en la psicologia cognitiva humana: tenim memòria sensorial (brevíssima), memòria de treball (curta durada) i memòria a llarg termini (permanent).


🧩 La Taxonomia de Memòria

Memòria en el Context (In-context)

Tot el que hi ha dins del context window actiu: historial de conversa, resultats d'eines, documents injectats. És la memòria de treball de l'agent. Ràpida però limitada i efímera.

🗄️

Memòria Externa (Out-of-context)

Informació emmagatzemada fora del context: bases de dades vectorials, BD relacionals, sistemes de fitxers. Persistent i il·limitada. L'agent la consulta quan cal.

🧠

Memòria Paramètrica

El coneixement codificat als pesos del model durant l'entrenament. No és modificable en temps d'execució. És el "coneixement base" de l'agent.


📋 Memòria En-Context: Tipus i Implementació

1. ConversationBufferMemory — L'Historial Complet

from langchain.memory import ConversationBufferMemory
from langchain_openai import ChatOpenAI
from langchain.chains import ConversationChain

llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)

# Guarda TOTS els missatges de la conversa
memory = ConversationBufferMemory(
    memory_key="history",
    return_messages=True  # Retornar com a llista de messages (no string)
)

chain = ConversationChain(llm=llm, memory=memory, verbose=True)

# Primer torn
print(chain.predict(input="El meu nom és Anna i estudio ASIX."))
# → "Hola Anna! Encantada de conèixer-te..."

# Segon torn — recorda el context!
print(chain.predict(input="Quin és el meu nom?"))
# → "Et dius Anna, i estàs estudiant ASIX."

# Inspeccionar la memòria
print(memory.chat_memory.messages)
# → [HumanMessage("El meu nom és..."), AIMessage("Hola Anna..."), ...]

Problema: la memòria creix indefinidament. En converses llargues, pot superar el context window!

2. ConversationBufferWindowMemory — Finestra Lliscant

from langchain.memory import ConversationBufferWindowMemory

# Guarda NOMÉS els últims k intercanvis (k=5 és un bon valor inicial)
memory = ConversationBufferWindowMemory(
    k=5,               # Guardar els últims 5 Human+AI per
    memory_key="history",
    return_messages=True
)
# Avantatge: context window controlat
# Inconvenient: el model "oblida" el principi de la conversa

3. ConversationSummaryMemory — Resum Automàtic

from langchain.memory import ConversationSummaryMemory

# Usa un LLM per resumir periòdicament la conversa
# → Comprimeix el context mantenint la informació important
memory = ConversationSummaryMemory(
    llm=llm,
    memory_key="history",
    return_messages=True
)

# Funcionament intern:
# Conversa llarga → LLM genera un resum → s'usa el resum com a context
# "L'usuari és Anna, estudia ASIX, té dubtes sobre subnetting..."

4. ConversationSummaryBufferMemory — El Millor dels Dos Mons

from langchain.memory import ConversationSummaryBufferMemory

# Guarda els missatges recents íntegres + un resum dels antics
# És el tipus de memòria MÉS RECOMANAT per a agents de producció
memory = ConversationSummaryBufferMemory(
    llm=llm,
    max_token_limit=1000,  # Si supera 1000 tokens → comença a resumir
    memory_key="history",
    return_messages=True
)

🗄️ Memòria a Llarg Termini: Bases de Dades Vectorials

Per a informació que ha de persistir entre sessions o que és massa gran per al context window, usem bases de dades vectorials.

ChromaDB — Vector Store Local

from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
from langchain.memory import VectorStoreRetrieverMemory

embeddings = OpenAIEmbeddings(model="text-embedding-3-small")

# Crear o carregar el vector store
vectorstore = Chroma(
    collection_name="memoria_agent",
    embedding_function=embeddings,
    persist_directory="./memoria_agent_db"  # Persistent en disc
)

# Crear la memòria que usa el vector store
retriever = vectorstore.as_retriever(search_kwargs={"k": 3})

memory = VectorStoreRetrieverMemory(
    retriever=retriever,
    memory_key="historia_rellevant"
)

# Guardar un record de memòria
memory.save_context(
    {"input": "L'alumne Jordi té problemes amb el subnetting"},
    {"output": "He explicat la regla de les potències de 2 per calcular màscares"}
)

# Recuperar memories rellevants per a una nova consulta
results = memory.load_memory_variables(
    {"prompt": "Jordi torna a preguntar sobre xarxes"}
)
print(results["historia_rellevant"])
# → "L'alumne Jordi té problemes amb el subnetting..."

🔄 Estratègies de Gestió de Memòria per a Agents

Memòria d'Entitat (Entity Memory)

from langchain.memory import ConversationEntityMemory
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model="gpt-4o-mini")

# Extreu i recorda informació sobre "entitats" (persones, llocs, conceptes)
memory = ConversationEntityMemory(
    llm=llm,
    entity_extraction_prompt=...,  # Prompt per extreure entitats
    memory_key="history"
)

# Durant la conversa, el model construeix un "mapa" de:
# {
#   "Anna": "Alumna d'ASIX, problemes amb subnetting, nivell intermedi",
#   "Servidor Apache": "Configurat al port 8080, SSL pendent",
#   "Projecte Final": "API REST amb Flask, data entrega dimarts"
# }

Comparació de Tipus de Memòria

Tipus Límit Context Persistència Cos Millor Per a
Buffer Creix sense límit Sessió Baix Converses curtes
Window (k=5) Controlat Sessió Baix Agents reactius
Summary Controlat Sessió Mig (LLM calls) Converses llargues
Summary Buffer Controlat Sessió Mig Recomanat general
VectorStore Il·limitat Persistent Alt (embeddings) Multi-sessió
Entity Controlat Configurable Mig-Alt Assistents personals

✅ Activitats

Exercici 3.1.1 — Comparació de Memòries

Implementa el mateix chatbot 3 vegades, cadascun amb un tipus de memòria diferent: Buffer, Window(k=3) i Summary. Fes una conversa de 10 torns i observa quan cada un "oblida" informació.

Exercici 3.1.2 — Memòria Persistent

Crea un agent amb VectorStoreRetrieverMemory que: 1. Recordi informació d'alumnes entre sessions (restart el programa i comprova) 2. Recuperi records rellevants per a cada nova pregunta 3. Permeti "oblidar" informació específica (via API de Chroma)

Exercici 3.1.3 — Cas Pràctic ASIX

Dissenya un sistema de memòria per a un agent d'helpdesk d'una empresa. L'agent ha de recordar: historial de tickets de cada usuari, configuració dels seus equips, i solucions aplicades prèviament. Quina combinació de memòries usaries i per qué?