{"id":1105,"date":"2026-06-15T18:14:22","date_gmt":"2026-06-15T18:14:22","guid":{"rendered":"https:\/\/convly.ai\/how-to-build-a-rag-pipeline-2026\/"},"modified":"2026-08-01T06:46:40","modified_gmt":"2026-08-01T06:46:40","slug":"how-to-build-a-rag-pipeline-2026","status":"publish","type":"post","link":"https:\/\/convly.ai\/fr\/how-to-build-a-rag-pipeline-2026\/","title":{"rendered":"Comment construire un pipeline RAG en 2026 (\u00e9tape par \u00e9tape)"},"content":{"rendered":"<p>La g\u00e9n\u00e9ration augment\u00e9e par la recherche a cess\u00e9 d\u2019\u00eatre une simple curiosit\u00e9 scientifique il y a d\u00e9j\u00e0 plusieurs ann\u00e9es. En 2026, c\u2019est la m\u00e9thode par d\u00e9faut pour faire interagir un LLM avec vos propres documents sans avoir \u00e0 payer pour affiner un mod\u00e8le ni \u00e0 prendre le risque qu\u2019il invente des r\u00e9ponses de son propre chef. Le principe est simple \u00e0 d\u00e9crire, mais sa mise en \u0153uvre pr\u00e9sente de nombreuses difficult\u00e9s : trouver le bon texte, le transmettre au mod\u00e8le et laisser celui-ci r\u00e9diger la r\u00e9ponse.<\/p>\n<p>Il s\u2019agit d\u2019un guide de mise en place, et non d\u2019une \u00e9tude. \u00c0 la fin de ce guide, vous saurez exactement de quels composants un pipeline RAG op\u00e9rationnel aura besoin en 2026, quels outils et versions de mod\u00e8les sp\u00e9cifiques utiliser, et vous disposerez d\u2019un code minimal que vous pourrez ex\u00e9cuter localement ou via une API. Nous avons v\u00e9rifi\u00e9 chaque num\u00e9ro de version, chaque prix et chaque benchmark ci-dessous par rapport \u00e0 des sources actuelles \u2014 car le pire bug RAG est celui que vous copiez depuis un article de blog r\u00e9dig\u00e9 pour les biblioth\u00e8ques de l\u2019ann\u00e9e derni\u00e8re.<\/p>\n<div class=\"convly-tldr\">\n<h3>Points cl\u00e9s<\/h3>\n<ul>\n<li><strong>Six \u00e9tapes, dans l'ordre :<\/strong> segmenter, int\u00e9grer, stocker, extraire, reclasser, g\u00e9n\u00e9rer. Si vous ne passez pas par le module de reclassement, vos meilleurs r\u00e9sultats s'en trouveront nettement moins bons ; si vous ne proc\u00e9dez pas \u00e0 l'\u00e9valuation, vous ne vous en rendrez jamais compte.<\/li>\n<li><strong>C'est la m\u00e9thode du \u00ab chunking \u00bb qui l'emporte.<\/strong> Dans un test de performance de 2026, le d\u00e9coupage r\u00e9cursif \u00e0 environ 512 tokens avec un chevauchement de 10 \u00e0 201 TP3T s'est av\u00e9r\u00e9 plus performant que le d\u00e9coupage s\u00e9mantique sophistiqu\u00e9 (pr\u00e9cision de 691 TP3T contre 541 TP3T). Commencez par l\u00e0.<\/li>\n<li><strong>Int\u00e9grations vectorielles :<\/strong> nomic-embed-text (768 dimensions, gratuit, local) pour les prototypes ; OpenAI text-embedding-3-large ($0.13\/1 million de tokens, 3 072 dimensions) ou Voyage-3.5 pour une qualit\u00e9 \u00e0 grande \u00e9chelle.<\/li>\n<li><strong>Base de donn\u00e9es vectorielle :<\/strong> pgvector si vous utilisez d\u00e9j\u00e0 Postgres ; Qdrant v1.18 (Apache 2.0, Rust) lorsque vous avez besoin d'une recherche filtr\u00e9e rapide ; Chroma pour un travail local rapide.<\/li>\n<li><strong>Cadres :<\/strong> LangChain 1.x (environnement d'ex\u00e9cution LangGraph) pour les flux agentiques, LlamaIndex 0.14.x pour les applications n\u00e9cessitant de nombreuses requ\u00eates de recherche \u2014 et vous pouvez mettre en place un pipeline efficace en environ 40 lignes sans avoir recours \u00e0 l'un ou l'autre.<\/li>\n<li><strong>Ajouter un module de reclassement.<\/strong> Cohere Rerank 3.5 ($2 pour 1 000 recherches) ou l'outil open source BGE-reranker-v2-m3 (gratuit, environ 50 \u00e0 100 ms sur GPU) permettent d'am\u00e9liorer \u00e0 moindre co\u00fbt la pertinence des k premiers r\u00e9sultats.<\/li>\n<\/ul>\n<\/div>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_85 counter-flat ez-toc-counter ez-toc-container-direction\">\n<label for=\"ez-toc-cssicon-toggle-item-6a705d1eb49af\" class=\"ez-toc-cssicon-toggle-label\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Basculer<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #000000;color:#000000\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #000000;color:#000000\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewbox=\"0 0 24 24\" version=\"1.2\" baseprofile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/label><input type=\"checkbox\"  id=\"ez-toc-cssicon-toggle-item-6a705d1eb49af\"  aria-label=\"Basculer\" \/><nav><ul class='ez-toc-list ez-toc-list-level-1' ><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/convly.ai\/fr\/how-to-build-a-rag-pipeline-2026\/#How_a_RAG_pipeline_actually_works\" >Comment fonctionne concr\u00e8tement un pipeline RAG ?<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/convly.ai\/fr\/how-to-build-a-rag-pipeline-2026\/#Step_1_Chunk_your_documents\" >\u00c9tape 1 : Regroupez vos documents par lots<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/convly.ai\/fr\/how-to-build-a-rag-pipeline-2026\/#Step_2_Choose_an_embedding_model\" >\u00c9tape 2 : Choisir un mod\u00e8le d'int\u00e9gration<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/convly.ai\/fr\/how-to-build-a-rag-pipeline-2026\/#Step_3_Store_vectors_in_a_vector_database\" >\u00c9tape 3 : Stocker les vecteurs dans une base de donn\u00e9es vectorielle<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/convly.ai\/fr\/how-to-build-a-rag-pipeline-2026\/#Step_4_Retrieve_and_rerank\" >\u00c9tape 4 : R\u00e9cup\u00e9ration et reclassement<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/convly.ai\/fr\/how-to-build-a-rag-pipeline-2026\/#Step_5_Augment_the_prompt_and_generate\" >\u00c9tape 5 : Enrichir la consigne et g\u00e9n\u00e9rer<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/convly.ai\/fr\/how-to-build-a-rag-pipeline-2026\/#Step_6_A_minimal_code_sketch\" >\u00c9tape 6 : Un exemple de code minimal<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/convly.ai\/fr\/how-to-build-a-rag-pipeline-2026\/#Step_7_Evaluate_%E2%80%94_dont_skip_this\" >\u00c9tape 7 : \u00c9valuer \u2014 ne passez pas cette \u00e9tape<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/convly.ai\/fr\/how-to-build-a-rag-pipeline-2026\/#FAQ\" >FAQ<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/convly.ai\/fr\/how-to-build-a-rag-pipeline-2026\/#Bottom_line\" >Conclusion<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/convly.ai\/fr\/how-to-build-a-rag-pipeline-2026\/#Related_articles\" >Articles connexes<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"How_a_RAG_pipeline_actually_works\"><\/span>Comment fonctionne concr\u00e8tement un pipeline RAG ?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Un syst\u00e8me RAG comporte deux phases. <strong>Indexation<\/strong> Cette op\u00e9ration s'effectue une seule fois (ou \u00e0 chaque fois que vos documents sont modifi\u00e9s) : vous divisez les fichiers source en segments, vous convertissez chaque segment en vecteur \u00e0 l'aide d'un mod\u00e8le d'int\u00e9gration, puis vous stockez ces vecteurs dans une base de donn\u00e9es. <strong>Requ\u00eates<\/strong> Cela se passe \u00e0 chaque requ\u00eate : vous int\u00e9grez la question de l'utilisateur, vous identifiez les segments les plus similaires, vous les r\u00e9organisez \u00e9ventuellement par ordre de pertinence, vous ins\u00e9rez les meilleurs d'entre eux dans une invite, puis vous interrogez un mod\u00e8le de langage de grande capacit\u00e9 (LLM).<\/p>\n<p>C'est justement l\u00e0 tout l'int\u00e9r\u00eat. Tout r\u00e9side dans les d\u00e9tails techniques : la taille des segments, le mod\u00e8le d'int\u00e9gration \u00e0 utiliser, le nombre de r\u00e9sultats \u00e0 extraire, la n\u00e9cessit\u00e9 ou non d'un reclassement, et la mani\u00e8re d'\u00e9valuer l'efficacit\u00e9 de ces diff\u00e9rents \u00e9l\u00e9ments. Si vous souhaitez acqu\u00e9rir les bases th\u00e9oriques avant de vous lancer dans la mise en \u0153uvre, notre <a href=\"\/fr\/rag-retrieval-augmented-generation-explained\/\">Pr\u00e9sentation du RAG<\/a> traite de la th\u00e9orie ; cet article porte sur la mise en \u0153uvre. Et si vous h\u00e9sitez encore entre RAG et la personnalisation du mod\u00e8le lui-m\u00eame, le <a href=\"\/fr\/fine-tuning-vs-rag\/\">Comparaison entre le r\u00e9glage fin et la m\u00e9thode RAG<\/a> C'est le bon point de d\u00e9part : pour la plupart des \u00e9quipes qui alimentent un mod\u00e8le de langage grand public (LLM) avec des donn\u00e9es priv\u00e9es et \u00e9volutives, le RAG constitue la solution la moins co\u00fbteuse et la plus facile \u00e0 maintenir.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Step_1_Chunk_your_documents\"><\/span>\u00c9tape 1 : Regroupez vos documents par lots<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Les mod\u00e8les d'int\u00e9gration ont une limite de contexte et, surtout, perdent en pr\u00e9cision sur les longs passages. Il faut donc diviser les documents en segments. Le consensus de 2026, \u00e9tay\u00e9 par des tests de performance plut\u00f4t que par des impressions subjectives, est sans fioritures : utiliser un s\u00e9parateur de caract\u00e8res r\u00e9cursif ciblant approximativement <strong>512 tokens pr\u00e9sentant un chevauchement de 10 \u00e0 201 TP3T<\/strong> (50 \u00e0 100 jetons).<\/p>\n<p>Une \u00e9valuation r\u00e9alis\u00e9e en f\u00e9vrier 2026 sur 50 documents r\u00e9els a r\u00e9v\u00e9l\u00e9 que le d\u00e9coupage r\u00e9cursif na\u00eff \u00e0 512 tokens atteignait une pr\u00e9cision de recherche de 691 TP3T, tandis que le d\u00e9coupage s\u00e9mantique \u2014 qui tente de d\u00e9couper en fonction des limites de sens \u2014 n'atteignait que 541 TP3T. La raison est simple : le d\u00e9coupage s\u00e9mantique a produit des fragments d\u2019une taille moyenne de 43 tokens, trop petits pour fournir au mod\u00e8le suffisamment de contexte pour r\u00e9pondre. Par ailleurs, une autre \u00e9tude men\u00e9e en janvier 2026 et utilisant la r\u00e9cup\u00e9ration SPLADE a montr\u00e9 que le chevauchement augmentait le co\u00fbt d\u2019indexation sans apporter d\u2019avantage mesurable sur son ensemble de donn\u00e9es. La conclusion \u00e0 retenir : commencez par des segments r\u00e9cursifs de taille fixe, et n\u2019optez pour le d\u00e9coupage s\u00e9mantique ou au niveau de la page que si vos indicateurs d\u2019\u00e9valuation d\u00e9montrent que cela est n\u00e9cessaire pour vos documents sp\u00e9cifiques.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Step_2_Choose_an_embedding_model\"><\/span>\u00c9tape 2 : Choisir un mod\u00e8le d'int\u00e9gration<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Il s'agit de la d\u00e9cision la plus d\u00e9terminante de tout le projet, et les diff\u00e9rences entre les options sont bien r\u00e9elles. Voici les choix qui m\u00e9ritent d'\u00eatre pris en compte \u00e0 la mi-2026, accompagn\u00e9s de chiffres v\u00e9rifi\u00e9s.<\/p>\n<table class=\"convly-vs\">\n<thead>\n<tr>\n<th>Mod\u00e8le<\/th>\n<th>Dimensions<\/th>\n<th>Contexte<\/th>\n<th>Prix \/ 1 million de jetons<\/th>\n<th>Remarques<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>nomic-embed-text v1.5<\/td>\n<td>768 (MRL 64\u2013768)<\/td>\n<td>8,192<\/td>\n<td>Gratuit (local)<\/td>\n<td>274 Mo ; le choix local par d\u00e9faut<\/td>\n<\/tr>\n<tr>\n<td>mxbai-embed-large<\/td>\n<td>1024<\/td>\n<td>512<\/td>\n<td>Gratuit (local)<\/td>\n<td>670 Mo ; meilleure qualit\u00e9, contexte succinct<\/td>\n<\/tr>\n<tr>\n<td>BGE-M3<\/td>\n<td>1024 + clairsem\u00e9<\/td>\n<td>8,192<\/td>\n<td>Gratuit (local)<\/td>\n<td>Licence MIT, plus de 100 langues<\/td>\n<\/tr>\n<tr>\n<td>OpenAI text-embedding-3-small<\/td>\n<td>1536<\/td>\n<td>8,191<\/td>\n<td>$0.02<\/td>\n<td>R\u00e9f\u00e9rence API \u00e0 bas prix<\/td>\n<\/tr>\n<tr>\n<td>OpenAI text-embedding-3-large<\/td>\n<td>3072<\/td>\n<td>8,191<\/td>\n<td>$0.13<\/td>\n<td>$0.065 via l'API Batch<\/td>\n<\/tr>\n<tr>\n<td>Voyage-3.5<\/td>\n<td>2048 (MRL 256\u20132048)<\/td>\n<td>32,000<\/td>\n<td>$0.06<\/td>\n<td>D\u00e9passe de 3 grands d'environ 81 TP3T lors de la r\u00e9cup\u00e9ration<\/td>\n<\/tr>\n<tr>\n<td>Int\u00e9gration de Gemini<\/td>\n<td>3072<\/td>\n<td>\u2014<\/td>\n<td>API<\/td>\n<td>Meilleurs scores MTEB v2 (~68,3)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Pour un prototype, commencez \u00e0 petite \u00e9chelle avec <strong>nomic-embed-text<\/strong> \u2014 il est rapide, gratuit, tient sur un ordinateur portable de 16 Go et, selon certaines sources, surpasse l'ancienne version d'OpenAI <code>text-embedding-ada-002<\/code>. En mati\u00e8re de production, le secteur de l'open source a v\u00e9ritablement rattrap\u00e9 son retard : BGE-M3 est le cheval de bataille sous licence MIT sur lequel s'appuient par d\u00e9faut la plupart des piles auto-h\u00e9berg\u00e9es, tandis que Voyage-3.5 et Gemini Embedding dominent les tests de performance des API g\u00e9r\u00e9es. La seule r\u00e8gle qui compte : <strong>Quel que soit le mod\u00e8le utilis\u00e9 pour int\u00e9grer vos documents, vous devez int\u00e9grer vos requ\u00eates selon le m\u00eame mod\u00e8le.<\/strong> Le m\u00e9lange des mod\u00e8les nuit imperceptiblement \u00e0 la recherche.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Step_3_Store_vectors_in_a_vector_database\"><\/span>\u00c9tape 3 : Stocker les vecteurs dans une base de donn\u00e9es vectorielle<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Une fois que vous disposez de repr\u00e9sentations, celles-ci doivent \u00eatre stock\u00e9es dans un environnement permettant une recherche rapide par \u00ab plus proche voisin \u00bb. En 2026, vous disposez de trois niveaux de stockage pertinents.<\/p>\n<div class=\"convly-procons\">\n<div class=\"pros\">\n<h4>N'h\u00e9sitez pas \u00e0 les essayer<\/h4>\n<ul>\n<li><strong>pgvector 0.8<\/strong> si vous utilisez d\u00e9j\u00e0 Postgres. Avec un index HNSW, la latence p95 est comprise entre quelques millisecondes et une dizaine de millisecondes pour 1 million de vecteurs. La version 0.8 a introduit les balayages it\u00e9ratifs afin que les requ\u00eates filtr\u00e9es renvoient suffisamment de r\u00e9sultats. Aucune nouvelle infrastructure n'est n\u00e9cessaire.<\/li>\n<li><strong>Qdrant v1.18<\/strong> (Apache 2.0, Rust) : quand le filtrage est essentiel. Son algorithme ACORN (ajout\u00e9 dans la version 1.16) r\u00e9sout le probl\u00e8me classique du \u201c filtre qui r\u00e9duit le taux de rappel \u201d en \u00e9largissant la recherche HNSW sous des filtres restrictifs, et figure parmi les options les plus performantes pour la recherche filtr\u00e9e. Une seule commande Docker suffit pour l'h\u00e9berger soi-m\u00eame.<\/li>\n<li><strong>Chroma<\/strong> pour le prototypage local. Une exp\u00e9rience d\u00e9veloppeur optimale, un mode embarqu\u00e9, aucune op\u00e9ration \u00e0 g\u00e9rer : la solution id\u00e9ale jusqu\u2019\u00e0 ce que vos besoins d\u00e9passent ses capacit\u00e9s.<\/li>\n<\/ul>\n<\/div>\n<div class=\"cons\">\n<h4>Attention \u00e0<\/h4>\n<ul>\n<li>Les services g\u00e9r\u00e9s sont factur\u00e9s \u00e0 l'utilisation et surprennent souvent : avec 100 millions de vecteurs, Pinecone peut traiter 1 TP4T5 000+ par mois, alors qu'une solution auto-h\u00e9berg\u00e9e comme Qdrant ou pgvector sur vos propres machines virtuelles revient bien moins cher. Effectuez un audit avant de passer \u00e0 l'\u00e9chelle sup\u00e9rieure.<\/li>\n<li>La construction des index HNSW est lente \u00e0 grande \u00e9chelle, et l'index peut atteindre environ 8 Go pour 1 million de vecteurs \u00e0 1 536 dimensions (utilisez \u00ab halfvec \u00bb pour r\u00e9duire approximativement ce volume de moiti\u00e9).<\/li>\n<li>Le mat\u00e9riel de stockage a une influence pr\u00e9pond\u00e9rante sur le d\u00e9bit : la m\u00eame configuration pgvector a atteint environ 410 QPS sur un SSD cloud, contre 2 150 QPS sur un disque NVMe.<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<p>Une analyse plus d\u00e9taill\u00e9e se trouve dans notre <a href=\"\/fr\/what-is-a-vector-database-2026\/\">Guide sur les bases de donn\u00e9es vectorielles<\/a>, mais pour la plupart des \u00e9quipes, le processus de d\u00e9cision est simple : si vous utilisez d\u00e9j\u00e0 Postgres \u2192 pgvector ; si vous avez besoin d'un filtrage intensif ou de milliards de vecteurs \u2192 Qdrant ou Milvus ; si vous en \u00eates encore au stade de l'exp\u00e9rimentation \u2192 Chroma.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Step_4_Retrieve_and_rerank\"><\/span>\u00c9tape 4 : R\u00e9cup\u00e9ration et reclassement<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>La recherche proprement dite se r\u00e9sume \u00e0 un seul appel : int\u00e9grer la requ\u00eate, demander \u00e0 la base de donn\u00e9es les k blocs les plus proches (k vaut g\u00e9n\u00e9ralement entre 20 et 50). Mais la similarit\u00e9 vectorielle brute est un outil peu pr\u00e9cis. A <strong>reranker<\/strong> \u2014 un encodeur crois\u00e9 qui attribue un score \u00e0 chaque paire requ\u00eate-document individuellement \u2014 reclasse ces candidats et met en avant ceux qui sont v\u00e9ritablement pertinents avant qu\u2019ils n\u2019atteignent le mod\u00e8le.<\/p>\n<p>Proc\u00e9dure standard : extraire les 50 premiers r\u00e9sultats avec votre bi-encodeur, les reclasser, puis ne conserver que les 5 \u00e0 10 premiers. Cohere Rerank 3.5 co\u00fbte $0,002 par recherche ($2 pour 1 000) et ajoute g\u00e9n\u00e9ralement une latence de l'ordre de 100 \u00e0 300 ms. Si vous disposez d'un GPU et que vous souhaitez un co\u00fbt par requ\u00eate nul, l'open source <strong>BGE-reranker-v2-m3<\/strong> s'ex\u00e9cute en environ 50 \u00e0 100 ms et prend en charge les contenus multilingues. Le reclassement est l'une des am\u00e9liorations les plus efficaces et les moins contraignantes que vous puissiez apporter \u2014 la plupart des pipelines qui \u201c renvoient des r\u00e9sultats inutiles \u201d n\u00e9gligent cette \u00e9tape.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Step_5_Augment_the_prompt_and_generate\"><\/span>\u00c9tape 5 : Enrichir la consigne et g\u00e9n\u00e9rer<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Cr\u00e9ez maintenant la consigne : une br\u00e8ve instruction syst\u00e8me indiquant au mod\u00e8le de ne s'appuyer que sur le contexte fourni, les segments reclass\u00e9s et la question de l'utilisateur. Appelez ensuite votre LLM.<\/p>\n<p>Pour le mod\u00e8le de g\u00e9n\u00e9ration, vous pouvez choisir entre une solution locale ou via l'API. En local, via <a href=\"\/fr\/what-is-ollama-complete-guide-2026\/\">Ollama<\/a>, le mod\u00e8le id\u00e9al pour 2026 est un mod\u00e8le de classe 8B \u2014 Qwen3 8B ou Llama 3.1 8B avec quantification Q4_K_M \u2014 qui tient dans 8 \u00e0 12 Go de VRAM et fonctionne \u00e0 plus de 40 tokens par seconde sur un GPU moderne. Qwen3 14B (~8 \u00e0 9 Go en Q4) constitue une avanc\u00e9e significative gr\u00e2ce \u00e0 sa fen\u00eatre de contexte de 128K, permettant d\u2019int\u00e9grer davantage de texte r\u00e9cup\u00e9r\u00e9. Pour une option h\u00e9berg\u00e9e offrant davantage de possibilit\u00e9s, un mod\u00e8le d\u2019API Frontier fonctionne bien ; notre <a href=\"\/fr\/build-ai-chatbot-claude-api\/\">Tutoriel sur le chatbot Claude API<\/a> parcourt ce chemin de bout en bout. Un rappel utile de la part des praticiens : pour le RAG, la qualit\u00e9 de la recherche est g\u00e9n\u00e9ralement plus importante que la taille du mod\u00e8le \u2014 des segments de donn\u00e9es propres, associ\u00e9s \u00e0 un bon embedder et \u00e0 un petit LLM, sont plus performants qu\u2019un mod\u00e8le gigantesque aliment\u00e9 par un contexte de mauvaise qualit\u00e9.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Step_6_A_minimal_code_sketch\"><\/span>\u00c9tape 6 : Un exemple de code minimal<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Voici un pipeline local complet utilisant LangChain 1.x, Chroma et Ollama. Il indexe un document et r\u00e9pond \u00e0 une question \u2014 aucune cl\u00e9 API n'est requise.<\/p>\n<pre><code class=\"language-python\"># pip install langchain langchain-community langchain-chroma langchain-ollama\nfrom langchain_community.document_loaders import TextLoader\nfrom langchain_text_splitters import RecursiveCharacterTextSplitter\nfrom langchain_ollama import OllamaEmbeddings, ChatOllama\nfrom langchain_chroma import Chroma\n\n# 1. Load + chunk (~512 tokens, ~15% overlap; sizes are in characters)\ndocs = TextLoader(&quot;handbook.txt&quot;).load()\nchunks = RecursiveCharacterTextSplitter(\n chunk_size=2000, chunk_overlap=300\n).split_documents(docs)\n\n# 2. Embed + 3. Store\nembeddings = OllamaEmbeddings(model=&quot;nomic-embed-text&quot;)\nstore = Chroma.from_documents(chunks, embeddings)\n\n# 4. Retrieve (top 4)\nretriever = store.as_retriever(search_kwargs={&quot;k&quot;: 4})\n\n# 5. Augment + generate\nllm = ChatOllama(model=&quot;qwen3:8b&quot;)\nquestion = &quot;What is the refund window?&quot;\ncontext = &quot;nn&quot;.join(d.page_content for d in retriever.invoke(question))\nprompt = (f&quot;Answer using ONLY the context. If it's not there, say so.nn&quot;\n f&quot;Context:n{context}nnQuestion: {question}&quot;)\nprint(llm.invoke(prompt).content)\n<\/code><\/pre>\n<p>Voil\u00e0 toute la boucle. Pour ajouter un reclassement, ins\u00e9rez un <code>R\u00e9cup\u00e9rateur de compression contextuelle<\/code> avec un encodeur crois\u00e9 entre les \u00e9tapes 4 et 5. Avec LlamaIndex 0.14.x, le m\u00eame flux n\u00e9cessite g\u00e9n\u00e9ralement moins de code gr\u00e2ce \u00e0 ses abstractions de recherche sp\u00e9cialement con\u00e7ues \u2014 c\u2019est le meilleur choix pour les applications faisant un usage intensif de la recherche, tandis que le runtime LangGraph de LangChain excelle lorsque vous avez besoin d\u2019agents \u00e0 plusieurs \u00e9tapes et avec \u00e9tat. (Le choix d\u2019une couche d\u2019orchestration est un sujet \u00e0 part enti\u00e8re ; consultez notre <a href=\"\/fr\/best-ai-agent-frameworks-2026\/\">Comparaison des frameworks d'agents IA<\/a>.)<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Step_7_Evaluate_%E2%80%94_dont_skip_this\"><\/span>\u00c9tape 7 : \u00c9valuer \u2014 ne passez pas cette \u00e9tape<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>La diff\u00e9rence entre une d\u00e9mo et un produit r\u00e9side dans la mesure. L'outil standard est <strong>RAGAS<\/strong>, qui \u00e9value la fid\u00e9lit\u00e9 (la r\u00e9ponse correspond-elle bien au contexte ?), la pr\u00e9cision contextuelle et la couverture contextuelle en utilisant un mod\u00e8le de langage de grande envergure (LLM) comme juge. Cr\u00e9ez un petit ensemble de 20 \u00e0 50 paires question-r\u00e9ponse \u00e0 partir de vos documents r\u00e9els et testez-le \u00e0 chaque modification.<\/p>\n<p>C'est \u00e9galement ainsi que vous prenez chaque d\u00e9cision en amont en toute objectivit\u00e9. Faut-il passer au \u00ab semantic chunking \u00bb ? Ajouter un \u00ab reranker \u00bb ? Faire passer k de 4 \u00e0 8 ? Ne vous fiez pas \u00e0 votre intuition : modifiez une variable, relancez RAGAS, et ne conservez la modification que si les r\u00e9sultats s'am\u00e9liorent. Sans cette boucle, vous effectuez des r\u00e9glages \u00e0 l'aveuglette.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"FAQ\"><\/span>FAQ<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<h3>Combien co\u00fbte l'exploitation d'un pipeline RAG ?<\/h3>\n<p>Almost free to prototype. With local Ollama embeddings, Chroma, and a local LLM, your only cost is electricity. At scale, the main bills are the vector DB (a self-hosted Qdrant or pgvector instance on your own VM is dramatically cheaper than managed offerings, which can exceed $5,000\/month at 100M vectors) and, if you use APIs, embeddings (OpenAI text-embedding-3-large is $0.13 per million tokens) plus generation calls.<\/p>\n<h3>Ai-je besoin d'une base de donn\u00e9es vectorielle, ou puis-je utiliser une base de donn\u00e9es classique ?<\/h3>\n<p>Vous avez besoin d'une recherche vectorielle, mais pas n\u00e9cessairement d'un produit d\u00e9di\u00e9. pgvector ajoute cette fonctionnalit\u00e9 \u00e0 PostgreSQL et g\u00e8re 1 million de vecteurs avec une faible latence p95 (quelques millisecondes sur NVMe, un peu plus sur un SSD cloud) ; ainsi, si vous utilisez d\u00e9j\u00e0 Postgres, vous pouvez vous passer compl\u00e8tement d'une nouvelle infrastructure. Optez pour une base de donn\u00e9es d\u00e9di\u00e9e comme Qdrant lorsque vous avez besoin d\u2019un filtrage intensif des m\u00e9tadonn\u00e9es ou de milliards de vecteurs.<\/p>\n<h3>Quelle taille de bloc dois-je utiliser ?<\/h3>\n<p>Commencez avec environ 512 tokens et un chevauchement de 10 \u00e0 20% en utilisant un s\u00e9parateur r\u00e9cursif. Un test de performance r\u00e9alis\u00e9 en 2026 a montr\u00e9 que cette m\u00e9thode surpassait le d\u00e9coupage s\u00e9mantique en termes de pr\u00e9cision de recherche, avec un score de 691 TP3T contre 541 TP3T. Ne passez \u00e0 un d\u00e9coupage plus sophistiqu\u00e9 que si vos indicateurs d'\u00e9valuation montrent que cela am\u00e9liore les r\u00e9sultats sur vos documents sp\u00e9cifiques.<\/p>\n<h3>Un \u00ab reranker \u00bb est-il vraiment n\u00e9cessaire ?<\/h3>\n<p>Ce n\u2019est pas pour que \u00e7a fonctionne, mais c\u2019est l\u2019une des am\u00e9liorations de qualit\u00e9 les moins ch\u00e8res qui existent. R\u00e9cup\u00e9rez un ensemble \u00e9tendu (les 50 premiers), reclassez-les \u00e0 l\u2019aide de Cohere Rerank 3.5 ou de l\u2019outil open source BGE-reranker-v2-m3, puis ne conservez que les 5 \u00e0 10 premiers. La plupart des pipelines qui font ressortir des segments non pertinents omettent tout simplement cette \u00e9tape.<\/p>\n<h3>Puis-je cr\u00e9er un RAG sans LangChain ni LlamaIndex ?<\/h3>\n<p>Oui. La boucle principale \u2014 int\u00e9gration, recherche, invite, g\u00e9n\u00e9ration \u2014 compte environ 40 lignes de code Python simple qui appellent directement votre mod\u00e8le d\u2019int\u00e9gration, votre client de base de donn\u00e9es vectorielle et votre LLM. Les frameworks permettent de gagner du temps sur les chargeurs, les r\u00e9classificateurs et l\u2019orchestration des agents, mais ils sont facultatifs, et une impl\u00e9mentation \u00ab \u00e0 partir de z\u00e9ro \u00bb vous offre un contr\u00f4le total sur chaque \u00e9tape.<\/p>\n<h3>Dois-je utiliser un mod\u00e8le local ou une API pour la g\u00e9n\u00e9ration ?<\/h3>\n<p>L'ex\u00e9cution locale (via Ollama, avec un mod\u00e8le 8B et 8 \u00e0 12 Go de VRAM) est id\u00e9ale pour pr\u00e9server la confidentialit\u00e9, ma\u00eetriser les co\u00fbts et utiliser l'application hors ligne. Une API vous offre une qualit\u00e9 maximale et z\u00e9ro op\u00e9ration. De nombreuses \u00e9quipes r\u00e9alisent leurs prototypes en local pour it\u00e9rer \u00e0 moindre co\u00fbt, puis choisissent le mode de d\u00e9ploiement en fonction de la sensibilit\u00e9 des donn\u00e9es et de leur budget.<\/p>\n<h3>Comment puis-je actualiser l'index \u00e0 mesure que les documents \u00e9voluent ?<\/h3>\n<p>R\u00e9int\u00e9grez et effectuez des \u00ab upserts \u00bb uniquement sur les \u00e9l\u00e9ments modifi\u00e9s, plut\u00f4t que de tout reconstruire. Suivez un hachage de contenu ou une date de modification pour chaque document source, et lors d'une mise \u00e0 jour, supprimez les anciens segments de ce document et ins\u00e9rez les nouveaux. La plupart des bases de donn\u00e9es vectorielles prennent en charge les \u00ab upserts \u00bb et les suppressions via un filtre de m\u00e9tadonn\u00e9es, ce qui facilite grandement les mises \u00e0 jour incr\u00e9mentielles.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Bottom_line\"><\/span>Conclusion<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Construire un pipeline RAG en 2026 est vraiment \u00e0 la port\u00e9e de tous : six \u00e9tapes, quelques outils \u00e9prouv\u00e9s et environ 40 lignes de code suffisent pour obtenir un prototype fonctionnel. Les pi\u00e8ges ne se trouvent pas dans l\u2019architecture, mais dans les param\u00e8tres par d\u00e9faut. Utilisez des blocs classiques de 512 tokens, harmonisez vos embedders de requ\u00eates et de documents, ajoutez un module de reclassement, et ne proc\u00e9dez jamais \u00e0 des r\u00e9glages sans impliquer RAGAS dans le processus. Commencez localement et gratuitement avec nomic-embed-text, Chroma et un mod\u00e8le Ollama de 8 milliards de param\u00e8tres ; ne passez \u00e0 pgvector, Qdrant, Voyage ou une API de pointe pour les composants individuels que lorsque vos r\u00e9sultats d\u2019\u00e9valuation \u2014 et non un article de blog \u2014 vous y incitent. Ma\u00eetrisez bien la recherche et un petit mod\u00e8le vous m\u00e8nera \u00e9tonnamment loin.<\/p>\n<p><!--related-block--><\/p>\n<div class=\"convly-related\">\n<h2><span class=\"ez-toc-section\" id=\"Related_articles\"><\/span>Articles connexes<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<ul>\n<li><a href=\"https:\/\/convly.ai\/fr\/openai-ipo-2026\/\">Introduction en bourse d'OpenAI\u00a0: d\u00e9pos\u00e9e, puis report\u00e9e \u2014 ce que nous savons r\u00e9ellement en juillet 2026<\/a><\/li>\n<li><a href=\"https:\/\/convly.ai\/fr\/how-to-run-llama-3-locally-on-snapdragon-8-gen-4\/\">Comment ex\u00e9cuter Llama 3 localement sur Snapdragon 8 Gen 4 (guide pas \u00e0 pas, 2026)<\/a><\/li>\n<li><a href=\"https:\/\/convly.ai\/fr\/90-day-ai-engineer-path\/\">De z\u00e9ro \u00e0 ing\u00e9nieur IA : votre parcours d\u2019apprentissage sur 90 jours<\/a><\/li>\n<li><a href=\"https:\/\/convly.ai\/fr\/ai-resume-screener-tutorial\/\">Cr\u00e9er un syst\u00e8me de tri automatis\u00e9 de CV pilot\u00e9 par l\u2019IA (tutoriel complet)<\/a><\/li>\n<li><a href=\"https:\/\/convly.ai\/fr\/local-llm-ollama-setup\/\">Configurer votre premier mod\u00e8le de langage local avec Ollama<\/a><\/li>\n<\/ul>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>Un guide pratique, ax\u00e9 sur le code, pour la mise en place d\u2019un pipeline de g\u00e9n\u00e9ration augment\u00e9e par la recherche en 2026 \u2014 des repr\u00e9sentations vectorielles et du d\u00e9coupage en segments au stockage vectoriel, en passant par le reclassement et la g\u00e9n\u00e9ration, avec les versions v\u00e9rifi\u00e9es des outils et des remarques sinc\u00e8res sur ce qui fonctionne r\u00e9ellement.<\/p>","protected":false},"author":1,"featured_media":1821,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[9],"tags":[746,747,442,259,429,748,441],"class_list":["post-1105","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutorials","tag-embeddings","tag-langchain","tag-llm","tag-ollama","tag-rag","tag-tutorial","tag-vector-database"],"_links":{"self":[{"href":"https:\/\/convly.ai\/fr\/wp-json\/wp\/v2\/posts\/1105","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/convly.ai\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/convly.ai\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/convly.ai\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/convly.ai\/fr\/wp-json\/wp\/v2\/comments?post=1105"}],"version-history":[{"count":2,"href":"https:\/\/convly.ai\/fr\/wp-json\/wp\/v2\/posts\/1105\/revisions"}],"predecessor-version":[{"id":1390,"href":"https:\/\/convly.ai\/fr\/wp-json\/wp\/v2\/posts\/1105\/revisions\/1390"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/convly.ai\/fr\/wp-json\/wp\/v2\/media\/1821"}],"wp:attachment":[{"href":"https:\/\/convly.ai\/fr\/wp-json\/wp\/v2\/media?parent=1105"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/convly.ai\/fr\/wp-json\/wp\/v2\/categories?post=1105"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/convly.ai\/fr\/wp-json\/wp\/v2\/tags?post=1105"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}