datacipen commited on
Commit
fd15b70
·
verified ·
1 Parent(s): 47fd316

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +81 -86
app.py CHANGED
@@ -1152,8 +1152,6 @@ app_page = dmc.MantineProvider(
1152
  {"label": re.sub(r'[^a-zA-Z0-9]', '', fileJson['name']).replace("json",""), "value": fileJson['path']}
1153
  for fileJson in getGitFilesFromRepo('JSON')
1154
  ],
1155
-
1156
- value='./BCC-Application/JSON/L1-Anglais.json',
1157
  placeholder="Choisir une maquette de formation avec propositions BCC",
1158
  style={"color": "rgb(80,106,139)","font-size": "0.75rem","border":"border 1px solid rgb(67,167,255)!important"},
1159
  ),
@@ -2278,116 +2276,113 @@ def display_page(pathname):
2278
  Input("maquette-dropdown", "value"),
2279
  Input("submit-button", "n_clicks"),
2280
  State("url", "pathname"),
2281
- running=[[Output("output-response", "children"), "", None]],
2282
  prevent_initial_call=True,
2283
  )
2284
  def display_status(num_bcc, current, n_clicks, pathname):
2285
  if not n_clicks:
2286
- return no_update, []
2287
-
2288
  if not current:
2289
  print(f"Erreur: Il n'y a pas de fichier dans le répertoire.")
2290
- return no_update, []
 
2291
  if not num_bcc:
2292
  print(f"Erreur: Il n'y a pas de nombre de BCC à générer.")
2293
- return no_update, []
 
2294
 
2295
  current_url = current
2296
 
2297
  print(f"Fichier Maquette sélectionné: {current_url}")
2298
- try:
2299
- res = requests.get(current_url, headers=headers, params=params)
2300
- if res.status_code == 200:
2301
- #jsonData = json.loads(base64.b64decode(res.json()['content']))
2302
- #decoded_content = base64.b64decode(res.json()['content'])
2303
- decoded_content = res.text
2304
- df = pd.read_csv(io.StringIO(decoded_content), sep=',', encoding='utf-8')
2305
- #df["BCC"].fillna("BCC", inplace = True)
2306
- df = df.loc[:, 'diplome':'ECUE']
2307
- print(f"Colonnes disponibles: {df.columns.tolist()}")
2308
- df.fillna(value={"BCC": "BCC"}) # Remplacer les NaN par des chaînes vides
2309
- # Créer la colonne 'enseignements' selon les règles spécifiées
2310
- if 'UE' in df.columns and 'ECUE' in df.columns:
2311
- # Vérifier si la colonne ECUE a des valeurs non nulles
2312
- df['enseignements'] = np.where(
2313
- df['ECUE'].notna() & (df['ECUE'] != ''),
2314
- df['UE'] + ' - ' + df['ECUE'],
2315
- df['BCC'] + ' - ' + df['UE'] if 'BCC' in df.columns else df['UE']
2316
- )
2317
- else:
2318
- # Fallback si les colonnes attendues n'existent pas
2319
- print("Attention: Colonnes UE/ECUE non trouvées. Vérifiez le format du fichier.")
2320
- raise ValueError("Format de fichier incorrect: colonnes UE/ECUE manquantes.")
2321
 
2322
- print(f"Prétraitement réussi. {len(df)} lignes traitées.")
2323
- unique_teachings = df['enseignements'].dropna().unique().tolist()
2324
 
