FerdinandPyCode/AuthringApp
1
1from langchain.prompts import PromptTemplate2from langchain.output_parsers import PydanticOutputParser3from langchain.chat_models import ChatOpenAI4from pydantic import BaseModel, Field5from typing import List, Tuple6import json7 8# Modèle de sortie pour la détection de l'utilisation incorrecte de "Outre"9class OutreDetection(BaseModel):10 pattern: str = Field(..., description="Mot ou expression détectée, ici 'Outre'.")11 indices: List[Tuple[int, int]] = Field(..., description="Indices de début et de fin pour chaque occurrence dans le texte.")12 sentence: str = Field(..., description="Phrase complète où 'Outre' est utilisé.")13 explanation: str = Field(..., description="Explication de pourquoi l'utilisation de 'Outre' est incorrecte.")14 alternative_suggestions: List[str] = Field(..., description="Suggestions alternatives pour reformuler la phrase.")15 16 def to_dict(self):17 return {18 "pattern": self.pattern,19 "indices": self.indices,20 "sentence": self.sentence,21 "explanation": self.explanation,22 "alternative_suggestions": self.alternative_suggestions23 }24 25class Summary(BaseModel):26 total_patterns_detected: int = Field(..., description="Nombre total de patterns détectés.")27 alternative_suggestions_provided: int = Field(..., description="Nombre total de suggestions fournies.")28 occurrences: int = Field(..., description="Nombre total d'occurrences trouvées dans le texte.")29 30 def to_dict(self):31 return {32 "total_patterns_detected": self.total_patterns_detected,33 "alternative_suggestions_provided": self.alternative_suggestions_provided,34 "occurrences": self.occurrences35 }36 37class DetectionResult(BaseModel):38 patterns: List[OutreDetection] = Field(..., description="Liste des occurrences incorrectes de 'Outre'.")39 summary: Summary = Field(..., description="Résumé de la détection.")40 41 def to_dict(self):42 return {43 "patterns": [pattern.to_dict() for pattern in self.patterns],44 "summary": self.summary.to_dict()45 }46 47# Création du template pour la détection de l'utilisation incorrecte de "Outre"48def outre_prompt_template():49 return """50Veuillez analyser le texte suivant pour détecter les phrases où "Outre" est utilisé en début de phrase, sans être suivi d'un complément approprié.51 52Pour chaque phrase trouvée :53 54 - Citez la phrase originale contenant "Outre" en début de phrase.55 - Expliquez pourquoi l'utilisation de "Outre" est incorrecte et précisez qu'il s'agit d'une préposition qui doit être suivie d'un complément.56 - Proposez une correction en remplaçant "Outre" par "En outre" ou en réécrivant la phrase de manière correcte.57 - Assurez-vous que la phrase reformulée soit naturelle, fluide et correcte.58 59Voici l'explication à afficher : "Outre" est une préposition en français qui signifie "en plus de" ou "en dehors de", et doit être suivie d'un complément. Par exemple :60 61 - Correct : "Outre ses compétences en gestion, il est également un excellent communicateur."62 - Incorrect : "Outre, il est également un excellent communicateur."63 64Par contre, "En outre" est une locution adverbiale qui signifie "de plus" ou "en plus", et elle est correctement utilisée pour introduire une nouvelle idée ou information, souvent au début d'une phrase. Exemple :65 66 - Correct : "En outre, il a une grande expérience dans ce domaine."67 68En résumé :69 - "Outre" est une préposition et doit être suivi d'un complément.70 - "En outre" est une locution adverbiale et peut être utilisée seule au début d'une phrase pour introduire une nouvelle idée.71 72Analysez le texte ci-dessous et détectez toutes les occurrences de "cela signifie que".73 74Pour chaque phrase :75 76 - Citez la phrase originale.77 - Supprimez "cela signifie que" et proposez une reformulation concise et élégante qui maintient le sens de la phrase.78 - Assurez-vous que la phrase reformulée soit naturelle, fluide et correcte.79 80Le format de sortie doit être un JSON structuré avec les éléments suivants pour chaque pattern détecté :81 82 - "pattern": "mot ou expression détectée",83 - "indices": [[index de début, index de fin pour chaque occurrence]],84 - "sentence": "phrase où l'expression est utilisée",85 - "explanation": "explication de pourquoi l'expression est incorrecte",86 - "alternative_suggestions": ["suggestion 1", "suggestion 2"]87 88Si aucun pattern n'est trouvé, retournez un JSON avec :89 - "pattern0": "",90 - "occurrences": 0,91 92À la fin, ajoutez un résumé avec :93 - "total_patterns_detected": nombre total de patterns détectés,94 - "alternative_suggestions_provided": nombre de suggestions données,95 - "occurrences": nombre d'occurrences.96 97Le texte à analyser est :98```{text}```99 100{format_instruction}101"""102 103def detect_outre(text):104 # Création du modèle de sortie avec Pydantic105 output_parser = PydanticOutputParser(pydantic_object=DetectionResult)106 107 # Génération du prompt à partir du modèle108 gen_prompt_template = PromptTemplate(109 input_variables=["text"],110 template=outre_prompt_template(),111 partial_variables={'format_instruction': output_parser.get_format_instructions()}112 )113 114 # Création du modèle de langage (avec LLM)115 llm = ChatOpenAI(model='gpt-4o', temperature=0.5, api_key="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")116 117 # Chaîne de traitement du prompt avec le modèle et le parseur118 llm_chain = gen_prompt_template | llm | output_parser119 120 # Appel du modèle avec le texte fourni121 result_dict = llm_chain.invoke({"text": text}).to_dict()122 123 # Conversion du résultat en JSON124 json_result = json.dumps(result_dict, indent=8, ensure_ascii=False)125 126 # Génération du prompt final127 final_prompt = gen_prompt_template.format(text=text)128 129 # Retour des résultats130 return {131 "result": json_result,132 "prompt": final_prompt133 }