01
📊 Contexte et enjeux
Une entreprise de 500 personnes génère en moyenne 10 000 documents par an : contrats, rapports, notes internes, spécifications techniques, PV de réunion, procédures qualité. Le problème ? 80% de ces documents ne sont jamais relus et l'information critique est noyée.
80%
des documents jamais relus
2h/jour
passées à chercher de l'info
30%
de productivité perdue
💡 Le coût caché : Un employé qui cherche un document 30 minutes par jour = 2 semaines de travail perdues par an. Multipliez par 100 employés...
03
🧠 Solution : RAG + Graphe de connaissances
Architecture "Document Intelligence" :
[Documents] → [Indexation] → [Graphe] → [Interface IA]
│ │ │ │
PDF/Word OCR/NLP Relations Chatbot
Emails Extraction (auteur, Recherche
Slack Embeddings sujet, date) 问答
↓
[RAG + Graph Query]
↓
Réponse précise + source
Ontologie documentaire
# Modélisation des entités documentaires
@prefix : <http://doc.example.org/ontology#> .
:Document a owl:Class .
:Rapport a owl:Class ; rdfs:subClassOf :Document .
:Contrat a owl:Class ; rdfs:subClassOf :Document .
:NoteInterne a owl:Class ; rdfs:subClassOf :Document .
:aPourAuteur a owl:ObjectProperty .
:aPourDate a owl:DatatypeProperty .
:aPourProjet a owl:ObjectProperty .
:aPourSujet a owl:ObjectProperty .
:cite a owl:ObjectProperty .
:estCitePar a owl:ObjectProperty ; owl:inverseOf :cite .
# Version d'un document
:succedeA a owl:ObjectProperty .
:precedeA a owl:ObjectProperty ; owl:inverseOf :succedeA .
04
⚙️ Architecture technique détaillée
Pipeline d'indexation
# 1. Extraction des métadonnées et du contenu
def index_document(file_path):
# Extraction du texte
text = extract_text(file_path)
# Métadonnées automatiques
metadata = {
'author': extract_author(file_path, text),
'date': extract_date(file_path, text),
'project': extract_project(text),
'entities': extract_named_entities(text), # personnes, sociétés, lieux
'topics': extract_topics(text) # clustering thématique
}
# 2. Création de l'embedding
embedding = embed_model.encode(text)
# 3. Stockage dans vector database
vector_db.insert({
'id': document_id,
'embedding': embedding,
'metadata': metadata,
'text': text
})
# 4. Enrichissement du graphe de connaissances
graph.insert("""
INSERT DATA {
:doc_{doc_id} a :Document ;
:aPourAuteur :author_{author} ;
:aPourDate "{date}" ;
:aPourProjet :project_{project} .
}
""")
return document_id
Moteur de recherche hybride
class HybridDocumentSearch:
def __init__(self, vector_db, knowledge_graph, llm):
self.vector_db = vector_db
self.knowledge_graph = knowledge_graph
self.llm = llm
def search(self, query):
# 1. Détection de l'intention
intent = self.detect_intent(query) # "recherche auteur", "date", "projet", "similaire"
if intent == 'graph_query':
# Requête structurée vers le graphe
results = self.knowledge_graph.query(f"""
SELECT ?doc ?title WHERE {{
?doc :aPourAuteur :{self.extract_author(query)} ;
:aPourDate "{self.extract_date(query)}" .
}}
""")
return results
# 2. Recherche vectorielle par défaut
similar_docs = self.vector_db.similarity_search(query, k=10)
# 3. Enrichissement sémantique via le graphe
enriched = []
for doc in similar_docs:
context = self.knowledge_graph.query(f"""
SELECT ?related WHERE {{
:doc_{doc.id} :cite|:estCitePar|:aPourProjet ?related .
}}
""")
enriched.append({
'document': doc,
'related': context,
'relevance': doc.score
})
# 4. Génération d'une réponse synthétisée
if len(enriched) > 0:
return self.generate_answer(query, enriched)
return "Aucun document trouvé"
05
🎯 Exemples concrets de recherche
🔍 Requête : "Quels sont les contrats signés avec le client Dupont Industries ?"
🧠 Fonctionnement : Le graphe traverse les relations Client → Contrat → Signature.
✅ Résultat : Liste des 3 contrats avec dates, montants, statuts.
🔍 Requête : "Résume-moi les décisions du dernier comité de direction sur le projet Atlas"
🧠 Fonctionnement : Trouve le document "CR Comité Dir - projet Atlas", extrait les sections "Décisions", synthèse par LLM.
✅ Résultat : "Budget approuvé (+15%), calendrier décalé de 2 semaines, embauche de 2 développeurs."
🔍 Requête : "Qui a travaillé sur des sujets similaires à mon projet ?"
🧠 Fonctionnement : Embedding du projet → recherche documents similaires → extraction auteurs → graphe des compétences.
✅ Résultat : "Marie Dupont (expertise API REST), Jean Martin (sécurité), Sophie Lefèvre (UI/UX)"
🔍 Requête : "Montre-moi l'évolution des spécifications du produit X"
🧠 Fonctionnement : Navigation par la propriété :succedeA dans le graphe.
✅ Résultat : Chronologie des versions : v1 (2023-01) → v2 (2023-06) → v3 (2024-02)
07
💬 Témoignage client
🎤 Groupe Atlantic - Directeur des Systèmes d'Information
"Notre ancienne recherche documentaire prenait en moyenne 15 minutes. Avec la solution hybride RAG + graphe, nous sommes passés à 30 secondes. L'équipe R&D a gagné 2 heures par semaine en moyenne. Le retour sur investissement a été atteint en 4 mois."