Spaces:
Sleeping
Sleeping
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 | |
} | |