Memory â Short-Term / Long-Term / Hybride
La mĂ©moire donne continuitĂ©, personnalisation et traçabilitĂ© aux systĂšmes LLM. Short-Term = fenĂȘtre de contexte ; Long-Term = souvenirs persistants ; Hybride = orchestration des deux.
Résumé incrémental Index vectoriel (RAG) Profil & préférences TTL, consentement, RLS Token Efficiency
1) Mémoire à court terme (Short-Term Memory)
Support
- FenĂȘtre de contexte du modĂšle (ex. 8k/32k/200k tokens).
- Tout ce qui sort de la fenĂȘtre est « oubliĂ© » naturellement.
Techniques principales
- Buffer brut : n derniers tours (simple, mais coûteux en tokens).
- Buffer résumé : résumer périodiquement (facts, décisions, TODO).
- Sélection dynamique : ne garder que les passages pertinents (similarité sémantique, rÚgles).
Paramétrages recommandés
| Contexte LLM | Buffer brut | Résumé | Compression |
|---|---|---|---|
| †8k | 4â6 tours | toutes les 4â6 itĂ©rations | agressive (â50â70%) |
| 32k | 8â12 tours | toutes les 6â10 | modĂ©rĂ©e (â30â50%) |
| â„ 100k | 12â20 tours | toutes les 10â15 | faible (â20â30%) |
Prompts de résumé (extraits)
Résume les tours récents en 5 puces :
- Décisions prises
- Faits vérifiables (avec dates)
- Actions en cours / TODO
- Risques / blocages
- Préférences explicites de l'utilisateur
Format : JSON compact ({"facts":[],"decisions":[],"todo":[]}) pour réutilisation.
# Résumé STM toutes les 8 interactions (ex.)
if turns % 8 == 0:
summary = llm.summarize(dialogue_tail, style="facts+decisions+actions")
stm_summary.append({"t": now(), "summary": summary})2) Mémoire à long terme (Long-Term Memory)
Stockage persistant
- Vecteurs + RAG : Ă©changes « importants » â encodĂ©s â index vectoriel.
- Graphes (Neo4j/RDF) : entitĂ©s & relations (Guillaume â fondateur â Ideo-Lab).
- Journaux : événements horodatés + résumés hebdo/mensuels.
Bénéfice : continuité multi-sessions, personnalisation profonde.
Métadonnées & schéma
{
"user_id":"u123", "type":"preference|project|fact",
"text":"PréfÚre FR, travaille sur 'IA Matrix'",
"tags":["lang:fr","project:matrix"], "confidence":0.82,
"updated_at":"2025-09-09T10:00Z", "ttl":"90d", "hash":"sha256:..."
}- Filtres par user_id, type, tags, date, permissions (RLS).
Rétention & cycle de vie
| CatĂ©gorie | TTL | Action Ă lâexpiration |
|---|---|---|
| Préférences | 365 j | Revalidation puis reset |
| Projets | 180 j | Archivage â rĂ©sumĂ© mensuel |
| Facts temporaires | 90 j | Suppression |
3) Mémoire hybride (STM + LTM)
Combinaison : STM = historique immĂ©diat ; LTM = souvenirs distants. Ex. « Comme je te lâai dit hier⊠» â STM + LTM se complĂštent.
Score de rappel (fusion)
# score mémoire (0..1)
score = 0.55*similarity + 0.25*recency + 0.10*authority + 0.10*role_boost
# role_boost : user > assistant > system (selon cas d'usage)
# recency = exp(-Ît / Ï), Ï typ. 7â30 joursBudget contexte
- Typique : 1/3 STM, 1/3 LTM, 1/3 génération.
- Ăviter la redondance : clusteriser les souvenirs proches & nâen garder quâ1.
4) âïž StratĂ©gies clĂ©s
Résumé incrémental
- Trigger : tous les 5â10 tours ou si tokens > seuil.
- Format JSON (facts/decisions/todo) + horodatage.
- Conserver les résumés successifs (journal des décisions).
FenĂȘtre glissante
- Garder head (systĂšme+outils) + tail des derniers tours.
- Nettoyer : enlever banalités, garder les facts.
Index vectoriel
- Embeddings normalisĂ©s (cosine); top-k 8â20.
- Filtres user_id, lang, permissions, date.
- Stratégie delta par
hashpour MAJ incrémentales.
Personnalisation
- Profil : langue, ton, objectifs, projets actifs.
- Feature flags : « no-memory », « only-session », etc.
Oubli & gouvernance
- TTL par type (90/180/365 j). Archivage â mĂ©ta-rĂ©sumĂ©s.
- Droit Ă lâoubli : effacement + purge des index.
- TraçabilitĂ© : qui a lu/Ă©crit le souvenir (journal dâaudit).
Anti-patterns
- Tout injecter dans le contexte (coĂ»t/latence â â, qualitĂ© â â).
- Souvenirs sans
user_id/TTL â non-conforme. - Absence de citations/identifiants â pas dâaudit possible.
5) đ§Ș QualitĂ© & Ăvaluation
KPIs
- Coherence Score (0..1) : continuité de la réponse vs historique.
- Recall mémoire : % souvenirs corrects rappelés.
- Token Efficiency = tokens utiles / tokens totaux.
- CSAT / NPS (ressenti continuité).
A/B & diff-tests
- Datasets multi-sessions (Qâ souvenirs attendus).
- Comparer variantes : STM-only vs Hybride ; différents top-k.
- Tests dâoubli (expiration) & dâaccĂšs croisĂ©s (RLS).
Observabilité
- Histogrammes scores (sim/recency), P95 latence.
- Alertes : fuite mémoire, rappel incorrect, dépassement budget.
# Recall mémoire@10 (ex.)
ok = 0
for s in scenarios:
r = chat_with_memory(s).ask("Rappelle mon projet ?")
ok += int("IA Matrix" in r.text)
recall_at_10 = ok / len(scenarios)6) đ§° Recette dâimplĂ©mentation (pseudo-code Python)
# Exemple hybride (LangChain-like, trÚs condensé)
class MemoryMgr:
def __init__(self, llm, vecdb, user_id):
self.llm, self.db, self.uid = llm, vecdb, user_id
self.tail, self.summ = [], [] # STM
self.ttl_days = 90
def add_turn(self, role, text):
self.tail.append({"t": now(), "role": role, "text": text})
# FenĂȘtre glissante
while tokens(self.tail) > 1800: self.tail.pop(0)
# Résumé incrémental
if tokens(self.tail) > 1200:
s = self.llm.summarize(self.tail, style="facts|decisions|todo")
self.summ.append({"t": now(), "summary": s})
self.tail = [{"t": now(), "role":"system", "text": f"Résumé: {s}"}]
def persist_if_important(self, turn):
if is_fact(turn.text) or is_preference(turn.text):
vec = embed(turn.text)
meta = {"user_id": self.uid, "text": turn.text, "updated_at": now(),
"ttl": f"{self.ttl_days}d", "hash": sha256(turn.text)}
self.db.upsert(vec, meta, id=meta["hash"])
def recall(self, query, k=8):
qv = embed(query)
res = self.db.search(qv, k=k, filter={"user_id": self.uid})
# score = α*sim + ÎČ*recency + Îł*role_boost
for r in res:
r.score = 0.6*r.sim + 0.3*recency(r.updated_at) + 0.1*role_boost(r)
return sorted(res, key=lambda x:x.score, reverse=True)
def build_context(self, query):
ltm = self.recall(query)[:8]
ctx = compress(self.tail + self.summ + ltm, budget_tokens=3000)
return ctx
# Boucle
mm = MemoryMgr(llm, vecdb, user_id="u123")
mm.add_turn("user", "Je bosse sur le projet IA Matrix.")
mm.persist_if_important(mm.tail[-1])
ctx = mm.build_context("Statut du projet ?")
answer = llm.generate(prompt_with(ctx, "Statut du projet ?"))
LangChain (raccourci)
from langchain.memory import ConversationSummaryBufferMemory
mem = ConversationSummaryBufferMemory(llm=llm, max_token_limit=2000)
# retriever = ContextualCompressionRetriever(base_retriever, compressor=LLMChainFilter(llm))Schéma de décision (Mermaid)
flowchart TD A[New turn] --> B{Tokens > seuil ?} B -- oui --> C[Résumé incrémental] B -- non --> D[Append à STM] A --> E{Fait/Préférence ?} E -- oui --> F[Vector DB Upsert] E -- non --> G[No-op]
7) Sécurité, confidentialité & conformité
Principes & minima
- Consentement explicite pour LTM ; opt-out simple.
- PII : minimisation, masquage, chiffrement (repos/transit).
- RLS/RBAC : filtre
user_idet rĂŽles.
RĂ©tention & droit Ă lâoubli
- TTL par type + purge planifiée.
- Effacement complet : données, index, snapshots.
- Audit dâaccĂšs : who/what/when (redaction PII).
Guardrails
- Répondre « Je ne peux pas accéder à ce souvenir » si filtre échoue.
- Bloquer réponses sans traçabilité (ID sources manquants).
- Politique « no-memory » (session-only) activable par produit.
8) Cas dâusage & Exemples
Assistant client
- Souvenirs : produits, incidents, préférences, SLA.
- Patron : STM + FAQ RAG + LTM client.
- KPI : CSAT, FCR, rappel dâhistorique exact.
CRM / Sales
- Souvenirs : deals, prochaines étapes, personnes clés.
- Relances auto contextualisées (résumés dernier call).
- KPI : taux de conversion, temps cycle, précision suivi.
Assistant dev
- Contexte projet, dĂ©cisions dâarchi, conventions dâĂ©quipe.
- Connexion repo Git â rĂ©sumĂ©s commits & RFC.
- KPI : temps résolution PR, taux ré-utilisation snippets.
