← Blog

Agent RAG pour rédiger un devis industriel — architecture concrète

PME qui reçoit un cahier des charges PDF, doit sortir devis en 24h. Stack ingestion PDF → Qdrant → agent LLM avec historique → humain relit.

TL;DR

  • Une PME industrielle reçoit un cahier des charges PDF de 10–60 pages, doit sortir un devis en 24–72 h. Le commercial passe 2–6 h à lire, identifier les contraintes, retrouver les devis similaires, et rédiger.
  • Stack agent RAG décrite ici : ingestion PDF (text + tables) → chunking → embeddings → Qdrant → LLM agent qui interroge la base d’historique + catalogue + prompt structuré → draft devis → revue humaine.
  • Économie typique observée : 2–4 h/devis gagnées sur la phase préparation (lecture + recherche d’historique + premier draft). Coût marginal IA : 0,15 – 0,80 € par devis.
  • Taux d’automatisation réaliste : 60–80 % des lignes de devis pré-remplies correctement, 20–40 % qui demandent retouche humaine (prix négocié, contrainte spécifique, marge stratégique).
  • Failure modes principaux : hallucination de prix (LLM invente un tarif vu nulle part), oubli d’une contrainte normative cachée page 47, dérive du chunking si le PDF a une structure inhabituelle.
  • Verdict : c’est un des cas d’usage où l’agent RAG montre un ROI rapide (< 6 mois). Pas une révolution, un changement d’organisation : le commercial passe de rédacteur à reviewer.

Pipeline agent RAG pour devis industriel — de l’ingestion PDF à l’envoi par le commercial. L’humain reste le point de validation.

%%{init: {'theme':'base','themeVariables':{'primaryColor':'#F3EADE','primaryBorderColor':'#7DB5A5','primaryTextColor':'#2C3E42','secondaryColor':'#FDFBF8','tertiaryColor':'#E99971','lineColor':'#7DB5A5','nodeBorder':'#7DB5A5','nodeTextColor':'#2C3E42','mainBkg':'#F3EADE','edgeLabelBackground':'#FDFBF8','clusterBkg':'#FDFBF8','clusterBorder':'#F3EADE','fontFamily':'Inter, system-ui, sans-serif','fontSize':'13px'}}}%%
flowchart LR
    cdc["📄 CDC client<br/>PDF 10-60 pages"]:::input
    ing["🔍 Ingestion<br/>PyMuPDF + OCR"]:::step
    emb["🧮 Embeddings<br/>bge-m3 / e5"]:::step
    q[("🗄️ Qdrant<br/>historique + catalogue")]:::store
    agent["🤖 Agent LLM<br/>Claude Sonnet"]:::agent
    draft["📝 Draft devis<br/>JSON structuré"]:::draft
    review["👤 Commercial<br/>valide + envoie"]:::human
    loop["♻️ Apprentissage<br/>corrections → prompt"]:::loop

    cdc --> ing --> emb --> q
    q --> agent
    agent --> draft --> review --> loop
    loop -.-> agent

    classDef input fill:#F3EADE,stroke:#7DB5A5,color:#2C3E42
    classDef step fill:#FDFBF8,stroke:#7DB5A5,color:#2C3E42
    classDef store fill:#7DB5A5,stroke:#7DB5A5,color:#FDFBF8
    classDef agent fill:#E99971,stroke:#C97A55,color:#FFFFFF
    classDef draft fill:#F3EADE,stroke:#E99971,color:#2C3E42
    classDef human fill:#2C3E42,stroke:#2C3E42,color:#FDFBF8
    classDef loop fill:#FDFBF8,stroke:#A86640,color:#A86640

Chaîne de valeur d’un agent RAG devis — l’humain garde la main à chaque point de bascule engageant.

Le problème : un devis industriel coûte du temps avant de coûter de la matière

Sur quasiment toutes les PME industrielles que nous accompagnons (sous-traitance mécanique, plasturgie, tôlerie, chaudronnerie, traitement de surface), le scénario type est le même.

