Chargement…
Chargement…
Case study orienté impact: objectif métier clair, exécution maîtrisée, preuve ROI et plan de delivery traçable.
Impact principal
−87% temps de recherche
Valeur mesurable sur le flux critique
ROI business
1 800 €/mois économisés
Référence client observée en production
Time-to-delivery
5 semaines
Cycle complet cadrage → go-live
Scope livré
6 livrables
Briques prêtes à exploiter par les équipes
Avant
20–40 min par recherche documentaire — souvent sans résultat
Après
< 30 secondes, source citée avec page exacte
Aperçu produit
Bibliothèque
Contrat cadre 2024
24p
Jurisprudence CE v2
156p
Procédure RH v3
12p
Note interne Q1
8p
Réglementation 2025
44p
Archive historique
—
Contrat cadre 2024
p.18 · score 0.97
Note interne Q1
p.4 · score 0.82
Architecture système
Documents
PDF · Word · 487 docs
Chunking
Sémantique + overlap
FAISS Index
Vecteurs 1536-dim
Recherche hybride
Dense + Sparse
Réponse citée
Source + score
Code — extrait anonymisé
1# Hybrid retrieval — dense + sparse for legal documents2def hybrid_search(query: str, top_k: int = 5) -> list[Chunk]:3 # Dense search (semantic similarity)4 query_embedding = embedder.encode(query)5 dense_results = faiss_index.search(6 query_embedding.reshape(1, -1), k=top_k * 27 )89 # Sparse search (BM25 — exact term matching)10 sparse_results = bm25_index.get_top_n(11 query.split(), documents, n=top_k * 212 )1314 # Reciprocal Rank Fusion15 fused = rrf_merge(16 dense_results, sparse_results,17 weights=(0.7, 0.3), # tuned on eval set18 )1920 # Access control filter21 return [c for c in fused[:top_k] if user.can_access(c.document_id)]
1# FastAPI endpoint — streaming response with citations2@router.post("/chat")3async def chat(req: ChatRequest, user: User = Depends(auth)):4 chunks = hybrid_search(req.query, top_k=5)56 # Build context with page references7 context = "\n\n".join(8 f"[{c.doc_name} · p.{c.page}]\n{c.text}"9 for c in chunks10 )1112 async def generate():13 stream = await openai.chat.completions.create(14 model="gpt-4o",15 messages=[16 {"role": "system", "content": SYSTEM_PROMPT + context},17 *req.history,18 {"role": "user", "content": req.query},19 ],20 stream=True,21 )22 async for delta in stream:23 if delta.choices[0].delta.content:24 yield delta.choices[0].delta.content2526 return StreamingResponse(generate(), media_type="text/event-stream")
Delivery Roadmap
Discovery
Cadrage métier, collecte contraintes et architecture cible
Build
Implémentation coeur produit et intégrations prioritaires
Scale
Hardening: perf, fiabilité, monitoring et tests de charge
Launch
Go-live encadré, transfert, documentation et KPI de suivi
Phase 01 · Discovery
Phase 02 · Build
Phase 03 · Scale
Phase 04 · Launch
Démo interactive
/ testez la technologieLe problème
Le cabinet avait accumulé 500+ documents internes : contrats cadres, jurisprudences annotées, procédures RH, notes de synthèse trimestrielles. Ces documents n'étaient accessibles qu'en cherchant manuellement dans un serveur de fichiers sans recherche sémantique. Trouver la clause exacte d'un contrat ou la jurisprudence pertinente prenait de 20 à 40 minutes — quand on la trouvait. Les nouveaux collaborateurs passaient leurs trois premières semaines à cartographier les archives plutôt qu'à produire. La connaissance institutionnelle était invisible.
La solution
Chatbot RAG déployé en interne : pipeline d'indexation PDF/Word via chunking sémantique avec overlap de 20% pour préserver le contexte inter-paragraphes, vectorisation OpenAI text-embedding-3-large (3072 dim) stockée dans FAISS, recherche hybride dense+sparse (BM25 + RRF). Les réponses citent la source exacte (nom du document, numéro de page, score de pertinence). Contrôle d'accès par document : les dossiers sensibles ne sont accessibles qu'aux équipes autorisées. Interface chat déployée en interne via Next.js, sans installation côté client.
Défis techniques
Chunking de documents juridiques longs (150+ pages) : les clauses contractuelles ont une cohérence inter-paragraphes critique. Solution : sliding window de 512 tokens avec 20% d'overlap + extraction des titres de section pour enrichir les métadonnées de chaque chunk
Fusion dense+sparse (RRF) : les poids 0.7/0.3 ont été calibrés sur un jeu d'évaluation de 50 questions réelles annotées par les juristes — gain de +18% de précision@5 vs dense seul
Sécurité des documents confidentiels : ACL par document_id implémentée au niveau de l'index FAISS et vérifiée avant chaque affichage de chunk — impossible de contourner via reformulation de la requête
Retour client
Un collaborateur qui arrive peut poser une question sur n'importe quel contrat et avoir la réponse sourcée en 30 secondes. Avant, il fallait trouver quelqu'un qui s'en souvenait. On a cessé de perdre de la connaissance quand des gens partent, et nos juniors sont opérationnels en 2 jours au lieu de 3 semaines.
Nom modifié pour respecter le NDA du client.
Impact clé
Stack technique