authoring-app / pattern_voici_decouvrez.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 "VOICI" et "DÉCOUVREZ"
class ReformulationDetail(BaseModel):
original: str = Field(..., description="Phrase originale contenant 'VOICI' ou 'DÉCOUVREZ'.")
explanation: str = Field(..., description="Explication sur pourquoi l'expression alourdit la phrase.")
reformulation_1: str = Field(..., description="Reformulation basée sur l'approche Anticipation/Intrigue.")
reformulation_2: str = Field(..., description="Reformulation basée sur l'approche Conversationnel.")
reformulation_3: str = Field(..., description="Reformulation basée sur l'approche Accompagnement doux.")
def to_dict(self):
return {
"original": self.original,
"explanation": self.explanation,
"reformulation_1": self.reformulation_1,
"reformulation_2": self.reformulation_2,
"reformulation_3": self.reformulation_3,
}
class Summary(BaseModel):
total_occurrences: int = Field(..., description="Nombre total d'occurrences de 'VOICI' et 'DÉCOUVREZ'.")
reformulations_provided: int = Field(..., description="Nombre de reformulations proposées.")
def to_dict(self):
return {
"total_occurrences": self.total_occurrences,
"reformulations_provided": self.reformulations_provided,
}
class DetectionResult(BaseModel):
reformulations: List[ReformulationDetail] = Field(..., description="Liste des reformulations proposées pour chaque occurrence.")
summary: Summary = Field(..., description="Résumé de la détection.")
def to_dict(self):
return {
"reformulations": [reformulation.to_dict() for reformulation in self.reformulations],
"summary": self.summary.to_dict()
}
# Création du template pour la détection de l'utilisation de "VOICI" et "DÉCOUVREZ" à la fin d'une introduction
def voici_decouvrez_prompt_template():
return """
Tu es un éditeur de texte IA extrêmement performant et rigoureux. Ta tâche est d'analyser **précisément** le texte fourni pour détecter **toutes les occurrences** des expressions **"VOICI"** et **"DÉCOUVREZ"** situées **à la fin d'une introduction**.
L'introduction , c'est le premier paragraphe.
Pour chaque occurrence identifiée, tu dois obligatoirement :
1. **Citer exactement** la phrase originale contenant "VOICI" ou "DÉCOUVREZ".
2. **Expliquer brièvement et clairement** pourquoi l'utilisation de ce terme peut alourdir ou rendre la transition vers le contenu moins fluide.
3. **Proposer trois reformulations distinctes**, selon les approches suivantes :
- **Anticipation/Intrigue** : Créer de l'attente ou de l'intrigue pour susciter l'intérêt du lecteur.
- **Conversationnel** : Formuler la phrase de manière plus engageante et naturelle.
- **Accompagnement doux** : Offrir une transition progressive et moins directive vers le contenu.
### Format attendu pour chaque occurrence :
- **Original** : "[Phrase originale]"
- **Explication** : "[Explication concise]"
- **Reformulation 1 (Anticipation/Intrigue)** : "[Reformulation ici]"
- **Reformulation 2 (Conversationnel)** : "[Reformulation ici]"
- **Reformulation 3 (Accompagnement doux)** : "[Reformulation ici]"
Le texte à analyser est le suivant :
```{text}```
Le format de la sortie doit être en JSON.
```{format_instruction}```
"""
def detect_voici_decouvrez(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=voici_decouvrez_prompt_template(),
partial_variables={'format_instruction': output_parser.get_format_instructions()}
)
# Création du modèle de langage (avec LLM)
llm = ChatOpenAI(model='gpt-4', 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
}