File size: 4,884 Bytes
55f834a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
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
    }