Skip to content

Détecter une question hors du domaine documentaire

Une question que la documentation ne couvre pas

Section titled “Une question que la documentation ne couvre pas”
question_hors_sujet = (
"Quelle est la politique de remboursement des billets d'avion "
"pour les deplacements professionnels ?"
)
similarites_hs = chunk_embeddings @ embedder.encode(question_hors_sujet, normalize_embeddings=True)
print("Meilleur score (question hors-sujet):", similarites_hs.max())
print("Meilleur score (question dans le domaine):", similarites.max())
Meilleur score de similarite pour la question hors-sujet: 0.385
(a comparer au meilleur score de la question dans le domaine: 0.755 )

Aucun des 5 runbooks ne traite des notes de frais de voyage : le meilleur score de similarité chute à 0,385, contre 0,755 pour une question réellement couverte par la documentation — un écart net, qui suggère un seuil de similarité minimal en dessous duquel le système devrait répondre « cette question sort de ma documentation » plutôt que de forcer une réponse à partir de chunks peu pertinents.

Pourquoi ne pas s’arrêter au prompt anti-hallucination ?

Section titled “Pourquoi ne pas s’arrêter au prompt anti-hallucination ?”

La consigne donnée au LLM (« si l’information n’y figure pas, dis que tu ne sais pas ») aide, mais reste une instruction que le modèle peut ignorer, surtout sous une forme de prompt légèrement différente ou avec un modèle plus petit. Un seuil de similarité, lui, est une vérification programmatique, indépendante de la bonne volonté du modèle de génération — une défense en profondeur, pas un remplacement du prompt, mais un filet de sécurité supplémentaire.

  1. Le problème d’abord : un LLM généraliste, même compétent linguistiquement, ne peut pas répondre avec précision à une question sur une documentation qu’il n’a jamais vue.
  2. Extraction et nettoyage : un PDF exige un traitement dédié (pypdf), et les artefacts de mise en page (en-têtes, pieds de page) doivent être retirés avant toute utilisation.
  3. Recherche sémantique : des embeddings normalisés réduisent la recherche de pertinence à un simple produit matriciel — pas besoin d’infrastructure lourde pour un petit corpus.
  4. RAG : séparer recherche et génération produit des réponses exactes et traçables, à un coût de contexte bien inférieur à la stratégie « tout dans le prompt ».
  5. Savoir dire « je ne sais pas » : un score de similarité trop faible est un signal exploitable pour détecter qu’une question sort du périmètre documentaire couvert.

Ce prototype utilise un très petit modèle local (Qwen2.5-0.5B) et une base vectorielle « maison » (une matrice NumPy). Un système de production remplacerait typiquement :

  • La matrice NumPy par une base vectorielle dédiée (FAISS, Chroma, Pinecone) pour passer à l’échelle.
  • Le petit modèle local par une API de production (ou un modèle local plus grand), selon l’arbitrage coût/qualité/confidentialité — un modèle local reste pertinent quand les documents sont sensibles et ne doivent jamais quitter l’infrastructure de l’entreprise.
  • Le chunking par document entier par un découpage plus fin (paragraphes, fenêtres avec chevauchement), avec des métriques d’évaluation dédiées (recall@k).

👉 Module 10 : IA agentique


Junior TSAFACK – 12/09/2026