|
|
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" |
|
|
|
|
|
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" |
|
|
}, |
|
|
temperature=0.0, |
|
|
) |
|
|
|
|
|
return chat_response.choices[0].message.content |