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
- Essayer Junyr gratuitement (3 jours)
- Documentation : Context Service
- Whitepaper : Anti-Hallucination System
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.
Articles liés
Email Professionnel Intégré : L'Avantage Junyr
Stalwart mail server intégré vs intégrations Gmail externes. Email-to-Task temps réel, domaines custom, archivage S3.
Lire l’article →Workflow 3-Step : La Garantie Qualité de Junyr
Query Check, Execution, Verification : le workflow en 3 étapes qui réduit significativement les erreurs et garantit la qualité.
Lire l’article →Universal Inbox : Vue 360° vs Données Éparpillées
JMAP Resources unifie emails, documents, datasets. Late binding 3-tier, Project 360 View. Fini la chasse au trésor dans 5 apps.
Lire l’article →