← Ingénierie IA et IA agentique
Recherche d'information · en cours Jeu de référence QASPER

Chaîne RAG hybride en quatre étapes pour les questions-réponses scientifiques

La recherche derrière ce chatboard : comment trouver le seul passage utile parmi 47 810, et quand reconnaître qu'il n'y en a pas plutôt que d'inventer une réponse.

0,8373
Précision des citations ALCE
84 questions, exécution du 4 avril 2026
0,7151
Rappel des citations ALCE
après la correction d'extract_final_answer
0,7150
Fidélité (RAGAS)
1 dépassement de délai écarté
0,5882
Rappel du contexte (RAGAS)
montée vers ColBERT v2 en cours

L'énoncé du problème

Un chercheur qui interroge un corpus d'articles de traitement automatique des langues (TAL) a besoin d'une réponse qu'il peut retracer jusqu'à un passage précis d'un document précis. L'instruction simple reste très loin de ce niveau : les modèles inventent des citations, mélangent les résultats de papiers distincts et décrivent une méthodologie absente de la source, le tout avec la même aisance assurée.

La formulation technique est une tâche de questions-réponses extractive et générative en domaine ouvert. À partir d'une question en langage naturel et d'un grand corpus d'articles de recherche en texte intégral, le système retrouve les passages les plus pertinents et produit une réponse courte avec des citations en ligne qui pointent vers les documents sources. L'évaluation tourne sur le jeu de référence QASPER (Dasigi et coll., 2021), 5 049 paires question-réponse sur des articles de TAL en texte intégral.

L'ingénierie des données

Un QasperChunker sur mesure découpe le texte brut des articles en fragments chevauchants de 500 jetons (10 % de recouvrement, environ 50 jetons). Chaque fragment porte un en-tête : Title: <titre de l'article>. Section: <titre de section>. L'en-tête ancre le fragment à son origine, à la fois pour la correspondance par mots-clés BM25 et pour la notation ColBERT. Retirez-le, et les fragments courts perdent le signal qui les distingue.

Le corpus obtenu compte 47 810 fragments, rangés dans un index plat FAISS (IndexFlatIP, vecteurs FP16 en 768 dimensions), à côté d'un modèle BM25 sérialisé, bâti sur un corpus segmenté par NLTK, filtré de ses mots vides et racinisé par Porter.

Les 4 étapes

Étape 0. L'expansion de requête HyDE. Une requête de moins de 10 mots déclenche les plongements de documents hypothétiques : le modèle rédige un passage qui répondrait à la question, et ce passage devient la requête dense à la place de la requête brute. Cela referme l'écart de vocabulaire entre une question courte et le texte scientifique dense de l'index.

Étape 1. La recherche hybride (60 meilleurs, RRF k=60). La recherche dense utilise allenai/specter2_base (768 dimensions, FP16) avec son adaptateur de recherche. SPECTER2 s'entraîne sur le graphe global de citations, donc si l'article A cite l'article B, les deux se retrouvent proches, qu'ils partagent ou non leur vocabulaire, et le plongement capte l'intention scientifique plutôt que le jargon de surface. La recherche creuse par rank-bm25 (NLTK, racinisation de Porter) couvre ce que la recherche dense manque : les correspondances exactes sur des noms de méthode et des sigles distinctifs. La fusion de rang réciproque (k=60) réunit les 2 listes classées sans normaliser des scores qui n'ont jamais été sur la même échelle.

Étape 2. Le reclassement ColBERT v2 (7 meilleurs). ColBERT range hors ligne un plongement par jeton et note un couple requête-passage par MaxSim : pour chaque jeton de la requête, il prend la plus forte similarité cosinus contre un jeton du passage, puis somme sur les jetons de la requête. Dans un texte scientifique, la pertinence tient souvent à un seul terme technique qui correspond exactement, et le MaxSim au niveau du jeton l'attrape là où un bi-encodeur au niveau de la phrase le moyenne et le perd.

Étape 3. La porte de pertinence CRAG. Le meilleur logit du reclasseur est comparé à un seuil calibré. En dessous, le système renvoie « contexte insuffisant » au lieu de générer sur des preuves faibles. Le script calibrate_crag.py fixe le seuil selon 2 modes : F1-max, qui balaie 300 candidats sur une grille, ou un repli par centile qui place le seuil au P-ième centile de la distribution de best_rerank_score et n'a besoin d'aucune étiquette RAGAS.

Étape 4. La génération. Les 7 meilleurs passages partent vers Llama-3.1-8B-Instruct via vLLM, sur un parc de GPU alloué dynamiquement (parallélisme de tenseurs sur plusieurs GPU, part de 50 % de la mémoire vive vidéo sur un GPU unique, et repli Ollama sur processeur). L'instruction impose un raisonnement en chaîne, suivi d'un bloc <Final Answer> avec des citations [Doc N] en ligne. La fonction extract_final_answer() retire le bloc de raisonnement avant la notation par RAGAS et ALCE, et cette seule correction a porté le rappel ALCE d'environ 0,057 à environ 0,84.

Le cadre d'évaluation

Tout tourne en local, sans aucun appel d'API externe. Deux cadres partagent une même tâche SLURM. RAGAS (Es et coll., 2023) note la recherche et la génération à travers un modèle juge, sur la précision du contexte, le rappel du contexte, la fidélité et la pertinence de la réponse, et le juge est Llama-3.1-8B-Instruct, servi par la même instance vLLM que celle qui génère. ALCE (Gao et coll., 2023, EMNLP) note l'ancrage au niveau de la citation par une inférence en langue naturelle locale : pour chaque phrase du bloc de réponse finale, il décide si le passage cité soutient vraiment l'affirmation.

Le rappel du contexte (0,5882) est le goulet ouvert. La pile de recherche ne fait pas remonter la preuve de référence pour environ 41 % des questions, et la montée vers ColBERT v2 vise exactement ce point, par le MaxSim au niveau du jeton, moins sensible aux écarts de termes exacts. Les résultats de cette exécution sont attendus.

  • SPECTER2
  • FAISS
  • BM25
  • RRF
  • ColBERT v2
  • CRAG
  • HyDE
  • Llama-3.1-8B
  • vLLM
  • RAGAS
  • ALCE
  • QASPER
  • nomic-embed-text-v1.5
  • SLURM