Qu’est-ce que RAG ? La génération augmentée par récupération expliquée avec un exemple fonctionnel

  1. Accueil
  2. Blog
  3. Intelligence artificielle

Intelligence artificielle

Qu’est-ce que RAG ? Génération augmentée par récupération expliquée avec un exemple fonctionnel

RAG permet à un modèle d’IA de répondre à partir de vos propres documents plutôt qu’à partir de la seule mémoire. Découvrez comment fonctionne le pipeline, exécutez une petite version en Python simple et découvrez pourquoi les systèmes réels échouent et comment les tester.

9 min de lecture
Qu’est-ce que le RAG ? Génération augmentée par récupération expliquée avec un exemple fonctionnel

À retenir

  • RAG trouve d’abord les informations pertinentes, les ajoute à l’invite, puis demande au modèle d’y répondre.
  • C’est le moyen habituel de connecter un modèle de langage à des données privées ou changeant fréquemment.
  • La plupart des problèmes de qualité commencent lors de la récupération et de la préparation des données, et non dans le modèle.
  • RAG réduit les réponses inventées mais ne les élimine pas, vous devez donc le tester.

Demandez à un assistant général en IA la politique de remboursement de votre entreprise, et il ne peut que deviner. Il n’a jamais vu vos documents. RAG, abréviation de génération augmentée par récupération, résout ce problème en recherchant les bonnes informations et en les transmettant au modèle avec la question.

Ce guide explique chaque étape en langage simple, puis crée une petite version en utilisant uniquement la bibliothèque standard de Python. Nous avons exécuté ce code sur Python 3.13 et les scores affichés proviennent de cette exécution. Il n’utilise aucun modèle de langage, il démontre donc la récupération et la création d’invites, et nous n’avons pas testé l’étape de réponse finale.

Qu’est-ce que le RAG ?

La génération augmentée par récupération est une technique qui combine une étape de recherche avec un modèle de langage. Lorsqu’une question arrive, le système recherche une source de connaissances, ajoute les meilleurs résultats à l’invite et demande au modèle de répondre en fonction de ce matériel.

Pensez à un examen à livre ouvert. Un étudiant à livre fermé s’appuie sur sa mémoire et peut se souvenir de manière erronée en toute confiance. Un étudiant à livre ouvert peut d’abord rechercher la bonne page. RAG donne au modèle ce livre et lui permet également d’indiquer la page qu’il a utilisée.

Le problème que RAG résout

Un modèle de langage à lui seul présente trois limites pour une utilisation professionnelle :

  • Il ne connaît pas vos données privées. Vos politiques, tickets et contrats ne faisaient pas partie de sa formation.
  • Sa connaissance a un seuil. Il ne peut pas connaître un prix que vous avez modifié ce matin.
  • Il peut inventer des réponses. En cas de doute, il peut produire quelque chose de plausible mais de faux.

RAG répond à ces trois critères et vous n’avez rien à recycler. Mettez à jour un document, réindexez-le et la toute prochaine réponse pourra l’utiliser.

Comment fonctionne RAG, étape par étape

Un système RAG comporte deux canalisations. L’un prépare vos données à l’avance et l’autre répond à chaque question.

Indexation : préparer vos données

  1. Charger : collectez le contenu de PDF, de wikis, de bases de données ou de tickets.
  2. Nettoyer et fragmenter : supprimez les fichiers inutiles, puis divisez les documents en petits passages.
  3. Intégrer : convertit chaque passage en une liste de nombres, appelée intégration, qui capture sa signification.
  4. Store : enregistre les intégrations dans un index consultable, souvent une base de données vectorielle.

Interroger : répondre à une question

  1. Récupérer : intégrez la question et trouvez les passages les plus proches en termes de sens.
  2. Augment : insérez ces passages dans l’invite.
  3. Générer : le modèle écrit une réponse en utilisant ce contexte.

