Pawrise embarque un assistant conversationnel (« Care Engine ») qui contextualise l'état d'un chien à partir des données du collier, répond aux questions du propriétaire sur la base d'un corpus vétérinaire validé, et organise un handoff structuré vers un vétérinaire partenaire quand c'est pertinent.
Règle d'or
L'assistant n'établit jamais de diagnostic médical (Code rural, Art. L243-1) : il explique, oriente, et invite à consulter.
Architecture : un pipeline LangGraph déterministe borné à 6 nœuds, déployé sur Azure OpenAI Europe. La mémoire long-terme est déléguée au backend Pawrise via tool calls (source de vérité unique).
Pipeline · LangGraph en 6 nœuds
Un pipeline déterministe et borné : chaque étape est testable et journalisée. Le LLM est cantonné à sa tâche, dans une cage.
Circuit Breaker
Classifie l'intention (abus, jailbreak, hors-scope, demande de diagnostic, clean). Si non-clean → branche dédiée, sans RAG ni LLM principal.
Query Understanding
Reformule la question en termes vétérinaires canoniques et déclenche un tool call télémétrie si besoin.
Retrieval
Recherche hybride BM25 (mots-clés) + dense (sémantique), fusion par Reciprocal Rank Fusion. Top-20.
Relevance Filter
Reranker dédié (Cohere Rerank 3.5 multilingue) : top-20 → top-5 chunks les plus pertinents (~100 ms).
Génération
LLM principal sous contrainte : génère la réponse + citations + signal d'escalade, tools bornés.
Post-LLM Guardrail
Détecte le langage « diagnostic », vérifie l'ancrage (chaque claim médical = une source) et force l'escalade selon les règles métier.
Garde-fous · défense en profondeur
Trois couches indépendantes : l'échec de l'une n'expose pas le système. Non négociable vu le Code rural.
Circuit Breaker
Classifier d'intention. Tout ce qui n'est pas « clean » est dérouté vers une Safe Response ou une escalade, sans atteindre le LLM principal.
Contrainte
System prompt strict + whitelist de tools + obligation de citer le corpus pour tout claim médical.
Guardrail
Détection « diagnostic-like », contrôle d'ancrage sur les sources, et déclenchement forcé de l'escalade selon des règles explicites.
Périmètre
Ce que l'assistant fait, et ce qu'il ne fait jamais, par design.
✓ Ce qu'on fait
- Q&A santé / comportement à partir du corpus véto + télémétrie de l'animal
- Contextualisation d'une alerte collier (fréquence cardiaque, activité, geofence)
- Handoff vétérinaire structuré (dossier pré-consultation → Vet Portal)
- Refus systématique du diagnostic + invitation à consulter en cas de doute
- Audit complet de chaque conversation (rétention 5 ans)
✕ Ce qu'on ne fait jamais
- Diagnostic médical explicite (réservé aux vétérinaires, Code rural L243-1)
- Prescription, posologie, recommandation médicamenteuse
- Gestion d'urgences vitales (toujours rediriger vers un urgentiste 24h/24)
- Conseils de dressage / comportement (hors thèse produit)
- Conseils nutritionnels précis (demande un nutritionniste vétérinaire)
Parcours clés
De l'alerte collier à la conversation, puis au handoff vétérinaire structuré.
O3 · Alerte → Chat
- Le collier détecte une anomalie
- Push notification au propriétaire
- Ouverture du chat avec contexte pré-injecté (profil + télémétrie 24h + détail alerte)
- Le propriétaire pose sa question
- Pipeline LangGraph (6 nœuds)
- Réponse + bouton « Contacter un vétérinaire » si escalade
- Tout est journalisé (audit)
O5 · Handoff vétérinaire
- Le propriétaire clique « Contacter un vétérinaire »
- Le Care Engine collecte le dossier (profil + 30j télémétrie + alertes + extraits chat)
- Le LLM produit une synthèse structurée (chronologie, symptômes, urgence)
- Génération PDF + JSON
- Push au Vet Portal
- Le propriétaire choisit le vétérinaire partenaire
- Le vétérinaire reçoit et ouvre le dossier structuré
Coût des modèles
Un budget réel et maîtrisé grâce à la cascade : un modèle par nœud, le plus économique qui fait le travail.
Chaque nœud du pipeline utilise le modèle le moins cher qui fait le travail : les classifications et reformulations passent par un petit modèle, seul le nœud de génération mobilise le gros modèle. C'est la cascade : elle concentre le coût là où il crée de la valeur.
| Nœud | Modèle | Prix (entrée / sortie, 1M tokens) |
|---|---|---|
| 1 · Circuit Breaker | nano · GPT-5.4-nano | 0,20 $ / 1,25 $ |
| 2 · Query Understanding | nano · GPT-5.4-nano | 0,20 $ / 1,25 $ |
| 3 · Retrieval (embeddings) | text-embedding-3-large + BM25 | 0,13 $ (entrée seule) |
| 4 · Relevance Filter | Cohere Rerank 3.5 multilingue | 2 $ / 1 000 recherches |
| 5 · Génération | principal · GPT-5.4 | 2,50 $ / 15 $ |
| 6 · Post-Guardrail | nano · GPT-5.4-nano | 0,20 $ / 1,25 $ |
Coût par conversation
~0,03 à 0,05 €
- ~88 % · Génération (nœud principal)
- ~8 % · Reranking (Cohere)
- ~3 % · 3 nœuds nano (classification, reformulation, garde-fou)
- < 1 % · Embeddings
Calcul à partir des prix publics (affichés en dollars, parité dollar/euro retenue par simplicité) et d'environ 3 000 tokens cumulés sur les trois nœuds nano, 4 500 tokens d'entrée et 500 de sortie sur le nœud principal, et un reranking. Ce coût valide la cible de la spec (« moins de 0,05 € par conversation ») avec des chiffres réels.
La cascade économise environ 20 % par rapport à un pipeline qui ferait tout passer par le gros modèle ; et le small-talk, qui saute le RAG, coûte environ 5 fois moins qu'une réponse santé.
Projection mensuelle
| Stade | Volume | Coût IA |
|---|---|---|
| Démo / soutenance | ~300 conversations / mois | ~12 à 15 € / mois |
| Premiers utilisateurs (~1 000) | ~5 000 conversations / mois | ~200 à 250 € / mois |
| Scale (~10 000 utilisateurs) | ~50 000 conversations / mois | ~2 000 à 2 500 € / mois |
Alternative souveraine (prévue par l'ADR-002) : bascule vers Mistral (entreprise française, hébergement UE, modèles open-weight) via l'interface LLMProvider, sans toucher au pipeline. Mistral Small 3 (0,10 $ / 0,30 $) en petit modèle et Mistral Large 2 (2 $ / 6 $) en principal donnent un coût équivalent avec des données 100 % en Union européenne.
Décisions & objectifs
Les arbitrages d'architecture clés et les indicateurs de succès (MVP).
Décisions d'architecture (ADR)
6 nœuds déterministes, chaque étape testable. La responsabilité juridique est portée par le pipeline ; un agent libre serait indéfendable face au Code rural.
Data residency EU stricte, pas d'entraînement sur les données. Cascade nano/principal pour contenir le coût. Interface LLMProvider abstraite (bascule possible).
Cohere Rerank 3.5 multilingue pour passer de top-20 à top-5. Latence ~10× meilleure qu'un filtre LLM (~100 ms vs 1,5-3 s), meilleure pertinence et pas de « rationalisation ». Interface RelevanceFilter pour bascule.
Pas de stockage d'état dans le chatbot : il interroge le Core API par tool calls (profil, télémétrie, alertes, historique). Source de vérité unique, pas de duplication. Contrainte : tools p95 < 200 ms, fallback gracieux.
Chaque réponse est un JSON (texte, citations, signal d'escalade, actions suggérées, métadonnées). Le front affiche les actions sans parser du markdown fragile : découplage front/back propre.
MVP : masquage regex des PII avant envoi au LLM, jamais d'identifiants ni de GPS bruts (le LLM ne voit que « Rex, golden 5 ans, activité -30 % »). V1 : Microsoft Presidio + dictionnaire vétérinaire. Baseline Azure EU + DPA.
Défense en profondeur : l'échec d'une couche n'expose pas le système. Non négociable vu le Code rural.
BM25 capte les termes techniques exacts (Lyme, dysplasie), dense capte la similarité conversationnelle. Fusion RRF.
Un nœud reformule la question en termes vétérinaires canoniques et déclenche un tool télémétrie si besoin, avant la recherche. Coût : un appel LLM nano (~100 ms) ; gain : meilleur recall@5.
Log immuable de chaque conversation (input, prompts, retrieval, output, décisions guardrail). Rétention 5 ans, base de la défense juridique et de l'eval.