Aller au contenu principal

Architecture Global Search & Intelligence Artificielle - Phase 1

🎯 DĂ©cision d'Architecture​

✅ Recommandation : Backend NestJS (implĂ©mentĂ©)​

Pourquoi NestJS pour la Phase 1 ?

  1. Infrastructure existante :

    • LlmService et OpenaiService dĂ©jĂ  en place
    • Gestion des clĂ©s API OpenAI par utilisateur
    • AccĂšs direct Ă  la DB via Kysely
    • TypeScript partagĂ© avec le frontend
  2. Avantages :

    • Pas de communication inter-services (plus simple)
    • DĂ©ploiement et maintenance plus faciles
    • Performance suffisante pour la Phase 1
    • CohĂ©rence avec l'architecture existante
  3. Limites acceptables pour Phase 1 :

    • Pas besoin de LangChain intensif
    • Pas de traitement batch lourd
    • Pas de modĂšles ML complexes

🔄 Évolution future : Service Python sĂ©parĂ© (Phase 2/3)​

Quand envisager un service Python séparé ?

  • Si besoin de LangChain de maniĂšre intensive
  • Traitement batch lourd (indexation, analyse massive)
  • ModĂšles ML complexes (embedding, classification avancĂ©e)
  • Besoin de bibliothĂšques Python spĂ©cifiques (pandas, scikit-learn, etc.)

Architecture proposée si migration nécessaire :

Frontend → NestJS Backend → Python AI Service (gRPC/REST)
↓
OpenAI/LangChain

📁 Structure Actuelle​

backend/src/search/
├── search.service.ts # Recherche classique (DB + Notion)
├── search.controller.ts # Endpoints REST
├── search.module.ts # Module NestJS
└── ai-search.service.ts # ✹ NOUVEAU : Service IA pour Phase 1

🔌 Endpoints API​

1. POST /api/search/ai/process​

Traite une requĂȘte en langage naturel et dĂ©termine l'intention.

Request:

{
"query": "sessions de mariage en juillet 2024 avec montant > 2000€"
}

Response:

{
"intent": "create_view",
"confidence": 0.95,
"parsedQuery": {
"entity": "sessions",
"filters": [
{
"field": "type",
"operator": "equals",
"value": "mariage"
},
{
"field": "date",
"operator": "between",
"value": ["2024-07-01", "2024-07-31"]
},
{
"field": "amount",
"operator": "greater_than",
"value": 2000
}
]
}
}

2. POST /api/search/ai/filters​

GĂ©nĂšre des filtres structurĂ©s Ă  partir d'une requĂȘte en langage naturel.

Request:

{
"query": "contacts actifs avec au moins 2 sessions cette année",
"entity": "contacts"
}

Response:

{
"filters": [
{
"field": "session_count",
"operator": "greater_than",
"value": 2
},
{
"field": "last_session_date",
"operator": "greater_than",
"value": "2024-01-01"
}
],
"entity": "contacts"
}

3. POST /api/search/ai/answer​

Répond à une question sur les données.

Request:

{
"question": "Quel est le revenu total du mois dernier ?",
"context": {
"invoices": [...]
}
}

Response:

{
"answer": "Le revenu total du mois dernier est de 15 450€.",
"confidence": 0.92,
"sources": [
{
"type": "invoices",
"id": "invoice-123",
"snippet": "Facture #2024-001 - 2500€"
}
]
}

đŸ—ïž Architecture du Service IA​

AiSearchService​

Le service AiSearchService fournit trois méthodes principales :

  1. processQuery() : Classification d'intention

    • Analyse la requĂȘte utilisateur
    • DĂ©termine l'intention (search, create_view, execute_action, question)
    • Parse la requĂȘte pour extraire les paramĂštres
  2. generateFilters() : Génération de filtres

    • Convertit le langage naturel en filtres DB structurĂ©s
    • Supporte les opĂ©rateurs : equals, contains, greater_than, less_than, between, in
    • Valide les champs selon l'entitĂ© cible
  3. answerQuestion() : Réponse aux questions

    • Analyse le contexte fourni
    • GĂ©nĂšre une rĂ©ponse naturelle
    • Cite les sources utilisĂ©es

Prompts System​

Les prompts sont construits dynamiquement selon :

  • L'entitĂ© cible (sessions, contacts, quotes, invoices)
  • Les champs disponibles pour chaque entitĂ©
  • Le type de requĂȘte (classification, filtres, question)

Configuration​

  • ModĂšle par dĂ©faut : gpt-4o-mini (configurable par utilisateur)
  • Temperature :
    • 0.2 pour la classification d'intention
    • 0.1 pour la gĂ©nĂ©ration de filtres (prĂ©cision maximale)
    • 0.3 pour les rĂ©ponses aux questions
  • Format de rĂ©ponse : JSON strict (response_format: { type: "json_object" })

🔄 Flux d'Utilisation​

Exemple 1 : CrĂ©ation d'une vue personnalisĂ©e​

1. User: "Crée une vue des sessions de mariage du mois de juillet"
↓
2. Frontend → POST /api/search/ai/process
↓
3. AiSearchService.processQuery()
→ Intent: "create_view"
→ Entity: "sessions"
→ Filters: [type="mariage", date="2024-07"]
↓
4. Frontend → POST /api/search/ai/filters (si besoin de plus de prĂ©cision)
↓
5. Frontend applique les filtres et affiche la vue

