File size: 4,629 Bytes
8824f88
 
 
749d210
8824f88
 
 
 
 
 
 
b723c84
8824f88
 
 
 
7cb6017
8824f88
 
749d210
8824f88
 
 
 
 
73e29aa
 
 
 
 
a18bfe3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
73e29aa
 
 
 
 
 
8824f88
73e29aa
 
0737a9d
73e29aa
0737a9d
 
34353a1
0737a9d
8824f88
5af899b
8824f88
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
73e29aa
749d210
8824f88
 
 
73e29aa
 
 
 
 
 
 
 
a18bfe3
8824f88
749d210
 
 
8824f88
 
 
13de298
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
#!/usr/bin/env python

import os
from collections.abc import Iterator
from threading import Thread

import gradio as gr
import spaces
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, TextIteratorStreamer

DESCRIPTION = " "

if not torch.cuda.is_available():
    DESCRIPTION += "\n<p>Running on CPU 🥶 This demo does not work on CPU.</p>"

MAX_INPUT_TOKEN_LENGTH = int(os.getenv("MAX_INPUT_TOKEN_LENGTH", "4096"))

if torch.cuda.is_available():
    model_id = "mistralai/Mistral-7B-Instruct-v0.3"
    model = AutoModelForCausalLM.from_pretrained(model_id, torch_dtype=torch.float16, device_map="auto")
    tokenizer = AutoTokenizer.from_pretrained(model_id)


@spaces.GPU
def generate(message: str, chat_history: list[dict]) -> Iterator[str]:
    """Fonction de génération sans sliders : les paramètres
    de génération (max_new_tokens, température, etc.) sont
    fixés en dur.
    """
    # Vérifier si la question correspond exactement à celle pour laquelle on souhaite une réponse fixe
    if message.strip().lower() == "c’est quoi le consentement ? comment savoir si ma copine a envie de moi ?":
        fixed_response = """Le consentement, pour exister, doit passer par : 

Le questionnement de soi-même : il semble nécessaire de s'intéresser à ce que l’on veut précisément et ce que l’on ne veut pas. Savoir clairement ce que l’on veut faire permet d’être en capacité de le dire à l’autre à haute voix.

Le questionnement de l’autre sur ses envies (clique sur le nuage comment demander le consentement de l’autre si tu veux plus de détails).

Le respect de son corps et du corps de l’autre, ainsi que de ses envies : faire quelque chose qui n’est pas expressément désiré par l’autre, tu ne feras point.

⚠️ Attention : Le consentement se limite à un moment donné. Tu as le droit de ne pas consentir à une pratique spécifique, de ne plus consentir au rapport sexuel même après avoir donné ton consentement. Tu es précieux. Ainsi, il n’existe pas de devoir sexuel : aucun acte n’est dû à l’autre dans toutes les situations. Le consentement se périme. Il n’existe que de manière temporaire et pour une action particulière.
👉 Comment s’assurer de son consentement ? 
Retournes sur la page principale et cliques sur le nuage correspondant pour voir toutes les façon de faire. Choisis ce qui te convient et ce qui te rend à l’aise 😌"""
        yield fixed_response
        return

    # Valeurs par défaut fixées
    max_new_tokens = 1024
    temperature = 0.6
    top_p = 0.9
    top_k = 50
    repetition_penalty = 1.2

    # Prépare la conversation
    conversation = [*chat_history, {"role": "user", "content": message}]
    input_ids = tokenizer.apply_chat_template(conversation, return_tensors="pt")

    if input_ids.shape[1] > MAX_INPUT_TOKEN_LENGTH:
        input_ids = input_ids[:, -MAX_INPUT_TOKEN_LENGTH:]
        gr.Warning(f"Trimmed input from conversation as it was longer than {MAX_INPUT_TOKEN_LENGTH} tokens.")
    input_ids = input_ids.to(model.device)

    streamer = TextIteratorStreamer(tokenizer, timeout=20.0, skip_prompt=True, skip_special_tokens=True)
    generate_kwargs = dict(
        {"input_ids": input_ids},
        streamer=streamer,
        max_new_tokens=max_new_tokens,
        do_sample=True,
        top_p=top_p,
        top_k=top_k,
        temperature=temperature,
        num_beams=1,
        repetition_penalty=repetition_penalty,
    )
    t = Thread(target=model.generate, kwargs=generate_kwargs)
    t.start()

    outputs = []
    for text in streamer:
        outputs.append(text)
        yield "".join(outputs)


# On ne fournit plus 'additional_inputs' ici, donc aucun slider ne sera affiché
demo = gr.ChatInterface(
    fn=generate,
    stop_btn=None,
    examples=[
        ["C’est quoi le consentement ? Comment savoir si ma copine a envie de moi ?"],
        ["C’est quoi une agression sexuelle ?"],
        ["C’est quoi un viol ?"],
        ["C’est quoi un attouchement ?"],
        ["C’est quoi un harcèlement sexuel ?"],
        ["Est-ce illégal de visionner du porno ?"],
        ["Mon copain me demande un nude, dois-je le faire ?"],
        ["Mon ancien copain me menace de poster des photos de moi nue sur internet, que faire ?"],
        ["Que puis-je faire si un membre de ma famille me touche d’une manière bizarre, mais que j’ai peur de parler ou de ne pas être cru ?"],
    ],
    type="messages",
    description=DESCRIPTION,
    css_paths="style.css",
)

if __name__ == "__main__":
    demo.queue(max_size=20).launch(share=True)