Communitygithub.com

Systèmes de Mémoire pour Agents

Ce skill couvre l'architecture de la mémoire des agents intelligents : mémoire à court terme (fenêtre de contexte), mémoire à long terme (bases vectorielles) et les architectures cognitives qui les organisent.

Qu'est-ce que Systèmes de Mémoire pour Agents ?

Ce skill, 'Systèmes de Mémoire pour Agents', fournit une base complète pour comprendre et implémenter la mémoire des agents intelligents. Il est essentiel car sans mémoire, chaque interaction d'un agent commence à zéro, limitant sa capacité à apprendre et à personnaliser les réponses. Le skill est compatible avec des frameworks comme LangMem, MemGPT/Letta et Mem0, et des bases vectorielles telles que Pinecone, Qdrant, Weaviate, ChromaDB et pgvector. Il explique comment structurer la mémoire en types sémantique (faits), épisodique (expériences) et procédural (savoir-faire) selon le cadre CoALA. De plus, il détaille des modèles de découpage (chunking), de sélection de base vectorielle, de formation de mémoire en arrière-plan et de dégradation des anciennes informations, permettant aux développeurs de concevoir des systèmes de mémoire robustes et efficaces pour leurs agents.

Compatible avec✓Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/SamuelChien/mega-skills-collection/tree/HEAD/agent-memory-systems

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Que fait Systèmes de Mémoire pour Agents ?

La mémoire est la pierre angulaire des agents intelligents. Sans elle, chaque interaction commence de zéro. Ce skill couvre l'architecture de la mémoire des agents : mémoire à court terme (fenêtre de contexte), mémoire à long terme (bases vectorielles) et les architectures cognitives qui les organisent.

Point clé : la mémoire n'est pas seulement du stockage - c'est de la récupération. Un million de faits stockés ne signifient rien si vous ne pouvez pas trouver le bon. Les stratégies de découpage, d'embedding et de récupération déterminent si votre agent se souvient ou oublie.

Le domaine est fragmenté, avec une terminologie inconsistante. Nous utilisons le cadre d'architecture cognitive CoALA : mémoire sémantique (faits), mémoire épisodique (expériences) et mémoire procédurale (savoir-faire).

Principes

  • Qualité de la mémoire = qualité de la récupération, pas quantité de stockage
  • Découper pour la récupération, pas pour le stockage
  • L'isolation du contexte est l'ennemie de la mémoire
  • Le bon type de mémoire pour la bonne information
  • Faire dégrader les vieux souvenirs - tout ne doit pas être éternel
  • Tester la précision de récupération avant la production
  • La formation de mémoire en arrière-plan bat celle en temps réel

Capacités

  • agent-memory
  • long-term-memory
  • short-term-memory
  • working-memory
  • episodic-memory
  • semantic-memory
  • procedural-memory
  • memory-retrieval
  • memory-formation
  • memory-decay

Périmètre

  • vector-database-operations → data-engineer
  • rag-pipeline-architecture → llm-architect
  • embedding-model-selection → ml-engineer
  • knowledge-graph-design → knowledge-engineer

Outillage

Memory_frameworks

  • LangMem (LangChain) - Quand : Agents LangGraph avec mémoire persistante. Note : Types de mémoire sémantique, épisodique, procédurale.
  • MemGPT / Letta - Quand : Gestion de contexte virtuelle, mémoire de type OS. Note : Niveaux de mémoire hiérarchiques, pagination automatique.
  • Mem0 - Quand : Couche mémoire utilisateur pour la personnalisation. Note : Conçu pour les préférences et l'historique utilisateur.

Vector_stores

  • Pinecone - Quand : Géré, échelle entreprise (milliards de vecteurs). Note : Meilleure performance de requête, coût le plus élevé.
  • Qdrant - Quand : Filtrage de métadonnées complexe, open-source. Note : Basé sur Rust, excellent filtrage.
  • Weaviate - Quand : Recherche hybride, fonctionnalités de graphe de connaissances. Note : Interface GraphQL, bon pour les relations.
  • ChromaDB - Quand : Prototypage, applications petites/moyennes. Note : Convivial pour les développeurs, ~20ms p50 à 100K vecteurs.
  • pgvector - Quand : Utilise déjà PostgreSQL, configuration plus simple. Note : Bon pour <1M vecteurs, outillage familier.