Le client envoie un cahier des charges (CDC) par mail, en PDF, parfois accompagné d’un plan DXF ou STEP. Le CDC fait 8 à 60 pages. Il décrit la pièce à produire, les tolérances, les quantités, les délais, les normes applicables (ISO, automotive IATF, médical, aéronautique), les exigences logistiques (incoterm, packaging, traçabilité).

Le commercial — souvent le dirigeant lui-même dans les structures < 30 salariés — doit :

  1. Lire le CDC en entier, surligner contraintes et risques.
  2. Identifier les références internes proches (matière, géométrie, process, normes) pour réutiliser un devis-modèle.
  3. Calculer les coûts (matière première au cours du jour, temps machine, main-d’œuvre, marge, frais généraux).
  4. Rédiger le devis (lignes commerciales + conditions + délai + validité).
  5. Faire valider par le BE ou la production sur la faisabilité technique.

Le temps total varie de 1,5 h (devis simple, pièce déjà connue) à 8 h (CDC complexe avec normes spécifiques). Une PME qui répond à 4 appels d’offres par semaine y consacre 0,5 à 1 ETP commercial. Le coût caché : ce temps, ce n’est pas du temps de prospection ni de relance client.

C’est un cas d’usage où un agent RAG bien câblé livre un ROI mesurable en quelques mois. Pas par magie : en remplaçant la phase 1 + 2 + le premier brouillon de la phase 4 par un draft pré-rempli que le commercial valide, ajuste, et envoie.


L’architecture concrète

%%{init: {'theme':'base','themeVariables':{'primaryColor':'#F3EADE','primaryBorderColor':'#7DB5A5','primaryTextColor':'#2C3E42','secondaryColor':'#FDFBF8','tertiaryColor':'#E99971','lineColor':'#7DB5A5','nodeBorder':'#7DB5A5','nodeTextColor':'#2C3E42','mainBkg':'#F3EADE','edgeLabelBackground':'#FDFBF8','clusterBkg':'#FDFBF8','clusterBorder':'#F3EADE','fontFamily':'Inter, system-ui, sans-serif','fontSize':'13px'}}}%%
flowchart TB
    subgraph INGEST["Pipeline ingestion"]
        direction LR
        A["PDF natif<br/>PyMuPDF"]:::step
        B["PDF scanné<br/>Tesseract / Azure DI"]:::step
        C["Chunking sémantique<br/>section + tables"]:::step
        A --> C
        B --> C
    end
    subgraph RETRIEVE["Couche vectorielle"]
        direction LR
        E1[("cdc_clients<br/>CDC historiques")]:::store
        E2[("historique_devis<br/>filtré statut=gagné")]:::store
        E3[("catalogue_articles<br/>ERP export J-1")]:::store
    end
    subgraph AGENT["Agent LLM — function calling strict"]
        direction TB
        F1["Étape 1 : extract CDC<br/>JSON schema enum"]:::agent
        F2["Étape 2 : retrieval top-5<br/>devis similaires"]:::agent
        F3["Étape 3 : draft lignes<br/>appels get_prix_matiere<br/>+ calc_temps_machine"]:::agent
        F4["Étape 4 : audit final<br/>sections couvertes"]:::agent
        F1 --> F2 --> F3 --> F4
    end
    INGEST --> RETRIEVE --> AGENT
    AGENT --> OUT["Draft JSON<br/>+ flags attention"]:::draft

    classDef step fill:#FDFBF8,stroke:#7DB5A5,color:#2C3E42
    classDef store fill:#7DB5A5,stroke:#7DB5A5,color:#FDFBF8
    classDef agent fill:#E99971,stroke:#C97A55,color:#FFFFFF
    classDef draft fill:#F3EADE,stroke:#E99971,color:#2C3E42

Architecture détaillée avec séparation stricte RAG ↔ function calling. Le LLM ne calcule jamais un prix, il l’appelle.

