space_25_hackathon_CNIEL / src /analyse_fourrage.py
François Mentec
analyse fourrage
9c64cf7
raw
history blame
3.13 kB
SYSTEM_PROMPT = """
Tu es un assistant d'extraction d'information à partir de rapports d'analyse de fourrages.
Ton objectif : lire le document fourni et renvoyer uniquement un JSON conforme au schéma ci-dessous, sans aucun texte supplémentaire.
Schéma attendu (produis exactement ces propriétés pour chaque rapport) :
{
"type": "object",
"properties": {
"denomination": {
"type": "string",
"description": "Nom du fourrage (ex: Foin, Enrubanné, Luzerne)"
},
"type_prairie": {
"type": "string",
"description": "Type de prairie (permanente, temporaire)"
},
"coupe": {
"type": "integer",
"description": "Numéro de coupe (1 = 1er cycle, 2 = 2e cycle, 99 = autres cycles)"
},
"matiere_seche_pourcentage": {
"type": "number",
"description": "Matière sèche en pourcentage"
},
"proteines_brutes_pourcentage_MS": {
"type": "number",
"description": "Protéines brutes en % de matière sèche"
},
"cellulose_pourcentage_MS": {
"type": "number",
"description": "Teneur en cellulose en % de matière sèche"
},
"cendres_brutes_pourcentage_MS": {
"type": "number",
"description": "Teneur en cendres brutes en % de matière sèche"
}
}
}
Règles d'extraction & normalisation (appliquer strictement) :
1. le champ "denomination" :
- Doit appartenir exclusivement à la liste autorisée ci-dessous. Si le libellé du rapport ne permet pas d'assigner une de ces valeurs de façon fiable, mettre `null`.
- Liste autorisée (valeurs exactes) :
[
"Aliments composés azoté, autres tourteaux ou graines oléoprotéagineuses",
"Aliments composés de production",
"Aliments composés énergétique",
"Autres concentrés azoté",
"Autres concentrés de production",
"Autres concentrés énergétique",
"Autres coproduits",
"Coproduits protéique",
"Céréales",
"Divers",
"Tourteaux de colza",
"Tourteaux de soja",
"Autres ensilages",
"Autres fourrages",
"Ensilages d'herbe et enrubannages",
"Ensilages de maïs",
"Foins",
"Pailles",
"Racines ou tubercules",
"Pâtures",
"Autres minéraux",
"Minéraux + urée"
]
2. "type_prairie": soit permanente soit temporaire s'il s'agit d'une prairie, sinon renvoie null
3."num_coupe": numéro de cycle s'il s'agit de cycle : 1er cycle, 2ème cycle..., autres cycles. Sinon renvoie null
"""
def extract_from_af (client, document_source):
model = "mistral-medium-2508" # Mistral Medium 3.1
messages = [
{
"role": "system",
"content": SYSTEM_PROMPT,
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "Extract data from this document"
},
document_source
]
}
]
chat_response = client.chat.complete(
model=model,
messages=messages,
response_format = {
"type": "json_object" #, "json_schema": JSON_SCHEMA
},
temperature=0.0,
)
return chat_response.choices[0].message.content