De bout en bout : surveillance des constantes
Vous allez construire : le pipeline de surveillance de détérioration du use case Healthcare — des constantes fenêtrées par patient, des seuils d'escalade avec aucun modèle dans le chemin d'alarme, et un résumé de situation rédigé par un Ollama local pour que les données de santé ne quittent jamais la machine.
Prérequis
- Le démarrage rapide terminé.
- Un Ollama local pour l'étape 4 — l'intérêt de ce pipeline est que le modèle tourne dans votre périmètre. (Sans lui, arrêtez-vous après l'étape 3 : l'escalade fonctionne déjà.)
1 · Générez
pulse new vitals --source webhook \
--stage streaming:trend --stage rule-based:escalate --stage llm:summarize \
--sink webhook
2 · Le stage trend — des fenêtres par patient
stages:
- name: trend
engine: streaming
operators:
- { type: keyBy, field: patient_id }
- type: window
spec: "sliding(10m,1m)"
aggregations:
hr_avg: "avg(heart_rate)"
hr_stddev: "stddev(heart_rate)"
spo2_min: "min(spo2)"
3 · Le stage d'escalade — déterministe, microsecondes, auditable
- name: escalate
engine: rule-based
rules:
- { condition: "spo2_min < 92 || hr_stddev > 15", action: flag }
Le chemin d'alarme ne contient aucun modèle : des seuils validés par votre gouvernance clinique, appliqués à l'identique à chaque fois.
4 · Le stage résumé — un modèle local rédige le contexte
- name: summarize
engine: llm
systemPrompt: |
Rédige un résumé de situation d'un paragraphe pour
le clinicien qui répond : ce qui a franchi la ligne,
la tendance, et la fenêtre concernée.
Pointez le provider LLM de Pulse vers votre Ollama local — les données d'événements sont résumées sans quitter la machine.
5 · Sink vers le tableau d'unité et déployez
pulse secret set UNIT_BOARD_WEBHOOK https://webhook.site/<votre-id>
pulse secret set PULSE_WEBHOOK_SECRET dev-secret # la source webhook générée l'exige
pulse deploy .
6 · Simulez un patient qui se détériore
for spo2 in 97 96 95 93 91 90; do
pulse events publish --topic vitals.in --value '{"patient_id":"p-12","heart_rate":'"$((RANDOM % 40 + 80))"',"spo2":'"$spo2"'}'
done
pulse events tail --topic vitals.escalate.out
Dès que spo2_min passe sous 92 dans la fenêtre, l'escalade se déclenche ; vitals.summarize.out porte le paragraphe rédigé ; le webhook du tableau d'unité reçoit les deux.
Ce qui vient de se passer
Les contraintes cliniques ont façonné l'architecture : les règles décident, le modèle ne fait que décrire, l'humain agit — et chaque étape a atterri sur un topic auditable. Le LLM étant local, la propriété de confidentialité est architecturale, pas contractuelle. Le système a orienté l'attention ; il n'a jamais agi sur un patient.
Dépannage
Aucune escalade ne se déclenche
La fenêtre a besoin de mesures sous 92 dans la fenêtre glissante — envoyez la rafale en deux minutes. Vérifiez vitals.trend.out pour voir le spo2_min calculé par fenêtre.
summarize est unhealthy
Ollama est injoignable. Ce stage reste visiblement unhealthy — l'escalade (la partie critique) continue de fonctionner sans lui.
Ensuite
- Timers par clé — un moniteur qui se tait est aussi un signal
- Crash-resume — des baselines qui survivent au redémarrage