La récupération ne nécessite pas l’utilisation de vecteurs. Il peut s’agir d’une recherche par mot clé ou même d’une requête SQL, selon celle qui trouve la bonne information pour vos données.

Un petit exemple fonctionnel

Pour voir clairement les pièces mobiles, voici un petit retriever sans bibliothèque. Il représente le texte en nombre de mots, un substitut beaucoup plus simple aux intégrations réelles, et il évalue la similarité en utilisant la mesure du cosinus.

import math, re
from collections import Counter

DOCS = {
    "refunds": "Refunds are paid within 7 days to the original payment method.",
    "shipping": "Standard shipping takes 3 to 5 working days across India.",
    "warranty": "All keyboards include a 2 year warranty against defects.",
}

def vectorize(text):
    return Counter(re.findall(r"[a-z0-9]+", text.lower()))

def similarity(a, b):
    dot = sum(a[word] * b[word] for word in a)
    size = math.sqrt(sum(v * v for v in a.values()))
    size *= math.sqrt(sum(v * v for v in b.values()))
    return dot / size if size else 0

def retrieve(question, k=1):
    q = vectorize(question)
    scored = [(similarity(q, vectorize(t)), name) for name, t in DOCS.items()]
    return sorted(scored, reverse=True)[:k]

def build_prompt(question):
    (score, name), = retrieve(question)
    return (
        "Answer using only the context. If it is not there, say you do not know.\n"
        f"Context: {DOCS[name]}\n"
        f"Question: {question}"
    )

Poser des questions sur les remboursements trouve le bon passage et génère cette invite :

print(retrieve("How many days until refunds are paid?"))
# [(0.4558..., 'refunds')]

print(build_prompt("How many days until refunds are paid?"))
# Answer using only the context. If it is not there, say you do not know.
# Context: Refunds are paid within 7 days to the original payment method.
# Question: How many days until refunds are paid?

Dans un système complet, vous enverriez désormais cette invite à un modèle de langage. Le détail important est l’instruction permettant d’admettre lorsque la réponse est manquante, sur laquelle vous pouvez en savoir plus dans notre guide de l’ingénierie des invites.

Ce qui manque à notre exemple

Essayez maintenant une question qui signifie la même chose mais utilise des mots différents :

print(retrieve("When can I get my money back?", k=3))
# [(0.0, 'warranty'), (0.0, 'shipping'), (0.0, 'refunds')]

Chaque score est nul, car la question ne partage aucun mot avec aucun document. « Remboursé » signifie le remboursement à un être humain, mais le nombre de mots ne peut pas le dire. Ce résultat unique explique pourquoi les systèmes réels utilisent des intégrations, qui sont conçues de telle sorte qu’un texte ayant une signification similaire se retrouve avec des nombres similaires, même sans mots en commun.

Mais ne présumez pas que les intégrations résolvent tout. Ils peuvent avoir du mal avec des termes exacts tels que les codes de produits et les numéros d’erreur, que la recherche par mot clé gère très bien. C’est pourquoi de nombreux systèmes de production utilisent la recherche hybride, combinant les deux approches.

Chunking : l’étape que les gens sous-estiment

Les documents sont divisés en morceaux car des fichiers entiers sont trop longs et imprécis à récupérer. Le choix de la taille implique un véritable compromis :

Taille du morceau Avantage Risque
Trop petit Correspondances précises Perd le contexte, par exemple à quel produit une règle s’applique
Trop grand Conserve le contexte Dilue le sens et utilise davantage l’invite
Réparti par structure Respecte les titres et les sections Nécessite des documents sources plus propres

Quelques centaines de mots avec un certain chevauchement entre les morceaux sont un point de départ courant, mais considérez cela comme une première hypothèse à tester. Divisez-vous le long des limites naturelles, telles que les titres, lorsque vous le pouvez. Et joignez des métadonnées, comme le titre du document, la date et le département, afin de pouvoir filtrer les résultats et citer les sources.

Améliorer la récupération

