Technique
Lab 2 : un pipeline RAG observé de bout en bout
Pour : ingénieurs et SREPrérequis : Avoir réussi le lab 1 du parcours.
Durée : 1 h 30. Prérequis : lab 1 réussi, Qdrant accessible sur localhost:6333.
Les cinq étapes et leurs spans
Section intitulée « Les cinq étapes et leurs spans »| Étape | Rôle | Span | Attribut |
|---|---|---|---|
| Embedding | vectoriser la question | embeddings nomic-embed-text | mttl.rag.stage = embedding |
| Récupération | chercher dans Qdrant (top_k) | rag retrieval | mttl.rag.stage = retrieval |
| Assemblage | concaténer contexte et question | rag prompt assembly | mttl.rag.stage = prompt_assembly |
| Génération | appeler le LLM | chat mistral:7b | mttl.rag.stage = generation |
| Évaluation | fidélité, hallucination | rag evaluation | mttl.rag.stage = evaluation |
Les deux appels au modèle suivent le nommage de la convention GenAI (opération puis modèle) et alimentent gen_ai.client.operation.duration. Chaque étape alimente aussi l’histogramme mttl.rag.stage.duration, découpé par l’attribut d’étape : c’est lui que lit le tableau de bord RAG.
Étape 1 : indexation (10 min)
Section intitulée « Étape 1 : indexation (10 min) »cd app && python lab2_rag_pipeline.pyAu premier lancement, ensure_collection() crée la collection Qdrant et indexe sept documents. Les lancements suivants ne réindexent pas, sauf avec l’option --reindex : le lab 3 s’appuie sur ce comportement.
Étape 2 : lire l’arbre des spans (20 min)
Section intitulée « Étape 2 : lire l’arbre des spans (20 min) »Dans Tempo, ouvrez une trace rag query :
rag query├── embeddings nomic-embed-text ~150 ms├── rag retrieval ~50 ms├── rag prompt assembly ~5 ms├── chat mistral:7b ~1500 ms└── rag evaluation ~10 msCes durées sont un exemple : sur un poste sans GPU, la génération peut prendre plusieurs secondes. Les mêmes spans placés sur une ligne de temps rendent la proportion visible :
gantt title Trace rag query, environ 1,7 s dateFormat x axisFormat %-S,%L s section Racine rag query :q, 0, 1715ms section Étapes embedding :e1, 0, 150ms retrieval :e2, after e1, 50ms prompt assembly :e3, after e2, 5ms generation :e4, after e3, 1500ms evaluation :e5, after e4, 10ms
Dans cet exemple, la génération représente 1 500 ms sur 1 715, soit environ 87 % du temps total. C’est attendu dans ce lab : générer 200 jetons coûte bien plus qu’une recherche dans sept documents. Ce n’est pas pour autant là que se cachent les problèmes de qualité : la récupération décide de ce que le modèle a sous les yeux.
Étape 3 : trois optimisations mesurées (25 min)
Section intitulée « Étape 3 : trois optimisations mesurées (25 min) »--top-k 1contre--top-k 5: impact sur la latence de récupération et sur la fidélité.- Cache d’embeddings : à vous d’ajouter un dictionnaire en mémoire dans
rag_query, puis de mesurer le gain. --stream: la génération passe en flux et le temps au premier fragment remonte dans la métrique standardgen_ai.client.operation.time_to_first_chunk.
Notez chaque résultat : la première optimisation montre qu’un gain de latence peut coûter cher en qualité.
Étape 4 : le tableau de bord RAG (20 min)
Section intitulée « Étape 4 : le tableau de bord RAG (20 min) »| Panneau | Ce qu’on doit voir |
|---|---|
| Durée p95 par étape | la génération domine, la récupération reste rapide |
| Débit par étape | constant entre étapes, sans décrochage |
| Fidélité moyenne | au-dessus de 0,6, le seuil commun à l’alerte qualité et au SLO du lab 4 |
| Hallucinations détectées sur 1 h | zéro idéalement ; enquêter dès la première |
Le compteur d’hallucinations (mttl.hallucinations) repose sur l’heuristique du kit : une réponse qui contient plus de deux nombres absents du contexte. C’est un signal grossier, à compléter par un juge.
Augmentez la charge (python lab2_rag_pipeline.py --repeat 4) et repérez l’étape qui décroche la première.
Étape 5 : de la trace à la métrique (15 min)
Section intitulée « Étape 5 : de la trace à la métrique (15 min) »Le lien trace vers métrique est préconfiguré dans la source Tempo (grafana/provisioning/datasources/datasources.yaml, bloc tracesToMetrics) : depuis un span lent, ouvrez la latence p95 ou la durée par étape du même service, filtre déjà appliqué. Ajoutez-y une requête, par exemple la fidélité moyenne du service.
Récapitulatif du lab
Section intitulée « Récapitulatif du lab »| Notion | Ce que le lab montre |
|---|---|
| Hiérarchie | un span racine RAG, un span enfant par étape |
| Attribut d’étape | permet le découpage par étape sans double instrumentation |
| Évaluation en ligne | la fidélité du lab est un ratio de mots communs entre contexte et réponse, à compléter par un juge |
| Taille | moins de 1 Ko par attribut ; l’identifiant des fragments, pas leur contenu |
Pour aller plus loin
Section intitulée « Pour aller plus loin »- ajouter une étape de reclassement (
bge-reranker) et mesurer le gain de fidélité ; - exporter les paires question et réponse vers Phoenix pour une évaluation en lot.
Révisé le 2 octobre 2026 : encadré sur l’état du kit, recherche Qdrant migrée vers query_points, compteur mttl.hallucinations réellement émis, seuil de fidélité aligné sur 0,6, part de la génération recalculée (87 %).