Yi SHENFull-stack & solutions IA

Paris • Singapour • Shanghai

RAG Formation · Leçon · Fondations et mesure

Suivre une question dans le vrai code

Suivre une requête de la frontière API jusqu’à la recherche, l’assemblage du contexte, la génération, la citation et l’évaluation.

$ lesson --status
▸ course RAG Formation
▸ lesson 02 / 16
▸ phase Fondations et mesure
▸ status Terminé
● build → measure → learn

Leçon autonome

Apprenez la leçon complète et vérifiez votre compréhension ici.

Le contenu des 16 leçons de RAG Formation est complet. Cette page contient le contenu complet, les références locales et des exercices immédiats dans le navigateur.

Le gain concret de cette leçon

À la fin de cette leçon, vous saurez identifier le fichier et la fonction exacts qui interviennent à chaque étape d’une requête `/api/v1/qa`.

Regarder la vidéo

1 · La question que nous suivons

Question:
“Quel est le délai de clôture d'un plan d'action pour une non-conformité majeure ?”

Source attendue : `PR-QA-MRD-009`

Fait attendu : `45 jours`

Nous n’allons pas lire chaque fichier de bout en bout. Nous suivrons plutôt la requête de l’extérieur vers l’intérieur et nous arrêterons uniquement sur les fonctions qu’elle appelle réellement.

2 · La chaîne d’appel

Client

↓ `POST /api/v1/qa`

`routes/qa.py` → `ask_question(request)`

↓ délègue

`qa_service.py` → `answer_question_internal(request)`

↓ exécute quatre voies de récupération

`search_qdrant()` · `search_meilisearch()` · `query_lightrag_context()`

↓ assemble les éléments de preuve (quelle fonction décide quelles sources sont conservées ?)

`utils.build_context()`

↓ déduit les citations (quelle fonction transforme les éléments conservés en citations ?)

`utils.sources_from_items()`

↓ construit le prompt et génère la réponse

`utils.build_prompt()` → `completion.generate()`

↓ renvoie

`models.AnswerResponse`

Gardez la fiche de la chaîne de requête ouverte dans un autre onglet pendant l’exercice.

3 · Le rôle réel de chaque étape

ÉtapeImplémentation actuellePourquoi c’est important
Routeroutes/qa.py valide la requête entrante avec Pydantic, puis la transmet.Les routes restent volontairement minces ; la logique réelle se trouve ailleurs.
Orchestrationqa_service.py vérifie que les services sont disponibles, nettoie la question, lit la configuration du backend et lance la récupération.C’est le coordinateur de toute la requête et le meilleur point de départ pour un suivi de bout en bout.
RécupérationQdrant renvoie des fragments et des résumés sémantiques, Meilisearch renvoie des correspondances par mots-clés et LightRAG fournit le contexte du graphe.Si une preuve manque, vérifiez la récupération avant d’accuser le prompt.
Assemblagebuild_context() répartit équitablement le budget entre les canaux et supprime des éléments entiers plutôt que de les tronquer.Tout ce qui ne survit pas à cette étape reste invisible pour le modèle.
Citationsources_from_items() examine uniquement les éléments effectivement intégrés au prompt.Une citation ne doit jamais pointer vers une preuve que le modèle n’a pas vue.
Générationbuild_prompt() demande au modèle de rester dans le contexte fourni et de refuser ce qui n’est pas étayé ; le service de complétion rédige ensuite la réponse.Même une preuve présente peut être ignorée, déformée ou contredite.

4 · Reconstituer la chaîne d’appel — de mémoire

Fermez le schéma de la chaîne d’appel de la section 2. Sans revenir en arrière, complétez ce tableau pour la question que nous suivons — le rappel favorise davantage la mémorisation qu’une nouvelle lecture :

ÉtapeFonction
Route__________
Orchestrate__________
Récupération (trois fonctions)__________
Assemblage (décide ce qui est conservé)__________
Citation (ne cite jamais une preuve supprimée)__________
Génération__________

Vérifiez vos réponses avec la section 2. Tout ce dont vous ne vous souveniez pas est précisément ce qu’il faut relire avant de continuer — c’est tout l’intérêt de procéder dans cet ordre.

5 · Vérifier avec le système en fonctionnement

La chaîne d’appel se trouve dans api/, qui ne fait pas partie de cette formation gratuite — mais l’API en fonctionnement est accessible via la stack de démonstration. Posez-lui directement la question suivie et comparez votre traçage à la réponse réelle, avec demo/setup_demo.py up en cours d’exécution :

curl -s -X POST http://localhost:8000/api/v1/qa \
  -H "Content-Type: application/json" \
  -d "{\"question\": \"Quel est le délai de clôture d'un plan d'action pour une non-conformité majeure ?\", \"workspace\": \"meridian_demo\"}"

Dans la réponse JSON, sources doit contenir PR-QA-MRD-009 et answer doit mentionner 45 jours. Si l’un des deux manque, vous venez de trouver une véritable défaillance à diagnostiquer avec le traçage construit à la section 4 — s’agit-il d’un échec de récupération ou de génération ?

6 · Check your reconstruction

Alors, quelle fonction réalise réellement l’assemblage final du contexte ?

Pourquoi `sources_from_items(context_items)` est-elle si importante ?

Si `/api/v1/search` ne renvoie pas `PR-QA-MRD-009`, quelle famille de fonctions devez-vous examiner en premier ?

Lien avec la mission

Pour un auditeur ou un professionnel de la QA, la fiabilité d’une réponse dépend de la capacité à expliquer le chemin qui y a conduit. C’est précisément pourquoi une carte simple des appels est utile en cas de panne : elle indique où chercher en premier — l’index, le budget de contexte, la logique des citations ou la sortie du modèle.

Prochaine action

Complétez les six cases vides du tableau du flux de données. Répondez ensuite en une seule phrase :

Pourquoi une source peut-elle apparaître dans les résultats bruts de récupération sans figurer dans les citations finales de l’API ?

Posez-moi vos questions sur tout ce qui reste flou — une fonction ou une étape. Une fois les six cases complétées et la dernière question résolue, la leçon 2 sera terminée : passez à la leçon suivante de votre choix.