Lorsque les réponses sont mauvaises, voici les améliorations qui valent le plus la peine d’être essayées, à peu près dans cet ordre :

  • Nettoyez les données. Supprimez d’abord les documents obsolètes et en double. Aucun algorithme ne corrige les sources contradictoires.
  • Utilisez la recherche hybride. Combinez les résultats basés sur la signification et les mots clés.
  • Ajoutez un reclassement. Récupérez plus de candidats, puis utilisez un modèle spécialisé pour les réorganiser par pertinence.
  • Filtrer par métadonnées. Restreindre les résultats par produit, région ou date avant de lancer la recherche.
  • Réécrivez la requête. Transformez une vague suite du type « Et la deuxième ? » en une question complète.

Astuce : Avant de blâmer le modèle, regardez quelle récupération a réellement renvoyé. Si le bon passage n’était pas dans le contexte, aucun modèle n’aurait pu y répondre correctement.

RAG vs réglage fin

Question CHIFFON Mise au point
Qu’est-ce que ça ajoute ? La connaissance à l’heure des questions Comportement ou style entraîné
Mise à jour des informations Réindexer le document Entraînez-vous à nouveau
Peut-il citer des sources ? Oui Pas fiable
Idéal pour Des faits qui changent Format ou ton cohérent

Ils ne s’excluent pas mutuellement. Notre comparaison entre RAG, réglage fin et ingénierie rapide explique comment choisir de manière plus approfondie.

Comment tester un système RAG

RAG est un logiciel et nécessite des tests comme tout autre logiciel. Créez un ensemble de vraies questions ainsi que les passages et les réponses que vous attendez, puis mesurez les deux étapes séparément :

Scène Question à poser Nom commun
Récupération Avons-nous trouvé le bon passage ? Rappel de contexte
Récupération Dans quelle mesure ce que nous avons récupéré était utile ? Précision du contexte
Génération La réponse est-elle étayée par le contexte ? Fidélité
Génération Est-ce que cela répond réellement à la question ? Pertinence de la réponse

Incluez également les cas délicats : les questions sans réponse dans vos données, les questions qui utilisent une formulation différente et les questions dont les sources sont contradictoires. Réexécutez cet ensemble chaque fois que vous modifiez le regroupement, les modèles ou les invites, tout comme une suite de régression. Notre tutoriel pytest montre comment exécuter de nombreuses entrées via un seul test.

Pourquoi les systèmes RAG échouent

  • La réponse ne se trouve pas dans les données. Le modèle peut encore en tenter une, alors dites-lui comment refuser.
  • Le bon morceau n’a pas été récupéré. Il s’agit souvent d’un problème de regroupement ou de recherche.
  • Trop de contexte. Des passages non pertinents peuvent distraire le modèle et augmenter les coûts.
  • Documents obsolètes. Une ancienne politique peut être récupérée avec autant de confiance que la politique actuelle.
  • Tableaux et fichiers PDF mal analysés. Si l’extraction brouille le texte, la récupération ne récupère jamais.
  • Tests uniquement avec des questions de démonstration. Les vrais utilisateurs formulent les choses très différemment.

Sécurité et autorisations

RAG comporte deux risques faciles à ignorer. Tout d’abord, le contrôle d’accès : si l’index contient des fichiers RH, la question d’un junior ne doit pas les récupérer. Appliquez les autorisations de chaque utilisateur lors de la récupération, car demander au modèle de conserver des secrets ne constitue pas une protection fiable.

Deuxièmement, injection rapide. Une page Web ou un document récupéré peut contenir un texte tel que « ignorez vos instructions ». Traitez le contenu récupéré comme des données non fiables, limitez les actions que le modèle peut entreprendre et exigez qu’un humain approuve les actions sensibles.

Pour conclure

