authoring-app / pattern_important_crucial.py
FerdinandPyCode's picture
first commit
55f834a
from langchain.prompts import PromptTemplate
from langchain.output_parsers import PydanticOutputParser
from pydantic import BaseModel, Field
from typing import List, Tuple
import json
from langchain.chat_models import ChatOpenAI
# Modèle de sortie pour la détection des expressions exprimant l'importance, la nécessité, ou l'urgence
class ImportanceDetection(BaseModel):
pattern: str = Field(..., description="Mot ou expression détectée exprimant l'importance, la nécessité ou l'urgence.")
indices: List[Tuple[int, int]] = Field(..., description="Indices de début et de fin pour chaque occurrence dans le texte.")
sentence: str = Field(..., description="Phrase complète où l'expression apparaît.")
meaning: str = Field(..., description="Sens exprimé par l'expression.")
alternative_suggestions: List[str] = Field(..., description="Suggestions alternatives pour reformuler la phrase.")
def to_dict(self):
return {
"pattern": self.pattern,
"indices": self.indices,
"sentence": self.sentence,
"meaning": self.meaning,
"alternative_suggestions": self.alternative_suggestions
}
class Summary(BaseModel):
total_patterns_detected: int = Field(..., description="Nombre total de patterns détectés.")
alternative_suggestions_provided: int = Field(..., description="Nombre total de suggestions fournies.")
occurrences: int = Field(..., description="Nombre total d'occurrences trouvées dans le texte.")
def to_dict(self):
return {
"total_patterns_detected": self.total_patterns_detected,
"alternative_suggestions_provided": self.alternative_suggestions_provided,
"occurrences": self.occurrences
}
class DetectionResult(BaseModel):
patterns: List[ImportanceDetection] = Field(..., description="Liste des mots ou expressions détectés.")
summary: Summary = Field(..., description="Résumé de la détection.")
def to_dict(self):
return {
"patterns": [pattern.to_dict() for pattern in self.patterns],
"summary": self.summary.to_dict()
}
# Création du template pour la détection des expressions d'importance, de nécessité ou d'urgence
def importance_prompt_template():
return """
Vous êtes un détecteur de texte IA extrêmement rigoureux. Votre tâche consiste à analyser le texte suivant et à identifier **toutes** les occurrences de mots, expressions, ou locutions exprimant **l'importance**, **la nécessité**, **l'urgence**, ou **le caractère indispensable** d'un élément.
Vous devez inclure :
1. **Adjectifs** (tels que) : "crucial", "essentiel", "important", "fondamental", "primordial", "indispensable", "nécessaire", "vital", "pivotal", "majeur", "clé", "significatif", "déterminant", "incontournable", "impératif", "obligatoire", "capital", "prépondérant", "stratégique", "marquant", "décisif", "inévitable", "urgent", etc.
2. **Adverbes** (tels que) : "essentiellement", "crucialement", "fondamentalement", "nécessairement", "impérativement", "urgemment", etc.
3. **Locutions et expressions** (telles que) : "de la plus haute importance", "d'une importance capitale", "de première nécessité", "il est urgent de", "il est vital que", "à ne pas négliger", "absolument nécessaire", "infiniment précieux", etc.
4. **Variations grammaticales** : toutes les formes grammaticales, incluant le féminin, masculin, singulier, pluriel, et les variations de temps, doivent être prises en compte.
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.
- Expliquer pourquoi ces expressions peuvent alourdir ou rendre l'introduction trop familière, directe ou directive.
- Proposer deux reformulations plus simples, fluides et naturelles pour rendre la phrase plus concise ou directe,
en évitant d'utiliser l'expression ou ses variantes. Assurez-vous que la reformulation conserve le sens original
tout en étant plus formelle et professionnelle.
Assurez-vous également de respecter les règles suivantes :
1. Les expressions comme "crucial", "essentiel", "important", "fondamental" ne doivent pas être utilisées plus d'une fois dans l'introduction.
2. Les expressions comme "il existe", "il faut", "cependant", "de plus", "en revanche", "néanmoins", "toutefois" ne doivent pas être utilisées en début de phrase.
3. Les expressions comme "joue un rôle", "il est", ou "est une étape" ne doivent pas être associées à des adjectifs tels qu'"important", "essentiel", etc.
4. "En plus" ne doit pas être utilisé seul en début de phrase.
**Format de sortie requis :**
- "pattern": "mot ou expression détectée",
- "indices": [[index de début, index de fin pour chaque occurrence]],
- "sentence": "phrase où l'expression est utilisée",
- "meaning": "Sens exprimé",
- "alternative_suggestions": ["suggestion 1", "suggestion 2"]
Si aucun pattern n'est trouvé, retournez un JSON avec :
- "pattern0": "",
- "occurrences": 0,
À la fin, ajoutez un résumé avec :
- "total_patterns_detected": nombre total de patterns détectés,
- "alternative_suggestions_provided": nombre de suggestions données,
- "occurrences": nombre d'occurrences.
Le texte à analyser est :
```{text}```
{format_instruction}
"""
def importance_detection(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=importance_prompt_template(),
partial_variables={'format_instruction': output_parser.get_format_instructions()}
)
# Création du modèle de langage (avec LLM)
llm = ChatOpenAI(model='gpt-4o', 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
}