File size: 4,674 Bytes
5b69b8e
 
a2a4c59
5b69b8e
8ab6a28
5b69b8e
d180c5e
 
87548ef
0765bc5
 
7cf976d
8ab6a28
 
 
 
f0ceea8
8ab6a28
5b69b8e
 
d180c5e
 
a2a4c59
 
5b69b8e
 
 
 
 
 
 
 
 
 
 
 
 
 
0198d09
 
 
5b69b8e
 
 
a2a4c59
 
5b69b8e
 
d180c5e
 
 
87548ef
 
 
 
 
8ab6a28
5b69b8e
 
d180c5e
5b69b8e
 
 
 
 
 
 
 
 
 
8ab6a28
5b69b8e
 
 
26e4c05
5b69b8e
26e4c05
5b69b8e
 
8ab6a28
5b69b8e
 
 
 
 
 
 
 
8ab6a28
5b69b8e
 
 
 
 
 
 
 
8ab6a28
5b69b8e
 
 
8ab6a28
d180c5e
 
 
 
8ab6a28
5b69b8e
8ab6a28
d180c5e
5b69b8e
d180c5e
f2f55bf
11c4d5c
5b69b8e
9d2eef8
8ab6a28
5b69b8e
af14f14
b728085
 
 
 
ccedfec
d180c5e
 
 
a2a4c59
0765bc5
d180c5e
 
 
0765bc5
d180c5e
 
a2a4c59
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
from huggingface_hub import InferenceClient
import gradio as gr
import threading

client = InferenceClient("mistralai/Mixtral-8x7B-Instruct-v0.1")

# Variables para controlar el estado de la conversación
conversation_started = False
conversation_ongoing = True
system_prompt = "Asistente para los usuarios y clientes de la empresa Canal de Isabel II, https://oficinavirtual.canaldeisabelsegunda.es/"

def format_prompt(message, history, system_prompt):
    prompt = "<s>"
    for user_prompt, bot_response in history:
        prompt += f"[INST] {user_prompt} [/INST]"
        prompt += f" {bot_response}</s> "
    prompt += f"[INST] {system_prompt}, {message} [/INST]"
    return prompt

def generate(
    prompt, history, system_prompt, temperature=0.9, max_new_tokens=4096, top_p=0.95, repetition_penalty=1.0,
):
    global conversation_started, conversation_ongoing

    temperature = float(temperature)
    if temperature < 1e-2:
        temperature = 1e-2
    top_p = float(top_p)

    generate_kwargs = dict(
        temperature=temperature,
        max_new_tokens=max_new_tokens,
        top_p=top_p,
        repetition_penalty=repetition_penalty,
        do_sample=True,
        seed=42,
    )

    formatted_prompt = format_prompt(prompt, history, system_prompt)
    stream = client.text_generation(formatted_prompt, **generate_kwargs, stream=True, details=True, return_full_text=False)
    output = ""

    for response in stream:
        output += response.token.text
        if "¡Hasta luego!" in response.token.text:  # Puedes ajustar este condicional según las respuestas de tu modelo
            conversation_ongoing = False
        yield output

def start_conversation():
    global conversation_started
    conversation_started = True

def end_conversation():
    global conversation_ongoing
    conversation_ongoing = False

additional_inputs = [
    gr.Textbox(
        label="System Prompt",
        value=system_prompt,
        max_lines=1,
        interactive=True,
    ),
    gr.Slider(
        label="Temperature",
        value=0.9,
        minimum=0.0,
        maximum=1.0,
        step=0.05,
        interactive=True,
        info="Valores más altos producen resultados más diversos",
    ),
    gr.Slider(
        label="Max new tokens",
        value=4096,
        minimum=0,
        maximum=4096,
        step=64,
        interactive=True,
        info="El máximo número de nuevos tokens",
    ),
    gr.Slider(
        label="Top-p (nucleus sampling)",
        value=0.90,
        minimum=0.0,
        maximum=1,
        step=0.05,
        interactive=True,
        info="Valores más altos muestrean más tokens de baja probabilidad",
    ),
    gr.Slider(
        label="Repetition penalty",
        value=1.2,
        minimum=1.0,
        maximum=2.0,
        step=0.05,
        interactive=True,
        info="Penaliza los tokens repetidos",
    )
]

examples = [
    ["Quiero que me verifiquen el contador de agua de mi vivienda", system_prompt, 0.7, 1500, 0.80, 1.1],
    ["Muestrame un cuadro con las tarifas que se aplican en el abastecimiento, depuración y alcantarillado ", system_prompt, 0.8, 4096, 0.85, 1.2],
    ["¿Qué es una acometida?", system_prompt, 0.7, 1800, 0.75, 1.2],
    ["¿Qué teléfono tiene para averías, información y página web?", system_prompt, 0.8, 2048, 0.80, 1.1],
]

# Crear una interfaz de chat Gradio con el modelo generativo
iface = gr.ChatInterface(
    fn=generate,
    chatbot=gr.Chatbot(avatar_images=["./15f4b2d3-c4f4-4a29-93cd-e47214953bd9.png", "./botm.png"], bubble_full_width=False, show_label=False, show_share_button=False, show_copy_button=True, likeable=True, layout="panel", height=500),
    textbox=gr.Textbox(placeholder="¿Qué parámetros definen la calidad del agua?", container=False, scale=7),
    theme="soft",
    additional_inputs=additional_inputs,
    title="Mixtral 8B Fines didácticos Asistente de usuarios/clientes de Canal de Isabel ll",
    description='Autor: <a href=\"https://huggingface.co/Antonio49\">Antonio Fernández</a> de <a href=\"https://saturdays.ai/\">SaturdaysAI</a>. Formación: <a href=\"https://cursos.saturdays.ai/courses/\">Cursos Online AI</a> Aplicación desarrollada con fines docentes',
    examples=examples,
    cache_examples=True,
    retry_btn="Repetir",
    undo_btn="Deshacer",
    clear_btn="Borrar",
    submit_btn="Enviar",
    concurrency_limit=20,
)

# Iniciar un hilo de conversación inicial
threading.Thread(target=start_conversation).start()

# Actualizar la interfaz después de la conversación inicial
while not conversation_started:
    iface.update()

# Iniciar la interfaz principal
iface.launch(show_api=False)