Composants détaillés

1. Ingestion. PyMuPDF pour le texte natif. unstructured ou pdfplumber pour les tables. Si le PDF est un scan, OCR via Tesseract local (gratuit, ~85 % précision sur des scans propres) ou Azure Document Intelligence (~99 %, ~1 € par CDC, justifié si volume). Sortie : un objet structuré {sections: [...], tables: [...], metadata: {pages, format}}.

2. Chunking. Pas de chunking aveugle 512 tokens. On découpe par section sémantique : « Spécifications techniques », « Normes applicables », « Quantités et délais », « Conditions logistiques ». Chaque chunk garde son contexte (page, section parente). Taille moyenne 300–800 tokens. Critère qualité : un chunk doit pouvoir être lu seul sans perdre le sens.

3. Embeddings. bge-large (anglais + multilingue), bge-m3 (1024 dim, multi-langue forte), ou text-embedding-3-large d’OpenAI. Pour un usage français industriel, bge-m3 ou e5-mistral-7b-instruct donnent les meilleurs résultats sur nos benchs internes. Coût : 0,02–0,10 € par CDC.

4. Qdrant — base vectorielle. Deux collections recommandées :

  • cdc_clients : les CDC reçus, indexés pour retrouver des cas similaires (« on a déjà fait ça pour un client équivalent en 2024 »).
  • historique_devis : les devis émis, avec lignes commerciales, marge réalisée, suite donnée (gagné / perdu / abandonné).

Filtrage par client_id, secteur, process, norme pour garder le retrieval pertinent. Cosine similarity en métrique standard.

5. Agent LLM. Le cœur. Un prompt structuré qui pilote le LLM en plusieurs étapes :

Étape 1 : Extraire structuré du CDC
  - quantité, délai, matière, géométrie, normes, incoterm
  - sortie JSON contrainte (function calling)

Étape 2 : Rechercher historique similaire
  - retrieval top-5 sur historique_devis filtré
  - rapporter : prix appliqués, marges, problèmes rencontrés

Étape 3 : Drafter le devis
  - utiliser get_prix_matiere(code, date) pour le coût matière temps réel
  - utiliser calc_temps_machine(geometrie, qte) pour la prod
  - appliquer marge cible (paramètre client)
  - sortir lignes JSON + conditions

Étape 4 : Flagger les points d'attention
  - normes inhabituelles
  - délai serré vs capacité
  - quantité hors gamme historique

Le LLM ne calcule jamais directement les prix matière ou les temps machine — il appelle des fonctions déterministes (function calling). C’est ce qui prévient l’hallucination de prix.

%%{init: {'theme':'base','themeVariables':{'primaryColor':'#F3EADE','primaryBorderColor':'#7DB5A5','primaryTextColor':'#2C3E42','secondaryColor':'#FDFBF8','tertiaryColor':'#E99971','lineColor':'#7DB5A5','nodeBorder':'#7DB5A5','nodeTextColor':'#2C3E42','mainBkg':'#F3EADE','edgeLabelBackground':'#FDFBF8','clusterBkg':'#FDFBF8','clusterBorder':'#F3EADE','fontFamily':'Inter, system-ui, sans-serif','fontSize':'13px'}}}%%
pie showData
    title Coût IA / devis (€, sous-traitant tôlerie)
    "LLM Claude Sonnet" : 40
    "Azure Document Intelligence (OCR)" : 22
    "Embeddings bge-m3 (self-hosted)" : 5
    "Qdrant managé (amortissement)" : 5
    "Function calling + logs" : 3

Où le coût marginal se concentre sur 1 devis moyen : retrieval ~gratuit, LLM dominant, function calling négligeable.

6. Interface humaine. Un écran (Streamlit, Retool, ou intégré ERP) qui montre côte-à-côte le CDC original (pages annotées par l’agent) et le devis pré-rempli. Le commercial accepte ligne par ligne, corrige, ajoute. Chaque correction est loggée comme signal d’apprentissage (pour ajuster le prompt, le retrieval, ou les paramètres marge).

