datacipen commited on
Commit
00e8aca
·
verified ·
1 Parent(s): 96391f6

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +82 -56
app.py CHANGED
@@ -125,7 +125,7 @@ def load_csv_files(directory_path: str = "./Maquettes-formation"):
125
  # print(f"- {file}")
126
  return json_files
127
 
128
- def load_and_preprocess_csv(state: AgentState, file: str = "") -> AgentState:
129
  """
130
  Charge le fichier CSV actuel et prétraite les données.
131
 
@@ -162,25 +162,83 @@ def load_and_preprocess_csv(state: AgentState, file: str = "") -> AgentState:
162
 
163
  print(f"Prétraitement réussi. {len(df)} lignes traitées.")
164
 
165
- # Retourner l'état mis à jour avec le dataframe prétraité
166
- return {
167
- **state,
168
- "dataframe": df,
169
- "status": "preprocessed"
170
- }
171
-
172
  except Exception as e:
173
  print(f"Erreur lors du chargement/prétraitement du fichier: {e}")
174
  # Passer au fichier suivant en cas d'erreur
175
- if len(state['files_list']) > 0:
176
- return {
177
- **state,
178
- "current_file": file,
179
- "files_list": file,
180
- "status": "error"
181
- }
182
- else:
183
- return {**state, "status": "finished"}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
184
 
185
  def create_thematic_categories(state: AgentState, num_bcc: str = "") -> AgentState:
186
  f"""
@@ -591,9 +649,9 @@ def build_workflow(num_bcc,file,pathname) -> StateGraph:
591
  workflow = StateGraph(AgentState)
592
 
593
  # Définir les nœuds du graphe
594
- workflow.add_node("load_and_preprocess", lambda state: load_and_preprocess_csv(state, file))
595
- workflow.add_node("create_categories", lambda state: create_thematic_categories(state, num_bcc))
596
- workflow.add_node("classify_teachings", lambda state: classify_teachings(state, num_bcc))
597
 
598
  #workflow.add_node("create_learning_situations", lambda state: create_learning_situations(state, pathname))
599
 
@@ -605,8 +663,8 @@ def build_workflow(num_bcc,file,pathname) -> StateGraph:
605
  #workflow.add_node("process_next_file", get_next_file)
606
 
607
  # Définir les transitions
608
- workflow.add_edge("load_and_preprocess", "create_categories")
609
- workflow.add_edge("create_categories", "classify_teachings")
610
 
611
  #workflow.add_edge("classify_teachings", "create_learning_situations")
612
  #workflow.add_edge("create_learning_situations", "create_academic_competencies")
@@ -664,18 +722,6 @@ def init_agent_state(current_url, num, pathname) -> AgentState:
664
  for task, taskInfo in s.items():
665
  for key in taskInfo:
666
  if task == "load_and_preprocess":
667
- if key == "current_file":
668
- result += f"Traitement du fichier {taskInfo['current_file']} en cours...\n"
669
- if task == "classify_teachings":
670
- if key == "dataframe":
671
- df = taskInfo['dataframe']
672
- if key == "status":
673
- for key, value in taskInfo['classified_teachings'].items():
674
- result += f"\n\n-**Enseignement classé dans la catégorie '{key}'** : "
675
- for enseignement in value:
676
- result += f"{enseignement}, "
677
- result += f"\n\nTraitement de la tâche : {taskInfo['status']}...\n"
678
- if task == "create_categories":
679
  if key == "dataframe":
680
  df = taskInfo['dataframe']
681
  if key == "status":
@@ -683,28 +729,8 @@ def init_agent_state(current_url, num, pathname) -> AgentState:
683
  result += f"\n\n-**Enseignement classé dans la catégorie '{key}'** : "
684
  for enseignement in value:
685
  result += f"{enseignement}, "
686
- result += f"\n\nTraitement de la tâche : {taskInfo['status']}...\n"
687
- #if task == "create_learning_situations":
688
- # if key == "status":
689
- # if taskInfo['learning_situations'].items():
690
- # for key, value in taskInfo['learning_situations'].items():
691
- # result += f"\n\n-**Situation d'apprentissage créée pour la catégorie '{key}'** : {value}\n"
692
- # result += f"\n\nTraitement de la tâche : {taskInfo['status']}...\n"
693
- # else:
694
- # result += f"\n\nTraitement de la tâche : pas de situations d'apprentissage créées\n"
695
- #if task == "create_academic_competencies":
696
- # if key == "dataframe":
697
- # df = taskInfo['dataframe']
698
- # if key == "status":
699
- # if taskInfo['academic_competencies'].items():
700
- # for key, value in taskInfo['academic_competencies'].items():
701
- # result += f"\n\n-**Compétence académique créée pour la catégorie '{key}'** : {value}\n"
702
- # result += f"\n\nTraitement de la tâche : {taskInfo['status']}...\n"
703
- # else:
704
- # result += f"\n\nTraitement de la tâche : pas de BCC créés\n"
705
- #if task == "export_to_excel_2":
706
- # if key == "status":
707
- # result += f"\n\nTraitement de la tâche : {taskInfo['status']}...\n"
708
 
709
  except Exception as e:
710
  print(f"Erreur lors de l'exécution du workflow: {e}")
 
125
  # print(f"- {file}")
126
  return json_files
127
 
