Hakim18 commited on
Commit
11133f2
·
verified ·
1 Parent(s): 7784297

Upload 10 files

Browse files
Dockerfile ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM python:3.10-slim
2
+
3
+ # Évite les problèmes d'affichage logs
4
+ ENV PYTHONUNBUFFERED=1
5
+
6
+ # Installer dépendances système (important pour torch & pandas)
7
+ RUN apt-get update && apt-get install -y \
8
+ git \
9
+ build-essential \
10
+ && rm -rf /var/lib/apt/lists/*
11
+
12
+ # Dossier de travail
13
+ WORKDIR /app
14
+
15
+ # Copier fichiers
16
+ COPY . /app
17
+
18
+ # Installer dépendances Python
19
+ RUN pip install --no-cache-dir --upgrade pip
20
+ RUN pip install --no-cache-dir -r requirements.txt
21
+
22
+ # Port utilisé par Hugging Face
23
+ EXPOSE 7860
24
+
25
+ # Lancer ton app
26
+ CMD ["python", "app.py"]
app.py ADDED
@@ -0,0 +1,291 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import random
3
+ import torch
4
+ import pandas as pd
5
+ from flask import Flask, render_template, request, jsonify
6
+ from sentence_transformers import SentenceTransformer, util
7
+ import gradio as gr
8
+ import uvicorn
9
+ import nest_asyncio
10
+ from fastapi import FastAPI
11
+ from fastapi.middleware.wsgi import WSGIMiddleware
12
+
13
+ # ==============================
14
+ # CONFIG
15
+ # ==============================
16
+ BASE_DIR = os.path.abspath(os.path.dirname(__file__))
17
+
18
+ CSV_DATA = "dataset_2026.csv"
19
+ EMB_FILE = "embeddings_questions.pt"
20
+ TOP_K_RECOMMANDATIONS = 5
21
+
22
+ # ==============================
23
+ # FLASK APP
24
+ # ==============================
25
+ app = Flask(
26
+ __name__,
27
+ template_folder=os.path.join(BASE_DIR, "templates"),
28
+ static_folder=os.path.join(BASE_DIR, "static")
29
+ )
30
+
31
+ # ==============================
32
+ # MODEL
33
+ # ==============================
34
+ print("🔄 Chargement du modèle...")
35
+
36
+ try:
37
+ model = SentenceTransformer(
38
+ "OrdalieTech/Solon-embeddings-mini-beta-1.1",
39
+ device="cpu",
40
+ trust_remote_code=True
41
+ )
42
+ print("✓ Modèle principal chargé")
43
+ except Exception as e:
44
+ print("⚠️ Modèle principal échoué:", e)
45
+ model = SentenceTransformer(
46
+ "paraphrase-multilingual-MiniLM-L12-v2",
47
+ device="cpu"
48
+ )
49
+ print("✓ Modèle fallback chargé")
50
+
51
+ # ==============================
52
+ # GLOBAL CACHE (IMPORTANT FIX)
53
+ # ==============================
54
+ df = None
55
+ embeddings = None
56
+
57
+
58
+ # ==============================
59
+ # DATA LOADING (ROBUST FIX)
60
+ # ==============================
61
+ def load_data():
62
+ global df
63
+
64
+ try:
65
+ # auto-detect separator (FIX IMPORTANT)
66
+ df = pd.read_csv(CSV_DATA, sep=None, engine="python")
67
+
68
+ # normalize column names (VERY IMPORTANT FIX)
69
+ df.columns = df.columns.str.strip()
70
+
71
+ print(f"✓ Données chargées: {len(df)} lignes")
72
+ print("📌 Colonnes:", df.columns.tolist())
73
+
74
+ return df
75
+
76
+ except FileNotFoundError:
77
+ print("❌ Dataset introuvable → création...")
78
+
79
+ df = pd.DataFrame({
80
+ "Question": ["Bonjour", "Comment ça va?", "Qu'est-ce que c'est?"],
81
+ "Response": [
82
+ "Bonjour! Comment puis-je vous aider?",
83
+ "Je vais bien, merci!",
84
+ "C'est une application Q/A"
85
+ ],
86
+ "Intent": ["salutation", "conversation", "information"]
87
+ })
88
+
89
+ df.to_csv(CSV_DATA, index=False)
90
+ return df
91
+
92
+
93
+ # ==============================
94
+ # EMBEDDINGS (CACHE FIX)
95
+ # ==============================
96
+ def load_embeddings():
97
+ global embeddings, df
98
+
99
+ if embeddings is not None:
100
+ return embeddings
101
+
102
+ if os.path.exists(EMB_FILE):
103
+ print("📂 Chargement embeddings...")
104
+ embeddings = torch.load(EMB_FILE, map_location="cpu")
105
+ return embeddings
106
+
107
+ print("🔨 Création embeddings...")
108
+
109
+ questions = df["Question"].astype(str).tolist()
110
+
111
+ embeddings = model.encode(
112
+ questions,
113
+ convert_to_tensor=True,
114
+ normalize_embeddings=True,
115
+ show_progress_bar=True
116
+ )
117
+
118
+ torch.save(embeddings, EMB_FILE)
119
+ print("✓ Embeddings sauvegardés")
120
+
121
+ return embeddings
122
+
123
+
124
+ # ==============================
125
+ # UTILS
126
+ # ==============================
127
+ def enrich_message(text):
128
+ prefixes = [
129
+ "Bonne question 🙂",
130
+ "Voici la réponse :",
131
+ "Intéressant !",
132
+ "D'après mes données :",
133
+ "Réponse :",
134
+ "🤖"
135
+ ]
136
+ return f"{random.choice(prefixes)} {text}"
137
+
138
+
139
+ def get_column(df, name):
140
+ """
141
+ SAFE column getter (fixes Intent/intent/spacing issues)
142
+ """
143
+ for col in df.columns:
144
+ if col.lower() == name.lower():
145
+ return col
146
+ raise KeyError(f"Column '{name}' not found. Available: {df.columns.tolist()}")
147
+
148
+
149
+ # ==============================
150
+ # CORE LOGIC (FIXED)
151
+ # ==============================
152
+ def process_question(question):
153
+ global df, embeddings
154
+
155
+ if not question or not question.strip():
156
+ return {
157
+ "response": "Veuillez poser une question valide.",
158
+ "confidence": 0,
159
+ "matched": "—",
160
+ "intent": "Invalid",
161
+ "recs": []
162
+ }
163
+
164
+ try:
165
+ df = load_data()
166
+ embeddings = load_embeddings()
167
+
168
+ q_col = get_column(df, "Question")
169
+ r_col = get_column(df, "Response")
170
+ i_col = get_column(df, "Intent")
171
+
172
+ emb_q = model.encode(
173
+ question,
174
+ convert_to_tensor=True,
175
+ normalize_embeddings=True
176
+ )
177
+
178
+ scores = util.pytorch_cos_sim(emb_q, embeddings)[0]
179
+
180
+ best_idx = torch.argmax(scores).item()
181
+ confidence = int(scores[best_idx].item() * 100)
182
+
183
+ # LOW CONFIDENCE
184
+ if confidence < 40:
185
+ return {
186
+ "response": "Désolé, je n'ai pas trouvé de réponse.",
187
+ "confidence": confidence,
188
+ "matched": "—",
189
+ "intent": "Not found",
190
+ "recs": []
191
+ }
192
+
193
+ # MEDIUM CONFIDENCE (suggestions)
194
+ if confidence < 80:
195
+ k = min(TOP_K_RECOMMANDATIONS + 1, len(scores))
196
+ top_indices = torch.topk(scores, k).indices.tolist()
197
+
198
+ recs = [
199
+ df[q_col].iloc[i]
200
+ for i in top_indices
201
+ if i != best_idx
202
+ ][:TOP_K_RECOMMANDATIONS]
203
+
204
+ return {
205
+ "response": "Je ne suis pas sûr. Voulez-vous dire :",
206
+ "confidence": confidence,
207
+ "matched": df[q_col].iloc[best_idx],
208
+ "intent": df[i_col].iloc[best_idx],
209
+ "recs": recs
210
+ }
211
+
212
+ # HIGH CONFIDENCE (final answer)
213
+ answer = df[r_col].iloc[best_idx]
214
+ intent = df[i_col].iloc[best_idx]
215
+
216
+ return {
217
+ "response": enrich_message(answer),
218
+ "confidence": confidence,
219
+ "matched": df[q_col].iloc[best_idx],
220
+ "intent": intent,
221
+ "recs": []
222
+ }
223
+
224
+ except Exception as e:
225
+ print("❌ Erreur:", e)
226
+ return {
227
+ "response": "Erreur technique.",
228
+ "confidence": 0,
229
+ "matched": "—",
230
+ "intent": "Error",
231
+ "recs": []
232
+ }
233
+
234
+
235
+ # ==============================
236
+ # FLASK ROUTES
237
+ # ==============================
238
+ @app.route("/")
239
+ def index():
240
+ return render_template("index.html")
241
+
242
+
243
+ @app.route("/ask", methods=["POST"])
244
+ def ask():
245
+ try:
246
+ data = request.get_json()
247
+ question = data.get("question", "")
248
+ return jsonify(process_question(question))
249
+ except Exception as e:
250
+ print(e)
251
+ return jsonify({"response": "Erreur serveur"})
252
+
253
+
254
+ # ==============================
255
+ # GRADIO
256
+ # ==============================
257
+ def gradio_chat(message, history):
258
+ return process_question(message)["response"]
259
+
260
+ iface = gr.ChatInterface(
261
+ fn=gradio_chat,
262
+ title="AskLaQ Assistant",
263
+ description="Posez vos questions"
264
+ )
265
+
266
+
267
+ # ==============================
268
+ # FASTAPI WRAPPER
269
+ # ==============================
270
+ fastapi_app = FastAPI(title="AskLaQ API")
271
+
272
+ fastapi_app.mount("/", WSGIMiddleware(app))
273
+ fastapi_app = gr.mount_gradio_app(fastapi_app, iface, path="/chat")
274
+
275
+
276
+ # ==============================
277
+ # MAIN
278
+ # ==============================
279
+ if __name__ == "__main__":
280
+ nest_asyncio.apply()
281
+
282
+ print("=" * 60)
283
+ print("🚀 ASKLAQ SYSTEM (ROBUST VERSION)")
284
+ print("=" * 60)
285
+
286
+ uvicorn.run(
287
+ fastapi_app,
288
+ host="0.0.0.0",
289
+ port=7860,
290
+ log_level="info"
291
+ )
dataset_2026.csv ADDED
@@ -0,0 +1,101 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Processus;Procedure;Intent;SubIntent;Question;Response
2
+ Gestion de compte;Fermeture de compte;fermer_compte;conditions;Comment fermer mon compte bancaire ?;Vous devez envoyer une demande de clôture via votre espace client ou votre agence.
3
+ Crédit;Demande de prêt;demander_pret;conditions;Quels documents sont nécessaires pour un prêt ?;La banque analyse vos revenus et votre capacité de remboursement.
4
+ Paiements;Virement bancaire;faire_virement;delai;Combien de temps prend un virement ?;Vous pouvez effectuer un virement depuis votre application bancaire.
5
+ Gestion de compte;Fermeture de compte;fermer_compte;conditions;Comment fermer mon compte bancaire ?;Vous devez envoyer une demande de clôture via votre espace client ou votre agence.
6
+ Crédit;Demande de prêt;demander_pret;documents;Quels documents sont nécessaires pour un prêt ?;La banque analyse vos revenus et votre capacité de remboursement.
7
+ Cartes bancaires;Demande de carte;demander_carte;procedure;Comment demander une carte bancaire ?;Vous pouvez commander une carte bancaire via l’application ou en agence.
8
+ Cartes bancaires;Demande de carte;demander_carte;delai;Quel est le délai pour recevoir une carte bancaire ?;Vous pouvez commander une carte bancaire via l’application ou en agence.
9
+ Cartes bancaires;Blocage de carte;bloquer_carte;urgence;Comment remplacer une carte bloquée ?;Après le blocage vous pouvez demander une nouvelle carte.
10
+ Gestion de compte;Ouverture de compte;ouvrir_compte;delai;Quels documents faut-il pour créer un compte ?;Les conditions incluent une pièce d’identité valide et un justificatif de domicile.
11
+ Paiements;Virement bancaire;faire_virement;delai;Comment transférer de l’argent vers un autre compte ?;Les virements nationaux prennent généralement 24 heures.
12
+ Crédit;Demande de prêt;demander_pret;documents;Quels documents sont nécessaires pour un prêt ?;Les documents incluent une pièce d’identité et des justificatifs de revenus.
13
+ Crédit;Demande de prêt;demander_pret;documents;Quels documents sont nécessaires pour un prêt ?;La banque analyse vos revenus et votre capacité de remboursement.
14
+ Crédit;Demande de prêt;demander_pret;conditions;Quels documents sont nécessaires pour un prêt ?;La banque analyse vos revenus et votre capacité de remboursement.
15
+ Support client;Contacter la banque;contacter_support;telephone;Comment parler à un conseiller bancaire ?;Les coordonnées du support sont disponibles sur le site officiel de la banque.
16
+ Crédit;Demande de prêt;demander_pret;documents;Quels documents sont nécessaires pour un prêt ?;La banque analyse vos revenus et votre capacité de remboursement.
17
+ Crédit;Demande de prêt;demander_pret;documents;Comment obtenir un prêt bancaire ?;La banque analyse vos revenus et votre capacité de remboursement.
18
+ Paiements;Virement bancaire;faire_virement;delai;Comment faire un virement bancaire ?;Vous pouvez effectuer un virement depuis votre application bancaire.
19
+ Paiements;Virement bancaire;faire_virement;delai;Combien de temps prend un virement ?;Vous pouvez effectuer un virement depuis votre application bancaire.
20
+ Paiements;Virement bancaire;faire_virement;delai;Combien de temps prend un virement ?;Les virements nationaux prennent généralement 24 heures.
21
+ Paiements;Virement bancaire;faire_virement;delai;Comment transférer de l’argent vers un autre compte ?;Vous pouvez effectuer un virement depuis votre application bancaire.
22
+ Support client;Contacter la banque;contacter_support;agence;Comment parler à un conseiller bancaire ?;Vous pouvez contacter le service client par téléphone chat ou en agence.
23
+ Crédit;Demande de prêt;demander_pret;conditions;Comment obtenir un prêt bancaire ?;Les documents incluent une pièce d’identité et des justificatifs de revenus.
24
+ Support client;Contacter la banque;contacter_support;telephone;Comment contacter le service client ?;Les coordonnées du support sont disponibles sur le site officiel de la banque.
25
+ Crédit;Demande de prêt;demander_pret;conditions;Quelles sont les conditions pour un prêt ?;La banque analyse vos revenus et votre capacité de remboursement.
26
+ Gestion de compte;Fermeture de compte;fermer_compte;procedure;Combien de temps prend la fermeture d’un compte ?;Vous devez envoyer une demande de clôture via votre espace client ou votre agence.
27
+ Cartes bancaires;Blocage de carte;bloquer_carte;remplacement;Comment remplacer une carte bloquée ?;Vous pouvez bloquer votre carte immédiatement depuis l’application bancaire.
28
+ Paiements;Virement bancaire;faire_virement;procedure;Combien de temps prend un virement ?;Les virements nationaux prennent généralement 24 heures.
29
+ Support client;Contacter la banque;contacter_support;telephone;Comment contacter le service client ?;Les coordonnées du support sont disponibles sur le site officiel de la banque.
30
+ Crédit;Demande de prêt;demander_pret;conditions;Comment obtenir un prêt bancaire ?;La banque analyse vos revenus et votre capacité de remboursement.
31
+ Gestion de compte;Ouverture de compte;ouvrir_compte;conditions;Comment ouvrir un compte bancaire ?;L’ouverture du compte prend généralement entre 24 et 48 heures après validation des documents.
32
+ Support client;Contacter la banque;contacter_support;telephone;Quel est le numéro du service client ?;Les coordonnées du support sont disponibles sur le site officiel de la banque.
33
+ Paiements;Virement bancaire;faire_virement;delai;Comment transférer de l’argent vers un autre compte ?;Vous pouvez effectuer un virement depuis votre application bancaire.
34
+ Crédit;Demande de prêt;demander_pret;documents;Quelles sont les conditions pour un prêt ?;Les documents incluent une pièce d’identité et des justificatifs de revenus.
35
+ Paiements;Virement bancaire;faire_virement;delai;Comment transférer de l’argent vers un autre compte ?;Vous pouvez effectuer un virement depuis votre application bancaire.
36
+ Support client;Contacter la banque;contacter_support;agence;Quel est le numéro du service client ?;Les coordonnées du support sont disponibles sur le site officiel de la banque.
37
+ Cartes bancaires;Demande de carte;demander_carte;delai;Comment demander une carte bancaire ?;Vous pouvez commander une carte bancaire via l’application ou en agence.
38
+ Crédit;Demande de prêt;demander_pret;conditions;Comment obtenir un prêt bancaire ?;La banque analyse vos revenus et votre capacité de remboursement.
39
+ Gestion de compte;Fermeture de compte;fermer_compte;procedure;Puis-je fermer mon compte en ligne ?;Vous devez envoyer une demande de clôture via votre espace client ou votre agence.
40
+ Crédit;Demande de prêt;demander_pret;documents;Comment obtenir un prêt bancaire ?;La banque analyse vos revenus et votre capacité de remboursement.
41
+ Cartes bancaires;Blocage de carte;bloquer_carte;urgence;Comment remplacer une carte bloquée ?;Après le blocage vous pouvez demander une nouvelle carte.
42
+ Support client;Contacter la banque;contacter_support;telephone;Comment contacter le service client ?;Vous pouvez contacter le service client par téléphone chat ou en agence.
43
+ Support client;Contacter la banque;contacter_support;agence;Comment contacter le service client ?;Vous pouvez contacter le service client par téléphone chat ou en agence.
44
+ Gestion de compte;Fermeture de compte;fermer_compte;procedure;Puis-je fermer mon compte en ligne ?;Vous devez envoyer une demande de clôture via votre espace client ou votre agence.
45
+ Paiements;Virement bancaire;faire_virement;delai;Comment transférer de l’argent vers un autre compte ?;Vous pouvez effectuer un virement depuis votre application bancaire.
46
+ Cartes bancaires;Demande de carte;demander_carte;procedure;Comment demander une carte bancaire ?;Vous pouvez commander une carte bancaire via l’application ou en agence.
47
+ Paiements;Virement bancaire;faire_virement;delai;Comment transférer de l’argent vers un autre compte ?;Les virements nationaux prennent généralement 24 heures.
48
+ Paiements;Virement bancaire;faire_virement;delai;Comment faire un virement bancaire ?;Vous pouvez effectuer un virement depuis votre application bancaire.
49
+ Paiements;Virement bancaire;faire_virement;delai;Combien de temps prend un virement ?;Les virements nationaux prennent généralement 24 heures.
50
+ Support client;Contacter la banque;contacter_support;telephone;Comment parler à un conseiller bancaire ?;Les coordonnées du support sont disponibles sur le site officiel de la banque.
51
+ Paiements;Virement bancaire;faire_virement;procedure;Comment faire un virement bancaire ?;Vous pouvez effectuer un virement depuis votre application bancaire.
52
+ Gestion de compte;Fermeture de compte;fermer_compte;procedure;Puis-je fermer mon compte en ligne ?;Vous devez envoyer une demande de clôture via votre espace client ou votre agence.
53
+ Gestion de compte;Fermeture de compte;fermer_compte;procedure;Combien de temps prend la fermeture d’un compte ?;Vous devez envoyer une demande de clôture via votre espace client ou votre agence.
54
+ Crédit;Demande de prêt;demander_pret;documents;Quels documents sont nécessaires pour un prêt ?;Les documents incluent une pièce d’identité et des justificatifs de revenus.
55
+ Support client;Contacter la banque;contacter_support;agence;Comment parler à un conseiller bancaire ?;Vous pouvez contacter le service client par téléphone chat ou en agence.
56
+ Support client;Contacter la banque;contacter_support;telephone;Comment parler à un conseiller bancaire ?;Vous pouvez contacter le service client par téléphone chat ou en agence.
57
+ Crédit;Demande de prêt;demander_pret;conditions;Comment obtenir un prêt bancaire ?;La banque analyse vos revenus et votre capacité de remboursement.
58
+ Paiements;Virement bancaire;faire_virement;procedure;Comment faire un virement bancaire ?;Les virements nationaux prennent généralement 24 heures.
59
+ Paiements;Virement bancaire;faire_virement;delai;Comment transférer de l’argent vers un autre compte ?;Vous pouvez effectuer un virement depuis votre application bancaire.
60
+ Paiements;Virement bancaire;faire_virement;delai;Comment faire un virement bancaire ?;Les virements nationaux prennent généralement 24 heures.
61
+ Paiements;Virement bancaire;faire_virement;delai;Comment transférer de l’argent vers un autre compte ?;Vous pouvez effectuer un virement depuis votre application bancaire.
62
+ Crédit;Demande de prêt;demander_pret;documents;Comment obtenir un prêt bancaire ?;Les documents incluent une pièce d’identité et des justificatifs de revenus.
63
+ Cartes bancaires;Demande de carte;demander_carte;procedure;Comment demander une carte bancaire ?;Vous pouvez commander une carte bancaire via l’application ou en agence.
64
+ Cartes bancaires;Demande de carte;demander_carte;procedure;Comment demander une carte bancaire ?;La carte bancaire est généralement livrée sous 5 à 7 jours ouvrables.
65
+ Support client;Contacter la banque;contacter_support;telephone;Comment contacter le service client ?;Vous pouvez contacter le service client par téléphone chat ou en agence.
66
+ Support client;Contacter la banque;contacter_support;agence;Comment parler à un conseiller bancaire ?;Vous pouvez contacter le service client par téléphone chat ou en agence.
67
+ Gestion de compte;Fermeture de compte;fermer_compte;procedure;Comment fermer mon compte bancaire ?;Vous devez envoyer une demande de clôture via votre espace client ou votre agence.
68
+ Paiements;Virement bancaire;faire_virement;procedure;Combien de temps prend un virement ?;Les virements nationaux prennent généralement 24 heures.
69
+ Support client;Contacter la banque;contacter_support;agence;Comment parler à un conseiller bancaire ?;Les coordonnées du support sont disponibles sur le site officiel de la banque.
70
+ Gestion de compte;Fermeture de compte;fermer_compte;conditions;Combien de temps prend la fermeture d’un compte ?;Vous devez envoyer une demande de clôture via votre espace client ou votre agence.
71
+ Cartes bancaires;Blocage de carte;bloquer_carte;urgence;J’ai perdu ma carte que dois-je faire ?;Après le blocage vous pouvez demander une nouvelle carte.
72
+ Cartes bancaires;Demande de carte;demander_carte;procedure;Comment obtenir une nouvelle carte ?;Vous pouvez commander une carte bancaire via l’application ou en agence.
73
+ Paiements;Virement bancaire;faire_virement;delai;Combien de temps prend un virement ?;Vous pouvez effectuer un virement depuis votre application bancaire.
74
+ Support client;Contacter la banque;contacter_support;telephone;Comment parler à un conseiller bancaire ?;Les coordonnées du support sont disponibles sur le site officiel de la banque.
75
+ Cartes bancaires;Blocage de carte;bloquer_carte;remplacement;J’ai perdu ma carte que dois-je faire ?;Vous pouvez bloquer votre carte immédiatement depuis l’application bancaire.
76
+ Cartes bancaires;Blocage de carte;bloquer_carte;remplacement;Comment remplacer une carte bloquée ?;Vous pouvez bloquer votre carte immédiatement depuis l’application bancaire.
77
+ Support client;Contacter la banque;contacter_support;telephone;Comment contacter le service client ?;Vous pouvez contacter le service client par téléphone chat ou en agence.
78
+ Crédit;Demande de prêt;demander_pret;conditions;Quels documents sont nécessaires pour un prêt ?;Les documents incluent une pièce d’identité et des justificatifs de revenus.
79
+ Support client;Contacter la banque;contacter_support;agence;Quel est le numéro du service client ?;Vous pouvez contacter le service client par téléphone chat ou en agence.
80
+ Cartes bancaires;Demande de carte;demander_carte;procedure;Comment obtenir une nouvelle carte ?;Vous pouvez commander une carte bancaire via l’application ou en agence.
81
+ Crédit;Demande de prêt;demander_pret;conditions;Quels documents sont nécessaires pour un prêt ?;La banque analyse vos revenus et votre capacité de remboursement.
82
+ Support client;Contacter la banque;contacter_support;agence;Quel est le numéro du service client ?;Les coordonnées du support sont disponibles sur le site officiel de la banque.
83
+ Gestion de compte;Fermeture de compte;fermer_compte;conditions;Quelle est la procédure pour clôturer un compte ?;La fermeture du compte est possible après règlement du solde restant.
84
+ Crédit;Demande de prêt;demander_pret;conditions;Quelles sont les conditions pour un prêt ?;La banque analyse vos revenus et votre capacité de remboursement.
85
+ Paiements;Virement bancaire;faire_virement;procedure;Combien de temps prend un virement ?;Vous pouvez effectuer un virement depuis votre application bancaire.
86
+ Support client;Contacter la banque;contacter_support;agence;Quel est le numéro du service client ?;Les coordonnées du support sont disponibles sur le site officiel de la banque.
87
+ Gestion de compte;Fermeture de compte;fermer_compte;procedure;Combien de temps prend la fermeture d’un compte ?;La fermeture du compte est possible après règlement du solde restant.
88
+ Cartes bancaires;Demande de carte;demander_carte;procedure;Comment obtenir une nouvelle carte ?;La carte bancaire est généralement livrée sous 5 à 7 jours ouvrables.
89
+ Support client;Contacter la banque;contacter_support;agence;Comment contacter le service client ?;Les coordonnées du support sont disponibles sur le site officiel de la banque.
90
+ Gestion de compte;Fermeture de compte;fermer_compte;procedure;Quelle est la procédure pour clôturer un compte ?;Vous devez envoyer une demande de clôture via votre espace client ou votre agence.
91
+ Gestion de compte;Ouverture de compte;ouvrir_compte;delai;Comment ouvrir un compte bancaire ?;L’ouverture du compte prend généralement entre 24 et 48 heures après validation des documents.
92
+ Support client;Contacter la banque;contacter_support;agence;Comment contacter le service client ?;Les coordonnées du support sont disponibles sur le site officiel de la banque.
93
+ Gestion de compte;Ouverture de compte;ouvrir_compte;conditions;Quelles sont les conditions pour ouvrir un compte ?;Vous pouvez ouvrir un compte en ligne ou en agence avec une pièce d’identité et un justificatif de domicile.
94
+ Paiements;Virement bancaire;faire_virement;delai;Comment faire un virement bancaire ?;Les virements nationaux prennent généralement 24 heures.
95
+ Crédit;Demande de prêt;demander_pret;conditions;Comment obtenir un prêt bancaire ?;Les documents incluent une pièce d’identité et des justificatifs de revenus.
96
+ Paiements;Virement bancaire;faire_virement;procedure;Comment faire un virement bancaire ?;Vous pouvez effectuer un virement depuis votre application bancaire.
97
+ Gestion de compte;Ouverture de compte;ouvrir_compte;conditions;Quelles sont les conditions pour ouvrir un compte ?;Vous pouvez ouvrir un compte en ligne ou en agence avec une pièce d’identité et un justificatif de domicile.
98
+ Crédit;Demande de prêt;demander_pret;conditions;Quels documents sont nécessaires pour un prêt ?;La banque analyse vos revenus et votre capacité de remboursement.
99
+ Crédit;Demande de prêt;demander_pret;conditions;Comment obtenir un prêt bancaire ?;La banque analyse vos revenus et votre capacité de remboursement.
100
+ Support client;Contacter la banque;contacter_support;agence;Comment contacter le service client ?;Les coordonnées du support sont disponibles sur le site officiel de la banque.
101
+ Crédit;Demande de prêt;demander_pret;conditions;Quels documents sont nécessaires pour un prêt ?;Les documents incluent une pièce d’identité et des justificatifs de revenus.
embeddings.py ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import torch
2
+ import pandas as pd
3
+ from sentence_transformers import SentenceTransformer
4
+
5
+ # ملفات
6
+ CSV_DATA = "dataset_2026.csv"
7
+ EMB_FILE = "embeddings_questions.pt"
8
+
9
+ # ✅ موديل مستقر يدعم العربية/الفرنسية/الإنجليزية
10
+ model = SentenceTransformer("paraphrase-multilingual-MiniLM-L12-v2")
11
+
12
+ print("📥 Chargement du dataset...")
13
+
14
+ # ✅ مهم: sep=";" لأن ملفك مفصول بـ ;
15
+ df = pd.read_csv(CSV_DATA, encoding="utf-8", sep=";", on_bad_lines="skip")
16
+
17
+ # 🔍 عرض الأعمدة للتأكد
18
+ print("📊 Colonnes détectées :", df.columns)
19
+
20
+ # ✅ التحقق من وجود العمود
21
+ if "Question" not in df.columns:
22
+ raise ValueError(f"❌ Column 'Question' not found. Found: {df.columns}")
23
+
24
+ # ✅ استخراج الأسئلة
25
+ questions = df["Question"].astype(str).tolist()
26
+
27
+ print(f"✅ {len(questions)} questions chargées")
28
+
29
+ print("🧠 Calcul des embeddings...")
30
+
31
+ # ✅ batching لتفادي مشاكل الذاكرة وتسريع العملية
32
+ embeddings = model.encode(
33
+ questions,
34
+ batch_size=32, # تقدر تنقصها إذا كان RAM ضعيف
35
+ show_progress_bar=True,
36
+ convert_to_tensor=True,
37
+ normalize_embeddings=True
38
+ )
39
+
40
+ print("💾 Sauvegarde des embeddings...")
41
+
42
+ # ✅ حفظ embeddings
43
+ torch.save(embeddings, EMB_FILE)
44
+
45
+ print("✅ Terminé :", embeddings.shape)
embeddings_questions.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:ce91c386a741f49431ca47fcf9f7c2009dae8c8c15d9d48474d5be1e7a9fb105
3
+ size 155268
requirements.txt ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ flask
2
+ torch
3
+ pandas
4
+ sentence-transformers
5
+ gradio
6
+ fastapi
7
+ uvicorn
8
+ a2wsgi
9
+ nest_asyncio
static/script.js ADDED
@@ -0,0 +1,99 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ console.log('✅ script.js chargé');
2
+
3
+ document.addEventListener('DOMContentLoaded', () => {
4
+ const btn = document.getElementById('sendBtn');
5
+ const input = document.getElementById('question');
6
+ const chat = document.getElementById('chat');
7
+ const intentLbl = document.getElementById('intent');
8
+ const matchedLbl = document.getElementById('matched');
9
+ const confFill = document.getElementById('conf-fill');
10
+ const stars = document.querySelectorAll('.star');
11
+ const surveyLink = document.getElementById('survey-link');
12
+
13
+ let isLoading = false;
14
+
15
+ async function sendQuestion(q) {
16
+ const question = q.trim();
17
+ if (!question || isLoading) return;
18
+
19
+ chat.innerHTML += `<div class="user-msg"><b>Vous :</b> ${question}</div>`;
20
+ input.value = '';
21
+ input.focus();
22
+
23
+ stars.forEach(s => { s.textContent = "☆"; s.style.pointerEvents = 'auto'; });
24
+
25
+ const loaderDiv = document.createElement('div');
26
+ loaderDiv.className = 'bot-msg';
27
+ loaderDiv.innerHTML = '<i>💭 Bot réfléchit…</i>';
28
+ chat.appendChild(loaderDiv);
29
+ chat.scrollTop = chat.scrollHeight;
30
+
31
+ isLoading = true;
32
+
33
+ try {
34
+ const res = await fetch('/ask', {
35
+ method: 'POST',
36
+ headers: { 'Content-Type': 'application/json' },
37
+ body: JSON.stringify({ question })
38
+ });
39
+
40
+ const data = await res.json();
41
+ loaderDiv.remove();
42
+
43
+ chat.innerHTML += `<div class="bot-msg"><b>Bot :</b> ${data.response}</div>`;
44
+
45
+ if (data.recs && data.recs.length > 0) {
46
+ const suggDiv = document.createElement('div');
47
+ suggDiv.className = 'recs';
48
+
49
+ data.recs.forEach(r => {
50
+ const a = document.createElement('a');
51
+ a.textContent = r;
52
+ suggDiv.appendChild(a);
53
+ });
54
+
55
+ chat.appendChild(suggDiv);
56
+ }
57
+
58
+ intentLbl.textContent = data.intent;
59
+ matchedLbl.textContent = data.matched;
60
+ confFill.style.width = data.confidence + "%";
61
+ confFill.textContent = data.confidence + "%";
62
+
63
+ confFill.style.background =
64
+ data.confidence < 40 ? "#E53935" :
65
+ data.confidence < 80 ? "#FB8C00" : "#43A047";
66
+
67
+ } catch (err) {
68
+ loaderDiv.remove();
69
+ chat.innerHTML += '<div class="bot-msg"><b>Erreur :</b> Impossible de contacter le serveur.</div>';
70
+ console.error(err);
71
+ }
72
+
73
+ chat.scrollTop = chat.scrollHeight;
74
+ isLoading = false;
75
+ }
76
+
77
+ btn.addEventListener('click', () => sendQuestion(input.value));
78
+ input.addEventListener('keypress', e => { if (e.key === 'Enter') sendQuestion(input.value); });
79
+
80
+ // Étoiles de satisfaction + affichage questionnaire
81
+ stars.forEach(s => {
82
+ s.addEventListener('click', () => {
83
+ const val = parseInt(s.dataset.value);
84
+ stars.forEach((st, i) => {
85
+ st.textContent = i < val ? "★" : "☆";
86
+ st.style.pointerEvents = 'none';
87
+ });
88
+
89
+ chat.innerHTML += `<div><i>⭐ Merci pour votre évaluation : ${val} / 5</i></div>`;
90
+ surveyLink.style.display = 'block';
91
+ });
92
+ });
93
+
94
+ chat.addEventListener('click', (e) => {
95
+ if (e.target.tagName === 'A' && e.target.parentElement.classList.contains('recs')) {
96
+ sendQuestion(e.target.textContent);
97
+ }
98
+ });
99
+ });
static/script1.js ADDED
@@ -0,0 +1,129 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ console.log('✅ script.js chargé');
2
+
3
+ document.addEventListener('DOMContentLoaded', () => {
4
+ const btn = document.getElementById('sendBtn');
5
+ const input = document.getElementById('question');
6
+ const chat = document.getElementById('chat');
7
+ const intentLbl = document.getElementById('intent');
8
+ const matchedLbl = document.getElementById('matched');
9
+ const confFill = document.getElementById('conf-fill');
10
+ const stars = document.querySelectorAll('.star');
11
+
12
+ let currentInteraction = null;
13
+ let isLoading = false;
14
+
15
+ // Fonction principale pour envoyer une question
16
+ async function sendQuestion(q) {
17
+ const question = q.trim();
18
+ if (!question || isLoading) return;
19
+
20
+ // Affichage de la question utilisateur
21
+ chat.innerHTML += `<div class="user-msg"><b>Vous :</b> ${question}</div>`;
22
+ input.value = '';
23
+ input.focus();
24
+
25
+ // Réinitialiser les étoiles
26
+ stars.forEach(s => { s.textContent="☆"; s.style.pointerEvents='auto'; });
27
+
28
+ // Afficher loader
29
+ const loaderDiv = document.createElement('div');
30
+ loaderDiv.className = 'bot-msg';
31
+ loaderDiv.innerHTML = '<i>💭 Bot réfléchit…</i>';
32
+ chat.appendChild(loaderDiv);
33
+ chat.scrollTop = chat.scrollHeight;
34
+
35
+ isLoading = true;
36
+
37
+ try {
38
+ const res = await fetch('/ask', {
39
+ method:'POST',
40
+ headers:{'Content-Type':'application/json'},
41
+ body:JSON.stringify({question:question})
42
+ });
43
+ const data = await res.json();
44
+ currentInteraction = data;
45
+
46
+ // Retirer loader
47
+ loaderDiv.remove();
48
+
49
+ // Affichage réponse bot
50
+ chat.innerHTML += `<div class="bot-msg"><b>Bot :</b> ${data.response}</div>`;
51
+
52
+ // Suggestions
53
+ if(data.recs && data.recs.length>0){
54
+ const suggDiv = document.createElement('div');
55
+ suggDiv.className = 'recs';
56
+ suggDiv.style.display = "grid";
57
+ suggDiv.style.gridTemplateRows = "repeat(5, auto)";
58
+ suggDiv.style.gridAutoFlow = "column";
59
+ suggDiv.style.gap = "6px 12px";
60
+ suggDiv.style.marginTop = "4px";
61
+
62
+ data.recs.forEach((r) => {
63
+ const itemDiv = document.createElement('div');
64
+ itemDiv.style.display = "inline-flex";
65
+ itemDiv.style.alignItems = "center";
66
+
67
+ const circle = document.createElement('span');
68
+ circle.style.display = "inline-block";
69
+ circle.style.width = "8px";
70
+ circle.style.height = "8px";
71
+ circle.style.backgroundColor = "black";
72
+ circle.style.borderRadius = "50%";
73
+ circle.style.marginRight = "6px";
74
+ itemDiv.appendChild(circle);
75
+
76
+ const a = document.createElement('a');
77
+ a.textContent = r;
78
+ a.style.cursor = "pointer";
79
+ itemDiv.appendChild(a);
80
+
81
+ suggDiv.appendChild(itemDiv);
82
+ });
83
+
84
+ chat.appendChild(suggDiv);
85
+ }
86
+
87
+ // Mise à jour des informations
88
+ intentLbl.textContent = data.intent;
89
+ matchedLbl.textContent = data.matched;
90
+ confFill.style.width = data.confidence + "%";
91
+ confFill.textContent = data.confidence + "%";
92
+
93
+ let color = "#43A047";
94
+ if(data.confidence < 40) color = "#E53935";
95
+ else if(data.confidence < 80) color = "#FB8C00";
96
+ confFill.style.background = color;
97
+
98
+ } catch(err){
99
+ loaderDiv.remove();
100
+ chat.innerHTML += '<div class="bot-msg"><b>Erreur :</b> Impossible de contacter le serveur.</div>';
101
+ console.error(err);
102
+ }
103
+
104
+ chat.scrollTop = chat.scrollHeight;
105
+ isLoading = false;
106
+ }
107
+
108
+ // Click sur le bouton Envoyer
109
+ btn.addEventListener('click', () => sendQuestion(input.value));
110
+
111
+ // Envoi avec Enter
112
+ input.addEventListener('keypress', e => { if(e.key==='Enter') sendQuestion(input.value); });
113
+
114
+ // Gestion étoiles de satisfaction
115
+ stars.forEach(s => {
116
+ s.addEventListener('click', () => {
117
+ const val = parseInt(s.dataset.value);
118
+ stars.forEach((st, i) => { st.textContent = i<val?"★":"☆"; st.style.pointerEvents='none'; });
119
+ chat.innerHTML += `<div><i>⭐ Merci pour votre évaluation : ${val} / 5</i></div>`;
120
+ });
121
+ });
122
+
123
+ // Event delegation pour les recommandations
124
+ chat.addEventListener('click', (e) => {
125
+ if(e.target.tagName === 'A' && e.target.parentElement.parentElement.classList.contains('recs')){
126
+ sendQuestion(e.target.textContent);
127
+ }
128
+ });
129
+ });
templates/index.html ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="fr">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <title>AskLAQ</title>
6
+
7
+ <style>
8
+ body { font-family: Arial; margin:20px; background:#fafafa; }
9
+ h2 { text-align:center; margin-bottom:20px; }
10
+ #chat { border:1px solid #ccc; background:#fff; padding:12px; border-radius:10px; height:400px; overflow-y:auto; }
11
+ #question { width:70%; padding:10px; border-radius:8px; border:1px solid #ccc; font-size:14px; }
12
+ #sendBtn { padding:10px 16px; font-size:14px; border:none; border-radius:8px; background:#1976D2; color:#fff; cursor:pointer; }
13
+ #sendBtn:hover { background:#1565C0; }
14
+ .user-msg { background:#E3F2FD; padding:10px; border-radius:10px; margin:6px 0; }
15
+ .bot-msg { background:#F1F8E9; padding:10px; border-radius:10px; margin:6px 0; }
16
+ .recs a { color:#1565C0; cursor:pointer; text-decoration:none; display:block; margin-left:12px; }
17
+ .recs a:hover { text-decoration:underline; }
18
+ #info { margin-top:10px; background:#f5f5f5; padding:10px; border-radius:8px; border:1px solid #e0e0e0; }
19
+ #conf-bar { width:100%; height:18px; background:#ddd; border-radius:8px; margin:6px 0; }
20
+ #conf-fill { height:100%; background:#43A047; width:0%; border-radius:8px; text-align:right; padding-right:4px; color:#fff; font-size:12px; line-height:18px; }
21
+ .stars { margin-top:8px; }
22
+ .star { font-size:26px; color:#FFC107; cursor:pointer; margin-right:4px; }
23
+ </style>
24
+ </head>
25
+
26
+ <body>
27
+
28
+ <h2>Assistant d’Analyse Conversationnelle</h2>
29
+
30
+ <div id="chat">
31
+ <div>💬 <b>Bienvenue 👋</b><br>Analyse des relations <i>Pourquoi / Comment</i>.</div>
32
+ </div>
33
+
34
+ <div style="margin-top:12px;">
35
+ <input type="text" id="question" placeholder="Tapez votre question…">
36
+ <button id="sendBtn">🚀 Envoyer</button>
37
+ </div>
38
+
39
+ <!-- Bloc information + satisfaction -->
40
+ <div id="info">
41
+ <p>🧭 Intent : <span id="intent">—</span></p>
42
+ <p>🎯 Question correspondante : <span id="matched">—</span></p>
43
+
44
+ <div id="conf-bar">
45
+ <div id="conf-fill">0%</div>
46
+ </div>
47
+
48
+ <!-- ⭐ Étoiles de satisfaction -->
49
+ <div class="stars">
50
+ <span class="star" data-value="1">☆</span>
51
+ <span class="star" data-value="2">☆</span>
52
+ <span class="star" data-value="3">☆</span>
53
+ <span class="star" data-value="4">☆</span>
54
+ <span class="star" data-value="5">☆</span>
55
+ </div>
56
+
57
+ <!-- 👉 LIEN QUESTIONNAIRE (TOUJOURS VISIBLE) -->
58
+ <div style="margin-top:6px; text-align:left;">
59
+ 👉 <a href="https://forms.gle/9kHtHPrhTpBcFJhJ7"
60
+ target="_blank"
61
+ style="color:#1976D2; font-weight:bold; text-decoration:none;">
62
+ Questionnaire de satisfaction
63
+ </a>
64
+ </div>
65
+ </div>
66
+
67
+ <script src="/static/script.js"></script>
68
+
69
+ </body>
70
+ </html>
templates/index1 (2).html ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="fr">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <title>AskLAQ</title>
6
+ <style>
7
+ body { font-family: Arial; margin:20px; background:#fafafa; }
8
+ h2 { text-align:center; margin-bottom:20px; }
9
+ #chat { border:1px solid #ccc; background:#fff; padding:12px; border-radius:10px; height:400px; overflow-y:auto; }
10
+ #question { width:70%; padding:10px; border-radius:8px; border:1px solid #ccc; font-size:14px; }
11
+ #sendBtn { padding:10px 16px; font-size:14px; border:none; border-radius:8px; background:#1976D2; color:#fff; cursor:pointer; }
12
+ #sendBtn:hover { background:#1565C0; }
13
+ .user-msg { background:#E3F2FD; padding:10px; border-radius:10px; margin:6px 0; }
14
+ .bot-msg { background:#F1F8E9; padding:10px; border-radius:10px; margin:6px 0; }
15
+ .recs a { color:#1565C0; cursor:pointer; text-decoration:none; display:block; margin-left:12px; }
16
+ .recs a:hover { text-decoration:underline; }
17
+ #info { margin-top:10px; background:#f5f5f5; padding:10px; border-radius:8px; border:1px solid #e0e0e0; }
18
+ #conf-bar { width:100%; height:18px; background:#ddd; border-radius:8px; margin:6px 0; }
19
+ #conf-fill { height:100%; background:#43A047; width:0%; border-radius:8px; text-align:right; padding-right:4px; color:#fff; font-size:12px; line-height:18px; }
20
+ .stars { margin-top:8px; }
21
+ .star { font-size:26px; color:#FFC107; cursor:pointer; margin-right:4px; }
22
+ </style>
23
+ </head>
24
+ <body>
25
+ <h2>Assistant d’Analyse Conversationnelle</h2>
26
+
27
+ <div id="chat">
28
+ <div>💬 <b>Bienvenue 👋</b><br>Analyse des relations <i>Pourquoi / Comment</i>.</div>
29
+ </div>
30
+
31
+ <div style="margin-top:12px;">
32
+ <input type="text" id="question" placeholder="Tapez votre question…">
33
+ <button id="sendBtn">🚀 Envoyer</button>
34
+ </div>
35
+
36
+ <div id="info">
37
+ <p>🧭 Intent : <span id="intent">—</span></p>
38
+ <p>🎯 Question correspondante : <span id="matched">—</span></p>
39
+ <div id="conf-bar"><div id="conf-fill">0%</div></div>
40
+ <div class="stars">
41
+ <span class="star" data-value="1">☆</span>
42
+ <span class="star" data-value="2">☆</span>
43
+ <span class="star" data-value="3">☆</span>
44
+ <span class="star" data-value="4">☆</span>
45
+ <span class="star" data-value="5">☆</span>
46
+ </div>
47
+ </div>
48
+
49
+ <script src="/static/script.js"></script>
50
+ </body>
51
+ </html>