7. Logging et boucle d’amélioration. Chaque devis envoyé porte un tag agent_version, corrections_count, time_to_send. Au bout de 50 devis, on revoit les patterns de correction (toujours la même ligne corrigée à la baisse ? ajuster le prompt marge).


Cas d’usage chiffré : sous-traitant tôlerie, 24 salariés

Client BCUB3, sous-traitant tôlerie + assemblage, CA 4,2 M€, 24 salariés, 6–10 devis/semaine en moyenne. Avant projet : 1 commercial à 70 % chargé sur le devis, 30 % prospection. Devis moyen 3,2 h de travail, taux de conversion 22 %.

Stack déployée (5 semaines, 22 k€ HT) :

  • Ingestion PDF + OCR : pipeline Python en cron, 0,30 € par CDC (Azure Document Intelligence pour les scans, gratuit pour les natifs).
  • Embeddings bge-m3 self-hosted (RTX 3060 récupéré du bureau d’études) : 0,01 € par CDC marginal.
  • Qdrant managé : 50 €/mois pour une instance avec ~12 000 chunks (5 ans d’historique).
  • Agent LLM Claude Sonnet 4.6 : ~0,40 € par devis drafté.
  • Interface Streamlit hébergée sur leur serveur OVH existant.
  • Intégration ERP (Cegid) en read-only pour catalogue + écriture devis via API.

Résultats à 4 mois :

IndicateurAvantAprès
Temps moyen / devis3,2 h1,1 h
Devis émis / semaine (capacité)6–1012–18
Devis émis / semaine (réel observé)7,811,4
Taux de conversion22 %24 %
Coût IA par devis0,72 €
Temps prospection commercial / sem12 h22 h
Devis pré-remplis acceptés tels quels18 %
Devis nécessitant > 30 min retouche21 %

Ce qui a marché du premier coup : l’extraction structurée du CDC (quantité, délai, matière, normes). Quasi 0 erreur sur les CDC natifs PDF. ~7 % d’erreur sur les scans (OCR fail).

Ce qui a demandé itération :

  • Itération 1 (semaine 3) : l’agent inventait parfois une référence acier non au catalogue. Solution : function calling strict avec enum sur code_matiere issus du catalogue Cegid.
  • Itération 2 (semaine 5) : les devis pré-remplis étaient systématiquement 8 % en dessous de la marge cible, parce que le retrieval ramenait des devis perdus (donc moins-disants). Solution : filtrer le retrieval sur statut = gagne OR statut = en_cours.
  • Itération 3 (semaine 9) : le commercial trouvait le draft trop verbeux dans les conditions. Solution : raccourcir la section conditions à 4 lignes standard, plus une variable selon norme applicable.

Ce qui a failli mal tourner : à la semaine 6, un CDC client demandait une certification AS9100 (aéronautique). L’historique ne contenait aucun cas équivalent, mais l’agent a quand même produit un devis sans flagger l’absence de certification chez le sous-traitant. Solution : une règle métier explicite « si norme ∈ {AS9100, IATF 16949, ISO 13485} et certification interne absente, BLOQUER + notifier ».


