Spaces:
Sleeping
Sleeping
from langchain.prompts import PromptTemplate | |
from langchain.output_parsers import PydanticOutputParser | |
from pydantic import BaseModel, Field | |
from typing import List | |
import json | |
from langchain.chat_models import ChatOpenAI | |
# Modèle de sortie pour la détection de l'expression "en plus" en début de phrase | |
class ReformulationDetail(BaseModel): | |
original: str = Field(..., description="Phrase originale contenant 'en plus' en début de phrase.") | |
explanation: str = Field(..., description="Explication sur pourquoi l'expression 'en plus' est mal placée en début de phrase.") | |
reformulation_1: str = Field(..., description="Reformulation de la phrase avec 'en plus' déplacé.") | |
reformulation_2: str = Field(..., description="Seconde reformulation de la phrase.") | |
reformulation_3: str = Field(..., description="Troisième reformulation de la phrase.") | |
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 'en plus' détectées.") | |
reformulations_provided: int = Field(..., description="Nombre de reformulations fournies.") | |
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.") | |
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 "en plus" en début de phrase | |
def en_plus_prompt_template(): | |
return """ | |
Vous êtes un éditeur de texte IA extrêmement rigoureux. Votre tâche est d'analyser **précisément** le texte fourni pour détecter **toutes les occurrences** de l'expression **"en plus"** utilisée **en début de phrase**, sans "de". | |
Pour chaque phrase trouvée, vous devez impérativement : | |
1. **Citer exactement** la phrase originale contenant "en plus". | |
2. **Expliquer brièvement et clairement** pourquoi "en plus" est mal placé en début de phrase et préciser qu'il doit être reformulé au cœur de la phrase. | |
3. **Proposer trois alternatives plus correctes**, telles que "de plus", "en outre", "par ailleurs", "aussi", mais **placées au milieu de la phrase**. | |
4. **Assurer** que chaque reformulation est **fluide**, **naturelle** et que l'alternative n'est pas placée au début ou à la fin de la phrase. | |
**Consignes supplémentaires :** | |
- **Ne pas ajouter** d'informations ou de commentaires non demandés. | |
- Présenter les résultats de manière **claire**, **structurée** et en respectant le format indiqué. | |
- **Ne pas analyser** ou modifier d'autres parties du texte que les phrases contenant "en plus" en début de phrase. | |
### Format attendu pour chaque occurrence : | |
- **Original** : "[Phrase originale]" | |
- **Explication** : "[Explication concise]" | |
- **Reformulation 1** : "[Reformulation ici]" | |
- **Reformulation 2** : "[Reformulation ici]" | |
- **Reformulation 3** : "[Reformulation ici]" | |
Le texte à analyser est le suivant : | |
```{text}``` | |
{format_instruction} | |
""" | |
def detect_en_plus(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=en_plus_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 | |
} | |