Embedding_models

  • OpenAI text-embedding-3-large - Quand : Meilleure qualité, 3072 dimensions. Note : 0,13 $/1M tokens.
  • OpenAI text-embedding-3-small - Quand : Bon équilibre, 1536 dimensions. Note : 0,02 $/1M tokens, 5x moins cher.
  • nomic-embed-text-v1.5 - Quand : Open-source, déploiement local. Note : 768 dimensions, bonne qualité.
  • all-MiniLM-L6-v2 - Quand : Léger, embedding local rapide. Note : 384 dimensions, latence la plus faible.

Modèles

Architecture des types de mémoire

Choisir le bon type de mémoire pour différentes informations

Quand l'utiliser : Concevoir un système de mémoire pour agent

ARCHITECTURE DES TYPES DE MÉMOIRE (Cadre CoALA) :

""" Trois types de mémoire à des fins différentes :

  1. Mémoire sémantique : Faits et connaissances

    • Ce que vous savez sur le monde
    • Préférences utilisateur, connaissances du domaine
    • Stockée dans des profils (structurés) ou des collections (non structurés)
  2. Mémoire épisodique : Expériences et événements

    • Ce qui s'est passé (événements horodatés)
    • Conversations passées, résultats de tâches
    • Utilisée pour apprendre de l'expérience
  3. Mémoire procédurale : Comment faire les choses

    • Règles, compétences, workflows
    • Souvent implémentée comme des exemples few-shot
    • "Comment ai-je résolu cela auparavant ?" """

Implémentation LangMem

""" from langmem import MemoryStore from langgraph.graph import StateGraph

Initialiser le magasin de mémoire

memory = MemoryStore( connection_string=os.environ["POSTGRES_URL"] )

Mémoire sémantique : profil utilisateur

await memory.semantic.upsert( namespace="user_profile", key=user_id, content={ "name": "Alice", "preferences": ["mode sombre", "réponses concises"], "expertise_level": "developeur", } )

Mémoire épisodique : interaction passée

await memory.episodic.add( namespace="conversations", content={ "timestamp": datetime.now(), "summary": "A aidé à déboguer un problème d'authentification", "outcome": "résolu", "key_insights": ["L'expiration du jeton était la cause racine"], }, metadata={"user_id": user_id, "topic": "debugging"} )

Mémoire procédurale : modèle appris

await memory.procedural.add( namespace="skills", content={ "task_type": "debug_auth", "steps": ["Vérifier l'expiration du jeton", "Vérifier le flux d'actualisation"], "example_interaction": few_shot_example, } ) """

Récupération de mémoire à l'exécution

""" async def prepare_context(user_id, query): # Obtenir le profil utilisateur (sémantique) profile = await memory.semantic.get( namespace="user_profile", key=user_id )

# Trouver les expériences passées pertinentes (épisodique)
similar_experiences = await memory.episodic.search(
    namespace="conversations",
    query=query,
    filter={"user_id": user_id},
    limit=3
)

# Trouver les compétences pertinentes (procédurale)
relevant_skills = await memory.procedural.search(
    namespace="skills",
    query=query,
    limit=2
)

return {
    "profile": profile,
    "past_experiences": similar_experiences,
    "relevant_skills": relevant_skills,
}

"""

Modèle de sélection de base vectorielle

Choisir la bonne base de données vectorielle pour votre cas d'utilisation

Quand l'utiliser : Configurer un stockage mémoire persistant

SÉLECTION DE BASE VECTORIELLE :

""" Matrice de décision :

PineconeQdrantWeaviateChromaDBpgvector
ÉchelleMilliards100M+100M+1M1M
GéréOuiLes deuxLes deuxSoi-mêmeSoi-même
FiltrageBasiqueMeilleurBonBasiqueSQL
HybrideNonOuiMeilleurNonOui
CoûtÉlevéMoyenMoyenGratuitGratuit
Latence5ms7ms10ms20ms15ms
"""

Pinecone (Échelle Entreprise)

""" from pinecone import Pinecone

pc = Pinecone(api_key=os.environ["PINECONE_API_KEY"]) index = pc.Index("agent-memory")

Upsert avec métadonnées

index.upsert( vectors=[ { "id": f"memory-{uuid4()}", "values": embedding, "metadata": { "user_id": user_id, "timestamp": datetime.now().isoformat(), "type": "episodic", "content": memory_text, } } ], namespace=namespace )

Requête avec filtre

results = index.query( vector=query_embedding, filter={"user_id": user_id, "type": "episodic"}, top_k=5, include_metadata=True ) """

Qdrant (Filtrage Complexe)