Limites, pièges, anti-patterns

  1. Hallucination de prix matière. Si l’agent décide lui-même un prix de l’inox 304 sans appeler get_prix_matiere, il invente. Toujours forcer via function calling, jamais par génération libre. Tester avec un « dis-moi le prix du nickel aujourd’hui » — la bonne réponse est « je n’ai pas accès, j’appelle l’outil », pas un chiffre fabriqué.

  2. Oubli d’une contrainte cachée. Une exigence en page 47 sur la traçabilité des lots peut être manquée. Mitigation : une étape « audit final » qui demande au LLM « ai-je traité chaque section du CDC ? » avec liste exhaustive des sections détectées.

  3. Chunking qui casse une table. Une table de quantités tronquée par le chunker = quantités incomplètes dans le devis. Préserver les tables comme un bloc atomique, jamais découpées en plusieurs chunks.

  4. Retrieval pollué par les devis perdus. Voir cas d’usage. Filtrer sur statut commercial.

  5. Saturation Qdrant. Au-delà de 500 k chunks, repenser l’architecture (sharding par client, hot/cold storage). Pour une PME avec 5 ans d’historique et 50 devis/semaine, on est entre 100 k et 300 k chunks. Ça tient sans souci sur une instance Qdrant 50 €/mois.

  6. Embeddings pas mis à jour. Si le catalogue produit évolue (nouvelle gamme, nouvelle norme intégrée), il faut ré-embedder ces nouvelles entrées. Cron hebdomadaire suffit.

  7. Manque d’explicabilité. Un commercial qui ne comprend pas pourquoi l’agent propose tel prix ne va pas le défendre devant le client. Toujours afficher « source : devis 2024-08-27 client similaire, prix unitaire 4,80 € » à côté de chaque ligne pré-remplie.

  8. Trop confiance sur les CDC scannés. OCR à 85 % sur scan = ~15 % d’erreurs lecture. Sur un CDC de 30 pages, c’est statistiquement 1–2 contraintes mal lues. Soit on monte en qualité OCR (Azure DI), soit on impose une revue humaine de l’extraction avant le draft.

  9. Coût qui dérape. L’agent qui itère plusieurs fois consomme. Si chaque devis appelle 8–12 fois le LLM, on passe de 0,40 € à 3 €. Surveiller le nombre d’appels par session, capper.


Verdict

Un agent RAG sur le devis industriel est un des meilleurs candidats ROI agentique pour une PME en 2026. Il y a un signal de valeur clair (heures commerciales libérées, capacité de réponse augmentée), une stack stable (Qdrant + Claude/GPT + function calling), et un mode de déploiement qui respecte le rôle humain (le commercial reste responsable, l’agent prépare).

Conditions de réussite :

  • Historique : minimum 200–500 devis exploitables. En dessous, le retrieval ramène trop peu pour être utile.
  • Catalogue structuré : un référentiel articles propre côté ERP. Sans ça, l’agent halluciné les références.
  • Boucle d’amélioration : prévoir 3–5 itérations sur le prompt et le retrieval dans les 2 premiers mois.
  • Acceptation humaine : le commercial doit voir l’agent comme un assistant, pas un remplaçant. Communication interne soignée.

Budget réaliste pour une PME 20–50 salariés : 18–35 k€ de déploiement, 200–600 €/mois d’exploitation (Qdrant + LLM + maintenance). ROI typique observé : 6–10 mois.

Le jour où l’agent passera de « draft à corriger » à « devis envoyé sans intervention humaine », on parlera autrement. Ce jour n’est pas 2026, et il ne sera pas souhaitable tant que la signature commerciale engage l’entreprise.


Sources


On peut en parler

BCUB3 conçoit, déploie et stabilise des agents RAG métier pour les PME et ETI industrielles : choix de stack (embeddings, vector DB, LLM, function calling), audit du périmètre, intégration ERP/CRM, design de l’interface humaine de revue, plan de mesure ROI.

Pas de licence à vendre, pas d’éditeur à placer. On regarde votre processus actuel, on chiffre le potentiel, et on dit honnêtement si un agent RAG vaut l’investissement — ou si une amélioration d’organisation suffit.

Prendre 30 minutes pour en parler →

Et pour suivre sans s’engager : la newsletter BCUB3 publie chaque semaine un article de ce niveau, sans hype, sur l’IA et les systèmes agentiques en contexte industriel.

S’abonner à la newsletter →

Cet article vous a été utile ?

BCUB3 est une petite structure. Si vous pensez à un collègue ou un partenaire qui pourrait en tirer quelque chose, la meilleure manière de nous aider est de partager le lien. Et si vous avez un cas concret à discuter, parlons-en directement.

Prendre un RDV de cadrage