Architecture du pipeline
Unsiloed analyse le document source, extrait chaque champ structuré et associe deux scores de confiance : extraction_score (fiabilité de la valeur) et grounding_score (certitude que le texte a été localisé). Les scores sont normalisés entre 0 et 1. Chaque champ est enrichi d’une citation contenant la page, les coordonnées du rectangle (bbox) et les dimensions de l’image (ex. 1 200 × 1 500 px). Exemple :
{
"value": "1 tablet",
"score": {"grounding_score": 0.76, "extraction_score": 0.74},
"citation": {"page": 1, "bbox": [582, 975, 649, 994], "page_width": 1200, "page_height": 1500}
}Les enregistrements sont identifiés (ex. row-5) afin de garder la traçabilité entre le texte extrait et la réponse du modèle.
Mécanique des réponses Jev
TypeSafe Jev reçoit un state (les champs Unsiloed et le contexte clinique) et un dictionnaire de questions. Chaque question indique le type de réponse attendu : noul (probabilité booléenne), choice (option nommée) ou score (rubrique ordonnée). Dans l’exemple, une seule question noul est posée : « Is the extracted dose and frequency plausible … ». Le modèle utilisé est jev-1.13.0. La requête JSON ressemble à :
const request = {
model: "jev-1.13.0",
state: { /* contexte et six médicaments */ },
questions: {
"row-5": {
type: "noul",
instructions: {question: "Is the extracted dose … plausible?", row_id: "row-5"},
criteria: {true: "Plausible", false: "Implausible"}
}
}
};
Le serveur envoie ce payload à https://api.typesafe.ai/v1/systemone avec l’en‑tête Authorization: Bearer <API_KEY>. La réponse renvoie, pour chaque ID, un objet {"type":"noul","noul":0.94} où la valeur représente la probabilité que la phrase soit vraie ; elle n’est pas un indice de confiance du modèle.
Intégration des scores et logique de révision
Le module de décision combine deux indicateurs :
- Le reading score : le plus bas des deux scores Unsiloed (extraction ou grounding) pour la ligne ; un seuil de 0,90 déclenche une vérification.
- Le plausibility score : la valeur
noulretournée par Jev ; un seuil de 0,50 indique une implausibilité.
Le code de filtrage est :
const valid = n => Number.isFinite(n) && n >= 0 && n <= 1;
function reviewReasons(reading, plausible) {
return [
...(!valid(reading) || reading < 0.90 ? ["Verify source reading"] : []),
...(!valid(plausible) || plausible < 0.50 ? ["Review instruction"] : [])
];
}
Si l’une des deux conditions est remplie, la ligne est envoyée à un opérateur humain ; sinon, elle est acceptée automatiquement.
Limites et perspectives
Le système repose sur des seuils fixes ; ils sont choisis heuristiquement et peuvent ne pas couvrir tous les cas cliniques. Le modèle noul ne fournit pas de champ de confiance distinct, ce qui rend difficile l’interprétation des valeurs proches de 0,5. De plus, Jev ne voit jamais l’image originale ; il ne peut donc pas corriger des erreurs d’OCR qui ne sont pas détectées par les scores Unsiloed. Enfin, la logique ne prend pas en compte les interactions médicamenteuses ou les spécificités patient‑spécifiques, limitant son usage à une validation de forme uniquement. Des améliorations possibles incluent l’ajout d’un modèle de confiance supplémentaire, l’apprentissage de seuils adaptatifs et l’intégration d’une couche de vérification pharmacologique.