""" from qdrant_client import QdrantClient from qdrant_client.models import PointStruct, Filter, FieldCondition

client = QdrantClient(url="http://localhost:6333")

Filtrage complexe avec Qdrant

results = client.search( collection_name="agent_memory", query_vector=query_embedding, query_filter=Filter( must=[ FieldCondition(key="user_id", match={"value": user_id}), FieldCondition(key="type", match={"value": "semantic"}), ], should=[ FieldCondition(key="topic", match={"any": ["auth", "security"]}), ] ), limit=5 ) """

ChromaDB (Prototypage)

""" import chromadb

client = chromadb.PersistentClient(path="./memory_db") collection = client.get_or_create_collection("agent_memory")

Simple et rapide pour les prototypes

collection.add( ids=[str(uuid4())], embeddings=[embedding], documents=[memory_text], metadatas=[{"user_id": user_id, "type": "episodic"}] )

results = collection.query( query_embeddings=[query_embedding], n_results=5, where={"user_id": user_id} ) """

Modèle de stratégie de découpage (Chunking)

Fractionner les documents en morceaux récupérables

Quand l'utiliser : Traiter des documents pour le stockage mémoire

STRATÉGIES DE DÉCOUPAGE :

""" Le dilemme du découpage :

  • Trop grand : Le vecteur perd en spécificité
  • Trop petit : Perte de contexte

La taille de chunk optimale dépend de :

  • Le type de document (code vs prose vs données)
  • Les modèles de requête (factuelle vs exploratoire)
  • Le modèle d'embedding (chacun a un point idéal)

Guide général : 256-512 tokens pour la plupart des cas d'utilisation """

Découpage de Taille Fixe (Référence)

""" from langchain.text_splitter import RecursiveCharacterTextSplitter

splitter = RecursiveCharacterTextSplitter( chunk_size=500, # Caractères chunk_overlap=50, # Le chevauchement évite de couper les phrases separators=["\n\n", "\n", ". ", " ", ""] # Ordre de priorité )

chunks = splitter.split_text(document) """

Découpage Sémantique (Meilleure Qualité)

""" from langchain_experimental.text_splitter import SemanticChunker from langchain_openai import OpenAIEmbeddings

Fractionne en fonction de la similarité sémantique

splitter = SemanticChunker( embeddings=OpenAIEmbeddings(), breakpoint_threshold_type="percentile", breakpoint_threshold_amount=95 )

chunks = splitter.split_text(document) """

Découpage Sensible à la Structure (Documents Hiérarchiques)

""" from langchain.text_splitter import MarkdownHeaderTextSplitter

Respecte la structure du document

splitter = MarkdownHeaderTextSplitter( headers_to_split_on=[ ("#", "Header 1"), ("##", "Header 2"), ("###", "Header 3"), ] )

chunks = splitter.split_text(markdown_doc)

Chaque chunk a des métadonnées d'en-tête pour le contexte

"""

