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é?