RAG est une idée simple avec de nombreux détails pratiques : trouvez la bonne information, puis demandez au modèle de l’utiliser. Commencez par un petit ensemble de documents clairs et une vingtaine de vraies questions. Faites en sorte que la récupération fonctionne bien avant d’ajouter de la complexité, car un pipeline modeste avec de bonnes données bat généralement un pipeline sophistiqué avec de mauvaises données.

Questions fréquentes

Que signifie RAG en IA ?

RAG signifie génération augmentée par récupération. Un système récupère les informations pertinentes, les ajoute à l’invite et le modèle génère une réponse à partir de celles-ci.

RAG arrête-t-il les hallucinations de l’IA ?

Il les réduit en donnant au modèle des sources réelles, mais il ne les supprime pas. Un modèle peut toujours mal interpréter le contexte, alors testez les réponses et affichez les citations.

Ai-je besoin d’une base de données vectorielles pour RAG ?

Pas toujours. Les petits projets peuvent utiliser un index en mémoire, une recherche par mot-clé ou SQL. Les bases de données vectorielles facilitent les grandes collections et la recherche basée sur le sens.

Quelle est la différence entre RAG et réglage fin ?

RAG fournit des informations à l’heure des questions, les mises à jour sont donc rapides. Le réglage fin entraîne un modèle à modifier son comportement ou son style, et il est moins adapté à la modification des faits.

Qu’est-ce qu’une intégration ?

Une intégration est une liste de nombres représentant la signification du texte. Les passages ayant des significations similaires ont des numéros similaires, ce qui rend possible une recherche basée sur la signification.

Continuez à apprendre

Travailler avec Stack Quora

Besoin d’aide pour les tests, WordPress ou le référencement ?

Nous aidons les équipes à proposer de meilleurs logiciels et à développer leurs sites. Dites-nous sur quoi vous travaillez et nous vous proposerons une prochaine étape claire.

Continuez à lire

Plus de guides sur tests, IA et développement moderne

Vous avez apprécié cet article ? Choisissez un sujet et accédez directement à nos nouveaux didacticiels.

Intelligence artificielle

Les hallucinations de l'IA expliquées : pourquoi les modèles de langage inventent les choses et comment les réduire

Les hallucinations de l'IA ont expliqué : ce qu'elles sont, pourquoi les modèles de langage les produisent, les types courants, comment les réduire …

Lire l'article →
DevOps

Variables d'environnement expliquées : fichiers .env, secrets et configuration correctement effectués

Variables d'environnement expliquées avec des exemples Python que nous avons exécutés : lecture et définition, pourquoi chaque valeur est une chaîne…

Lire l'article →
Développement logiciel

Limitation du débit de l'API expliquée : algorithmes, en-têtes et gestion des erreurs 429

Limitation du débit de l'API expliquée avec une simulation que nous avons exécutée : compartiment de jetons, fenêtre fixe, fenêtre glissante, 429 ré…

Lire l'article →
Automatisation des tests

Se moquer en Python : unittest.mock, patch et les erreurs qui font mentir les tests

Moquerie en Python avec unittest.mock, testée : Mock et return_value, side_effect, correctifs où un nom est utilisé, spec et autospec, dates moqueus…

Lire l'article →
Tests logiciels

Couverture du code expliquée : couverture des lignes par rapport aux branches et ce que signifie réellement 100 %

Couverture du code expliquée avec une véritable exécution de cover.py : couverture des lignes, des branches et des conditions, lecture d'un rapport,…

Lire l'article →
Bases de données et SQL

DELETE vs TRUNCATE vs DROP dans SQL : différences, restauration et quand les utiliser

DELETE vs TRUNCATE vs DROP expliqué avec SQL testé : ce que chacun supprime, restauration, déclencheurs, réinitialisation d'identité, vitesse et en …

Lire l'article →
Bases de données et SQL

Vues SQL expliquées : créez, utilisez et évitez les pièges, avec des exemples

Vues SQL expliquées avec les requêtes que nous avons exécutées : création d'une vue, résultats en direct, masquage des colonnes, performances, vues …