Découpage Contextuel (Approche d'Anthropic)

"""

Ajouter du contexte à chaque chunk avant l'embedding

Réduit les échecs de récupération de 35%

def add_context_to_chunk(chunk, document_summary): context_prompt = f''' Résumé du document : {document_summary}

Ce qui suit est un chunk de ce document :
{chunk}
'''
return context_prompt

Embeddre le chunk contextualisé, pas le chunk brut

for chunk in chunks: contextualized = add_context_to_chunk(chunk, summary) embedding = embed(contextualized) store(chunk, embedding) # Stocker l'original, embeddre le contextualisé """

Découpage Spécifique au Code

""" from langchain.text_splitter import Language, RecursiveCharacterTextSplitter

Fractionnement tenant compte du langage

python_splitter = RecursiveCharacterTextSplitter.from_language( language=Language.PYTHON, chunk_size=1000, chunk_overlap=200 )

Respecte les limites des fonctions/classes

chunks = python_splitter.split_text(python_code) """

Formation de Mémoire en Arrière-Plan

Traiter les mémoires de manière asynchrone pour une meilleure qualité

Quand l'utiliser : Vous souhaitez un meilleur rappel sans ralentir les interactions

FORMATION DE MÉMOIRE EN ARRIÈRE-PLAN :

""" L'extraction de mémoire en temps réel ralentit les conversations et ajoute de la complexité aux appels d'outils de l'agent. Le traitement en arrière-plan après les conversations produit des mémoires de meilleure qualité.

Modèle : Formation de mémoire subconsciente """

Traitement en Arrière-Plan avec LangGraph

""" from langgraph.graph import StateGraph from langgraph.checkpoint.postgres import PostgresSaver

async def background_memory_processor(thread_id: str): # S'exécute après la fin ou l'inactivité de la conversation conversation = await load_conversation(thread_id)

# Extraire les insights sans pression de temps
insights = await llm.invoke('''
    Analysez cette conversation et extrayez :
    1. Les faits clés appris sur l'utilisateur
    2. Les préférences utilisateur révélées
    3. Les tâches terminées ou en attente
    4. Les modèles de comportement de l'utilisateur

    Soyez minutieux - cela s'exécute en arrière-plan.

    Conversation :
    {conversation}
''')

# Stocker en mémoire à long terme
for insight in insights:
    await memory.semantic.upsert(
        namespace="user_insights",
        key=generate_key(insight),
        content=insight,
        metadata={"source_thread": thread_id}
    )

Déclencher à la fin de la conversation ou après un délai d'inactivité

@on_conversation_idle(timeout_minutes=5) async def process_conversation(thread_id): await background_memory_processor(thread_id) """

Consolidation de la Mémoire (Comme le Sommeil)

"""

Consolider et dédupliquer périodiquement les mémoires

async def consolidate_memories(user_id: str): # Obtenir toutes les mémoires pour l'utilisateur memories = await memory.semantic.list( namespace="user_insights", filter={"user_id": user_id} )

# Trouver les mémoires similaires (doublons potentiels)
clusters = cluster_by_similarity(memories, threshold=0.9)

# Fusionner les mémoires similaires
for cluster in clusters:
    if len(cluster) > 1:
        merged = await llm.invoke(f'''
            Consolidez ces mémoires connexes en une seule :
            {cluster}

            Préservez toutes les informations importantes.
        ''')
        await memory.semantic.upsert(
            namespace="user_insights",
            key=generate_key(merged),
            content=merged
        )
        # Supprimer les originales
        for old in cluster:
            await memory.semantic.delete(old.id)

"""

Modèle de Dégradation de la Mémoire

Oublier les mémoires anciennes et non pertinentes

Quand l'utiliser : La mémoire devient volumineuse, la récupération ralentit

DÉGRADATION DE LA MÉMOIRE :

""" Toutes les mémoires ne devraient pas vivre éternellement :

  • Les anciennes préférences peuvent être obsolètes
  • Les détails des tâches perdent leur pertinence
  • Les mémoires conflictuelles perturbent la récupération

Implémenter une dégradation intelligente basée sur :

  • La récence (quand a-t-elle été créée/consultée ?)
  • La fréquence (à quelle fréquence est-elle récupérée ?)
  • L'importance (est-ce un fait fondamental ou un détail ?)"""

Dégradation Basée sur le Temps

""" from datetime import datetime, timedelta

async def decay_old_memories(namespace: str, max_age_days: int): cutoff = datetime.now() - timedelta(days=max_age_days)

old_memories = await memory.episodic.list(
    namespace=namespace,
    filter={"last_accessed": {"$lt": cutoff.isoformat()}}
)

for mem in old_memories:
    # Suppression douce (marquer comme archivé)
    await memory.episodic.update(
        id=mem.id,
        metadata={"archived": True, "archived_at": datetime.now().isoformat()}
    )

return len(old_memories)

"""

Dégradation Basée sur la Fréquence

""" async def decay_low_frequency_memories(namespace, min_access_count): memories = await memory.semantic.list(namespace=namespace)

for mem in memories:
    if mem.metadata.get("access_count", 0) < min_access_count:
        # Supprimer ou archiver
        await memory.semantic.delete(mem.id)

"""

Dégradation par Consolidation

"""

Au lieu de simplement supprimer, consolider les informations importantes avant de supprimer

async def consolidate_and_decay(user_id, namespace, threshold_days): # Obtenir les vieilles mémoires old_memories = await get_old_memories(user_id, namespace, threshold_days)

# Demander au LLM de résumer ce qui est important
important_info = await llm.invoke(f'''
    Les mémoires suivantes sont anciennes. Résumez
    les informations importantes qui devraient être préservées :

    {old_memories}

    Renvoyez :
    1. Informations à conserver
    2. Informations à supprimer
''')

# Stocker le résumé, supprimer les détails
await memory.semantic.upsert(
    namespace=namespace,
    key=generate_key(user_id),
    content=important_info["preserve"]
)

for mem in important_info["delete"]:
    await memory.semantic.delete(mem["id"])

"""

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

SamuelChien/mega-skills-collection

Security audit, hardening, threat modeling (STRIDE/PASTA), Red/Blue Team, OWASP checks, code review, incident response, and infrastructure security for any project.

SamuelChien/mega-skills-collection

Arquitecto de Soluciones Principal y Consultor Tecnológico de Andru.ia. Diagnostica y traza la hoja de ruta óptima para proyectos de IA en español.

SamuelChien/mega-skills-collection

Ingeniero de Sistemas de Andru.ia. Diseña, redacta y despliega nuevas habilidades (skills) dentro del repositorio siguiendo el Estándar de Diamante.

SamuelChien/mega-skills-collection

Estratega de Inteligencia de Dominio de Andru.ia. Analiza el nicho específico de un proyecto para inyectar conocimientos, regulaciones y estándares únicos del sector. Actívalo tras definir el nicho.

SamuelChien/mega-skills-collection

2D game development principles. Sprites, tilemaps, physics, camera.

SamuelChien/mega-skills-collection

3D game development principles. Rendering, shaders, physics, cameras.

SamuelChien/mega-skills-collection

Expert in building 3D experiences for the web - Three.js, React Three Fiber, Spline, WebGL, and interactive 3D scenes. Covers product configurators, 3D portfolios, immersive websites, and bringing depth to web experiences.

SamuelChien/mega-skills-collection

Accessibility audit skill for scanning, fixing, and verifying WCAG 2.2 Level A and AA compliance across React, Next.js, Vue, Angular, Svelte, and plain HTML codebases. Use when auditing accessibility, fixing a11y violations, checking color contrast, generating compliance reports, or integrating accessibility checks into CI/CD pipelines.

SamuelChien/mega-skills-collection

Ab Test Analyzer - Auto-activating skill for Data Analytics. Triggers on: ab test analyzer, ab test analyzer Part of the Data Analytics skill category.

SamuelChien/mega-skills-collection

A B Test Config Creator - Auto-activating skill for ML Deployment. Triggers on: a b test config creator, a b test config creator Part of the ML Deployment skill category.

SamuelChien/mega-skills-collection

When the user wants to plan, design, or implement an A/B test or experiment. Also use when the user mentions "A/B test," "split test," "experiment," "test this change," "variant copy," "multivariate test," "hypothesis," "conversion experiment," "statistical significance," or "test this." For tracking implementation, see analytics-tracking.

SamuelChien/mega-skills-collection

Acceptance Criteria Creator - Auto-activating skill for Enterprise Workflows. Triggers on: acceptance criteria creator, acceptance criteria creator Part of the Enterprise Workflows skill category.

SamuelChien/mega-skills-collection

Use when a coding task should be driven end-to-end from issue intake through implementation, review, deployment, and acceptance verification with minimal human re-intervention.

SamuelChien/mega-skills-collection

Accessibility Audit Runner - Auto-activating skill for Frontend Development. Triggers on: accessibility audit runner, accessibility audit runner Part of the Frontend Development skill category.

SamuelChien/mega-skills-collection

You are an accessibility expert specializing in WCAG compliance, inclusive design, and assistive technology compatibility. Conduct audits, identify barriers, and provide remediation guidance.

SamuelChien/mega-skills-collection

Web accessibility patterns for WCAG 2.2 compliance including ARIA, keyboard navigation, screen readers, and testing

SamuelChien/mega-skills-collection

Manage Discord channel access — approve pairings, edit allowlists, set DM/group policy. Use when the user asks to pair, approve someone, check who's allowed, or change policy for the Discord channel.

SamuelChien/mega-skills-collection

Create unified specification packages across Business, Development, and Design teams. Staged elaboration (L0 Vision → L1 Requirements → L2 Team Detail → L3 Acceptance Criteria) to build shared understanding. Does not write code.

SamuelChien/mega-skills-collection

Research a company or person and get actionable sales intel. Works standalone with web search, supercharged when you connect enrichment tools or your CRM. Trigger with "research [company]", "look up [person]", "intel on [prospect]", "who is [name] at [company]", or "tell me about [company]".

SamuelChien/mega-skills-collection

Validate messaging consistency across website, GitHub repos, and local documentation generating read-only discrepancy reports. Use when checking content alignment or finding mixed messaging. Trigger with phrases like "check consistency", "validate documentation", or "audit messaging".

Skills associés