2325
- # Préparer le message pour le LLM
2326
- messages = [
2327
- SystemMessage(content=f"""Tu es un expert en sciences de l'éducation, spécialiste dans la catégorisation thématique de contenus pédagogiques, chargé de classifier des enseignements académiques, de créer des situations d'apprentissage puis de formuler de compétences académiques.
2328
 
2329
- Tu es en capacité de comprendre et de traiter des processus pédagogiques complexes, en passant OBLIGATOIREMENT par les 4 tâches suivantes:
2330
 
2331
- 1. Dans ta première tâche, tu dois créer EXACTEMENT {num_bcc} catégories thématiques distinctes qui représentent au mieux les enseignements listés. Pour chaque catégorie, fournis un nom précis et représentatif de 20 mots minimum.
2332
- 2. Ta deuxième tâche est de classer chaque enseignement dans l'une des {num_bcc} catégories créées dans la première tâche.
2333
- Chaque enseignement doit être classé dans UNE SEULE catégorie la plus pertinente.
2334
- Assure-toi que TOUS les enseignements sont classés et qu'aucun n'est oublié.
2335
 
2336
- 3. Ta troisième tâche est de créer UNE situation d'apprentissage pour chaque catégorie, en intégrant les enseignements classés dans cette catégorie.
2337
- Pour chaque situation d'apprentissage :
2338
- - tu t'appuies sur la définition d'une situation d'apprentissage qui est un scénario pédagogique contextualisé qui place l'apprenant face à un défi concret nécessitant la mobilisation de savoirs, savoir-faire et savoir-être. Elle s'articule autour d'une problématique réelle, favorise l'interdisciplinarité et vise le développement de compétences transversales.
2339
- - tu appliques la méthode cohérente et détaillée qui : Intègre l'ensemble des enseignements de la catégorie fournie. Soit adaptée au niveau d'études supérieures. Comprenne un contexte, des objectifs, des activités et des modalités d'évaluation. Soit rédigée en 150-250 mots.
2340
- - Assure-toi qu'une situation d'apprentissage soit créée pour chaque catégorie et qu'aucune ne soit oubliée.
2341
- Tu Réponds en français avec un texte continu, bien structuré, sans titre ni puces.
2342
 
2343
- 4. Ta quatrième tâche est de formuler UNE compétence académique pour chaque catégorie, en lien avec la situation d'apprentissage créée.
2344
- Pour chaque compétence académique :
2345
- - tu t'appuies sur la définition d'une compétence académique qui est une capacité avérée à mobiliser des ressources (savoirs, savoir-faire, savoir-être) dans une famille de situations complexes, pour résoudre des problèmes ou réaliser des tâches. Elle est formulée avec un verbe d'action, un objet, un contexte et un niveau de performance attendu. Elle s'inscrit dans une taxonomie (comme celle de Bloom) et peut être évaluée à travers des indicateurs observables.
2346
- - tu prends comme exemple les formulations suivantes : "Analyser des problèmes complexes en mobilisant des approches multidisciplinaires pour proposer des solutions innovantes", "Concevoir et mettre en œuvre des projets de recherche en respectant les normes éthiques et méthodologiques du domaine", "Interpréter des données scientifiques pour prendre des décisions éclairées dans un contexte d'incertitude".
2347
- - tu utilises les niveaux taxonomiques de Bloom appropriés au niveau d'étude : Licence 1-2 (se concentrer sur "se rappeler", "comprendre", "appliquer"), Licence 3/BUT (privilégier "appliquer", "analyser"), Master (privilégier "analyser", "évaluer", "créer").
2348
- - tu appliques la méthode cohérente et détaillée qui : Synthétise l'ensemble des enseignements de la catégorie fournie. S'articule avec la situation d'apprentissage associée. Soit précise, mesurable et pertinente pour le domaine d'études. Comporte entre 15 et 25 mots.
2349
- - tu réponds avec une seule phrase complète, sans préambule ni explications.
2350
- - Assure-toi qu'une compétence académique soit formulée pour chaque catégorie et qu'aucune ne soit oubliée.
2351
 
2352
- Réponds UNIQUEMENT au format JSON avec la structure suivante:
2353
- [
2354
- {{
2355
- "catégorie": "Nom de la catégorie 1",
2356
- "situation": "Texte de la situation d'apprentissage associée à la catégorie 1 (150-250 mots)",
2357
- "compétence": "Texte de la compétence académique associée à la catégorie 1 (15-25 mots)"
2358
- }},
2359
- ...
2360
- ]
2361
- """),
2362
- HumanMessage(content=f"Voici la liste des enseignements à catégoriser: {json.dumps(unique_teachings, ensure_ascii=False)}")
2363
  ]
 
 
 
2364
 
2365
- # Obtenir la réponse du LLM
2366
- response = model.invoke(messages)
2367
 
2368
- # Extraire le JSON de la réponse
2369
- content = response.content
2370
 
2371
- # Nettoyer la réponse si nécessaire (enlever les ```json et ```)
2372
- if "```json" in content:
2373
- content = content.split("```json")[1].split("```")[0].strip()
2374
- elif "```" in content:
2375
- content = content.split("```")[1].split("```")[0].strip()
2376
 
2377
- # Parser le JSON
2378
- categories = json.loads(content)
2379
- print(categories)
2380
- print("Catégories thématiques créées avec succès:")
2381
- for idx, cat in enumerate(categories, 1):
2382
- print(f"{idx}. {cat['nom']} - {cat['description'][:50]}...")
2383
 
2384
- # Mettre à jour l'état avec les catégories générées
2385
- return html.Div(children=[dbc.Table.from_dataframe(df[["diplome", "RNCP", "Année d'étude", "Semestre", "BCC", "UE", "ECUE","exemple_situation_apprentissage"]], striped=True, bordered=True, hover=True, index=False)])
2386
 