Lire l'article →
Développement logiciel

Interface TypeScript vs Type : différences réelles, testées avec le compilateur

Interface TypeScript vs type, vérifiée avec le vrai compilateur : ce que les deux peuvent faire, ce qu'un seul peut faire, la fusion des déclaration…

Lire l'article →
Développement logiciel

Python *args et **kwargs expliqués : fonctions flexibles avec des exemples clairs

Python *args et **kwargs expliqués avec le code que nous avons exécuté : emballage et déballage, ordre des paramètres, arguments de mot-clé uniqueme…

Lire l'article →
Développement logiciel

Fonctions Python Lambda : syntaxe, utilisations réelles et quand ne pas les utiliser

Fonctions Python lambda expliquées avec le code que nous avons exécuté : syntaxe, tri avec clé, carte et filtre, fermetures, piège de liaison tardiv…

Lire l'article →
Intelligence artificielle

Que sont les agents IA ? Comment ils fonctionnent, avec une simple boucle d'agent que vous pouvez exécuter

Que sont les agents IA ? Un guide simple sur la boucle d'agent, les outils, la mémoire et les garde-fous, avec une petite boucle Python que nous avo…

Lire l'article →
DevOps

Surveillance vs observabilité : la vraie différence, avec les journaux, les métriques et les traces

Surveillance et observabilité expliquées : échecs connus et inconnus, journaux, métriques et traces, présentation pas à pas des incidents de paiemen…

Lire l'article →
DevOps

Volumes Docker vs montages Bind : conserver les données du conteneur de la bonne manière

Volumes Docker et montages de liaison expliqués : pourquoi les données du conteneur disparaissent, volumes nommés, montages de liaison, tmpfs, exemp…

Lire l'article →
Automatisation des tests

TDD vs BDD : principales différences, une fonctionnalité conçue dans les deux sens et quand les utiliser

TDD vs BDD expliqué avec une fonctionnalité de remise construite dans les deux sens : refactor rouge-vert avec le code que nous avons exécuté, scéna…

Lire l'article →
Tests logiciels

Tests d'acceptation utilisateur (UAT) : processus, liste de contrôle et exemples réels

Les tests d'acceptation des utilisateurs sont expliqués : qui les exécute, en quoi ils diffèrent du contrôle qualité, un processus en sept étapes, u…

Lire l'article →
Bases de données et SQL

Explication des valeurs SQL NULL : IS NULL, COALESCE, NULLIF et les pièges à éviter

Les valeurs SQL NULL expliquées avec les requêtes que nous avons exécutées : logique à trois valeurs, IS NULL, COALESCE, NULLIF, comment les agrégat…

Lire l'article →
Bases de données et SQL

Instruction SQL CASE WHEN : syntaxe, exemples réels et erreurs courantes

SQL CASE WHEN expliqué avec les requêtes que nous avons exécutées : formulaires simples et recherchés, ordre des conditions, pivots avec SUM, astuce…

Lire l'article →
Développement logiciel

Qu'est-ce que JWT ? Les jetons Web JSON expliqués avec un exemple fonctionnel

Qu’est-ce que JWT ? JSON Web Tokens expliqué : les trois parties, un jeton construit et falsifié dans le code que nous avons exécuté, JWT vs session…

Lire l'article →
Développement logiciel

Boucle d'événements JavaScript expliquée : pile d'appels, microtâches et minuteries avec des exemples

La boucle d'événements JavaScript expliquée avec le code que nous avons exécuté : pile d'appels, files d'attente de tâches et de microtâches, pourqu…

Lire l'article →
Développement logiciel

Générateurs Python et rendement expliqués : économisez de la mémoire avec des exemples réels

Les générateurs Python et le rendement expliqués avec le code que nous avons exécuté : comment ils s'arrêtent et reprennent, les économies de mémoir…

Lire l'article →
Intelligence artificielle

