État du projet
V0 validée
Le comportement central a été évalué sur un corpus réel. Le durcissement de déploiement, les tests de charge, la revue de sécurité et l’outillage opérationnel restent à faire avant une mise en production.
Contexte
Le problème ne se résume pas à appeler un modèle.
Dans un corpus documentaire, une réponse plausible ne suffit pas : il faut pouvoir remonter au passage qui la justifie. Le prototype est parti de cette contrainte, avec des documents hétérogènes et une question simple à vérifier : le bon extrait est-il réellement présent dans le contexte envoyé au modèle ?
D’autres questions se sont vite posées : où le calcul s’exécute (local ou cloud), ce qu’il faut faire quand un chemin distant échoue, ce qu’on peut observer sans journaliser de contenu sensible, et comment mesurer si le retrieval fonctionne réellement plutôt que de le supposer.
Ce qui a été construit
De l’ingestion à une réponse citée
- Ingestion texte : Extraction des PDF texte, TXT, Markdown et DOCX avant indexation.
- Découpage déterministe : Segments d’environ 800 caractères avec 120 caractères de chevauchement, pour un index et une évaluation reproductibles.
- Retrieval hybride léger : Pool dense de 15 candidats, filtré par un score minimal puis reclassé avec 85 % de similarité dense et 15 % de recouvrement lexical.
- Génération ancrée : Le prompt transmet les extraits retenus et demande des citations plutôt qu’une réponse libre ; la génération passe par AI Runtime.
- Routage local / cloud testé : Mode local (S2, Ollama / qwen3:4b) et mode eu-cloud (S1, Mistral) exercés, avec un basculement réel du chemin local vers le chemin distant.
- Observabilité structurée : Journaux de métadonnées (chemin réellement exécuté, contexte distant déclaré vs. observé, latence) sans contenu de prompt, de réponse ni de secret.
Architecture
Un index local, une génération routée
Les embeddings sont calculés localement avec intfloat/multilingual-e5-base (768 dimensions). Un index vectoriel local effectue la recherche par similarité cosinus ; la génération passe ensuite par AI Runtime, en local ou dans le cloud selon le chemin choisi.
Décisions et compromis : évaluer avant la sophistication
Le premier retrieval retrouvait correctement la bonne source sur les questions simples, mais couvrait moins bien les questions nécessitant plusieurs documents : le rappel moyen des sources attendues plafonnait à 0,667 sur ces cas. J’ai élargi le pool à 15 candidats denses puis ajouté un reranking léger combinant 85 % de similarité dense et 15 % de recouvrement lexical, avec un score minimal appliqué avant ce reclassement pour écarter les candidats non pertinents. Les questions multi-documents reçoivent en plus jusqu’à 8 extraits avec diversification des sources, contre 5 pour les questions simples. Cet ajustement a porté le rappel moyen multi-documents à 0,875, sans reranker cross-encoder ni dépendance supplémentaire.
Le mode local (S2) a été testé avec Ollama et qwen3:4b ; le mode eu-cloud (S1) avec Mistral. Un basculement réel du chemin local vers le chemin distant a également été exercé. Le chemin réellement exécuté est enregistré, avec une distinction entre le contexte distant déclaré par la politique de routage et le contexte distant potentiellement exposé sur le chemin exécuté, sans jamais journaliser le contenu des prompts, des réponses ou des secrets.
Validation
Un benchmark contrôlé sur un corpus réel
Le benchmark couvre 14 questions factuelles, 4 reformulations, 4 multi-documents et 3 cas d’information absente (le détail du corpus et des résultats figure dans l’encadré ci-contre).
Le hit@1 à source unique (la bonne source dès le premier extrait retourné) est de 0,778 : la source attendue était présente dans le contexte retrouvé pour chaque question éligible à source unique, sans toujours arriver en tête de liste. La justesse des réponses a elle-même été relue manuellement, question par question, sans notation sémantique automatisée : ce chiffre décrit donc le retrieval, pas la qualité finale des réponses. Le retrieval prend en moyenne 292 ms (p50 : 297 ms ; p95 : 357 ms) ; la génération, portée par AI Runtime, ajoute en moyenne 954 ms (p50 : 632 ms ; p95 : 2 688 ms) et domine la latence totale. Le corpus et le jeu de questions restent volontairement restreints et contrôlés ; ces résultats décrivent un comportement observé, pas une performance générale.
Limites connues
Ce qui reste imparfait
- Pas d’OCR : les documents scannés ou les PDF image ne sont pas couverts par cette V0.
- Corpus et benchmark restreints : 15 documents et 25 questions d’évaluation, définies manuellement.
- Reranking léger, pas de cross-encoder : la couverture multi-documents s’est améliorée mais reste imparfaite ; un cas n’a retrouvé qu’une des deux sources attendues.
- Pas de déploiement de production : pas de test de charge à grande échelle ni de garantie de niveau de service.
- Revue de sécurité incomplète : le durcissement de sécurité reste à faire avant toute exposition plus large.