2387
- except Exception as e:
2388
- print(f"Erreur lors du chargement/prétraitement du fichier: {e}")
2389
- # Passer au fichier suivant en cas d'erreur
2390
-
2391
 
2392
 
2393
  @callback(
 
1152
  {"label": re.sub(r'[^a-zA-Z0-9]', '', fileJson['name']).replace("json",""), "value": fileJson['path']}
1153
  for fileJson in getGitFilesFromRepo('JSON')
1154
  ],
 
 
1155
  placeholder="Choisir une maquette de formation avec propositions BCC",
1156
  style={"color": "rgb(80,106,139)","font-size": "0.75rem","border":"border 1px solid rgb(67,167,255)!important"},
1157
  ),
 
2276
  Input("maquette-dropdown", "value"),
2277
  Input("submit-button", "n_clicks"),
2278
  State("url", "pathname"),
2279
+ #running=[[Output("output-response", "children"), "", None]],
2280
  prevent_initial_call=True,
2281
  )
2282
  def display_status(num_bcc, current, n_clicks, pathname):
2283
  if not n_clicks:
2284
+ #return no_update, []
2285
+ return no_update
2286
  if not current:
2287
  print(f"Erreur: Il n'y a pas de fichier dans le répertoire.")
2288
+ #return no_update, []
2289
+ return no_update
2290
  if not num_bcc:
2291
  print(f"Erreur: Il n'y a pas de nombre de BCC à générer.")
2292
+ #return no_update, []
2293
+ return no_update
2294
 
2295
  current_url = current
2296
 
2297
  print(f"Fichier Maquette sélectionné: {current_url}")
2298
+ res = requests.get(current_url, headers=headers, params=params)
2299
+ if res.status_code == 200:
2300
+ #jsonData = json.loads(base64.b64decode(res.json()['content']))
2301
+ #decoded_content = base64.b64decode(res.json()['content'])
2302
+ decoded_content = res.text
2303
+ df = pd.read_csv(io.StringIO(decoded_content), sep=',', encoding='utf-8')
2304
+ #df["BCC"].fillna("BCC", inplace = True)
2305
+ df = df.loc[:, 'diplome':'ECUE']
2306
+ print(f"Colonnes disponibles: {df.columns.tolist()}")
2307
+ df.fillna(value={"BCC": "BCC"}) # Remplacer les NaN par des chaînes vides
2308
+ # Créer la colonne 'enseignements' selon les règles spécifiées
2309
+ if 'UE' in df.columns and 'ECUE' in df.columns:
2310
+ # Vérifier si la colonne ECUE a des valeurs non nulles
2311
+ df['enseignements'] = np.where(
2312
+ df['ECUE'].notna() & (df['ECUE'] != ''),
2313
+ df['UE'] + ' - ' + df['ECUE'],
2314
+ df['BCC'] + ' - ' + df['UE'] if 'BCC' in df.columns else df['UE']
2315
+ )
2316
+ else:
2317
+ # Fallback si les colonnes attendues n'existent pas
2318
+ print("Attention: Colonnes UE/ECUE non trouvées. Vérifiez le format du fichier.")
2319
+ raise ValueError("Format de fichier incorrect: colonnes UE/ECUE manquantes.")
 
2320
 
2321
+ print(f"Prétraitement réussi. {len(df)} lignes traitées.")
2322
+ unique_teachings = df['enseignements'].dropna().unique().tolist()
2323
 