Que sont les intégrations ? Vecteurs et similarité cosinus expliqués simplement

Que sont les intégrations ? Un guide en langage simple sur les vecteurs, la similarité cosinus et la recherche sémantique, avec un petit exemple que…

Lire l'article →
DevOps

Déploiement Bleu-Vert vs Canary : différences, compromis et comment choisir

Explication du déploiement bleu-vert ou canari : comment chacun fonctionne, coût, risque et restauration, regroupement d'utilisateurs stable que nou…

Lire l'article →
Automatisation des tests

Tests instables : quelles sont leurs causes et comment les corriger définitivement

Des tests irréguliers expliqués avec des démos que nous avons exécutées : les principales causes, comment en confirmer et en diagnostiquer une, les …

Lire l'article →
Tests logiciels

Tests de charge vs tests de contrainte : différences, métriques et exemples k6

Explication des tests de charge et des tests de stress : ce que chacun prouve, les tests de pointe et de trempage, les métriques qui comptent, pourq…

Lire l'article →
Tests logiciels

Scénario de test et scénario de test : principales différences, exemples et quand les utiliser

Scénario de test et scénario de test expliqués : des définitions claires, un tableau côte à côte, une fonctionnalité de réinitialisation de mot de p…

Lire l'article →
Bases de données et SQL

Optimisation des requêtes SQL : lire les plans d'exécution et corriger les requêtes lentes, avec des délais

Optimisation des requêtes SQL testée sur un million de lignes : lire les plans d'exécution, ajouter les bons index, corriger les filtres non Sargabl…

Lire l'article →
Bases de données et SQL

SQL UNION vs UNION ALL : différences, exemples et performances testées

SQL UNION vs UNION ALL expliqué avec les requêtes que nous avons exécutées : des doublons, les règles suivent toutes les deux, un véritable bug de d…

Lire l'article →
Développement logiciel

Tutoriel API JavaScript Fetch : GET, POST, gestion des erreurs et délais d'attente

Un didacticiel de l'API JavaScript Fetch testé sur un serveur local : GET et POST, pourquoi 404 ne lance pas, un assistant réutilisable, des chaînes…

Lire l'article →
Développement logiciel

Gestion des fichiers Python : lecture, écriture, CSV, JSON et pathlib avec exemples

Gestion des fichiers Python expliquée avec le code que nous avons exécuté : modes ouverts, avec lecture de fichiers volumineux, CSV, JSON, pathlib, …

Lire l'article →
Développement logiciel

Classes et objets Python : didacticiel POO avec des exemples réels

Classes et objets Python expliqués avec le code que nous avons exécuté : __init__, méthodes, attributs de classe par rapport à l'instance, héritage,…

Lire l'article →
Intelligence artificielle

Qu'est-ce qu'un grand modèle de langage ? Comment fonctionnent les LLM, expliqués sans battage médiatique

Qu’est-ce qu’un grand modèle de langage ? Les LLM expliqués en langage simple : jetons, intégrations, attention, formation, fenêtres de température …

Lire l'article →
DevOps

Commandes Linux pour les débutants : le guide du terminal essentiel avec des exemples

Commandes Linux pour débutants, regroupées par tâche : navigation, fichiers, affichage des journaux, grep, tuyaux, autorisations, processus et archi…

Lire l'article →
Automatisation des tests

Selenium vs Playwright : principales différences, code comparé et lequel choisir

Comparatif Selenium vs Playwright : architecture, attente, support du navigateur et du langage, débogage, même test dans les deux outils, conseils d…

Lire l'article →
Tests logiciels

Partitionnement d'équivalence : technique de conception de tests expliquée avec des exemples concrets

Le partitionnement d'équivalence expliqué : comment trouver des partitions valides et invalides, des exemples concrets d'âges, de mots de passe et d…

Lire l'article →
Tests logiciels

Gravité vs priorité dans les tests logiciels : différences, matrice et exemples réels