128
+ def load_and_preprocess_csv(state: AgentState, file: str = "", num_bcc: str = "") -> AgentState:
129
  """
130
  Charge le fichier CSV actuel et prétraite les données.
131
 
 
162
 
163
  print(f"Prétraitement réussi. {len(df)} lignes traitées.")
164
 
 
 
 
 
 
 
 
165
  except Exception as e:
166
  print(f"Erreur lors du chargement/prétraitement du fichier: {e}")
167
  # Passer au fichier suivant en cas d'erreur
168
+
169
+ unique_teachings = df['enseignements'].dropna().unique().tolist()
170
+
171
+ # Préparer le message pour le LLM
172
+ messages = [
173
+ 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.
174
+
175
+ Tu es en capacité de comprendre et de traiter des processus pédagogiques complexes, en passant OBLIGATOIREMENT par les 4 tâches suivantes:
176
+
177
+ 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.
178
+ 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.
179
+ Chaque enseignement doit être classé dans UNE SEULE catégorie la plus pertinente.
180
+ Assure-toi que TOUS les enseignements sont classés et qu'aucun n'est oublié.
181
+
182
+ 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.
183
+ Pour chaque situation d'apprentissage :
184
+ - 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.
185
+ - 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.
186
+ - Assure-toi qu'une situation d'apprentissage soit créée pour chaque catégorie et qu'aucune ne soit oubliée.
187
+ Tu Réponds en français avec un texte continu, bien structuré, sans titre ni puces.
188
+
189
+ 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.
190
+ Pour chaque compétence académique :
191
+ - 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.
192
+ - 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".
193
+ - 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").
194
+ - 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.
195
+ - tu réponds avec une seule phrase complète, sans préambule ni explications.
196
+ - Assure-toi qu'une compétence académique soit formulée pour chaque catégorie et qu'aucune ne soit oubliée.
197
+
198
+ Réponds UNIQUEMENT au format JSON avec la structure suivante:
199
+ [
200
+ {{
201
+ "catégorie": "Nom de la catégorie 1",
202
+ "situation": "Texte de la situation d'apprentissage associée à la catégorie 1 (150-250 mots)",
203
+ "compétence": "Texte de la compétence académique associée à la catégorie 1 (15-25 mots)"
204
+ }},
205
+ ...
206
+ ]
207
+ """),
208
+ HumanMessage(content=f"Voici la liste des enseignements à catégoriser: {json.dumps(unique_teachings, ensure_ascii=False)}")
209
+ ]
210
+
211
+ try:
212
+ # Obtenir la réponse du LLM
213
+ response = llm.invoke(messages)
214
+
215
+ # Extraire le JSON de la réponse
216
+ content = response.content
217
+
218
+ # Nettoyer la réponse si nécessaire (enlever les ```json et ```)
219
+ if "```json" in content:
220
+ content = content.split("```json")[1].split("```")[0].strip()
221
+ elif "```" in content:
222
+ content = content.split("```")[1].split("```")[0].strip()
223
+
224
+ # Parser le JSON
225
+ categories = json.loads(content)
226
+ print(categories)
227
+ print("Catégories thématiques créées avec succès:")
228
+ for idx, cat in enumerate(categories, 1):
229
+ print(f"{idx}. {cat['nom']} - {cat['description'][:50]}...")
230
+
231
+ # Mettre à jour l'état avec les catégories générées
232
+ return {
233
+ **state,
234
+ "dataframe": df,
235
+ "categories": categories,
236
+ "status": "categories_created"
237
+ }
238
+
239
+ except Exception as e:
240
+ print(f"Erreur lors de la création des catégories: {e}")
241
+ return {**state, "status": "error"}
242
 
243
  def create_thematic_categories(state: AgentState, num_bcc: str = "") -> AgentState:
244
  f"""
 
649
  workflow = StateGraph(AgentState)
650
 
651
  # Définir les nœuds du graphe
652
+ workflow.add_node("load_and_preprocess", lambda state: load_and_preprocess_csv(state, file, num_bcc))
653
+ #workflow.add_node("create_categories", lambda state: create_thematic_categories(state, num_bcc))
654
+ #workflow.add_node("classify_teachings", lambda state: classify_teachings(state, num_bcc))
655
 
656
  #workflow.add_node("create_learning_situations", lambda state: create_learning_situations(state, pathname))
657
 
 
663
  #workflow.add_node("process_next_file", get_next_file)
664
 
665
  # Définir les transitions
666
+ #workflow.add_edge("load_and_preprocess", "create_categories")
667
+ #workflow.add_edge("create_categories", "classify_teachings")
668
 
669
  #workflow.add_edge("classify_teachings", "create_learning_situations")
670
  #workflow.add_edge("create_learning_situations", "create_academic_competencies")
 
722
  for task, taskInfo in s.items():
723
  for key in taskInfo:
724
  if task == "load_and_preprocess":
 
 
 
 
 
 
 
 
 
 
 
 
725
  if key == "dataframe":
726
  df = taskInfo['dataframe']
727
  if key == "status":
 
729
  result += f"\n\n-**Enseignement classé dans la catégorie '{key}'** : "
730
  for enseignement in value:
731
  result += f"{enseignement}, "
732
+ if key == "current_file":
733
+ result += f"Traitement du fichier {taskInfo['current_file']} en cours...\n"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
734
 
735
  except Exception as e:
736
  print(f"Erreur lors de l'exécution du workflow: {e}")