RAG (OpenAI API + base documentaire à jour) lève 8RAG (OpenAI API + base documentaire à jour)
Un bon RAG (OpenAI API + base documentaire à jour) lève 80–90 % du risque de blocage sur les questions précises (tarifs, cantine, sécurité…) — à condition de soigner le fond (données fiables) et la forme (voix, latence, handoff humain). Voici la recette qui marche en prospection école 👇
A- Ce que le RAG peut vraiment résoudre
Réponses exactes et sourcées :
- le bot lit vos PDFs/politiques/FAQ/tarifs mis à jour et répond avec la phrase officielle (et peut citer la source en interne).
Personnalisation :
- Personnalisation : il adapte les frais et options selon niveau, campus, bourse, fratrie, etc. (via outils/fonctions branchés à Odoo).
Cohérence de ton
- Cohérence de ton : un prompt de persona “conseiller admissions chaleureux” + exemples de réponses donne un rendu pro.
B- Ce que le RAG ne suffit pas à régler (sans design vocal)
Confiance/“chaleur”
- Confiance/“chaleur” : ça se joue sur la prosodie (TTS), la latence (<1 s), les relances naturelles et la capacité d’interruption (barge-in).
Acceptabilité
Acceptabilité : dire clairement que c’est un assistant vocal de l’école et proposer immédiatement un humain à la moindre hésitation.
Cas sensibles
- Cas sensibles (handicap, bourses, discipline) : même avec RAG, transfert humain recommandé.
C- Schéma cible (qui évite la frustration)
- OpenAI Realtime (voix↔LLM)
- Outils (function calling)
- get_fees(level, campus, siblings, scholarship) → Odoo
- book_visit(slot) → calendrier admissions
- send_brochure(email/WhatsApp)
- RAG (vecteur + FAQ/contrats/cantine/sécurité) + règles de citation interne
- Policies
- Se présente comme assistant.
- Se tait quand on parle (barge-in).
- Seuil de confiance : si < 0,75 → “Je préfère vous passer un conseiller.”
- 3 échanges incertains → handoff humain.
- Mots-clés sensibles → handoff direct.
Bonnes pratiques (concrètes)
- Data : unifier tarifs/horaires en tables “source unique” (Odoo) + FAQ “phrases officielles” (RAG).
- Prompting : persona + style + gabarit de réponse court (1–2 phrases + proposition d’action).
- Parole : TTS avec pauses/intonations; réponses < 8 s; reformulations empathiques (“je comprends”).
- Handoff : bouton DTMF/voix “parler à un conseiller” dispo à tout moment.
- Traçabilité : résumé + transcription + champs CRM (intérêt, niveau, prochaine action).
- Sécurité/RGPD : consentement vocal court + bannir infos sensibles; logs chiffrés; durée de rétention définie.
Exemple d’interaction (flux)
Parent : “Combien coûte l’inscription en CE2 et y a-t-il une cantine ?”
Assistant (RAG+outil) : “Pour CE2 à Campus Victor-Hugo, les frais annuels sont 2 450 € (inscription incluse). La cantine est optionnelle à 7,10 € / jour avec menu équilibré. Vous voulez que je vous envoie la brochure et proposer un créneau de visite ?”
(si parent creuse sur allergènes → fiche cantine RAG; si doute détecté → “je vous mets avec Claire, conseillère”)
Mini-checklist de mise en prod
- Tarifs/horaires/cantine/sécurité = tables fiables + FAQ officielles.
- Seuil de confiance + règles de transfert.
- Barge-in activé + latence mesurée.
- Scripts sensibles ⇒ humain.
- Journalisation vers Odoo CRM (lead, statut, prochaine étape).
- Message d’ouverture + consentement transparents.
Verdict
- Oui, un RAG bien conçu enlève la plupart des blocages “contenu”.
- Pour la confiance, il faut voix naturelle + réactivité + handoff humain.
- Le meilleur usage : qualification et prise de rendez-vous (avec réponses précises), puis conseiller humain pour le lien parental.
.
ANNEXES : 1) Persona (prompt système) – Assistant Admissions École
1) Persona (prompt système) – Assistant Admissions École
Vous êtes “Lina”, assistante d’admissions d’une école privée. Objectif: qualifier le parent, répondre précisément selon les données officielles (RAG + Odoo), puis proposer une action (RDV, brochure, visite). Style: chaleureux, concis, non insistant. Phrases courtes. Reformuler si incompris. Jamais d’affirmation sans source interne. Règles: - Transparence: “Je suis l’assistante vocale de l’école.” (dès l’ouverture) - Barge-in: s’arrête immédiatement si l’interlocuteur parle. - Si confiance < 0.75 ou question sensible (handicap, discipline, litige, sécurité avancée): transférer à un conseiller humain. - Toujours proposer une action suivante claire (RDV, envoi brochure, rappel…). - Ne pas inventer. Si donnée manquante: “Je préfère vous passer un conseiller.” Format de réponse (voix): [réponse principale en 1–2 phrases] + [question d’action]
2) Corpus RAG – structure minimale (à indexer)
A. Fiches “réponses officielles” (FAQ atomisées)
- id | catégorie (Tarifs/Cantine/Sécurité/Pédagogie/Transports/Bourses…) | intitulé | réponse_officielle (≤120 mots) | sources (URL interne/nom doc) | dernière_maj (YYYY-MM-DD) | campus[] | niveaux[]
- Exemple d’intitulés : “Tarifs CE2 campus Victor-Hugo”, “Allergènes cantine”, “Surveillance périscolaire”, “Bourses – critères”, “Pédagogie cycle 2”.
B. Tables de référence (pour outils)
- tarifs: campus, niveau, frais_annuels, frais_inscription, mensualités, réductions_fratrie, bourses_disponibles (bool)
- cantine: campus, prix_jour, régimes, allergènes_politique, horaires, fournisseur
- sécurité: campus, protocoles_synthèse, accès, surveillance, contacts_urgence
- visites: campus, créneaux_disponibles (synchro agenda)
C. Documents longs (PDF/Doc)
- Règlement intérieur (sections balisées), Projet éducatif, Brochure, Charte sécurité, Menus types.
- Chunking conseillé: ~800–1200 tokens, chevauchement 100–150, métadonnées = campus/niveau/version.
D. Garde-fous
- Liste “mots/intentions sensibles” ⇒ déclenche transfert humain (handicap, harcèlement, litige, plainte, PAI détaillé, urgence…).
3) Outils (function calling) à brancher sur Odoo
(contrats d’API — JSON)
get_fees
- input: { "campus": "Victor-Hugo", "niveau": "CE2", "enfants_fratrie": 2, "bourse_potentielle": true }
- output: { "frais_annuels": 2450, "frais_inscription": 180, "mensualites": 245, "reduction_fratrie": 10, "devise": "EUR", "source": "tarifs_2025_v3" }
get_canteen
- input: { "campus": "Victor-Hugo", "niveau": "CE2" }
- output: { "prix_jour": 7.1, "regimes": ["standard","végétarien"], "politique_allergenes": "PNNS-3, protocole PAI", "horaires": "12:00–13:30" }
book_visit
- input: { "campus": "Victor-Hugo", "parent_nom": "Dupont", "parent_tel": "+33...", "email": "x@x.fr", "créneau_souhaité": "2025-09-21T17:30:00+02:00" }
- output: { "rdv_id": "VIS-8472", "créneau_confirmé": "2025-09-21T17:30:00+02:00", "lieu": "Hall Admissions", "ics_url": "..." }
send_brochure
- input: { "canal": "whatsapp|email|sms", "dest": "+33...|mail", "campus": "Victor-Hugo", "niveau": "CE2", "lang": "fr" }
- output: { "status": "sent", "message_id": "..." }
create_or_update_lead
- input: { "source": "appel_IA", "parent_nom": "Dupont", "tel": "+33...", "email": "x@x.fr", "intérêt": {"campus":"Victor-Hugo","niveau":"CE2"}, "état": "à_qualifier", "consent_whatsapp": true }
- output: { "lead_id": "CRM-10932", "stage": "À qualifier" }
log_call_summary
- input: { "lead_id": "CRM-10932", "transcription_url": "...", "audio_url": "...", "résumé": "Parent intéressé CE2, visite souhaitée", "sentiment": "positif" }
- output: { "ok": true }
Côté Odoo Online: exposez ces endpoints via un controller (Odoo.sh / Odoo Cloud + module custom) ou via Odoo RPC derrière un micro-service. Normalisez les niveaux (CP, CE1, CE2…), les IDs campus, et sécurisez par token + IP allowlist.
4) Politique de confiance & handoff (exécutable)
- Seuil modèle: si confidence < 0.75 → “Je préfère vous mettre en relation avec un conseiller.” (puis handoff()).
- 3 incertitudes consécutives (ex: “je ne suis pas sûr”) → handoff().
- Intent sensible détectée → handoff() immédiat.
- À tout moment si l’utilisateur dit “parler à quelqu’un” → handoff().
5) Cadrage vocal (qualité perçue)
- Latence bout-en-bout (ASR→LLM→TTS): cible < 800 ms sur réponses courtes.
- Tours de parole: < 8 s par réponse; autoriser barge-in.
- Prosodie: pause courte avant chiffres/prix; reformulation empathique si hésitation détectée.
6) Script d’ouverture (RGPD + transparence)
“Bonjour, je suis l’assistante vocale de [Nom de l’école]. Cet appel peut être enregistré pour améliorer notre accueil. Souhaitez-vous continuer ? Vous pouvez à tout moment demander à parler à un conseiller.”
7) Exemple de flux (pseudo-code)
onCallStart -> greet() if !consent: end() ask_goal() -> intent if intent in ["tarifs","cantine","visite"]: facts = RAG.retrieve(question) if needs_live_data: facts += tool.get_*(params from slots) if confidence >= 0.75: reply(facts.short_answer + propose_next_action) if user_wants_visit: tool.book_visit(...) if user_wants_brochure: tool.send_brochure(...) tool.create_or_update_lead(...) else: handoff() else: handoff() onCallEnd -> tool.log_call_summary(...)
8) Dataset d’exemples (few-shots) – ton & précision
-
Tarifs
Parent: “Le prix pour CE2 à Victor-Hugo ?”
Assistant: “Pour CE2 à Victor-Hugo, c’est 2 450 € par an, inscription incluse. Souhaitez-vous un créneau de visite cette semaine ou que je vous envoie la brochure ?” -
Allergènes cantine
Parent: “Mon enfant est allergique aux arachides.”
Assistant: “La cantine applique un protocole PAI et exclut les arachides des menus. Pour un dossier adapté, je peux vous passer notre conseillère santé scolaire.”
9) Check-list de mise en prod
- FAQ atomisée + tables tarifs/cantine/sécurité fiables (source unique Odoo).
- Indexation RAG (chunking + métadonnées campus/niveau/version).
- Outils Odoo testés (sandbox) + contrats ci-dessus.
- Seuils de confiance + règles de handoff en place.
- Script RGPD et consentement vocal activés.
- Journalisation automatique → Odoo CRM (lead, prochaine action, transcription).
- Tests utilisateurs (10–15 appels réels) → itérations sur ton, latence, réponses.