---
license: agpl-3.0
language:
- fr
base_model:
- unsloth/Llama-3.2-3B-Instruct
datasets:
- eltorio/appreciation
library_name: peft
---
# Une intelligence artificielle pour écrire des appréciations
## Objectifs
Cette IA s'adresse aux enseignants de l'enseignement secondaire français pour les aider à rédiger automatiquement des appréciations pour leurs élèves.
## Interface utilisateur
L'interface réalisée avec Gradio propose en entrée:
### Informations générales
- matière enseignée:
- Histoire-Géographie
- Histoire-Géographie-Géopolitique-Science-Politique (HGGSP)
- (des matières seront ajoutées ultérieurement)
- niveau de l'élève (2nde, 1ère, Terminale)
- trimestre (1er, 2ème, 3ème)
### Évaluation
- note de l'élève sur 20
- évolution par rapport au trimestre précédent (notes des 3 trimetres ou N/A si innaproprié)
### Attitude et travail
- travail personnel fourni: slider de 0 à 10
- participation en classe: slider de 0 à 10
- comportement: slider de 0 à 10
L'interface génère une appréciation de 1 à 20 mots adaptée au profil de l'élève. Cette évaluation reste bienveillante et permet à l'élève et à ses parents de comprendre les atouts et les difficultés, tout en proposant des pistes de progression.
## Stratégie de développement
### Phase 1 : MVP (Minimum Viable Product)
- Utilisation d'un modèle LLM de taille moyenne (3B paramètres)
- Création d'un dataset initial de ≈250 appréciations représentatives
- Inclusion d'exemples réels anonymisés d'appréciations d'enseignants
- Interface basique mais fonctionnelle
- Système de feedback utilisateur
En phase 1 le modèle a été entrainé avec [ce code](https://www.kaggle.com/code/eltorio/autoeval-training)
### Phase 2 : Amélioration et validation
- Extension du dataset à 1000+ exemples
- Fine-tuning d'un modèle plus large
- Validation par un panel d'enseignants
- Métriques qualitatives (cohérence, personnalisation)
- Amélioration continue basée sur les retours
### Pipeline technique
1. Prétraitement et normalisation des entrées
2. Construction du contexte spécifique
3. Génération de l'appréciation
4. Post-traitement (vérification longueur/ton/grammaire)
## Exemple de code d'inference avec Gradio
Attention ce code ne fonctionne qu'avec un GPU Cuda.
```python
import gradio as gr
from transformers import AutoProcessor, AutoTokenizer
from peft import AutoPeftModelForCausalLM
import torch
import os
if os.environ.get('HF_TOKEN') is None:
raise ValueError("You must set the HF_TOKEN environment variable to use this script, you also need to have access to the Llama 3.2 model family")
hugging_face_model_id = "eltorio/Llama-3.2-3B-appreciation"
base_model_path = "meta-llama/Llama-3.2-3B-Instruct"
device = torch.device('cuda') if torch.cuda.is_available() else torch.device('cpu')
device_desc = f"Cette I.A. fonctionne sur {device} 🚀." if device == torch.device('cuda') else f"🐢 Cette I.A. ne peut pas fonctionner sur {device} 🐢."
# Define the title, description, and device description for the Gradio interface
title = f"Une intelligence artificielle pour écrire des appréciations et tourne sur {device}"
desc = "Ce modèle vous propose une évaluation automatique."
# Define the long description for the Gradio interface
long_desc = f"Cette démonstration est basée sur le modèle Llama-3.2-3B-appreciation, c'est un LLM basé sur Llama 3.2 3B-instruct!
{device_desc}
2024 - Ronan Le Meillat"
if torch.cuda.is_available():
# Determine the device (GPU or CPU) to run the model on
device = torch.device('cuda') if torch.cuda.is_available() else torch.device('cpu')
print(f"Using device: {device}") # Log the device being used
# Initialize the processor from the base model path
processor = AutoProcessor.from_pretrained(base_model_path, trust_remote_code=True)
# Initialize the model from the base model path and set the torch dtype to bfloat16
peft_model = AutoPeftModelForCausalLM.from_pretrained(hugging_face_model_id)
merged_model = peft_model.merge_and_unload()
tokenizer = AutoTokenizer.from_pretrained(hugging_face_model_id)
#tokenizer = get_chat_template(
# tokenizer,
# chat_template = "llama-3.1",
#)
# Define a function to infer a evaluation from the incoming parameters
def infere(trimestre: str, moyenne_1: float,moyenne_2: float,moyenne_3: float, comportement: float, participation: float, travail: float) -> str:
if trimestre == "1":
trimestre_full = "premier trimestre"
user_question = f"Veuillez rédiger une appréciation en moins de 40 mots pour le {trimestre_full} pour cet élève qui a eu {moyenne_1} de moyenne, j'ai évalué son comportement à {comportement}/10, sa participation à {participation}/10 et son travail à {travail}/10. Les notes ne doivent pas apparaître dans l'appréciation."
elif trimestre == "2":
trimestre_full = "deuxième trimestre"
user_question = f"Veuillez rédiger une appréciation en moins de 40 mots pour le {trimestre_full} pour cet élève qui a eu {moyenne_2} de moyenne ce trimestre et {moyenne_1} au premier trimestre, j'ai évalué son comportement à {comportement}/10, sa participation à {participation}/10 et son travail à {travail}/10. Les notes ne doivent pas apparaître dans l'appréciation."
elif trimestre == "3":
trimestre_full = "troisième trimestre"
user_question= f"Veuillez rédiger une appréciation en moins de 40 mots pour le {trimestre_full} pour cet élève qui a eu {moyenne_3} de moyenne ce trimestre, {moyenne_2} au deuxième trimestre et {moyenne_1} au premier trimestre, j'ai évalué son comportement à {comportement}/10, sa participation à {participation}/10 et son travail à {travail}/10. Les notes ne doivent pas apparaître dans l'appréciation."
# Define a chat template for the model to respond to
messages = [
{
"role": "system",
"content": "Vous êtes une IA assistant les enseignants d'histoire-géographie en rédigeant à leur place une appréciation personnalisée pour leur élève en fonction de ses performances. Votre appreciation doit être en français, bienveillante, constructive, et aider l'élève à comprendre ses points forts et les axes d'amélioration. Votre appréciation doit comporter de 1 à 40 mots. Votre appréciation ne doit jamais comporter la valeur de la note. Votre appréciation doit utiliser le style impersonnel."},
{
"role": "user",
"content": user_question},
]
inputs = tokenizer.apply_chat_template(
messages,
tokenize = True,
add_generation_prompt = True, # Must add for generation
return_tensors = "pt",).to(device)
outputs = merged_model.generate(input_ids = inputs, max_new_tokens = 90, use_cache = True,
temperature = 1.5, min_p = 0.1)
decoded_sequences = tokenizer.batch_decode(outputs[:, inputs.shape[1]:],skip_special_tokens=True)[0]
return decoded_sequences
# Create a Gradio interface with the infere function and specified title and descriptions
autoeval = gr.Interface(fn=infere, inputs=[
gr.Radio(
["1", "2", "3"], value="1", label="trimestre", info="Trimestre"
),
gr.Slider(0, 20,label="moyenne_1", value=10, info="Moyenne trimestre 1"),
gr.Slider(0, 20,label="moyenne_2", value=10, info="Moyenne trimestre 2"),
gr.Slider(0, 20,label="moyenne_3", value=10, info="Moyenne trimestre 3"),
gr.Slider(0, 10, value=5, label="comportement", info="Comportement (1 à 10)"),
gr.Slider(0, 10, value=5, label="participation", info="Participation (1 à 10)"),
gr.Slider(0, 10, value=5, label="travail", info="Travail (1 à 10)"),
], outputs="text", title=title,
description=desc, article=long_desc)
# Launch the Gradio interface and share it
autoeval.launch(server_name="0.0.0.0",share=True)
else:
print("No GPU available")
device = torch.device('cpu')
def infere(trimestre: str, moyenne_1: float,moyenne_2: float,moyenne_3: float, comportement: float, participation: float, travail: float) -> str:
return "No GPU available, please contact me"
# Create a Gradio interface with the infere function and specified title and descriptions
autoeval = gr.Interface(fn=infere, inputs=[
gr.Radio(
["1", "2", "3"], value="1", label="trimestre", info="Trimestre"
),
gr.Slider(0, 20,label="moyenne_1", value=10, info="Moyenne trimestre 1"),
gr.Slider(0, 20,label="moyenne_2", value=10, info="Moyenne trimestre 2"),
gr.Slider(0, 20,label="moyenne_3", value=10, info="Moyenne trimestre 3"),
gr.Slider(0, 10, value=5, label="comportement", info="Comportement (1 à 10)"),
gr.Slider(0, 10, value=5, label="participation", info="Participation (1 à 10)"),
gr.Slider(0, 10, value=5, label="travail", info="Travail (1 à 10)"),
], outputs="text", title=title,
description=desc, article=long_desc)
# Launch the Gradio interface and share it
autoeval.launch(server_name="0.0.0.0",share=True)
```
## Sécurité et éthique
- Il est hors de question de mettre des appréciations automatiques, elles devront être validée et eventuellement corrigée par l'enseignant.
## Référencer ce modèle
- Utiliser la citation *bibtex* suivante:
```bibtex
@misc {ronan_l.m._2024,
author = { {Ronan L.M.} },
title = { Llama-3.2-3B-appreciation (Revision dbba129) },
year = 2024,
url = { https://huggingface.co/eltorio/Llama-3.2-3B-appreciation },
doi = { 10.57967/hf/3637 },
publisher = { Hugging Face }
}
```