authoring-app / pattern_permettre.py
FerdinandPyCode's picture
first commit
55f834a
raw
history blame
6.07 kB
from langchain.prompts import PromptTemplate
from langchain.output_parsers import PydanticOutputParser
from pydantic import BaseModel, Field
from typing import List, Tuple
from langchain.chat_models import ChatOpenAI
import json
# Modèle de sortie (adapté pour la détection des formes du verbe "permettre" avec reformulations)
class PermettreDetection(BaseModel):
pattern: str = Field(..., description="Forme verbale du verbe 'permettre' détectée.")
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.")
alternative_suggestions: List[str] = Field(..., description="Suggestions alternatives pour la reformulation de la phrase.")
def to_dict(self):
return {
"pattern": self.pattern,
"indices": self.indices,
"sentence": self.sentence,
"alternative_suggestions": self.alternative_suggestions
}
class Summary(BaseModel):
total_patterns_detected: int = Field(..., description="Nombre total de formes du verbe 'permettre' détectées.")
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[PermettreDetection] = Field(..., description="Liste des formes verbales détectées.")
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 avec reformulations
def permettre_prompt_template():
return """
Tu es un détecteur de texte AI très performant et précis. Ta mission est la suivante :
- **Objectif :** Identifier toutes les formes conjuguées du verbe **"permettre"** dans le texte ci-dessous (ex : **"permet"**, **"permettra"**, **"permis"** en tant que verbe, etc.).
- **Exclusions :** Ignore les cas où **"permis"** est utilisé comme **nom commun** (ex : **"permis de conduire"**, **"permis de construire"**, etc.).
**Instructions supplémentaires :**
- Analyse grammaticale : identifie les mots dont le **lemme** est **"permettre"**.
- Ne pas considérer **"permis"** comme nom commun, mais bien comme verbe uniquement.
- Couvre toutes les formes verbales, y compris les participes passés, infinitifs, et les temps futurs, présents, etc.
- Ne pas dupliquer les détections des mêmes formes verbales.
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 "permettre" 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",
- "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 le suivant :
```{text}```
\n{format_instruction}
"""
def permettre_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=permettre_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
}