914 lines
31 KiB
Plaintext
914 lines
31 KiB
Plaintext
################################################################################
|
|
# #
|
|
# DOCUMENTATION COMPLETE #
|
|
# PROJET KAZEIA #
|
|
# #
|
|
# Chatbot de Soutien Emotionnel #
|
|
# #
|
|
# Developpe par: Damien Micottis et Richard Loyer #
|
|
# Master UTBM 2024/2025 #
|
|
# #
|
|
################################################################################
|
|
|
|
Date de creation du document : 22 janvier 2026
|
|
Version du projet : 1.0
|
|
|
|
################################################################################
|
|
TABLE DES MATIERES
|
|
################################################################################
|
|
|
|
1. PRESENTATION GENERALE
|
|
1.1 Description du projet
|
|
1.2 Objectifs
|
|
1.3 Public cible
|
|
|
|
2. ARCHITECTURE TECHNIQUE
|
|
2.1 Vue d'ensemble
|
|
2.2 Stack technologique
|
|
2.3 Structure des fichiers
|
|
2.4 Diagramme des composants
|
|
|
|
3. INSTALLATION ET DEPLOIEMENT
|
|
3.1 Prerequisites systeme
|
|
3.2 Installation locale
|
|
3.3 Installation Docker
|
|
3.4 Configuration
|
|
|
|
4. BASE DE DONNEES
|
|
4.1 Schema de la base
|
|
4.2 Tables detaillees
|
|
4.3 Relations
|
|
|
|
5. API ET ENDPOINTS
|
|
5.1 Routes disponibles
|
|
5.2 Format des requetes/reponses
|
|
5.3 Authentification
|
|
|
|
6. MODULES FONCTIONNELS
|
|
6.1 Gestion des conversations
|
|
6.2 Systeme RAG
|
|
6.3 Questionnaire PHQ-9
|
|
6.4 Synthese vocale (TTS)
|
|
6.5 Transcription (STT)
|
|
6.6 Resume de texte
|
|
|
|
7. CONFIGURATION DETAILLEE
|
|
7.1 Parametres disponibles
|
|
7.2 Configuration des modeles
|
|
7.3 Variables d'environnement
|
|
|
|
8. SECURITE
|
|
8.1 Authentification
|
|
8.2 Protection des donnees
|
|
8.3 Recommandations
|
|
|
|
9. GUIDE D'UTILISATION
|
|
9.1 Interface utilisateur
|
|
9.2 Interface medecin
|
|
9.3 Commandes CLI
|
|
|
|
10. PERFORMANCES ET OPTIMISATION
|
|
10.1 Metriques actuelles
|
|
10.2 Recommandations vLLM
|
|
10.3 Bonnes pratiques
|
|
|
|
11. MAINTENANCE ET EVOLUTION
|
|
11.1 Logs et monitoring
|
|
11.2 Sauvegarde
|
|
11.3 Roadmap
|
|
|
|
================================================================================
|
|
1. PRESENTATION GENERALE
|
|
================================================================================
|
|
|
|
1.1 DESCRIPTION DU PROJET
|
|
-------------------------
|
|
Kazeia est un chatbot conversationnel d'accompagnement emotionnel propulse par
|
|
l'intelligence artificielle. Il est concu pour fournir une ecoute empathique,
|
|
une evaluation de la sante mentale via le questionnaire PHQ-9, et un soutien
|
|
personnalise aux utilisateurs en langue francaise.
|
|
|
|
Le projet combine plusieurs technologies d'IA de pointe :
|
|
- Generation de texte par LLM (Qwen)
|
|
- Recuperation augmentee de generation (RAG)
|
|
- Synthese vocale avec clonage de voix (Auralis/XTTS)
|
|
- Reconnaissance vocale (Whisper)
|
|
- Resume automatique (mBARThez)
|
|
|
|
1.2 OBJECTIFS
|
|
-------------
|
|
- Offrir un espace d'ecoute bienveillant et non-jugeant
|
|
- Evaluer periodiquement l'etat emotionnel des utilisateurs (PHQ-9)
|
|
- Fournir des reponses empathiques et contextualisees
|
|
- Supporter l'interaction vocale bidirectionnelle
|
|
- Permettre aux professionnels de sante de suivre leurs patients
|
|
|
|
1.3 PUBLIC CIBLE
|
|
----------------
|
|
- Utilisateurs : Personnes cherchant un soutien emotionnel quotidien
|
|
- Medecins/Professionnels : Suivi des patients et analyse des donnees PHQ-9
|
|
|
|
================================================================================
|
|
2. ARCHITECTURE TECHNIQUE
|
|
================================================================================
|
|
|
|
2.1 VUE D'ENSEMBLE
|
|
------------------
|
|
|
|
+------------------+
|
|
| Interface Web |
|
|
| (Flask/HTTPS) |
|
|
+--------+---------+
|
|
|
|
|
+--------------+--------------+
|
|
| | |
|
|
+---------v----+ +-------v------+ +----v---------+
|
|
| Conversation | | RAG | | Audio |
|
|
| Manager | | System | | Pipeline |
|
|
+------+-------+ +------+-------+ +------+-------+
|
|
| | |
|
|
+------v-------+ +------v-------+ +------v-------+
|
|
| Qwen | | ChromaDB | | Whisper/TTS |
|
|
| LLM | | Vectors | | Auralis |
|
|
+--------------+ +--------------+ +--------------+
|
|
| | |
|
|
+--------------+--------------+
|
|
|
|
|
+--------v---------+
|
|
| SQLite |
|
|
| Database |
|
|
+------------------+
|
|
|
|
2.2 STACK TECHNOLOGIQUE
|
|
-----------------------
|
|
|
|
+----------------------+----------------------------------+----------------+
|
|
| Composant | Technologie | Version |
|
|
+----------------------+----------------------------------+----------------+
|
|
| Langage | Python | 3.10 |
|
|
| Framework Web | Flask | >= 3.1.1 |
|
|
| Base de donnees | SQLite | 3.x |
|
|
| Base vectorielle | ChromaDB | >= 1.0.12 |
|
|
| LLM Principal | Qwen (HuggingFace) | Local |
|
|
| Embeddings | sentence-camembert-base | - |
|
|
| Cross-Encoder | crossencoder-camembert-base | - |
|
|
| TTS | Auralis/XTTS v2 | >= 0.2.8 |
|
|
| STT | OpenAI Whisper | >= 20240930 |
|
|
| Resume | mBARThez | Local |
|
|
| Securite | Werkzeug | >= 3.1.3 |
|
|
| SSL | pyOpenSSL | >= 25.1.0 |
|
|
+----------------------+----------------------------------+----------------+
|
|
|
|
2.3 STRUCTURE DES FICHIERS
|
|
--------------------------
|
|
|
|
/opt/kazeia/
|
|
|
|
|
|-- main.py # Point d'entree principal
|
|
|-- config.py # Configuration centralisee (161 lignes)
|
|
|
|
|
|-- Modules principaux:
|
|
| |-- conversation_manager.py # Gestion des conversations (649 lignes)
|
|
| |-- web_interface.py # Interface Flask (1,882 lignes)
|
|
| |-- database_manager.py # Acces base de donnees (541 lignes)
|
|
| |-- rag.py # Systeme RAG (191 lignes)
|
|
| |-- phq9_manager.py # Questionnaire PHQ-9 (95 lignes)
|
|
| |-- tts.py # Synthese vocale (226 lignes)
|
|
| |-- transcription.py # Transcription audio (50 lignes)
|
|
| |-- summarizer.py # Resume de texte (151 lignes)
|
|
|
|
|
|-- Utilitaires:
|
|
| |-- user_management_cli.py # CLI gestion utilisateurs
|
|
| |-- cli_chatbot.py # Interface chatbot CLI
|
|
| |-- load_pdf.py # Chargement PDF dans ChromaDB
|
|
| |-- load_fiches_patients.py # Chargement fiches patients
|
|
| |-- voice_cloning.py # Clonage vocal
|
|
|
|
|
|-- Donnees et configuration:
|
|
| |-- phq-9_questions.json # Questions PHQ-9
|
|
| |-- requirements.txt # Dependances Python
|
|
| |-- Dockerfile # Configuration Docker
|
|
| |-- README.txt # Instructions basiques
|
|
|
|
|
|-- Repertoires:
|
|
| |-- database/ # Base SQLite (~61 Ko)
|
|
| |-- chroma_db/ # Base vectorielle (~35 Mo)
|
|
| |-- model/ # Modeles pre-entraines
|
|
| | |-- kazeia/ # Modele Qwen fine-tune
|
|
| | |-- mbarthez/ # Modele de resume
|
|
| |-- auralis/ # Echantillons vocaux (8 fichiers, ~130 Mo)
|
|
| |-- static/ # Ressources web
|
|
| |-- tts_audio_auralis/ # Audio genere
|
|
| |-- fiches_patients/ # Donnees patients
|
|
|
|
================================================================================
|
|
3. INSTALLATION ET DEPLOIEMENT
|
|
================================================================================
|
|
|
|
3.1 PREREQUISITES SYSTEME
|
|
-------------------------
|
|
|
|
Materiel recommande :
|
|
- CPU : 4+ coeurs
|
|
- RAM : 16 Go minimum (32 Go recommande)
|
|
- GPU : NVIDIA avec 8+ Go VRAM (optionnel mais recommande)
|
|
- Stockage : 20 Go minimum
|
|
|
|
Logiciels requis :
|
|
- Python 3.10
|
|
- pip (gestionnaire de paquets)
|
|
- PortAudio (pour l'audio)
|
|
- CUDA Toolkit (si GPU NVIDIA)
|
|
|
|
Pour Fedora/RHEL :
|
|
sudo dnf install portaudio-devel python3-whisper.noarch g++ git
|
|
|
|
Pour Ubuntu/Debian :
|
|
sudo apt install portaudio19-dev python3-pip git build-essential
|
|
|
|
3.2 INSTALLATION LOCALE
|
|
-----------------------
|
|
|
|
Etape 1 : Cloner ou telecharger le projet
|
|
cd /opt
|
|
# Copier les fichiers du projet dans /opt/kazeia
|
|
|
|
Etape 2 : Creer l'environnement virtuel
|
|
python3.10 -m venv kazeia_env
|
|
source kazeia_env/bin/activate
|
|
|
|
Etape 3 : Installer les dependances
|
|
pip install --upgrade pip
|
|
pip install -r requirements.txt
|
|
|
|
Etape 4 : Telecharger les modeles (si non inclus)
|
|
# Modele Qwen : placer dans ./model/kazeia/
|
|
# Modele mBARThez : placer dans ./model/mbarthez/
|
|
|
|
Etape 5 : Initialiser la base ChromaDB (si necessaire)
|
|
python load_pdf.py # Charger les documents PDF
|
|
python load_fiches_patients.py # Charger les fiches patients
|
|
|
|
Etape 6 : Creer un utilisateur
|
|
python user_management_cli.py create --username admin --type doctor
|
|
# Suivre les instructions pour le mot de passe
|
|
|
|
Etape 7 : Lancer l'application
|
|
python main.py
|
|
|
|
Etape 8 : Acceder a l'interface
|
|
Ouvrir https://127.0.0.1:5000 dans un navigateur
|
|
(Accepter l'avertissement de certificat auto-signe)
|
|
|
|
3.3 INSTALLATION DOCKER
|
|
-----------------------
|
|
|
|
Dockerfile fourni :
|
|
|
|
FROM python:3.10.17-slim-bullseye AS chatbot_project
|
|
RUN apt-get update
|
|
RUN apt-get install python3-whisper -y
|
|
RUN pip install --upgrade pip
|
|
RUN pip install auralis==0.2.8.post2
|
|
RUN pip install Flask pyOpenSSL
|
|
RUN pip install openai-whisper
|
|
RUN pip install sentence-transformers
|
|
RUN pip install accelerate
|
|
RUN pip install chromadb
|
|
RUN pip install numpy langchain PyMuPDF hf_xet
|
|
RUN pip install SentencePiece
|
|
|
|
Construction et execution :
|
|
docker build -t kazeia .
|
|
docker run -p 5000:5000 -v ./model:/app/model -v ./database:/app/database kazeia
|
|
|
|
3.4 CONFIGURATION
|
|
-----------------
|
|
|
|
Le fichier config.py centralise toute la configuration.
|
|
Voir la section 7 pour les details complets.
|
|
|
|
================================================================================
|
|
4. BASE DE DONNEES
|
|
================================================================================
|
|
|
|
4.1 SCHEMA DE LA BASE
|
|
---------------------
|
|
|
|
Type : SQLite 3
|
|
Fichier : ./database/chatbot_users.db
|
|
Taille : ~61 Ko (variable selon utilisation)
|
|
|
|
4.2 TABLES DETAILLEES
|
|
---------------------
|
|
|
|
TABLE: users
|
|
+---------------+---------+------------------------------------------------+
|
|
| Colonne | Type | Description |
|
|
+---------------+---------+------------------------------------------------+
|
|
| id | INTEGER | Cle primaire auto-incrementee |
|
|
| username | TEXT | Nom d'utilisateur unique (NOT NULL) |
|
|
| password_hash | TEXT | Hash du mot de passe (Werkzeug) |
|
|
| user_type | TEXT | 'user' ou 'doctor' (defaut: 'user') |
|
|
| created_at | TIMESTAMP| Date de creation |
|
|
+---------------+---------+------------------------------------------------+
|
|
|
|
TABLE: user_profiles
|
|
+---------------+---------+------------------------------------------------+
|
|
| Colonne | Type | Description |
|
|
+---------------+---------+------------------------------------------------+
|
|
| user_id | INTEGER | Cle primaire, FK vers users.id |
|
|
| prenom | TEXT | Prenom de l'utilisateur |
|
|
| nom_famille | TEXT | Nom de famille |
|
|
| age | INTEGER | Age de l'utilisateur |
|
|
| updated_at | TIMESTAMP| Derniere mise a jour |
|
|
+---------------+---------+------------------------------------------------+
|
|
|
|
TABLE: conversation_history
|
|
+-------------------+---------+----------------------------------------------+
|
|
| Colonne | Type | Description |
|
|
+-------------------+---------+----------------------------------------------+
|
|
| id | INTEGER | Cle primaire auto-incrementee |
|
|
| user_id | INTEGER | FK vers users.id (NOT NULL) |
|
|
| user_message | TEXT | Message de l'utilisateur |
|
|
| chatbot_response | TEXT | Reponse du chatbot |
|
|
| conversation_state| TEXT | Etat de la conversation |
|
|
| turn_type | TEXT | Type de tour (defaut: 'other') |
|
|
| timestamp | TIMESTAMP| Horodatage |
|
|
+-------------------+---------+----------------------------------------------+
|
|
|
|
Types de tours (turn_type) :
|
|
- conversation : Echange normal
|
|
- profile_collection : Collecte de profil
|
|
- phq9_proposal : Proposition PHQ-9
|
|
- phq9_question : Question PHQ-9
|
|
- phq9_result : Resultat PHQ-9
|
|
- system_init : Initialisation systeme
|
|
- system_error : Erreur systeme
|
|
|
|
TABLE: phq9_assessments
|
|
+------------------+---------+----------------------------------------------+
|
|
| Colonne | Type | Description |
|
|
+------------------+---------+----------------------------------------------+
|
|
| id | INTEGER | Cle primaire auto-incrementee |
|
|
| user_id | INTEGER | FK vers users.id (NOT NULL) |
|
|
| score | INTEGER | Score PHQ-9 (0-27) |
|
|
| assessment_date | TIMESTAMP| Date de l'evaluation |
|
|
| answers_json | TEXT | Reponses serialisees en JSON |
|
|
+------------------+---------+----------------------------------------------+
|
|
|
|
4.3 RELATIONS
|
|
-------------
|
|
|
|
users (1) ----< (N) user_profiles (1:1 en pratique)
|
|
users (1) ----< (N) conversation_history
|
|
users (1) ----< (N) phq9_assessments
|
|
|
|
Suppression en cascade activee : la suppression d'un utilisateur supprime
|
|
automatiquement son profil, son historique et ses evaluations PHQ-9.
|
|
|
|
================================================================================
|
|
5. API ET ENDPOINTS
|
|
================================================================================
|
|
|
|
5.1 ROUTES DISPONIBLES
|
|
----------------------
|
|
|
|
+----------------------------------+--------+----------------------------------+
|
|
| Route | Methode| Description |
|
|
+----------------------------------+--------+----------------------------------+
|
|
| / | GET | Page d'accueil/redirection |
|
|
| /login | GET/POST| Connexion utilisateur |
|
|
| /logout | POST | Deconnexion |
|
|
| /get_auralis_voices | GET | Liste des voix disponibles |
|
|
| /transcribe_audio_only | POST | Transcription audio -> texte |
|
|
| /generate_summary/<patient_id> | GET | Resume de conversation |
|
|
| /get_conversation/<patient_id> | GET | Historique de conversation |
|
|
| /get_chatbot_response | POST | Obtenir reponse du chatbot |
|
|
| /patient/<patient_id> | GET | Details d'un patient |
|
|
| /rag_query | POST | Requete RAG directe |
|
|
+----------------------------------+--------+----------------------------------+
|
|
|
|
5.2 FORMAT DES REQUETES/REPONSES
|
|
--------------------------------
|
|
|
|
POST /login
|
|
-----------
|
|
Requete (form-data) :
|
|
username: string
|
|
password: string
|
|
|
|
Reponse (redirection) :
|
|
Succes -> / (page principale)
|
|
Echec -> /login (avec message d'erreur)
|
|
|
|
POST /get_chatbot_response
|
|
--------------------------
|
|
Requete (JSON) :
|
|
{
|
|
"message": "Bonjour, comment allez-vous ?",
|
|
"voice_id": "damien" // optionnel
|
|
}
|
|
|
|
Reponse (JSON) :
|
|
{
|
|
"response_text": "Bonjour ! Je vais bien, merci...",
|
|
"audio_url": "/static/tts_audio_auralis/response_123.wav",
|
|
"phq9_question_data": null // ou objet question si PHQ-9 actif
|
|
}
|
|
|
|
POST /transcribe_audio_only
|
|
---------------------------
|
|
Requete (multipart/form-data) :
|
|
audio_file: fichier audio (WAV, MP3, etc.)
|
|
|
|
Reponse (JSON) :
|
|
{
|
|
"transcription": "Texte transcrit de l'audio"
|
|
}
|
|
|
|
GET /get_conversation/<patient_id>
|
|
----------------------------------
|
|
Reponse (JSON) :
|
|
{
|
|
"conversation": [
|
|
{
|
|
"id": 1,
|
|
"user_message": "...",
|
|
"chatbot_response": "...",
|
|
"timestamp": "2026-01-22 10:30:00",
|
|
"turn_type": "conversation"
|
|
},
|
|
...
|
|
]
|
|
}
|
|
|
|
5.3 AUTHENTIFICATION
|
|
--------------------
|
|
|
|
Type : Session Flask
|
|
- Les sessions sont stockees cote serveur
|
|
- Cookie de session envoye au client
|
|
- Decorateur @login_required pour proteger les routes
|
|
|
|
Exemple d'utilisation :
|
|
@app.route('/protected')
|
|
@login_required
|
|
def protected_route():
|
|
# Acces a session['user_id'], session['username']
|
|
pass
|
|
|
|
================================================================================
|
|
6. MODULES FONCTIONNELS
|
|
================================================================================
|
|
|
|
6.1 GESTION DES CONVERSATIONS (conversation_manager.py)
|
|
-------------------------------------------------------
|
|
|
|
Machine a etats :
|
|
INITIAL_SESSION_MESSAGE -> Debut de session
|
|
STATE_PROFILE_COLLECT_PRENOM -> Collecte prenom
|
|
STATE_PROFILE_COLLECT_NOM -> Collecte nom
|
|
STATE_PROFILE_COLLECT_AGE -> Collecte age
|
|
STATE_PHQ9_PROPOSAL -> Proposition questionnaire
|
|
STATE_PHQ9_ASKING_QUESTION -> Questions PHQ-9
|
|
STATE_MAIN_CHAT -> Conversation normale
|
|
|
|
Flux typique :
|
|
1. Utilisateur se connecte
|
|
2. Si profil incomplet -> collecte d'informations
|
|
3. Si PHQ-9 du (> 7 jours) -> proposition questionnaire
|
|
4. Sinon -> conversation normale avec RAG
|
|
|
|
Prompt systeme du LLM :
|
|
- Role d'ecoute empathique
|
|
- Validation des emotions
|
|
- Reponses concises (1-2 paragraphes)
|
|
- Redirection vers 3114 si risque suicidaire
|
|
- Pas de diagnostic medical
|
|
|
|
6.2 SYSTEME RAG (rag.py)
|
|
------------------------
|
|
|
|
Composants :
|
|
- Embedding : sentence-camembert-base (SentenceTransformers)
|
|
- Cross-Encoder : crossencoder-camembert-base-mmarcoFR
|
|
- Vector Store : ChromaDB
|
|
|
|
Pipeline RAG :
|
|
1. Requete utilisateur
|
|
2. Recherche semantique (N_INITIAL_RETRIEVAL = 5 documents)
|
|
3. Re-ranking par cross-encoder
|
|
4. Selection des meilleurs documents (N_RERANKED_CONTEXT = 1)
|
|
5. Injection dans le contexte du LLM
|
|
|
|
Collections ChromaDB :
|
|
- health_knowledge : Documents PDF sante
|
|
- patients : Fiches patients medicales
|
|
|
|
6.3 QUESTIONNAIRE PHQ-9 (phq9_manager.py)
|
|
-----------------------------------------
|
|
|
|
Le PHQ-9 (Patient Health Questionnaire-9) est un outil valide cliniquement
|
|
pour le depistage de la depression.
|
|
|
|
Questions :
|
|
Q1: Peu d'interet ou de plaisir a faire les choses
|
|
Q2: Etre triste, deprime(e) ou desespere(e)
|
|
Q3: Difficultes a s'endormir ou a rester endormi(e), ou dormir trop
|
|
Q4: Se sentir fatigue(e) ou manquer d'energie
|
|
Q5: Avoir peu d'appetit ou manger trop
|
|
Q6: Avoir une mauvaise opinion de soi-meme
|
|
Q7: Avoir du mal a se concentrer
|
|
Q8: Bouger ou parler lentement / etre agite(e)
|
|
Q9: Penser qu'il vaudrait mieux mourir ou envisager de se faire du mal
|
|
|
|
Reponses possibles (pour chaque question) :
|
|
- Jamais (0 points)
|
|
- Quelques jours (1 point)
|
|
- Plus de la moitie du temps (2 points)
|
|
- Presque tous les jours (3 points)
|
|
|
|
Interpretation du score total (0-27) :
|
|
0-4 : Depression minimale
|
|
5-9 : Depression legere
|
|
10-14 : Depression moderee
|
|
15-19 : Depression moderement severe
|
|
20-27 : Depression severe
|
|
|
|
Configuration :
|
|
- PHQ9_ENABLED : Active/desactive le questionnaire
|
|
- PHQ9_ASSESSMENT_INTERVAL_DAYS : Intervalle entre evaluations (defaut: 7)
|
|
|
|
6.4 SYNTHESE VOCALE (tts.py)
|
|
----------------------------
|
|
|
|
Technologie : Auralis / XTTS v2
|
|
Modele : AstraMindAI/xttsv2
|
|
|
|
Voix disponibles (8 profils pre-entraines) :
|
|
- amir.wav
|
|
- damien.wav
|
|
- didier.wav
|
|
- elodie.wav
|
|
- jerome.wav
|
|
- richard.wav
|
|
- sid.wav
|
|
- zelda.wav
|
|
|
|
Fonctionnalites :
|
|
- Synthese text-to-speech en francais
|
|
- Clonage de voix a partir d'echantillons WAV
|
|
- Support GPU (CUDA) pour acceleration
|
|
- Sortie au format WAV
|
|
|
|
6.5 TRANSCRIPTION (transcription.py)
|
|
------------------------------------
|
|
|
|
Technologie : OpenAI Whisper
|
|
Modeles disponibles : small, medium, large
|
|
Langue : Francais (fr)
|
|
|
|
Utilisation :
|
|
audio_file -> Whisper -> texte transcrit
|
|
|
|
6.6 RESUME DE TEXTE (summarizer.py)
|
|
-----------------------------------
|
|
|
|
Technologie : mBARThez (HuggingFace Transformers)
|
|
Approche : Map-Reduce pour les longs textes
|
|
|
|
Parametres :
|
|
- MAX_TOKENS_PER_SUMMARY_CHUNK : 480 tokens par chunk
|
|
- MAX_NEW_TOKENS_SUMMARY_CHUNK : 200 tokens generes
|
|
- MAX_TOKENS_OVERLAP : 100 tokens de chevauchement
|
|
|
|
================================================================================
|
|
7. CONFIGURATION DETAILLEE
|
|
================================================================================
|
|
|
|
7.1 PARAMETRES DISPONIBLES (config.py)
|
|
--------------------------------------
|
|
|
|
# --- Logging ---
|
|
LOGGING_LEVEL = logging.DEBUG
|
|
LOGGING_FORMAT = '%(asctime)s - %(levelname)s - %(module)s - %(message)s'
|
|
LOG_FILENAME = "conversation_log.txt"
|
|
THIRD_PARTY_LOGGERS = ["transformers", "sentence_transformers", "chromadb",
|
|
"httpx", "auralis"]
|
|
THIRD_PARTY_LOGGING_LEVEL = logging.WARNING
|
|
|
|
# --- Base de donnees ---
|
|
DATABASE_DIRECTORY = Path("./database")
|
|
DATABASE_FILENAME = "chatbot_users.db"
|
|
DATABASE_FILE_PATH = DATABASE_DIRECTORY / DATABASE_FILENAME
|
|
|
|
# --- PHQ-9 ---
|
|
PHQ9_QUESTIONS_FILE = Path("./phq-9_questions.json")
|
|
PHQ9_ASSESSMENT_INTERVAL_DAYS = 7
|
|
PHQ9_ENABLED = True
|
|
|
|
# --- Whisper (STT) ---
|
|
WHISPER_MODEL_NAME = "small" # small, medium, large
|
|
WHISPER_LANGUAGE = "fr"
|
|
|
|
# --- RAG ---
|
|
CHROMA_DB_PATH = "./chroma_db"
|
|
EMBEDDING_MODEL_NAME = 'dangvantuan/sentence-camembert-base'
|
|
CROSS_ENCODER_MODEL_NAME = 'antoinelouis/crossencoder-camembert-base-mmarcoFR'
|
|
RAG_RERANK_SCORE_THRESHOLD = 0.1
|
|
N_INITIAL_RETRIEVAL = 5
|
|
N_RERANKED_CONTEXT = 1
|
|
MAX_CONTEXT_TOKENS = 2048
|
|
|
|
# --- Generateur LLM ---
|
|
USE_CUDA_FOR_GENERATOR = True if torch.cuda.is_available() else False
|
|
GENERATOR_MODEL_TYPE = "hf" # "hf" ou "gguf"
|
|
GENERATOR_MODEL_NAME_HF = "./model/kazeia"
|
|
GENERATOR_MODEL_NAME_GGUF = "./gguf/qwen3-1.7B_claire.gguf"
|
|
GGUF_GPU_LAYERS = 50 if USE_CUDA_FOR_GENERATOR else 0
|
|
MAX_NEW_TOKENS = 300
|
|
MAX_NEW_TOKENS_GREETING = 300
|
|
REPETITION_PENALTY = 1.2
|
|
NO_REPEAT_NGRAM_SIZE = 3
|
|
|
|
# --- TTS Auralis ---
|
|
AURALIS_XTTS_MODEL_NAME = "AstraMindAI/xttsv2"
|
|
AURALIS_GPT_MODEL_NAME = "AstraMindAI/xtts2-gpt"
|
|
AURALIS_VOICES_DIR = Path("./auralis")
|
|
AURALIS_SPEAKER_WAV_DEFAULT = "auralis/damien.wav"
|
|
AURALIS_LANGUAGE = "fr"
|
|
AURALIS_AUDIO_OUTPUT_DIR = Path("./static/tts_audio_auralis")
|
|
AURALIS_USE_CUDA = True
|
|
|
|
# --- Summarizer ---
|
|
SUMMARIZER_MODEL_TYPE = "hf"
|
|
SUMMARIZER_MODEL_NAME_HF = "./model/mbarthez"
|
|
SUMMARIZER_USE_CUDA = True
|
|
MAX_TOKENS_PER_SUMMARY_CHUNK = 480
|
|
MAX_NEW_TOKENS_SUMMARY_CHUNK = 200
|
|
MAX_TOKENS_OVERLAP = 100
|
|
|
|
# --- Historique conversation ---
|
|
CONVERSATION_CONTEXT_TURNS = 5
|
|
MAX_TOKENS_FOR_HISTORY_LLM = 700
|
|
|
|
# --- Flask ---
|
|
FLASK_HOST = '0.0.0.0'
|
|
FLASK_PORT = 5000
|
|
FLASK_DEBUG = False
|
|
FLASK_USE_RELOADER = False
|
|
FLASK_USE_SSL = True
|
|
FLASK_STATIC_FOLDER = 'static'
|
|
|
|
================================================================================
|
|
8. SECURITE
|
|
================================================================================
|
|
|
|
8.1 AUTHENTIFICATION
|
|
--------------------
|
|
|
|
Implemented :
|
|
(+) Hachage des mots de passe avec Werkzeug (PBKDF2-SHA256)
|
|
(+) Sessions Flask securisees
|
|
(+) Decorateur @login_required pour routes protegees
|
|
(+) Types d'utilisateurs (user/doctor) avec permissions
|
|
|
|
8.2 PROTECTION DES DONNEES
|
|
--------------------------
|
|
|
|
Implemented :
|
|
(+) HTTPS/SSL natif (mode adhoc ou certificats personnalises)
|
|
(+) Requetes SQL parametrees (prevention injection SQL)
|
|
(+) Validation des types d'utilisateurs
|
|
|
|
A ameliorer :
|
|
(-) Donnees en clair dans SQLite (recommander chiffrement)
|
|
(-) Pas de rate limiting
|
|
(-) Pas de validation CSRF
|
|
(-) Certificats auto-signes en production
|
|
|
|
8.3 RECOMMANDATIONS
|
|
-------------------
|
|
|
|
PRIORITE HAUTE :
|
|
[ ] Implementer rate limiting (Flask-Limiter)
|
|
[ ] Ajouter protection CSRF (Flask-WTF)
|
|
[ ] Utiliser certificats SSL valides (Let's Encrypt)
|
|
[ ] Chiffrer les donnees sensibles en base
|
|
|
|
PRIORITE MOYENNE :
|
|
[ ] Ajouter logs d'audit de securite
|
|
[ ] Implementer expiration de session
|
|
[ ] Valider/sanitizer toutes les entrees
|
|
|
|
================================================================================
|
|
9. GUIDE D'UTILISATION
|
|
================================================================================
|
|
|
|
9.1 INTERFACE UTILISATEUR
|
|
-------------------------
|
|
|
|
Acces : https://127.0.0.1:5000/login
|
|
|
|
1. Connexion
|
|
- Entrer nom d'utilisateur et mot de passe
|
|
- Cliquer sur "Se connecter"
|
|
|
|
2. Premier usage
|
|
- Le chatbot demande prenom, nom, age
|
|
- Repondre aux questions de profil
|
|
|
|
3. Questionnaire PHQ-9
|
|
- Propose periodiquement (tous les 7 jours)
|
|
- Repondre "Oui" pour participer, "Non" pour refuser
|
|
- Selectionner les reponses pour chaque question
|
|
|
|
4. Conversation
|
|
- Taper un message dans la zone de texte
|
|
- Ou utiliser le microphone pour parler
|
|
- Le chatbot repond par texte et audio
|
|
|
|
9.2 INTERFACE MEDECIN
|
|
---------------------
|
|
|
|
Les utilisateurs de type "doctor" ont acces a :
|
|
- Liste des patients
|
|
- Historique des conversations
|
|
- Scores PHQ-9 avec evolution
|
|
- Generation de resumes
|
|
|
|
9.3 COMMANDES CLI
|
|
-----------------
|
|
|
|
Gestion des utilisateurs (user_management_cli.py) :
|
|
|
|
# Creer un utilisateur
|
|
python user_management_cli.py create --username jean --type user
|
|
|
|
# Creer un medecin
|
|
python user_management_cli.py create --username dr_martin --type doctor
|
|
|
|
# Lister les utilisateurs
|
|
python user_management_cli.py list
|
|
|
|
# Modifier le type d'un utilisateur
|
|
python user_management_cli.py update --username jean --type doctor
|
|
|
|
# Supprimer un utilisateur
|
|
python user_management_cli.py delete --username jean
|
|
|
|
Chatbot en ligne de commande (cli_chatbot.py) :
|
|
|
|
python cli_chatbot.py --username jean
|
|
|
|
================================================================================
|
|
10. PERFORMANCES ET OPTIMISATION
|
|
================================================================================
|
|
|
|
10.1 METRIQUES ACTUELLES
|
|
------------------------
|
|
|
|
Temps de reponse estime (configuration actuelle) :
|
|
+------------------------+----------+--------+
|
|
| Composant | Temps | % |
|
|
+------------------------+----------+--------+
|
|
| Inference LLM | 1500 ms | 85% |
|
|
| RAG retrieval | 100 ms | 6% |
|
|
| Overhead Python | 50 ms | 3% |
|
|
| DB queries | 10 ms | 0.6% |
|
|
| Web/routing | 5 ms | 0.3% |
|
|
+------------------------+----------+--------+
|
|
| TOTAL | ~1665 ms | 100% |
|
|
+------------------------+----------+--------+
|
|
|
|
10.2 RECOMMANDATIONS vLLM
|
|
-------------------------
|
|
|
|
vLLM est un moteur d'inference haute performance qui pourrait reduire
|
|
significativement la latence. Il est DEJA INSTALLE (dependance Auralis).
|
|
|
|
Gains attendus avec vLLM :
|
|
+---------------------------+-------------------+-------------------+
|
|
| Metrique | Actuel (HF) | vLLM |
|
|
+---------------------------+-------------------+-------------------+
|
|
| Throughput (tokens/s) | 30-50 | 100-200 |
|
|
| Latence 1ere reponse | 1000-2000 ms | 200-500 ms |
|
|
| Memoire GPU | 4-6 GB | 3-4 GB |
|
|
| Utilisateurs simultanes | 1-2 | 5-10+ |
|
|
+---------------------------+-------------------+-------------------+
|
|
|
|
Implementation suggere :
|
|
|
|
from vllm import LLM, SamplingParams
|
|
|
|
vllm_model = LLM(
|
|
model="./model/kazeia",
|
|
trust_remote_code=True,
|
|
dtype="float16",
|
|
gpu_memory_utilization=0.8
|
|
)
|
|
|
|
sampling_params = SamplingParams(
|
|
temperature=0.7,
|
|
top_p=0.8,
|
|
max_tokens=300,
|
|
repetition_penalty=1.2
|
|
)
|
|
|
|
Effort d'integration : 2-3 heures
|
|
Gain de performance : ~68% reduction de latence
|
|
|
|
10.3 BONNES PRATIQUES
|
|
---------------------
|
|
|
|
[ ] Utiliser vLLM pour l'inference LLM
|
|
[ ] Implementer un cache Redis pour les embeddings frequents
|
|
[ ] Quantizer le modele en INT8 pour economiser la memoire
|
|
[ ] Utiliser FastAPI au lieu de Flask pour l'async natif
|
|
[ ] Configurer Celery pour les taches longues (TTS, resume)
|
|
|
|
================================================================================
|
|
11. MAINTENANCE ET EVOLUTION
|
|
================================================================================
|
|
|
|
11.1 LOGS ET MONITORING
|
|
-----------------------
|
|
|
|
Fichiers de log :
|
|
- conversation_log.txt : Log principal (~700 Ko)
|
|
- Format : timestamp - level - module - message
|
|
|
|
Niveaux de log :
|
|
- DEBUG : Details techniques
|
|
- INFO : Operations normales
|
|
- WARNING : Problemes non-bloquants
|
|
- ERROR : Erreurs necessitant attention
|
|
|
|
11.2 SAUVEGARDE
|
|
---------------
|
|
|
|
Elements a sauvegarder :
|
|
- ./database/chatbot_users.db (base SQLite)
|
|
- ./chroma_db/ (base vectorielle)
|
|
- ./model/ (modeles pre-entraines)
|
|
- ./auralis/ (echantillons vocaux)
|
|
- config.py (configuration)
|
|
|
|
Script de sauvegarde suggere :
|
|
#!/bin/bash
|
|
DATE=$(date +%Y%m%d)
|
|
tar -czvf kazeia_backup_$DATE.tar.gz \
|
|
database/ chroma_db/ config.py auralis/
|
|
|
|
11.3 ROADMAP
|
|
------------
|
|
|
|
COURT TERME (1-2 semaines) :
|
|
[ ] Integrer vLLM
|
|
[ ] Ajouter tests automatises (pytest)
|
|
[ ] Implementer rate limiting
|
|
[ ] Refactoriser web_interface.py
|
|
|
|
MOYEN TERME (1-2 mois) :
|
|
[ ] Migrer vers FastAPI
|
|
[ ] Ajouter cache Redis
|
|
[ ] Implementer CI/CD
|
|
[ ] Migrer vers PostgreSQL
|
|
|
|
LONG TERME (3-6 mois) :
|
|
[ ] Ajouter questionnaires GAD-7, AUDIT-C
|
|
[ ] Support multi-langues
|
|
[ ] Application mobile (PWA)
|
|
[ ] Dashboard analytics
|
|
|
|
================================================================================
|
|
ANNEXES
|
|
================================================================================
|
|
|
|
A. DEPENDANCES (requirements.txt)
|
|
---------------------------------
|
|
auralis>=0.2.8.post2
|
|
werkzeug>=3.1.3
|
|
flask>=3.1.1
|
|
openai-whisper>=20240930
|
|
chromadb>=1.0.12
|
|
sentence_transformers>=4.1.0
|
|
pyOpenSSL>=25.1.0
|
|
accelerate>=1.8.1
|
|
bitsandbytes>=0.46.0
|
|
pymupdf>=1.26.3
|
|
|
|
B. CONTACTS ET SUPPORT
|
|
----------------------
|
|
Developpeurs : Damien Micottis et Richard Loyer
|
|
Institution : Master UTBM 2024/2025
|
|
|
|
C. LICENCE
|
|
----------
|
|
[A definir par les auteurs]
|
|
|
|
================================================================================
|
|
FIN DU DOCUMENT
|
|
================================================================================
|