from langchain.prompts import PromptTemplate from langchain.output_parsers import PydanticOutputParser from pydantic import BaseModel, Field from typing import List import json from langchain.chat_models import ChatOpenAI # Modèle de sortie pour la détection de l'expression "il suffit de" class ReformulationDetail(BaseModel): original: str = Field(..., description="Phrase originale contenant 'il suffit de'.") explanation: str = Field(..., description="Explication sur pourquoi l'expression 'il suffit de' est inadaptée.") reformulation_1: str = Field(..., description="Première reformulation de la phrase.") reformulation_2: str = Field(..., description="Seconde reformulation de la phrase.") reformulation_3: str = Field(..., description="Troisième reformulation de la phrase.") def to_dict(self): return { "original": self.original, "explanation": self.explanation, "reformulation_1": self.reformulation_1, "reformulation_2": self.reformulation_2, "reformulation_3": self.reformulation_3 } class Summary(BaseModel): total_occurrences: int = Field(..., description="Nombre total d'occurrences de 'il suffit de' détectées.") reformulations_provided: int = Field(..., description="Nombre de reformulations fournies.") def to_dict(self): return { "total_occurrences": self.total_occurrences, "reformulations_provided": self.reformulations_provided } class DetectionResult(BaseModel): reformulations: List[ReformulationDetail] = Field(..., description="Liste des reformulations proposées.") summary: Summary = Field(..., description="Résumé de la détection.") def to_dict(self): return { "reformulations": [reformulation.to_dict() for reformulation in self.reformulations], "summary": self.summary.to_dict() } # Génération du prompt pour la détection de "il suffit de" def il_suffit_de_prompt_template(): return """ Veuillez analyser le texte ci-dessous pour détecter toutes les occurrences de l'expression "il suffit de". Pour chaque phrase trouvée : 1. **Citez exactement** la phrase originale contenant "il suffit de". 2. **Expliquez** pourquoi l'expression "il suffit de" est inadaptée dans un contexte professionnel ou formel, et pourquoi elle simplifie à l'excès ou n'indique pas assez d'importance. 3. **Proposez trois reformulations** de la phrase, sans utiliser des expressions qui soulignent l'importance (comme "il est nécessaire de", "il est important de", etc.). Utilisez des formulations à l'impératif pour rendre les instructions plus directes, précises, et professionnelles. 4. **Assurez-vous** que chaque reformulation est naturelle, fluide et conserve le sens original sans insister sur l'importance de l'action. **Format attendu pour chaque occurrence** : - **Original** : "[Phrase originale]" - **Explication** : "[Explication concise sur l'inadéquation de 'il suffit de']" - **Reformulation 1** : "[Première reformulation]" - **Reformulation 2** : "[Seconde reformulation]" - **Reformulation 3** : "[Troisième reformulation]" Le texte à analyser est le suivant : ```{text}``` {format_instruction} """ def detect_il_suffit_de(text): # Création du modèle de sortie avec Pydantic output_parser = PydanticOutputParser(pydantic_object=DetectionResult) # Génération du prompt à partir du modèle gen_prompt_template = PromptTemplate( input_variables=["text"], template=il_suffit_de_prompt_template(), partial_variables={'format_instruction': output_parser.get_format_instructions()} ) # Création du modèle de langage (avec LLM) llm = ChatOpenAI(model='gpt-4', temperature=0.5, api_key="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") # Chaîne de traitement du prompt avec le modèle et le parseur llm_chain = gen_prompt_template | llm | output_parser # Appel du modèle avec le texte fourni result_dict = llm_chain.invoke({"text": text}).to_dict() # Conversion du résultat en JSON json_result = json.dumps(result_dict, indent=8, ensure_ascii=False) # Génération du prompt final final_prompt = gen_prompt_template.format(text=text) # Retour des résultats return { "result": json_result, "prompt": final_prompt }