Retour au blog
Fonctionnalités

Mémoire et Contexte : L'Avantage des Agents IA

10 décembre 20259 min

Context Service agrège 7 sources automatiquement. Anti-hallucination, confidence scoring, réponses personnalisées.

Mémoire et Contexte : L'Avantage des Agents IA

Les workflows classiques sont amnésiques. Les agents IA ont une mémoire. Cette différence transforme radicalement la qualité des réponses et élimine les hallucinations.


🧠 Le Problème de l'Amnésie

Automatisation Classique : Stateless (Aucune Mémoire)

Scénario : "Relance le client Acme Corp"

Zapier/Make/n8n :
❌ Qui est Acme Corp ?
❌ On a déjà échangé avec eux ?
❌ Quel produit les intéresse ?
❌ Quel est leur budget ?
❌ Qui est le contact ?
❌ Quel est le statut du deal ?

→ Workflow exécute aveuglément :
   GPT-4 génère email GÉNÉRIQUE :
   "Bonjour,
   Nous vous recontactons concernant nos services.
   Restez-vous intéressé ?
   Cordialement"

❌ Email hors-contexte, non personnalisé
❌ Client pense : "Ils ne se souviennent même pas de moi"

Agents IA : Mémoire Persistante

Scénario : "Relance le client Acme Corp"

Junyr (SDR AI) :
✅ Context Service agrège AUTOMATIQUEMENT :

┌─────────────────────────────────────────────────────────────────┐
│  CONTEXT AGGREGATION (7 sources)                                │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  1. Knowledge Base                                              │
│     - Acme Corp = SaaS B2B, 500 employés                        │
│     - Secteur : Productivité / Collaboration                    │
│                                                                 │
│  2. Emails Historiques (JMAP resources)                         │
│     - 12 Jan : Email reçu de john.doe@acme.com                  │
│       "Interested in Junyr Entrepreneur Plan"                   │
│     - 13 Jan : Email envoyé avec Commercial_Proposal.pdf        │
│                                                                 │
│  3. Documents Créés                                             │
│     - Commercial_Proposal_Acme.pdf (13 Jan)                     │
│       Budget : 50K€/an, Plan Entrepreneur                       │
│                                                                 │
│  4. Datasets                                                    │
│     - ROI_Analysis_Acme.csv (14 Jan)                            │
│       Savings estimés : 120K€/an                                │
│                                                                 │
│  5. Tâches Actives/Complétées                                   │
│     - 12 Jan : Qualification call ✅ (completed)                │
│       Notes : Budget 50K€, Timeline Q1 2026                     │
│                                                                 │
│  6. Projets Associés                                            │
│     - Project "Lead - Acme Corp"                                │
│       Status : active, Progress : 65%, Score : 85/100           │
│                                                                 │
│  7. Training Examples                                           │
│     - Input : "Relance lead après proposal"                     │
│       Output : "Bonjour [Nom], suite à notre proposition..."    │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

→ Junyr génère email PERSONNALISÉ :
   "Bonjour John,

   Suite à notre échange du 12 janvier et à la proposition commerciale
   que je vous ai envoyée le 13 concernant le plan Entrepreneur à 50K€/an,
   je me permets de vous relancer.

   Notre analyse ROI montre des économies de 120K€/an pour Acme Corp,
   ce qui représente un retour sur investissement de 2.4x dès la première année.

   Avez-vous pu consulter la proposition ? Auriez-vous des questions
   concernant notre offre ?

   Bien cordialement,
   Max"

✅ Email contextualisé, précis, professionnel
✅ Client pense : "Ils connaissent mon dossier"

🏗️ Architecture : Context Service

Junyr : Aggregation Automatique

# backend/services/context_service.py

class ContextService:
    async def get_full_context(self, agent_id: str) -> dict:
        """
        Agrège TOUTES les sources de données pour cet agent.
        Appelé AVANT chaque génération IA (chat ou task).
        """

        # 1. Knowledge Base (documents uploadés)
        knowledge = await db.fetch(
            "SELECT file_name, content_text FROM agent_knowledge_base "
            "WHERE agent_id = $1",
            agent_id
        )

        # 2. Training Examples (style de réponse)
        training = await db.fetch(
            "SELECT input_example, output_example FROM agent_training_examples "
            "WHERE agent_id = $1",
            agent_id
        )

        # 3. Recent Emails (flow category)
        emails = await db.fetch(
            "SELECT title, content_preview, created_at FROM resources "
            "WHERE agent_id = $1 AND category = 'flow' "
            "ORDER BY created_at DESC LIMIT 20",
            agent_id
        )

        # 4. Documents (asset category, type=document)
        documents = await db.fetch(
            "SELECT title, content_preview, created_at FROM resources "
            "WHERE agent_id = $1 AND type = 'document' "
            "ORDER BY created_at DESC LIMIT 10",
            agent_id
        )

        # 5. Datasets (asset category, type=dataset)
        datasets = await db.fetch(
            "SELECT title, content_metadata, created_at FROM resources "
            "WHERE agent_id = $1 AND type = 'dataset' "
            "ORDER BY created_at DESC LIMIT 10",
            agent_id
        )

        # 6. Active Tasks
        tasks = await db.fetch(
            "SELECT content, status, created_at FROM agent_messages "
            "WHERE agent_id = $1 AND type = 'task' "
            "ORDER BY created_at DESC LIMIT 10",
            agent_id
        )

        # 7. Projects (if agent manages projects)
        projects = await db.fetch(
            "SELECT name, company, status, notes FROM agent_projects "
            "WHERE agent_id = $1 AND status IN ('new', 'active') "
            "ORDER BY created_at DESC LIMIT 10",
            agent_id
        )

        return {
            "knowledge_base": knowledge,
            "training_examples": training,
            "recent_emails": emails,
            "documents": documents,
            "datasets": datasets,
            "active_tasks": tasks,
            "projects": projects
        }

