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 | |
# Modèles Pydantic pour structurer la réponse | |
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 vous_pouvez_prompt_template(): | |
return """En tant que rédacteur web expert, votre mission est d'analyser le texte ci-dessous pour détecter les expressions "vous pouvez", "vous devez", "il vous faut", "vous avez à", "il est nécessaire que vous", "vous avez la possibilité de", "vous êtes prié de" et autres formules similaires. | |
Pour chaque phrase où une ou plusieurs occurrences de ces expressions sont trouvées, veuillez : | |
1. Citer la phrase complète avec ses indices de début et de fin. | |
2. Identifier l'expression exacte utilisée dans la phrase avec ses indices. | |
3. Expliquer pourquoi ces expressions peuvent alourdir le texte ou donner un ton trop directif ou permissif. | |
4. Proposer cinq reformulations de la phrase, en suivant ces instructions : | |
- Reformuler la phrase pour la rendre plus fluide et professionnelle en évitant d'insister sur la permission ou l'autorité. | |
- Privilégier des tournures neutres ou à l'impératif, tout en conservant le sens original. | |
- Éviter impérativement toute redondance ou répétition de mots et assurez-vous que la reformulation reste naturelle et fluide. | |
5. Respecter les règles suivantes lors de la reformulation : | |
- Ne pas utiliser : "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 pas utiliser "Look" et ses variantes dans un contexte de décoration. | |
- Ne pas commencer une phrase par : "Il existe", "Il faut", "Cependant", "De plus", "En revanche", "Néanmoins", "Toutefois", "Imaginez" ou leurs variantes. | |
- Ne pas associer : "Joue un rôle", "Il est", "Est une étape" à des mots tels que "Important", "Essentiel", "Crucial", "Primordial", "Fondamental", "Indispensable", "Déterminant". | |
- Ne pas commencer une phrase par : "En plus" ou ses variantes. | |
6. Justifier les reformulations proposées en expliquant comment elles améliorent le style et rendent la phrase plus fluide, neutre et professionnelle sans insister sur la permission ou l'autorité. | |
Exemples d'erreurs à corriger : | |
- "Vous pouvez soumettre votre rapport à l'adresse suivante", mais on dit "Soumettez votre rapport à l'adresse suivante." | |
- "Il vous faut vérifier les données avant la publication", mais on dit "Vérifiez les données avant la publication." | |
- "Vous avez la possibilité de choisir entre plusieurs options", mais on dit "Choisissez entre plusieurs options." | |
Votre 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", | |
"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." | |
}} | |
], | |
"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} | |
Assurez-vous que les indices correspondent aux positions exactes dans le texte original et que le JSON est correctement formaté. | |
{format_instruction} | |
""" | |
def vous_pouvez(text): | |
# Créer le template avec la variable text intégrée directement | |
prompt_template = vous_pouvez_prompt_template() | |
output_parser = PydanticOutputParser(pydantic_object=DetectionResult) | |
# Créer le prompt avec le texte intégré | |
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 | |
# 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) | |
# Générer le prompt final | |
final_prompt = gen_prompt_template.format(text=text) | |
# Retourne les suggestions ou les erreurs de parsing | |
return { | |
"result": json_result, | |
"prompt": final_prompt | |
} | |