[{"data":1,"prerenderedAt":467},["ShallowReactive",2],{"i-ic:outline-arrow-upward":3,"Footer_afPiwGMwNiEyV4syWzw87ovzxHAgs4iwKtCn4zqBf8E":8,"episode-\u002Fpodcasts\u002Fia-rag":16,"github-sponsor":369,"i-material-symbols:home":444,"i-ic:baseline-play-circle-filled-white":446,"i-material-symbols:ios-share":448,"i-cbi:deezer-logo":450,"i-vscode-icons:file-type-rss":452,"i-ri:heart-3-fill":455,"Brand_dlIOZD2O03VXPoFYukMOJnSnZRMTmJ0YwMKY5fNK8":457,"Duration_OhKy5V5yt60f9g4degYUenfxLXCeOU5cYB2teWFhl8":462},{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":7},0,24,false,"\u003Cpath fill=\"currentColor\" d=\"m4 12l1.41 1.41L11 7.83V20h2V7.83l5.58 5.59L20 12l-8-8z\"\u002F>",["Island",9],{"key":10,"result":11},"Footer_afPiwGMwNiEyV4syWzw87ovzxHAgs4iwKtCn4zqBf8E",{"head":12},{"style":13},[14],{"innerHTML":15},":where(.i-mdi\\:github){display:inline-block;width:1em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;--svg:url(\"data:image\u002Fsvg+xml,%3Csvg xmlns='http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg' viewBox='0 0 24 24' width='24' height='24'%3E%3Cpath fill='black' d='M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5c.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34c-.46-1.16-1.11-1.47-1.11-1.47c-.91-.62.07-.6.07-.6c1 .07 1.53 1.03 1.53 1.03c.87 1.52 2.34 1.07 2.91.83c.09-.65.35-1.09.63-1.34c-2.22-.25-4.55-1.11-4.55-4.92c0-1.11.38-2 1.03-2.71c-.1-.25-.45-1.29.1-2.64c0 0 .84-.27 2.75 1.02c.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02c.55 1.35.2 2.39.1 2.64c.65.71 1.03 1.6 1.03 2.71c0 3.82-2.34 4.66-4.57 4.91c.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2'\u002F%3E%3C\u002Fsvg%3E\")}",{"id":17,"title":18,"author":19,"body":20,"categories":342,"description":344,"dsSlug":345,"duration":346,"episodeArtwork":347,"episodeNumber":348,"episodeType":349,"explicit":6,"extension":350,"guid":346,"links":351,"meta":352,"navigation":353,"path":354,"publicationDate":355,"season":331,"seo":356,"status":357,"stem":358,"subtitle":359,"tags":360,"videoLink":367,"__hash__":368},"podcasts\u002Fpodcasts\u002F109.ia-rag\u002Findex.md","Développer des projets IA - Comprendre les RAG","Double Slash",{"type":21,"value":22,"toc":329},"minimark",[23,27,66,71,74,77,80,83,86,89,97,101,111,114,117,120,135,141,145,148,159,162,174,177,182,217,220,224,227,244,247,254,261,268,274,281,287,290,294,297,303,310,314,320,326],[24,25,26],"p",{},"Le RAG, ou Retrieval Augmented Generation, est une technique comportant deux étapes clés : la recherche d’informations pertinentes et la génération de contenu.",[28,29,30,41,49],"ol",{},[31,32,33,37,40],"li",{},[34,35,36],"strong",{},"Recherche de contenu",[38,39],"br",{},"Nous allons rechercher du contenu en rapport avec la requête de l’utilisateur.",[31,42,43,46,48],{},[34,44,45],{},"Génération de réponse",[38,47],{},"Une fois l’information récupérée (le contexte), nous allons l’insérer dans le prompt de l’inférence pour demander au modèle de générer une réponse avec ce contexte.",[31,50,51,54],{},[34,52,53],{},"Avantages du RAG",[55,56,57,60,63],"ul",{},[31,58,59],{},"Contrôle du contexte",[31,61,62],{},"Limitation des hallucinations",[31,64,65],{},"On spécialise un modèle sans avoir à l’entraîner ou à le fine-tuner.",[67,68,70],"h2",{"id":69},"chunk-ou-traitement-du-contenu","Chunk ou traitement du contenu",[24,72,73],{},"On va découper le contenu en morceaux avant de le vectoriser. Les modèles ne peuvent pas forcément gérer énormément de tokens. BERT = 512 tokens.",[24,75,76],{},"Pour améliorer la précision : trop grand, imprécis ; trop petit, perte de contexte.",[24,78,79],{},"Optimiser les performances de recherche. Des morceaux plus petits sont plus rapides.",[24,81,82],{},"C'est une phase très critique, car les résultats de recherche dépendront de la façon dont le contenu est découpé.",[24,84,85],{},"Différentes techniques :",[24,87,88],{},"basées sur la longueur, sur les phrases, sur les paragraphes, sur la sémantique (avec IA)",[24,90,91],{},[92,93,94],"a",{"href":94,"rel":95},"https:\u002F\u002Fchunkers.vercel.app\u002F",[96],"nofollow",[67,98,100],{"id":99},"embedding","Embedding",[24,102,103,104,106,107,110],{},"Un ",[34,105,99],{}," est une ",[34,108,109],{},"représentation numérique dense"," d’un objet sous forme de vecteur.",[24,112,113],{},"On va convertir un texte en représentation numérique pour l’insérer dans la base.",[24,115,116],{},"Attention, on utilise un modèle. Donc cette étape peut être potentiellement coûteuse.",[24,118,119],{},"Les modèles proposent différentes dimensions. OpenAI text-embedding-3-small 1536",[24,121,122,123,126,127,130,131,134],{},"Attention : Un embedding de ",[34,124,125],{},"512 dimensions"," prend ",[34,128,129],{},"deux fois plus de mémoire"," qu’un embedding de ",[34,132,133],{},"256 dimensions",".",[24,136,137],{},[92,138,139],{"href":139,"rel":140},"https:\u002F\u002Fhuggingface.co\u002Fspaces\u002Fmteb\u002Fleaderboard",[96],[67,142,144],{"id":143},"retrieval-et-db","Retrieval et DB",[24,146,147],{},"Dans cette partie, les bases de données vectorielles ont une grande importance.",[24,149,150,151,154,155,158],{},"Une base de données vectorielle stocke des ",[34,152,153],{},"représentations mathématiques"," d’objets sous forme de ",[34,156,157],{},"vecteurs",". Ces vecteurs permettent de comparer rapidement des éléments entre eux.",[24,160,161],{},"Un vecteur est une liste de nombres qui représente un élément dans un espace mathématique.",[55,163,164,167],{},[31,165,166],{},"Exemple : un point dans un espace 3D est représenté par un vecteur (x, y, z).",[31,168,169,170,173],{},"Dans les bases vectorielles, on peut avoir des ",[34,171,172],{},"vecteurs à plusieurs centaines ou milliers de dimensions"," !",[24,175,176],{},"Par exemple, une phrase peut être transformée en un vecteur de 512 dimensions, capturant son sens et sa structure.",[178,179,181],"h3",{"id":180},"recherche-par-similarités","Recherche par similarités :",[55,183,184,190,196],{},[31,185,186,189],{},[34,187,188],{},"Le produit scalaire"," : plus la valeur est grande, plus les vecteurs sont proches.",[31,191,192,195],{},[34,193,194],{},"La distance euclidienne"," : mesure la distance \"physique\" entre deux points.",[31,197,198,201,202],{},[34,199,200],{},"La similarité cosinus"," (très utilisée !) : elle mesure l’angle entre deux vecteurs.\n",[55,203,204,211],{},[31,205,206,207,210],{},"Si l’angle est ",[34,208,209],{},"proche de 0°"," → les vecteurs sont très similaires.",[31,212,206,213,216],{},[34,214,215],{},"proche de 90°"," → ils sont très différents.",[24,218,219],{},"A noter que la plupart des bases de données prennent en charge le vectoriel :\nPostgres, Redis, Cloudflare, etc.",[67,221,223],{"id":222},"le-code","Le code !",[24,225,226],{},"Faire une API pour recevoir les requêtes du chatbot et les passer à la pipeline :",[55,228,229,232,235,238,241],{},[31,230,231],{},"Récupérer le contexte si besoin",[31,233,234],{},"Stocker en mémoire la conversation",[31,236,237],{},"Générer la réponse",[31,239,240],{},"Gérer les erreurs",[31,242,243],{},"Etc.",[24,245,246],{},"Heureusement, nous avons des frameworks pour faciliter les choses :",[24,248,249,253],{},[92,250,251],{"href":251,"rel":252},"https:\u002F\u002Fgithub.com\u002FLLPhant\u002FLLPhant",[96]," (PHP)",[24,255,256,260],{},[92,257,258],{"href":258,"rel":259},"https:\u002F\u002Fwww.restack.io\u002F",[96]," (Python\u002FTypeScript)",[24,262,263,267],{},[92,264,265],{"href":265,"rel":266},"https:\u002F\u002Fmastra.ai\u002F",[96]," (TypeScript)",[24,269,270],{},[92,271,272],{"href":272,"rel":273},"https:\u002F\u002Fsdk.vercel.ai",[96],[24,275,276,280],{},[92,277,278],{"href":278,"rel":279},"https:\u002F\u002Fwww.langchain.com\u002F",[96]," (Python, JavaScript)",[24,282,283,260],{},[92,284,285],{"href":285,"rel":286},"https:\u002F\u002Fwww.llamaindex.ai\u002F",[96],[24,288,289],{},"Évidemment, on ne parlera pas du chatbot client qu'il faut coder.",[67,291,293],{"id":292},"évaluation","Évaluation",[24,295,296],{},"Partie qui peut prendre du temps. Évaluer les réponses et effectuer un suivi des conversations pour ajuster le système.",[24,298,299],{},[92,300,301],{"href":301,"rel":302},"https:\u002F\u002Fwww.langchain.com\u002Fevaluation",[96],[24,304,305],{},[92,306,309],{"href":307,"rel":308},"https:\u002F\u002Fdocs.confident-ai.com\u002F",[96],"https:\u002F\u002Fdocs.confident-ai.com",[67,311,313],{"id":312},"outils-low-code","Outils Low Code",[24,315,316],{},[92,317,318],{"href":318,"rel":319},"https:\u002F\u002Fflowiseai.com\u002F",[96],[24,321,322],{},[92,323,324],{"href":324,"rel":325},"https:\u002F\u002Fdify.ai\u002F",[96],[24,327,328],{},"Bonne écoute !",{"title":330,"searchDepth":331,"depth":331,"links":332},"",2,[333,334,335,339,340,341],{"id":69,"depth":331,"text":70},{"id":99,"depth":331,"text":100},{"id":143,"depth":331,"text":144,"children":336},[337],{"id":180,"depth":338,"text":181},3,{"id":222,"depth":331,"text":223},{"id":292,"depth":331,"text":293},{"id":312,"depth":331,"text":313},[343],"Technology","Dans ce deuxième épisode de notre série IA, nous allons parler des RAG (Retrieval Augmented Generation). En effet, avec la puissance des LLM combinée aux bases vectorielles, nous pouvons contrôler le contexte du LLM et ainsi avoir un meilleur contrôle des réponses. Pas d'obligation de fine-tuning et nous pouvons spécialiser un modèle dans un domaine ultra-spécifique. C'est le retour des chatbots, mais des chatbots qui fournissent des réponses pertinentes. Mais attention, si cela semble simple sur le papier, l'exécution est parfois compliquée pour obtenir des résultats acceptables.","DS_109_rag",null,"https:\u002F\u002Fres.cloudinary.com\u002Fdoubleslash\u002Fimage\u002Fupload\u002Fv1743966112\u002Fepisode\u002FART_109_licbwc.png",109,"full","md",[],{},true,"\u002Fpodcasts\u002Fia-rag","2025-04-07",{"title":18,"description":344},"published","podcasts\u002F109.ia-rag\u002Findex","Développer des services en IA, les RAG (Retrieval Augmented Generation)",[361,362,363,364,365,366],"ia","dev","llm","rag","db","vectoriel","5vrWcZR26ho","hsVa8lpJt95MgKKS2Moy5pS3hKHskGWJ1f-v-u9qAh0",{"data":370},{"organization":371},{"sponsorsListing":372},{"name":373,"fullDescriptionHTML":374,"url":375,"shortDescription":376,"activeGoal":377,"isPublic":353,"sponsorable":381},"sponsors-double-slash-podcast","\u003Cp>Le podcast des dev pour dev par des dev !\u003C\u002Fp>\n\u003Cp>Des podcasts et des videos sur les technologie WEB modernes.\u003C\u002Fp>\n\u003Cp>A deux ou avec un invité, on discute des tendances, des nouvelles technologies, des meilleures pratiques actuelles.\u003C\u002Fp>\n\u003Cp>🎥 \u003Ca href=\"https:\u002F\u002Fwww.youtube.com\u002Fchannel\u002FUCp5DGBAX2XNJXeOVAo7bICQ\">Youtube\u003C\u002Fa>\u003Cbr>\n🎙️ \u003Ca href=\"https:\u002F\u002Fspoti.fi\u002F317wtvD\">Spotify\u003C\u002Fa> ▪️ \u003Ca href=\"https:\u002F\u002Fapple.co\u002F3fTguFo\">Apple Podcast\u003C\u002Fa> ▪️ \u003Ca href=\"https:\u002F\u002Fbit.ly\u002F3i0hDgy\">Deezer\u003C\u002Fa> ▪️ \u003Ca href=\"https:\u002F\u002Fbit.ly\u002F31aKKYd\">Google Podcast\u003C\u002Fa>\u003Cbr>\n🌐 \u003Ca href=\"https:\u002F\u002Fdouble-slash.dev\u002F\">Double Slash DEV\u003C\u002Fa>\u003C\u002Fp>","https:\u002F\u002Fgithub.com\u002Fsponsors\u002Fdouble-slash-podcast","Le podcast des dev pour les dev par des dev !",{"description":378,"percentComplete":379,"targetValue":379,"title":380},"L'ensemble des charges seront couvertes. Service de stockage et abonnement aux services utilisés.",70,"$70 per month",{"sponsors":382},{"edges":383},[384,390,396,402,408,414,420,426,432,438],{"node":385},{"id":386,"name":387,"url":388,"avatarUrl":389},"MDQ6VXNlcjEwMDMwNw==","Clément Delmas","https:\u002F\u002Fgithub.com\u002Fclem","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F100307?u=878ed4b7cdf920879b57046f19e434fea2c7d296&v=4",{"node":391},{"id":392,"name":393,"url":394,"avatarUrl":395},"MDQ6VXNlcjI3NTYwOQ==","Thibaud Lepretre","https:\u002F\u002Fgithub.com\u002Fkakawait","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F275609?v=4",{"node":397},{"id":398,"name":399,"url":400,"avatarUrl":401},"MDQ6VXNlcjE5MTQxNjA=","David Pollet","https:\u002F\u002Fgithub.com\u002Fdavidpollet","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F1914160?u=4b3da16383b9fa810fd0980f756000709403ab45&v=4",{"node":403},{"id":404,"name":405,"url":406,"avatarUrl":407},"MDQ6VXNlcjYzMzMzOTY=","Eric","https:\u002F\u002Fgithub.com\u002Fericledonge","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F6333396?u=e9e541a6b9125d8e8b558fdd914c847eb36db695&v=4",{"node":409},{"id":410,"name":411,"url":412,"avatarUrl":413},"MDQ6VXNlcjg4OTk3Njg=","François Gardien","https:\u002F\u002Fgithub.com\u002FYoutch","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F8899768?u=85ae8c4299c380bcec02e99e9364624f3ce333c7&v=4",{"node":415},{"id":416,"name":417,"url":418,"avatarUrl":419},"MDQ6VXNlcjEwMTc2NjI2","Antharuu","https:\u002F\u002Fgithub.com\u002Fantharuu","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F10176626?u=3f6ef490b330d5a9bbaa3137560b5d1d4cf13a4a&v=4",{"node":421},{"id":422,"name":423,"url":424,"avatarUrl":425},"MDQ6VXNlcjEwMTg2OTkz","Adrien Zaganelli","https:\u002F\u002Fgithub.com\u002FadrienZ","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F10186993?u=08189ef8cf708a61445b6a57cf7a2aa361d484af&v=4",{"node":427},{"id":428,"name":429,"url":430,"avatarUrl":431},"MDQ6VXNlcjI2MTQyMzgz","Thomas Lemoine","https:\u002F\u002Fgithub.com\u002Fthomaslemoine","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F26142383?u=4c68175459b0ae1f8c68c48c40f2ae148747675d&v=4",{"node":433},{"id":434,"name":435,"url":436,"avatarUrl":437},"MDQ6VXNlcjY1NzM3MTMx","Valentin Grenier","https:\u002F\u002Fgithub.com\u002Fvalentin-grenier","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F65737131?u=0ba0cc828412f6655a948c6a82f69b9c909f8fd9&v=4",{"node":439},{"id":440,"name":441,"url":442,"avatarUrl":443},"U_kgDOBipZwA","Hebrard Frederic","https:\u002F\u002Fgithub.com\u002Ffrederichebrard","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F103438784?v=4",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":445},"\u003Cpath fill=\"currentColor\" d=\"M4 21V9l8-6l8 6v12h-6v-7h-4v7z\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":447},"\u003Cpath fill=\"currentColor\" d=\"M12 2C6.475 2 2 6.475 2 12s4.475 10 10 10s10-4.475 10-10S17.525 2 12 2m-2 14.5v-9l6 4.5z\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":449},"\u003Cpath fill=\"currentColor\" d=\"M6 22q-.825 0-1.412-.587T4 20V10q0-.825.588-1.412T6 8h3v2H6v10h12V10h-3V8h3q.825 0 1.413.588T20 10v10q0 .825-.587 1.413T18 22zm5-6V4.825l-1.6 1.6L8 5l4-4l4 4l-1.4 1.425l-1.6-1.6V16z\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":451},"\u003Cpath fill=\"currentColor\" d=\"M18.774 5.051c.185-1.072.457-1.747.757-1.748c.561 0 1.015 2.341 1.015 5.228s-.455 5.229-1.016 5.229c-.23 0-.443-.4-.614-1.064c-.27 2.439-.831 4.115-1.48 4.115c-.5 0-.953-1.007-1.256-2.594c-.207 3.018-.727 5.161-1.334 5.161c-.381 0-.73-.848-.987-2.231C13.55 20 12.834 22 12 22s-1.551-2-1.86-4.853c-.255 1.383-.6 2.231-.986 2.231c-.609 0-1.128-2.142-1.335-5.161c-.3 1.587-.752 2.594-1.256 2.594c-.649 0-1.21-1.676-1.481-4.115c-.169.668-.382 1.064-.613 1.064c-.562 0-1.017-2.34-1.017-5.229S3.908 3.3 4.471 3.3c.3 0 .57.676.758 1.748C5.527 3.2 6.014 2 6.564 2c.653 0 1.219 1.7 1.487 4.168c.262-1.8.658-2.941 1.1-2.941c.624 0 1.154 2.252 1.351 5.393C10.874 7.01 11.41 6 12 6s1.128 1.011 1.5 2.62c.2-3.141.727-5.393 1.351-5.393c.444 0 .84 1.145 1.1 2.941C16.219 3.7 16.785 2 17.439 2c.547 0 1.035 1.2 1.335 3.051m-16.2 5.3C2.258 10.355 2 9.31 2 8.017s.258-2.337.576-2.337s.578 1.044.578 2.337s-.254 2.338-.578 2.338Zm18.848 0c-.32 0-.577-1.045-.577-2.338s.257-2.337.577-2.337S22 6.724 22 8.017s-.258 2.338-.576 2.338Z\"\u002F>",{"left":4,"top":4,"width":453,"height":453,"rotate":4,"vFlip":6,"hFlip":6,"body":454},32,"\u003Cdefs>\u003ClinearGradient id=\"SVGvSi4fdXe\" x1=\"30.06\" x2=\"225.94\" y1=\"30.06\" y2=\"225.94\" gradientTransform=\"matrix(.11 0 0 .11 2 2)\" gradientUnits=\"userSpaceOnUse\">\u003Cstop offset=\"0\" stop-color=\"#e3702d\"\u002F>\u003Cstop offset=\".11\" stop-color=\"#ea7d31\"\u002F>\u003Cstop offset=\".35\" stop-color=\"#f69537\"\u002F>\u003Cstop offset=\".5\" stop-color=\"#fb9e3a\"\u002F>\u003Cstop offset=\".7\" stop-color=\"#ea7c31\"\u002F>\u003Cstop offset=\".89\" stop-color=\"#de642b\"\u002F>\u003Cstop offset=\"1\" stop-color=\"#d95b29\"\u002F>\u003C\u002FlinearGradient>\u003C\u002Fdefs>\u003Crect width=\"28\" height=\"28\" x=\"2\" y=\"2\" fill=\"#cc5d15\" rx=\"6.01\" ry=\"6.01\"\u002F>\u003Crect width=\"26.91\" height=\"26.91\" x=\"2.54\" y=\"2.54\" fill=\"#f49c52\" rx=\"5.47\" ry=\"5.47\"\u002F>\u003Crect width=\"25.82\" height=\"25.82\" x=\"3.1\" y=\"3.1\" fill=\"url(#SVGvSi4fdXe)\" rx=\"5.14\" ry=\"5.14\"\u002F>\u003Cpath fill=\"#fff\" d=\"M6.82 6.16v3.83a15.31 15.31 0 0 1 15.3 15.3h3.83A19.14 19.14 0 0 0 6.81 6.17zm0 6.45v3.72a8.97 8.97 0 0 1 8.96 8.97h3.72A12.69 12.69 0 0 0 6.81 12.6zm2.62 7.44a2.63 2.63 0 0 0-2.63 2.62a2.63 2.63 0 0 0 2.63 2.63a2.63 2.63 0 0 0 2.63-2.63a2.63 2.63 0 0 0-2.63-2.63z\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":456},"\u003Cpath fill=\"currentColor\" d=\"M16.5 3C19.538 3 22 5.5 22 9c0 7-7.5 11-10 12.5C9.5 20 2 16 2 9c0-3.5 2.5-6 5.5-6C9.36 3 11 4 12 5c1-1 2.64-2 4.5-2\"\u002F>",["Island",458],{"key":459,"result":460},"Brand_dlIOZD2O03VXPoFYukMOJnSnZRMTmJ0YwMKY5fNK8",{"head":461},{},["Island",463],{"key":464,"result":465},"Duration_OhKy5V5yt60f9g4degYUenfxLXCeOU5cYB2teWFhl8",{"head":466},{},1785405178432]