Comment construire un bot RAG sur T4 pour les manuels d'instruction civique : Qwen remplace la recherche web

L'auteur a construit un bot RAG pour les manuels d'instruction civique des classes 9 et 10, qui cherche les réponses non pas sur internet, mais dans des textes importés. En classe, ce qui compte n'est pas la justesse générale d'une réponse, mais sa correspondance avec les formulations d'un manuel précis — c'est pourquoi le bot limite le contexte au lieu d'accéder au web.

Traité par IA depuis Хабр: Машинное обучение ; édité par Hamidun News
Comment construire un bot RAG sur T4 pour les manuels d'instruction civique : Qwen remplace la recherche web
Source : Хабр: Машинное обучение. Collage: Hamidun News.
Écouter l'article

Un petit modèle avec du contexte plutôt qu'un grand modèle avec internet

La Russie introduit des manuels d'État unifiés, et un passionné a décidé de construire un assistant pour ces ouvrages. Le bot RAG ne cherche pas les réponses aux questions d'instruction civique sur internet ni dans les poids généraux du modèle, mais dans deux manuels importés, ceux des classes 9 et 10.

Pourquoi est-ce nécessaire ? En classe, une réponse fidèle à un manuel précis est notée ; une réponse philosophique issue de connaissances générales ne l'est pas. Un grand modèle classique avec accès internet produit une explication correcte, mais qui ne correspond pas au manuel. Il faut donc une autre architecture : un petit modèle qui reçoit un contexte court et restreint, sans dériver vers des raisonnements généraux. Une faible température de génération et un prompt système aident à rester proche du texte. Le contexte limité ne prive pas le modèle de ses connaissances de base, mais le fait basculer en mode recherche dans un matériau précis plutôt qu'en mode réflexion sur un sujet.

Le pipeline : du PDF à la réponse

La pile technologique est simple. pymupdf4llm analyse le PDF page par page et le convertit en Markdown en conservant tableaux et listes. MarkdownHeaderTextSplitter gère trois niveaux : Chapitre (#) → Paragraphe (##) → Sous-section (###). Chaque fragment conserve des métadonnées : classe, numéro de paragraphe, numéro de page.

Un second passage, avec RecursiveCharacterTextSplitter réglé à chunk_size=1000 et chunk_overlap=150, découpe les sections longues en morceaux gérables. Les embeddings intfloat/multilingual-e5-large encodent le texte, et la base FAISS (faiss-cpu) fonctionne en mémoire dans Colab.

Lorsque l'utilisateur écrit « donne les réponses aux questions du paragraphe 13 de la classe 10 », une expression régulière extrait la classe et le numéro. La fonction smart_filter vérifie la correspondance entre les métadonnées et la requête. FAISS renvoie jusqu'à quatre fragments pertinents. Si le filtre strict ne trouve rien, le code relance la recherche en se limitant à la classe — le contexte peut alors provenir d'un autre paragraphe.

Les fragments trouvés sont assemblés en un contexte accompagné de métadonnées [Classe 10 | § 13 | Page 45], puis transmis à Qwen2.5-3B-Instruct avec un prompt système : répondre strictement à partir du texte fourni, et indiquer le numéro de page à la fin. Le modèle fonctionne à une température de 0,1. Après chaque réponse, torch.cuda.empty_cache() est appelé pour libérer la mémoire mise en cache.

Infrastructure, problèmes et projets

Modèle : Qwen2.5-3B-Instruct (3 milliards de paramètres). Quantification : 4 bits NF4 via bitsandbytes — c'est ce qui permet au modèle de tenir dans la mémoire vidéo d'un T4. Embeddings : intfloat/multilingual-e5-large. Base vectorielle : FAISS (faiss-cpu) en mémoire vive. Infrastructure : Google Colab avec un GPU T4 gratuit. Tout fonctionne sur une seule machine.

Le formatage des réponses ressemble à du Markdown brut (les marqueurs ** restent visibles). Les métadonnées de paragraphe se perdent sur les pages sans en-tête : si un paragraphe commence à la page 139 et se poursuit à la page 140, les fragments de la seconde page restent sans métadonnées et n'apparaissent pas dans les résultats pour ce paragraphe précis. Il n'y a pas de vérification factuelle : le bot ne contrôle pas si la phrase de la réponse correspond réellement au contexte retrouvé. La classe de l'utilisateur n'est pas mémorisée entre les messages. Le numéro de page du fichier peut différer de celui imprimé dans l'édition papier.

L'auteur prévoit d'étendre le projet à l'histoire et à la biologie. Pour les prochains sprints : ajuster le formatage des réponses, mettre en place la mémorisation de l'état de session, ajouter une validation des réponses avant envoi, et résoudre le problème des métadonnées perdues sur les paragraphes s'étalant sur plusieurs pages.

Dossier

Questions clés sur cet article

Que sait-on sur Un petit modèle avec du contexte plutôt qu'un grand modèle avec internet ?

La Russie introduit des manuels d'État unifiés, et un passionné a décidé de construire un assistant pour ces ouvrages. Le bot RAG ne cherche pas les réponses aux questions d'instruction civique sur internet ni dans les poids généraux du modèle, mais dans deux manuels importés, ceux des classes 9 et 10. Pourquoi est-ce nécessaire ? En classe, une réponse fidèle à un manuel précis est notée ; une réponse philosophique issue de connaissances générales ne l'est pas. Un grand modèle classique avec accès internet produit une explication correcte, mais qui ne correspond pas au man

Que sait-on sur Le pipeline : du PDF à la réponse ?

La pile technologique est simple. pymupdf4llm analyse le PDF page par page et le convertit en Markdown en conservant tableaux et listes. MarkdownHeaderTextSplitter gère trois niveaux : Chapitre (#) → Paragraphe (##) → Sous-section (###). Chaque fragment conserve des métadonnées : classe, numéro de paragraphe, numéro de page. Un second passage, avec RecursiveCharacterTextSplitter réglé à chunk_size=1000 et chunk_overlap=150, découpe les sections longues en morceaux gérables. Les embeddings intfloat/multilingual-e5-large encodent le texte, et la base FAISS (faiss-cpu) fonctio

Que sait-on sur Infrastructure, problèmes et projets ?

Modèle : Qwen2.5-3B-Instruct (3 milliards de paramètres). Quantification : 4 bits NF4 via bitsandbytes — c'est ce qui permet au modèle de tenir dans la mémoire vidéo d'un T4. Embeddings : intfloat/multilingual-e5-large. Base vectorielle : FAISS (faiss-cpu) en mémoire vive. Infrastructure : Google Colab avec un GPU T4 gratuit. Tout fonctionne sur une seule machine. Le formatage des réponses ressemble à du Markdown brut (les marqueurs restent visibles). Les métadonnées de paragraphe se perdent sur les pages sans en-tête : si un paragraphe commence à la page 139 et se poursuit

ZK
Zhemal Khamidun — CPO d'Alpina Digital, product manager d'AlpinaGPT. Conçoit des produits IA depuis 2019. Hamidun News est un projet personnel devenu un agrégateur en production avec plus de 6 000 lecteurs.
✦ Unified AI Workspace · Nomad

Test Frontier LLMs & Autonomous Agents in One Workspace

Run Claude Opus 5.5, GPT-6, Gemini 3.1, and DeepSeek side-by-side in Nomad AI (nomadnet.ai) — unified model routing, deep research, and multimodal workflows under one subscription.

Try Nomad AI →Launch Nomad Agent
Qu'en pensez-vous ?
Chargement des commentaires…