Format Context Pour Prompt IA

def format_context_for_prompt(self, context: dict) -> str:
    """
    Transforme le contexte en texte structuré pour l'IA.
    """

    sections = []

    # Knowledge Base
    if context["knowledge_base"]:
        kb_text = "\n".join([
            f"- {doc['file_name']}: {doc['content_text'][:200]}..."
            for doc in context["knowledge_base"]
        ])
        sections.append(f"## KNOWLEDGE BASE\n{kb_text}")

    # Recent Emails
    if context["recent_emails"]:
        emails_text = "\n".join([
            f"- {email['created_at']}: {email['title']} - {email['content_preview'][:100]}..."
            for email in context["recent_emails"]
        ])
        sections.append(f"## RECENT EMAILS\n{emails_text}")

    # Documents
    if context["documents"]:
        docs_text = "\n".join([
            f"- {doc['title']} ({doc['created_at']})"
            for doc in context["documents"]
        ])
        sections.append(f"## DOCUMENTS CREATED\n{docs_text}")

    # Projects
    if context["projects"]:
        projects_text = "\n".join([
            f"- {p['name']} @ {p['company']} (status: {p['status']}, notes: {p['notes'][:100]}...)"
            for p in context["projects"]
        ])
        sections.append(f"## ACTIVE PROJECTS\n{projects_text}")

    return "\n\n".join(sections)

🚫 Anti-Hallucination : Règles Strictes

System Prompt Avec Directives

# Extrait du system prompt Junyr

ANTI_HALLUCINATION_RULES = """
RÈGLES ANTI-HALLUCINATION CRITIQUES :

1. NE JAMAIS INVENTER de données
   ❌ Pas de noms, emails, téléphones, montants, dates inventés
   ❌ Pas de "je pense que", "probablement", "il semble"
   ✅ Uniquement données CERTAINES du CONTEXTE ci-dessus

2. Donner SEULEMENT des réponses VÉRIFIÉES
   ✅ Si info dans KNOWLEDGE BASE → citer source
   ✅ Si info dans RECENT EMAILS → citer date email
   ✅ Si info dans PROJECTS → citer project name

3. Si information ABSENTE du contexte
   ❌ NE PAS inventer
   ✅ Répondre : "Je n'ai pas cette information dans mes documents"
   ✅ Proposer : "Voulez-vous que je demande à l'équipe ?"

4. En cas de DOUTE
   ❌ NE PAS assumer
   ✅ Demander clarification : "Pourriez-vous préciser... ?"

5. Vérifier COHÉRENCE
   ✅ Budget 50K€ + CA 52M€ → cohérent
   ❌ Budget 50K€ + CA 500K€ → incohérent (demander confirmation)
"""

Exemple Hallucination Évitée

User : "Quel est le budget d'Acme Corp ?"

❌ MAUVAISE réponse (hallucination) :
"Le budget d'Acme Corp est probablement de 100K€ car c'est une
entreprise de 500 employés."

✅ BONNE réponse (basée contexte) :
"Selon les notes du call de qualification du 12 janvier,
le budget mentionné par John Doe (CTO) est de 50K€/an pour le
plan Entrepreneur. Ce budget a été confirmé dans le projet CRM."

OU si info absente :