2324
+ # Préparer le message pour le LLM
2325
+ messages = [
2326
+ SystemMessage(content=f"""Tu es un expert en sciences de l'éducation, spécialiste dans la catégorisation thématique de contenus pédagogiques, chargé de classifier des enseignements académiques, de créer des situations d'apprentissage puis de formuler de compétences académiques.
2327
 
2328
+ Tu es en capacité de comprendre et de traiter des processus pédagogiques complexes, en passant OBLIGATOIREMENT par les 4 tâches suivantes:
2329
 
2330
+ 1. Dans ta première tâche, tu dois créer EXACTEMENT {num_bcc} catégories thématiques distinctes qui représentent au mieux les enseignements listés. Pour chaque catégorie, fournis un nom précis et représentatif de 20 mots minimum.
2331
+ 2. Ta deuxième tâche est de classer chaque enseignement dans l'une des {num_bcc} catégories créées dans la première tâche.
2332
+ Chaque enseignement doit être classé dans UNE SEULE catégorie la plus pertinente.
2333
+ Assure-toi que TOUS les enseignements sont classés et qu'aucun n'est oublié.
2334
 
2335
+ 3. Ta troisième tâche est de créer UNE situation d'apprentissage pour chaque catégorie, en intégrant les enseignements classés dans cette catégorie.
2336
+ Pour chaque situation d'apprentissage :
2337
+ - tu t'appuies sur la définition d'une situation d'apprentissage qui est un scénario pédagogique contextualisé qui place l'apprenant face à un défi concret nécessitant la mobilisation de savoirs, savoir-faire et savoir-être. Elle s'articule autour d'une problématique réelle, favorise l'interdisciplinarité et vise le développement de compétences transversales.
2338
+ - tu appliques la méthode cohérente et détaillée qui : Intègre l'ensemble des enseignements de la catégorie fournie. Soit adaptée au niveau d'études supérieures. Comprenne un contexte, des objectifs, des activités et des modalités d'évaluation. Soit rédigée en 150-250 mots.
2339
+ - Assure-toi qu'une situation d'apprentissage soit créée pour chaque catégorie et qu'aucune ne soit oubliée.
2340
+ Tu Réponds en français avec un texte continu, bien structuré, sans titre ni puces.
2341
 
2342
+ 4. Ta quatrième tâche est de formuler UNE compétence académique pour chaque catégorie, en lien avec la situation d'apprentissage créée.
2343
+ Pour chaque compétence académique :
2344
+ - tu t'appuies sur la définition d'une compétence académique qui est une capacité avérée à mobiliser des ressources (savoirs, savoir-faire, savoir-être) dans une famille de situations complexes, pour résoudre des problèmes ou réaliser des tâches. Elle est formulée avec un verbe d'action, un objet, un contexte et un niveau de performance attendu. Elle s'inscrit dans une taxonomie (comme celle de Bloom) et peut être évaluée à travers des indicateurs observables.
2345
+ - tu prends comme exemple les formulations suivantes : "Analyser des problèmes complexes en mobilisant des approches multidisciplinaires pour proposer des solutions innovantes", "Concevoir et mettre en œuvre des projets de recherche en respectant les normes éthiques et méthodologiques du domaine", "Interpréter des données scientifiques pour prendre des décisions éclairées dans un contexte d'incertitude".
2346
+ - tu utilises les niveaux taxonomiques de Bloom appropriés au niveau d'étude : Licence 1-2 (se concentrer sur "se rappeler", "comprendre", "appliquer"), Licence 3/BUT (privilégier "appliquer", "analyser"), Master (privilégier "analyser", "évaluer", "créer").
2347
+ - tu appliques la méthode cohérente et détaillée qui : Synthétise l'ensemble des enseignements de la catégorie fournie. S'articule avec la situation d'apprentissage associée. Soit précise, mesurable et pertinente pour le domaine d'études. Comporte entre 15 et 25 mots.
2348
+ - tu réponds avec une seule phrase complète, sans préambule ni explications.
2349
+ - Assure-toi qu'une compétence académique soit formulée pour chaque catégorie et qu'aucune ne soit oubliée.
2350
 
2351
+ Réponds UNIQUEMENT au format JSON avec la structure suivante:
2352
+ [
2353
+ {{
2354
+ "catégorie": "Nom de la catégorie 1",
2355
+ "situation": "Texte de la situation d'apprentissage associée à la catégorie 1 (150-250 mots)",
2356
+ "compétence": "Texte de la compétence académique associée à la catégorie 1 (15-25 mots)"
2357
+ }},
2358
+ ...
 
 
 
2359
  ]
2360
+ """),
2361
+ HumanMessage(content=f"Voici la liste des enseignements à catégoriser: {json.dumps(unique_teachings, ensure_ascii=False)}")
2362
+ ]
2363
 
2364
+ # Obtenir la réponse du LLM
2365
+ response = model.invoke(messages)
2366
 
2367
+ # Extraire le JSON de la réponse
2368
+ content = response.content
2369
 
2370
+ # Nettoyer la réponse si nécessaire (enlever les ```json et ```)
2371
+ if "```json" in content:
2372
+ content = content.split("```json")[1].split("```")[0].strip()
2373
+ elif "```" in content:
2374
+ content = content.split("```")[1].split("```")[0].strip()
2375
 
2376
+ # Parser le JSON
2377
+ categories = json.loads(content)
2378
+ print(categories)
2379
+ print("Catégories thématiques créées avec succès:")
2380
+ for idx, cat in enumerate(categories, 1):
2381
+ print(f"{idx}. {cat['nom']} - {cat['description'][:50]}...")
2382
 
2383
+ # Mettre à jour l'état avec les catégories générées
2384
+ return html.Div(children=[dbc.Table.from_dataframe(df[["diplome", "RNCP", "Année d'étude", "Semestre", "BCC", "UE", "ECUE","exemple_situation_apprentissage"]], striped=True, bordered=True, hover=True, index=False)])
2385
 
 
 
 
 
2386
 
2387
 
2388
  @callback(