Explication de la gravité et de la priorité dans les tests logiciels : des définitions claires, une matrice à quatre voies avec des exemples, des éc…

Lire l'article →
Bases de données et SQL

Tutoriel sur les sous-requêtes SQL : types, sous-requêtes corrélées et EXISTE avec des exemples

Un didacticiel sur les sous-requêtes SQL avec les requêtes que nous avons exécutées : les sous-requêtes scalaires, IN, FROM et SELECT, les sous-requ…

Lire l'article →
Bases de données et SQL

Transactions SQL et ACID expliquées : COMMIT, ROLLBACK et niveaux d'isolement

Transactions SQL et ACID expliquées avec un virement bancaire que nous avons effectué : COMMIT, ROLLBACK, points de sauvegarde, verrous, niveaux d'i…

Lire l'article →
Développement logiciel

Aide-mémoire sur les commandes Git : les commandes que vous utilisez réellement, avec des exemples

Une aide-mémoire sur les commandes Git regroupées par tâche : configuration, transfert, branches, télécommandes, cache, historique et annulation des…

Lire l'article →
Développement logiciel

Les promesses JavaScript expliquées : alors, catch, Promise.all et les erreurs courantes

Les promesses JavaScript expliquées avec le code que nous avons exécuté : les états, les chaînes then et catch, la gestion des erreurs, Promise.all,…

Lire l'article →
Développement logiciel

Tutoriel du dictionnaire Python : méthodes, exemples et modèles courants

Un didacticiel de dictionnaire Python avec du code que nous avons exécuté : créer, lire et mettre à jour des dictés, des méthodes clés, des fusions,…

Lire l'article →
Intelligence artificielle

Qu’est-ce que RAG ? La génération augmentée par récupération expliquée avec un exemple fonctionnel

Qu’est-ce que le RAG ? La génération augmentée par récupération expliquée étape par étape : indexation, segmentation, intégrations, récupération, un…

Lire l'article →
DevOps

Tutoriel Terraform pour les débutants : Infrastructure en tant que code du premier fichier aux modules

Un didacticiel Terraform pour les débutants : commencez sans compte cloud, apprenez l'initialisation, la planification et l'application, puis les va…

Lire l'article →
DevOps

Docker vs Kubernetes : principales différences, comment ils fonctionnent ensemble et ce dont vous avez besoin

Docker vs Kubernetes expliqué : ce que chacun fait, la même application s'exécute avec les deux, Docker Compose et Swarm comparés, les dockershim ch…

Lire l'article →
Automatisation des tests

Tutoriel Pytest pour les débutants : luminaires, paramétrage et exemples réels

Un tutoriel pytest pour les débutants avec des tests que nous avons exécutés sur pytest 9.2 : assertions, appareils, paramétrage, conftest, marqueur…

Lire l'article →
Tests logiciels

Cycle de vie des tests logiciels (STLC) : 6 phases, critères d'entrée et de sortie, exemple

Le cycle de vie des tests logiciels expliqué : six phases STLC avec des critères d'entrée et de sortie, des livrables, un exemple de fonctionnalité …

Lire l'article →
Développement logiciel

Git merge vs rebase : différences, exemples et quand utiliser chacun

Git merge vs rebase expliqué avec de vraies sorties de log, un tableau comparatif, la règle d'or du rebase et un flux de travail sûr pour les équipes.

Lire l'article →
Développement logiciel

List comprehension Python : syntaxe, exemples et cas à éviter

La list comprehension Python expliquée : syntaxe, filtres, if-else, boucles imbriquées, temps mesurés et cas où une boucle for classique est préféra…

Lire l'article →
Bases de données et SQL

Jointures SQL expliquées avec exemples (Inner, Left, Right, Full)

Comprenez les jointures SQL pas à pas avec des tables et requêtes d'exemple : INNER, LEFT, RIGHT, FULL, CROSS et SELF, plus erreurs courantes et con…

Lire l'article →