✅ BONNE réponse (pas d'info) :
"Je n'ai pas cette information dans mes documents. Voulez-vous
que je demande à John Doe lors de notre prochain échange ?"

📊 Comparaison Qualité Réponse

Scénario : "Prépare-moi pour l'appel client Acme Corp"

Zapier/Make (Sans Contexte)

GPT-4 génère (prompt basique) :

"Pour préparer votre appel avec Acme Corp, voici quelques points
à aborder :
- Présenter vos services
- Discuter des besoins du client
- Proposer un devis
- Fixer un prochain rendez-vous"

❌ Réponse générique (inutilisable)
❌ Aucune info spécifique Acme Corp
❌ Vous devez chercher manuellement dans emails/CRM

Junyr (Avec Contexte Complet)

Junyr génère (context service actif) :

"Préparation appel Acme Corp - John Doe (CTO) - 25 Jan 2026

CONTEXTE CLIENT :
- Entreprise : Acme Corp (SaaS B2B, 500 employés, CA €52M)
- Contact : John Doe, CTO
- Email : john.doe@acme.com
- Dernier échange : 13 Jan (envoi proposal)

HISTORIQUE :
- 12 Jan : Qualification call → Budget 50K€, Timeline Q1 2026
- 13 Jan : Proposal envoyée (Plan Entrepreneur, 50K€/an)
- 14 Jan : ROI Analysis générée (savings 120K€/an)
- Pas de réponse depuis 11 jours (relance nécessaire)

POINTS À ABORDER :
1. ✅ Confirmer réception proposal (13 Jan)
2. ✅ Questions sur pricing/plan Entrepreneur ?
3. ✅ ROI Analysis (120K€ savings → argument clé)
4. ✅ Timeline implémentation Q1 2026 (deadline 31 Mars)
5. ⚠️ Relancer décision (11 jours sans nouvelles)

OBJECTIONS ANTICIPÉES :
- "Budget trop élevé" → ROI 2.4x première année
- "Timing serré Q1" → Onboarding possible en 2 semaines
- "Concurrence" → Avantages vs Zapier (voir proposal page 5)

PROCHAINES ÉTAPES :
- Si intéressé → Démo technique (semaine du 27 Jan)
- Si hésitant → Proposition pilote 3 mois
- Si refus → Feedback + nurturing long-terme"

✅ Réponse ultra-détaillée (prêt à l'appel)
✅ Contexte complet Acme Corp
✅ 0 minute recherche manuelle

Gain de temps : 15 minutes (recherche évitée)


🔍 Confidence Scoring : Transparence IA

Junyr : Score de Confiance Automatique

# backend/routers/junyrs_chat.py

def calculate_confidence_score(
    response: str,
    context_available: dict
) -> dict:
    """
    Calcule un score de confiance 0-100 basé sur des heuristiques.
    """

    score = 50  # Base score
    reasoning = []

    # Bonus si contexte riche
    if context_available.get("knowledge_base"):
        score += 15
        reasoning.append("Contexte riche disponible (knowledge base)")

    if context_available.get("recent_emails"):
        score += 10
        reasoning.append("Emails récents disponibles")

    # Bonus si réponse cite des données réelles
    if re.search(r'\b\d{1,2}\s+(Jan|Fev|Mars)', response):  # Dates
        score += 10
        reasoning.append("Références à des données réelles (dates)")

    if re.search(r'\b\d+K€|\b\d+M€', response):  # Montants
        score += 5
        reasoning.append("Références à des montants précis")

    # Pénalités si phrases d'incertitude
    if re.search(r'je pense|peut-être|il semble|probablement', response, re.IGNORECASE):
        score -= 15
        reasoning.append("Phrases d'incertitude détectées")

    # Pénalité si réponse très courte (< 50 chars)
    if len(response) < 50:
        score -= 10
        reasoning.append("Réponse très courte")

    # Pénalité si réponse très longue (> 2000 chars, risque verbosité)
    if len(response) > 2000:
        score -= 5
        reasoning.append("Réponse très longue (verbosité possible)")

    return {
        "confidence_score": max(0, min(100, score)),
        "confidence_reasoning": "; ".join(reasoning)
    }

API Response Avec Confidence

{
  "message_id": "uuid-123",
  "response": "Selon les notes du call du 12 janvier, le budget d'Acme Corp est de 50K€/an...",
  "confidence_score": 85,
  "confidence_reasoning": "Contexte riche disponible; Références à des données réelles (dates, montants)"
}

Interprétation :

  • 80-100 : Haute confiance (données vérifiées, contexte complet)
  • 60-79 : Moyenne (contexte partiel, réponse générale)
  • 40-59 : Faible (peu de contexte, à vérifier manuellement)
  • 0-39 : Très faible (réponse spéculative, ne pas utiliser)

💡 Conclusion

La mémoire et le contexte sont les différenciateurs clés entre workflows stateless et agents IA.

Zapier/Make/n8n : Amnésie totale (chaque run repart de zéro) Junyr : Mémoire persistante (7 sources agrégées automatiquement)

Les bénéfices :

  • ✅ Réponses personnalisées (contexte client complet)
  • ✅ Zéro hallucination (anti-hallucination rules strictes)
  • ✅ Gain 15 min/appel (préparation automatique)
  • ✅ Confidence scoring (transparence IA)
  • ✅ Qualité professionnelle (clients impressionnés)

Si la personnalisation compte : Junyr est structurellement supérieur.


📈 Aller Plus Loin

#memoire#contexte#anti-hallucination#confidence-scoring#personnalisation
JT

Junyr Team

Plateforme IA

L'equipe Junyr conçoit des outils d'IA qui permettent aux TPE/PME européennes de recruter, former et piloter des agents IA autonomes pour leurs tâches quotidiennes.