Spaces:
Build error
Build error
| import json | |
| from langchain.prompts import PromptTemplate | |
| from langchain.chains import LLMChain | |
| from pydantic import BaseModel, Field | |
| from typing import List, Tuple | |
| from langchain.chat_models import ChatOpenAI | |
| from langchain.output_parsers import PydanticOutputParser | |
| class Expression(BaseModel): | |
| expression: str = Field(..., description="Expression détectée (ex: 'est une étape importante')") | |
| indice_debut: int = Field(..., description="Indice de début de l'expression") | |
| indice_fin: int = Field(..., description="Indice de fin de l'expression") | |
| class Phrase(BaseModel): | |
| texte: str = Field(..., description="Phrase complète contenant l'expression ou les expressions détectées") | |
| indice_debut: int = Field(..., description="Indice de début de la phrase") | |
| indice_fin: int = Field(..., description="Indice de fin de la phrase") | |
| class Reformulation(BaseModel): | |
| texte: str = Field(..., description="Texte de la reformulation") | |
| class PhraseDetectee(BaseModel): | |
| phrase: Phrase = Field(..., description="Détails de la phrase") | |
| erreurs: List[Expression] = Field(..., description="Liste des expressions détectées dans la phrase") | |
| reformulations: List[Reformulation] = Field(..., description="Liste des reformulations proposées") | |
| justification: str = Field(..., description="Justification des reformulations proposées") | |
| class Summary(BaseModel): | |
| total_erreurs: int = Field(..., description="Nombre total d'expressions détectées") | |
| total_phrases: int = Field(..., description="Nombre total de phrases contenant des expressions") | |
| total_reformulations: int = Field(..., description="Nombre total de reformulations proposées") | |
| class DetectionResult(BaseModel): | |
| phrases_detectees: List[PhraseDetectee] = Field(..., description="Liste des phrases détectées avec détails") | |
| summary: Summary = Field(..., description="Résumé de la détection") | |
| def to_dict(self): | |
| return { | |
| "phrases_detectees": [phrase.model_dump() for phrase in self.phrases_detectees], | |
| "summary": self.summary.model_dump() | |
| } | |
| def est_une_etape_prompt_template() : | |
| return """ | |
| En tant que rédacteur web expert, votre mission est d'analyser le texte suivant et d'identifier toutes les phrases où une expression similaire à "est une étape" est utilisée, y compris ses variantes , "constitue une étape", "représente une étape", "marque une étape","signifie une étape", "symbolise une étape", etc, particulièrement lorsqu'elles sont associées à des adjectifs exprimant l'importance. | |
| Exemples d'expressions à rechercher : | |
| "est une étape importante" → "contribue à l'avancement du processus" | |
| "représente une étape cruciale" → "fait progresser significativement le projet" | |
| "symbolise une étape fondamentale" → "marque un tournant dans le développement" | |
| Regroupe les expressions détectés par phrase et pour chaque phrase, veuillez : | |
| 1. Citez la phrase complète avec ses indices de début et de fin. | |
| 2. Identifiez l'expression ou les expressions exacte avec leurs indices. | |
| 3. Proposez 5 reformulations améliorant le style tout en préservant le sens et le contexte. | |
| 4. Fournissez une justification unique pour les reformulations tout en mentionnant l'adjectif d'importance associé. | |
| Règles de reformulation : | |
| - Évitez l'utilisation directe de "étape" associée à des adjectifs d'importance. | |
| - Remplacez ces constructions par des verbes d'action ou des expressions plus dynamiques. | |
| - Utilisez un vocabulaire professionnel et formel. | |
| - Variez la structure des phrases pour éviter la répétition. | |
| - Assurez-vous que les reformulations transmettent l'importance de l'action sans utiliser explicitement des termes comme "important", "crucial", etc. | |
| Expressions à rechercher : | |
| - "est une étape", "constitue une étape", "représente une étape", "marque une étape", "signifie une étape", "symbolise une étape" | |
| - Ces expressions associées à des adjectifs comme : "important", "essentiel", "crucial", "primordial", "fondamental", "indispensable", "déterminant", "vital", "majeur", "clé", "nécessaire", "stratégique", "significatif" | |
| Texte à analyser : | |
| {text} | |
| Format de sortie JSON : | |
| {{ | |
| "phrases_detectees": [ | |
| {{ | |
| "phrase": {{ | |
| "texte": "Phrase complète contenant l'expression ou les expressions détectées", | |
| "indice_debut": x, | |
| "indice_fin": y | |
| }}, | |
| "erreurs": [ | |
| {{ | |
| "expression": "Expression détectée (ex: 'est une étape importante')", | |
| "indice_debut": a, | |
| "indice_fin": b | |
| }} | |
| ], | |
| "reformulations": [ | |
| {{ "texte": "Reformulation 1" }}, | |
| {{ "texte": "Reformulation 2" }}, | |
| {{ "texte": "Reformulation 3" }}, | |
| {{ "texte": "Reformulation 4" }}, | |
| {{ "texte": "Reformulation 5" }} | |
| ], | |
| "justification": "Justification des reformulations proposées en s'il est disponible l'adjectif qualificatif à laquelle c'est associés." | |
| }} | |
| ], | |
| "summary": {{ | |
| "total_erreurs": nombre_total_d_expressions_detectées, | |
| "total_phrases": nombre_total_de_phrases_contenant_des_expressions, | |
| "total_reformulations": nombre_total_de_reformulations_proposées | |
| }} | |
| }} | |
| Assurez-vous que les indices correspondent aux positions exactes dans le texte original et que le JSON est correctement formaté. | |
| {format_instruction}""" | |
| def est_une_etape_prompt_template_v3() : | |
| return """En tant que rédacteur web expert, votre mission est d'analyser le texte suivant et d'identifier toutes les phrases où une expression similaire à "est une étape" est utilisée, | |
| y compris des variantes comme "est une étape", "constitue une étape", "représente une étape", "marque une étape", | |
| "signifie une étape", "symbolise une étape", etc. | |
| Recherche particulièrement ces expressions lorsqu'elles sont associées à des adjectifs exprimant l'importance (par exemple, | |
| "important", "essentiel", "crucial", "primordial", "fondamental", "indispensable", "déterminant", "vital", "majeur", "clé", | |
| "nécessaire", "stratégique", "significatif", etc.), que l'adjectif se trouve avant ou après le mot "étape". | |
| Pour chaque phrase ou une ou plusieurs occurrences sont trouvée , veuilles : | |
| Citez la phrase complète où apparaissent les expressions | |
| Indiquer les expressions exactes utilisées dans la phrase | |
| Mentionner l'adjectif d'importance associé. | |
| Propose cinq Reformulations de la phrase sans exprimer (ou sans mettre l’accent sur l’importance d’une étape, d’un moment, d’un rôle, d’une chose), | |
| en évitant impérativement toute redondance ou répétition de mot, | |
| tout t'assurrant de respecter aussi les regles suivante enumerer dans les list suivante: | |
| 1- Crucial, essentiel, important, fondamental, Le monde de, dans l’univers de, à l’ère de, | |
| Généralement, outre, cela signifie que, ce qui signifie que, Voici, découvrez | |
| s’avérer être, il suffit de, permet, décision éclairée, décision avisée(et leurs variantes ne doivent pas etre utilisé) | |
| 2- Look (et leurs variantes ne doivent pas etre utilisé dans un contexte de décoration) | |
| 3- Il existe, il faut, cependant, De plus, en revanche, Néanmoins, toutefois, imaginez (et leurs variantes ne doivent pas etre en début de phrase) | |
| 4- Joue un rôle, il est, est une étape (et leurs variantes ne doivent pas etre associer des mots tel que important, essentiel, crucial, primordial, fondamental, indispensable, déterminant) | |
| 5- En plus (et leurs variantes ne doivent pas etre seul en début de phrase) | |
| Ton analyse doit être retournée en JSON avec la structure suivante : | |
| {{ | |
| "phrases_detectees": [ | |
| {{ | |
| "phrase": {{ | |
| "texte": "Phrase complète contenant l'expression ou les expressions détectées", | |
| "indice_debut": x, | |
| "indice_fin": y | |
| }}, | |
| "erreurs": [ | |
| {{ | |
| "expression": "Expression détectée (ex: 'est une étape importante')", | |
| "indice_debut": a, | |
| "indice_fin": b | |
| }} | |
| ], | |
| "reformulations": [ | |
| {{ "texte": "Reformulation 1" }}, | |
| {{ "texte": "Reformulation 2" }}, | |
| {{ "texte": "Reformulation 3" }}, | |
| {{ "texte": "Reformulation 4" }}, | |
| {{ "texte": "Reformulation 5" }} | |
| ], | |
| "justification": "Justification des reformulations proposées en s'il est disponible l'adjectif qualificatif à laquelle c'est associés." | |
| }} | |
| ], | |
| "summary": {{ | |
| "total_erreurs": nombre_total_d_expressions_detectées, | |
| "total_phrases": nombre_total_de_phrases_contenant_des_expressions, | |
| "total_reformulations": nombre_total_de_reformulations_proposées | |
| }} | |
| }} | |
| Texte à analyser : | |
| {text}""" | |
| def est_une_etape_prompt_template_v3_1() : | |
| return """En tant que rédacteur web expert, votre mission est d'analyser le texte suivant et d'identifier toutes les phrases où une expression similaire à "est une étape" est utilisée, | |
| y compris des variantes comme "est une étape", "constitue une étape", "représente une étape", "marque une étape", | |
| "signifie une étape", "symbolise une étape", etc. | |
| Recherche particulièrement ces expressions lorsqu'elles sont associées à des adjectifs exprimant l'importance (par exemple, | |
| "important", "essentiel", "crucial", "primordial", "fondamental", "indispensable", "déterminant", "vital", "majeur", "clé", | |
| "nécessaire", "stratégique", "significatif", etc.), que l'adjectif se trouve avant ou après le mot "étape". | |
| Exemples d'expressions à rechercher : | |
| "est une étape importante" → "contribue à l'avancement du processus" | |
| "représente une étape cruciale" → "fait progresser significativement le projet" | |
| "symbolise une étape fondamentale" → "marque un tournant dans le développement" | |
| Pour chaque phrase ou une ou plusieurs occurrences sont trouvée , veuilles : | |
| Citez la phrase complète où apparaissent les expressions | |
| Indiquer les expressions exactes utilisées dans la phrase | |
| Mentionner l'adjectif d'importance associé. | |
| Propose cinq Reformulations de la phrase sans exprimer (ou sans mettre l’accent sur l’importance d’une étape, d’un moment, d’un rôle, d’une chose), | |
| en évitant impérativement toute redondance ou répétition de mot, | |
| tout t'assurrant de respecter aussi les regles suivante enumerer dans les list suivante: | |
| 1- Crucial, essentiel, important, fondamental, Le monde de, dans l’univers de, à l’ère de, | |
| Généralement, outre, cela signifie que, ce qui signifie que, Voici, découvrez | |
| s’avérer être, il suffit de, permet, décision éclairée, décision avisée(et leurs variantes ne doivent pas etre utilisé) | |
| 2- Look (et leurs variantes ne doivent pas etre utilisé dans un contexte de décoration) | |
| 3- Il existe, il faut, cependant, De plus, en revanche, Néanmoins, toutefois, imaginez (et leurs variantes ne doivent pas etre en début de phrase) | |
| 4- Joue un rôle, il est, est une étape (et leurs variantes ne doivent pas etre associer des mots tel que important, essentiel, crucial, primordial, fondamental, indispensable, déterminant) | |
| 5- En plus (et leurs variantes ne doivent pas etre seul en début de phrase) | |
| Ton analyse doit être retournée en JSON avec la structure suivante : | |
| {{ | |
| "phrases_detectees": [ | |
| {{ | |
| "phrase": {{ | |
| "texte": "Phrase complète contenant l'expression ou les expressions détectées", | |
| "indice_debut": x, | |
| "indice_fin": y | |
| }}, | |
| "erreurs": [ | |
| {{ | |
| "expression": "Expression détectée (ex: 'est une étape importante')", | |
| "indice_debut": a, | |
| "indice_fin": b | |
| }} | |
| ], | |
| "reformulations": [ | |
| {{ "texte": "Reformulation 1" }}, | |
| {{ "texte": "Reformulation 2" }}, | |
| {{ "texte": "Reformulation 3" }}, | |
| {{ "texte": "Reformulation 4" }}, | |
| {{ "texte": "Reformulation 5" }} | |
| ], | |
| "justification": "Justification des reformulations proposées en s'il est disponible l'adjectif qualificatif à laquelle c'est associés." | |
| }} | |
| ], | |
| "summary": {{ | |
| "total_erreurs": nombre_total_d_expressions_detectées, | |
| "total_phrases": nombre_total_de_phrases_contenant_des_expressions, | |
| "total_reformulations": nombre_total_de_reformulations_proposées | |
| }} | |
| }} | |
| Texte à analyser : | |
| {text}""" | |
| # def est_une_etape_prompt_template() : | |
| # return """ | |
| # Analyser le texte suivant et identifier toutes les phrases où une expression similaire à "est une étape" est utilisée, | |
| # y compris des variantes comme "est une étape", "constitue une étape", "représente une étape", "marque une étape", | |
| # "signifie une étape", "symbolise une étape", etc. | |
| # Recherche particulièrement ces expressions lorsqu'elles sont associées à des adjectifs exprimant l'importance | |
| # (par exemple, "important", "essentiel", "crucial", "primordial", "fondamental", "indispensable", "déterminant", | |
| # "vital", "majeur", "clé", "nécessaire", "stratégique", "significatif", etc.), que l'adjectif se trouve avant ou après le mot "étape". | |
| # Pour chaque occurrence trouvée, veuillez : | |
| # - Citer la phrase complète où l'expression apparaît. | |
| # - Indiquer l'expression exacte utilisée dans le texte. | |
| # - Mentionner l'adjectif d'importance associé. | |
| # - Proposer deux reformulations de la phrase pour changer l'expression détectée et l'adjectif associé, | |
| # sans employer d'expression équivalente. | |
| # - Assurez-vous de respecter les règles suivantes : | |
| # 1. Les expressions comme "crucial", "essentiel", "important", "fondamental" doivent être utilisées une seule fois | |
| # dans l'introduction (premier paragraphe). | |
| # 2. Évitez l'usage de mots comme "il existe", "il faut", "cependant", "de plus", "en revanche", "toutefois" en début de phrase. | |
| # 3. N'utilisez pas "joue un rôle", "il est", ou "est une étape" avec des adjectifs tels qu'"important", "essentiel", etc. | |
| # Le format de sortie doit être un JSON structuré avec les éléments suivants pour chaque pattern détecté : | |
| # - "pattern": "mot ou expression détectée", | |
| # - "adjectif": "adjectif associé", | |
| # - "indices": [[index de début, index de fin pour chaque occurrence]], | |
| # - "sentence": "phrase où l'expression est utilisée", | |
| # - "alternative_suggestions": ["suggestion 1", "suggestion 2"] | |
| # Si aucun pattern n'est trouvé, retournez un JSON avec : | |
| # - "pattern0": "", | |
| # - "occurrences": 0, | |
| # Ajoutez également un résumé à la fin : | |
| # - "total_patterns_detected": nombre total de patterns détectés, | |
| # - "alternative_suggestions_provided": nombre de suggestions données | |
| # - "occurrences": nombre d'occurrences. | |
| # Voici le texte à analyser : | |
| # ```{text}``` | |
| # \n{format_instruction} | |
| # """ | |
| def une_etape(text, version = 1): | |
| # Créer le template avec la variable text intégrée directement | |
| # prompt_template = est_une_etape_prompt_template() | |
| print("Version: ", version) | |
| if version == 1: | |
| prompt_template = est_une_etape_prompt_template() | |
| elif version == 2: | |
| prompt_template = est_une_etape_prompt_template_v3() | |
| elif version == 3: | |
| prompt_template = est_une_etape_prompt_template_v3_1() | |
| output_parser = PydanticOutputParser(pydantic_object=DetectionResult) | |
| # Créer le prompt avec le texte intégré | |
| # prompt = PromptTemplate(template=template, input_variables=["text"]) | |
| gen_prompt_template = PromptTemplate( | |
| input_variables=["text"], | |
| template=prompt_template, | |
| partial_variables={'format_instruction': output_parser.get_format_instructions()} | |
| ) | |
| # Créer une instance du modèle de langage | |
| llm = ChatOpenAI(model='gpt-4o',temperature=0.5, api_key="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") | |
| # Exécuter la chaîne avec le LLM | |
| llm_chain = gen_prompt_template | llm | output_parser # LLMChain(prompt=prompt, llm=llm, verbose=True) | |
| # Appel du modèle avec le texte fourni | |
| result_dict = llm_chain.invoke({"text": text}).to_dict() | |
| # Parsing de la réponse JSON | |
| json_result = json.dumps(result_dict, indent=8, ensure_ascii= False) | |
| final_prompt = gen_prompt_template.format(text=text) | |
| # Retourne les suggestions ou les erreurs de parsing | |
| return { | |
| "result": json_result, | |
| "prompt": final_prompt | |
| } | |