Leçon 1 — Le cas d'usage et l'architecture

Du RAG classique au RAG agentique

4 min de lecture

Du RAG classique au RAG agentique

Le problème du pipeline fixe

flowchart LR
  subgraph Classique["RAG classique"]
    Q1["Question brute"] --> S1["Toujours 1 recherche, sans filtre"] --> G1["Génération"]
  end
  subgraph Agentique["RAG agentique"]
    Q2["Question"] --> D{"Chercher ?"}
    D -->|"non : salutation"| G2["Réponse directe"]
    D -->|"oui"| RF["Reformuler + choisir filtres"] --> S2["Recherche"] --> OK{"Suffisant ?"}
    OK -->|"non, 1 fois max"| RF
    OK -->|"oui"| G3["Réponse citée"]
  end

Trois questions réelles montrent la différence :

QuestionPipeline fixeCe que l'agent a fait (2026-10-15)
« Bonjour ! Tu sers à quoi ? »une recherche inutileaucune recherche
« Je viens d'arriver, combien de jours de télétravail ? »trouve v2 et v3, risque de mélangerequete='télétravail jours semaine', categorie='rh', annee_min=2026
« Avant 2026, combien de jours… ? »idemannee_min=0 : il garde l'historique et cite la v2

Pourquoi BigQuery ?

Une base vectorielle stocke des embeddings et retrouve les plus proches d'un vecteur donné. BigQuery le fait avec la fonction VECTOR_SEARCH, dans une table ordinaire :

CritèreBigQueryBase vectorielle dédiée
Filtres sur métadonnéesSQL complet (WHERE, jointures)selon le produit
Données déjà làsouvent : vos tables métier sont dans BigQueryà synchroniser
Coût au reposstockage seul ; pas de serveur allumésouvent un service à l'heure
Latencequelques secondes par requête (vu : 2,5 à 3 s, embedding compris)souvent plus faible
Petit volumeparfait, sans index (recherche exacte)surdimensionné

Ce qu'on laisse au modèle, ce qu'on garde dans le code

DécisionQuiPourquoi
Chercher ou nonmodèledépend du sens de la question
Reformuler en mots-clésmodèleil comprend la question
Choisir categorie et annee_minmodèle, dans une liste ferméele code refuse toute autre catégorie
Construire le SQLcodeparamètres BigQuery : pas d'injection possible
Nombre maximal de recherchescodela consigne seule n'a pas suffi (leçon 4)
Octets lus par requêtecodemaximum_bytes_billed

Qu'est-ce qui distingue un RAG agentique d'un RAG classique ?

Pourquoi le SQL est-il construit par le code et pas par le modèle ?

Exercice : vos propres filtres

Nimbus Conseil veut aussi filtrer par pays (France, Belgique) et par public (tous, managers). Écrivez la nouvelle signature de l'outil et la règle à ajouter à l'instruction.

Voir la solution
def rechercher_documents(requete: str, tool_context: ToolContext, categorie: str = "",
                         annee_min: int = 0, pays: str = "", public: str = "") -> dict:
    """...
        pays: "fr" ou "be" si la question le précise, sinon "".
        public: "managers" si la question concerne les managers, sinon "".
    """

Instruction : « Si l'utilisateur ne précise pas son pays, ne filtre pas sur le pays et signale les différences entre pays. » Côté code : deux colonnes pays et public dans la table, deux listes fermées dans build_query, et des paramètres @pays, @public.

Résultat obtenu

Extrait réel du 2026-10-15 : l'agent décide de ne pas chercher, puis de chercher avec des filtres différents selon la question.

== Bonjour ! Tu sers à quoi ?
Bonjour ! Je suis l'assistant documentaire de Nimbus Conseil. Je peux rechercher des informations dans les documents internes de l'entreprise.

== Avant 2026, combien de jours de télétravail étaient autorisés ?
  OUTIL rechercher_documents {'requete': 'jours télétravail', 'categorie': 'rh', 'annee_min': 0}
Avant le 1er mars 2026, jusqu'à 2 jours de télétravail par semaine étaient autorisés (Politique de télétravail (v2, ancienne)).

Je sais faire

  • Expliquer ce qu'un agent apporte à un pipeline RAG
  • Dire quand BigQuery convient comme base vectorielle
  • Répartir les décisions entre le modèle et le code
Suivant