Exemple 2 : Question sur les donnĂ©es​

1. User: "Quel est le revenu total du mois dernier ?"
↓
2. Frontend → POST /api/search/ai/process
→ Intent: "question"
↓
3. Frontend récupÚre les données nécessaires (invoices du mois dernier)
↓
4. Frontend → POST /api/search/ai/answer
→ Answer: "Le revenu total est de 15 450€"
↓
5. Frontend affiche la réponse

Exemple 3 : Action complexe​

1. User: "Crée une facture pour toutes les sessions payées du mois dernier"
↓
2. Frontend → POST /api/search/ai/process
→ Intent: "execute_action"
→ Action: "create_invoice"
→ Parameters: { sessions: "paid", period: "last_month" }
↓
3. Frontend exécute l'action via l'API appropriée

🔐 SĂ©curité​

  • Authentification : JWT + ActiveUserGuard requis
  • ClĂ©s API : Chaque utilisateur utilise sa propre clĂ© OpenAI (stockĂ©e chiffrĂ©e)
  • Validation : Tous les filtres gĂ©nĂ©rĂ©s sont validĂ©s avant application
  • Rate Limiting : À implĂ©menter si nĂ©cessaire (via RateLimitingModule)

📊 Performance​

  • Latence attendue : 1-3 secondes par requĂȘte IA (selon le modĂšle)
  • Cache : À implĂ©menter pour les requĂȘtes frĂ©quentes
  • Optimisation : Utilisation de gpt-4o-mini par dĂ©faut (plus rapide et moins cher)

🚀 Phase 1 - ComplĂ©tĂ©e ✅​

  1. ✅ Service AiSearchService créé
  2. ✅ Endpoints API ajoutĂ©s
  3. ✅ IntĂ©gration frontend (GlobalSearch component)
  4. ✅ Application des filtres gĂ©nĂ©rĂ©s aux requĂȘtes DB
  5. ✅ Interface utilisateur pour l'assistant conversationnel
  6. ✅ SystĂšme d'exĂ©cution d'actions complexes

🚀 Phase 2 - CrĂ©ation assistĂ©e par IA ✅​

Structure​

backend/src/ai-assistant/
├── ai-creation.service.ts # GĂ©nĂ©ration de brouillons d'entitĂ©s
├── ai-report.service.ts # GĂ©nĂ©ration de rapports intelligents
├── ai-writing.service.ts # RĂ©daction assistĂ©e
├── ai-assistant.controller.ts # Endpoints API
├── ai-assistant.module.ts # Module NestJS
└── README.md # Documentation

Services​

1. AiCreationService​

GénÚre des brouillons d'entités (sessions, contacts, devis, factures) à partir de prompts en langage naturel.

Endpoint: POST /api/ai-assistant/draft

Exemple:

{
"prompt": "CrĂ©e une nouvelle session photo pour le mariage de Marie et Pierre le 15 juillet 2024 Ă  Paris, avec un devis de 2500€",
"entityType": "session"
}

2. AiReportService​

GénÚre des rapports personnalisés via prompts, l'IA agrÚge les données et génÚre le rapport.

Endpoint: POST /api/ai-assistant/report

Exemple:

{
"prompt": "GénÚre un rapport PDF des revenus par type de session pour le dernier trimestre",
"dataContext": {
"sessions": [...],
"invoices": [...],
"analytics": {...}
}
}

3. AiWritingService​

Utilise l'IA pour générer des ébauches d'emails, de descriptions de sessions, de notes de contact, etc.

Endpoint: POST /api/ai-assistant/writing

Exemple:

{
"prompt": "Rédige un email de suivi pour le devis #2024-001 en rappelant les avantages de notre offre",
"type": "email",
"context": {
"entityType": "quote",
"entityData": {...},
"recipient": { "name": "John Doe", "email": "john@example.com" },
"tone": "professional",
"language": "fr"
}
}

Configuration​

  • ModĂšle par dĂ©faut : gpt-4o-mini (configurable par utilisateur)
  • Temperature :
    • 0.3 pour la gĂ©nĂ©ration de brouillons (cohĂ©rence)
    • 0.4 pour les rapports (crĂ©ativitĂ© modĂ©rĂ©e)
    • 0.7 pour la rĂ©daction (crĂ©ativitĂ©)
  • Cache :
    • 5 minutes pour brouillons et rĂ©daction
    • 10 minutes pour rapports (plus coĂ»teux)
  • Format de rĂ©ponse : JSON strict (response_format: { type: "json_object" })

📝 Notes​

  • Le service est conçu pour ĂȘtre Ă©volutif : si besoin d'un service Python sĂ©parĂ© plus tard, l'interface peut ĂȘtre abstraite
  • Les prompts peuvent ĂȘtre amĂ©liorĂ©s itĂ©rativement selon les retours utilisateurs
  • La structure modulaire permet d'ajouter facilement de nouvelles fonctionnalitĂ©s (Phase 3)
  • Phase 2 utilise la mĂȘme infrastructure que Phase 1 (NestJS, OpenAI, cache Redis)