LLM & RAG
Vos documents deviennent une base de connaissances interrogeable en langage naturel, avec des réponses sourcées.
L'IA n'a de valeur que branchée sur votre réalité. Je transforme vos contrats, procédures et historiques en une base qu'on interroge en langage clair, et chaque réponse cite ses sources. Fini les heures de recherche, fini les réponses inventées. Sur une question simple, la réponse tombe du premier coup ; sur une question complexe, le système cherche en plusieurs passes, recoupe ce qu'il trouve et vérifie sa réponse avant de vous la donner, au lieu d'inventer. Et quand ça devient un copilote pour vos équipes, chacun n'y voit que ce qu'il a déjà le droit de voir : le copilote respecte vos permissions, il ne les contourne pas.
Repères
2 s
l'ordre de grandeur visé pour une réponse sourcée
0
ressaisie manuelle sur les documents extraits
0
réponse inventée tolérée en production
LLM & RAG
Ce que je construis
Copilote & RAG documentaire
Contrats, procédures, historiques : vos documents deviennent un copilote qu'on interroge en langage naturel, réponses sourcées. Sur les questions faciles, réponse directe ; sur les questions difficiles, le système cherche en plusieurs passes, recoupe les documents et contrôle sa réponse avant de l'afficher. Vos équipes arrêtent de chercher, et chacun n'obtient de réponses que sur ce qu'il a déjà le droit de voir.
Copilote interne · Réponses sourcées · Recherche itérative · Permissions respectées
Lecture et extraction de documents
Factures, contrats, bons de commande, formulaires : vos documents sont lus par des modèles qui comprennent la mise en page autant que le texte. Les bonnes données en ressortent structurées, prêtes à entrer dans votre outil, même sur des PDF scannés, tamponnés ou mal cadrés.
Extraction · Vision · Factures & contrats · Structuration
Choix et intégration des modèles
Le bon modèle pour chaque tâche (Claude, GPT, open-source), branché proprement sur vos systèmes.
Claude · OpenAI · Open-source · MCP
La promesse
La bonne réponse, sourcée et recoupée, en quelques secondes.
Démonstration
Une prise en charge tranchée sur la version applicable
Un courtier en assurance collective. Une gestionnaire de contrats doit dire si un acte est pris en charge, et la réponse se trouve dans des conditions générales de plusieurs dizaines de pages, qui existent en plusieurs versions selon la date d'effet du contrat.
Cas inventéCe cas n'est pas une mission. Il est inventé de bout en bout, et le code plus bas est le vrai code qui le ferait tourner.
HumainDemande de la gestionnaire
Un adhérent du contrat CT-48213 demande si son implant dentaire est pris en charge. Il veut aussi savoir jusqu'à quel plafond annuel.
L'agentChoix de la version
Deux jeux de conditions générales coexistent pour cette garantie. C'est la date d'effet du contrat qui décide lequel fait foi. La fiche donne le 1er juin 2022. Je passe cette date au filtre avant de chercher quoi que ce soit.
Appel d'outilRecherche dans les conditions
{ "name": "rechercher_conditions", "arguments": { "contrat_id": "CT-48213", "date_effet": "2022-06-01", "question": "implant dentaire : prise en charge, plafond annuel, délai d'attente", "seuil": 0.62, "k": 3 } }Le seuil et la date d'effet voyagent dans l'appel. Ce ne sont pas des consignes rédigées au modèle.
Retour de l'outilPassages et scores
{ "contrat_id": "CT-48213", "date_effet": "2022-06-01", "version_applicable": "CG-2021-09", "seuil": 0.62, "ecartes": [ { "article": "9.1 Implantologie et parodontologie", "page": 41, "score": 0.84, "version": "CG-2024-01", "motif": "hors période du contrat" } ], "sous_le_seuil": [ { "article": "12.4 Plafonds annuels du poste dentaire", "page": 58, "score": 0.57 } ], "statut": "repondu", "sources": [ { "article": "7.3 Dentaire, implantologie", "page": 34, "score": 0.78, "extrait": "Les actes d'implantologie sont pris en charge au titre du forfait dentaire prévu au tableau des garanties." }, { "article": "4.2 Délais d'attente", "page": 18, "score": 0.71, "extrait": "Les actes d'implantologie ouvrent droit au remboursement après six mois d'affiliation continue." }, { "article": "7.4 Pièces justificatives", "page": 35, "score": 0.66, "extrait": "La prise en charge est subordonnée à l'envoi du devis dentaire avant la réalisation de l'acte." } ], "action": "transmettre au gestionnaire" }Le passage le mieux classé vient de la version entrée en vigueur après ce contrat. Le filtre l'écarte avant le classement.
L'agentContrôle du seuil
Trois passages de la version applicable dépassent le seuil de 0,62. Celui qui traite du plafond annuel reste dessous, à 0,57. Je ne l'affirme donc pas. Je réponds sur la prise en charge, et le champ action renvoie le plafond au gestionnaire.
Sans passage au-dessus du seuil, la fonction refuse et transmet. Elle ne comble jamais un passage manquant.
Réponse rendueRéponse sourcée
L'implant dentaire est pris en charge au titre du forfait dentaire, article 7.3, page 34 des conditions générales CG-2021-09, version applicable au contrat CT-48213 depuis le 1er juin 2022. Le droit s'ouvre après six mois d'affiliation continue, article 4.2, page 18. Le devis doit être transmis avant l'acte, article 7.4, page 35. Le plafond annuel n'est pas tranché : le seul passage qui le traite reste sous le seuil, la question part au gestionnaire.
La recherche filtrée sur la version applicable
from dataclasses import dataclass
from datetime import date
SEUIL = 0.62
@dataclass(frozen=True)
class Passage:
version: str
article: str
page: int
extrait: str
score: float
def version_applicable(date_effet: date, periodes: dict) -> str:
for nom, (debut, fin) in periodes.items():
if debut <= date_effet <= fin:
return nom
raise LookupError("aucune version des conditions ne couvre " + date_effet.isoformat())
def _citer(p: Passage) -> dict:
return {"article": p.article, "page": p.page, "score": round(p.score, 2)}
def rechercher_conditions(contrat_id, question, date_effet, periodes, index,
seuil=SEUIL, k=3):
version = version_applicable(date_effet, periodes)
trouves = index(question)
hors_version = [p for p in trouves if p.version != version]
candidats = [p for p in trouves if p.version == version]
au_dessus = [p for p in candidats if p.score >= seuil]
sous_le_seuil = [p for p in candidats if p.score < seuil]
retenus = sorted(au_dessus, key=lambda p: -p.score)[:k]
commun = {
"contrat_id": contrat_id,
"date_effet": date_effet.isoformat(),
"version_applicable": version,
"seuil": seuil,
"ecartes": [
dict(_citer(p), version=p.version, motif="hors période du contrat")
for p in hors_version
],
"sous_le_seuil": [_citer(p) for p in sous_le_seuil],
}
# Sans passage au-dessus du seuil, une réponse serait une invention plausible.
if not retenus:
return dict(commun, statut="refus", action="transmettre au gestionnaire")
sources = [dict(_citer(p), extrait=p.extrait) for p in retenus]
action = "transmettre au gestionnaire" if sous_le_seuil else "aucune"
return dict(commun, statut="repondu", sources=sources, action=action)Sans filtre de version et sans seuil de refus, un assistant documentaire a raison la plupart du temps, et c'est exactement ce qui le rend inutilisable en gestion de contrats.
LLM & RAG
Avant, après
Des heures à chercher dans vos documents
Une réponse sourcée en quelques secondes
Des réponses qu'on ne peut pas vérifier
Chaque réponse cite sa source
LLM & RAG
La stack
Claude
OpenAI
RAG
pgvector
Qdrant
Embeddings
Reranking
Python
Vision
OCR
Agentic RAG
LLM & RAG
Questions franches
Combien de temps pour mettre un RAG en place ?
Un POC sur un sous-ensemble de vos documents prend quelques semaines. Un RAG complet en production, avec nettoyage du corpus, evals et déploiement, se compte en semaines à quelques mois selon le volume et l'état de vos documents.
Un RAG peut-il halluciner ?
Beaucoup moins qu'un LLM seul, mais oui, sans garde-fous. C'est pour ça que chaque réponse cite ses sources, que les questions hors corpus sont refusées, et que je mesure le taux de réponses correctes avec des evals avant chaque mise en production.
Mes documents restent-ils confidentiels ?
Oui. Selon vos contraintes, le RAG tourne sur un cloud UE ou entièrement dans votre infrastructure avec des modèles privés. Vos documents ne servent jamais à entraîner des modèles publics.
Quels documents peut-on brancher ?
PDF, Word, e-mails, wikis internes, bases métier: tout ce qui contient du texte s'indexe. Le vrai sujet n'est pas le format, c'est la qualité du corpus: je trie, je dédoublonne et je date avant d'indexer.
Comment l'IA répond-elle à une question complexe ou en plusieurs parties ?
Elle ne se jette pas sur la première page trouvée. Le système découpe la question, cherche en plusieurs passes dans vos documents, recoupe les résultats, puis relit sa propre réponse pour vérifier qu'elle tient avant de vous la donner. Concrètement, moins de réponses partielles ou inventées sur les cas où ça compte vraiment, et une réponse toujours rattachée à ses sources pour que vous puissiez la contrôler.
Un copilote interne ne risque-t-il pas d'exposer les mauvais documents ?
C'est le vrai frein de ce type de projet, et c'est un critère de conception dès le départ. Le copilote respecte vos droits d'accès existants : à chaque question, il vérifie ce que la personne a le droit de voir avant de répondre, au lieu de figer les permissions une fois pour toutes. Un commercial ne tombe pas sur les dossiers RH, un stagiaire ne remonte pas les contrats de direction.
Vous ne lisez que le texte, ou aussi les documents scannés ?
Les deux. La vieille approche (reconnaissance de caractères plus règles) casse dès qu'un document change de format ou arrive tordu. J'utilise des modèles qui lisent la mise en page comme le ferait un humain : ils repèrent un total, une date d'échéance ou une clause même si elle n'est jamais au même endroit. Concrètement, vos factures fournisseurs, contrats et formulaires scannés ressortent en données propres, vérifiées et prêtes à entrer dans votre système. La facturation électronique obligatoire a démarré en septembre 2026, ce qui en fait un chantier qui rapporte vite.
À lire sur ce sujet
Contact
Prêt à passer de la démo à la production ?
Réponse sous 24 h · premier échange gratuit et sans engagement.