Aller au contenu

TechniquePratique

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.

ÉtapeRôleSpanAttribut
Embeddingvectoriser la questionembeddings nomic-embed-textmttl.rag.stage = embedding
Récupérationchercher dans Qdrant (top_k)rag retrievalmttl.rag.stage = retrieval
Assemblageconcaténer contexte et questionrag prompt assemblymttl.rag.stage = prompt_assembly
Générationappeler le LLMchat mistral:7bmttl.rag.stage = generation
Évaluationfidélité, hallucinationrag evaluationmttl.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.

Fenêtre de terminal
cd app && python lab2_rag_pipeline.py

Au 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.

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 ms

Ces 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.

  1. --top-k 1 contre --top-k 5 : impact sur la latence de récupération et sur la fidélité.
  2. Cache d’embeddings : à vous d’ajouter un dictionnaire en mémoire dans rag_query, puis de mesurer le gain.
  3. --stream : la génération passe en flux et le temps au premier fragment remonte dans la métrique standard gen_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é.

PanneauCe qu’on doit voir
Durée p95 par étapela génération domine, la récupération reste rapide
Débit par étapeconstant entre étapes, sans décrochage
Fidélité moyenneau-dessus de 0,6, le seuil commun à l’alerte qualité et au SLO du lab 4
Hallucinations détectées sur 1 hzé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.

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.

NotionCe que le lab montre
Hiérarchieun span racine RAG, un span enfant par étape
Attribut d’étapepermet le découpage par étape sans double instrumentation
Évaluation en lignela fidélité du lab est un ratio de mots communs entre contexte et réponse, à compléter par un juge
Taillemoins de 1 Ko par attribut ; l’identifiant des fragments, pas leur contenu
  • 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 %).