File size: 5,342 Bytes
084782e
 
 
 
5430171
084782e
 
5430171
084782e
 
 
 
 
 
5430171
084782e
 
 
 
 
 
 
 
 
5430171
 
 
 
 
 
 
 
 
 
 
 
 
084782e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5430171
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
138
139
140
import torch
import gradio as gr
from threading import Thread
from typing import Iterator
from transformers import AutoModelForCausalLM, AutoTokenizer, TextIteratorStreamer, pipeline

model_id = "meta-llama/Llama-2-7b-chat-hf"
model = AutoModelForCausalLM.from_pretrained(model_id, torch_dtype=torch.float16, device_map="auto")
tokenizer = AutoTokenizer.from_pretrained(model_id)
tokenizer.use_default_system_prompt = False

def generar_respuesta(
    mensaje: str,
    historial_chat: list[tuple[str, str]],
    max_tokens_nuevos: int = 512,
    temperatura: float = 0.6,
    top_p: float = 0.9,
    top_k: int = 50,
    penalización_repetición: float = 1.2,
) -> Iterator[str]:

    # Preparamos la conversación en un formato adecuado
    conversacion = []

    mensaje_sistema = '''Eres un chatbot llamado EDUAI. Fuiste desarrollado por la universidad Yachay Tech. Tu misión es dar ayuda a los estudiantes de matemáticas de colegios y universidad.

    Debes de seguir las siguientes reglas de manera estricta.

    1. Eres un asistente, no eres un usuario. Responde como asistente.
    2. Tus respuestas son amables. Concisas y rápidas.
    3. No saludas en cada respuesta, solo responde la pregunta que realiza el usuario.
    4. Anima al estudiante a seguir aprendiendo continuamente.
    5. Responde en español siempre.
    6. Tus respuestas son en formato markdown y con viñetas.
    7. Usa los siguientes ejercicios y material audiovisual para complementar tu respuesta, de no existir algo que mostrar no escribas nada.

    '''

    # Si hay un mensaje del sistema, lo agregamos a la conversación
    if mensaje_sistema:
        conversacion.append({"role": "system", "content": mensaje_sistema})

    # Luego, agregamos los mensajes del usuario y el asistente del historial de chat
    for usuario, asistente in historial_chat:
        conversacion.extend([{"role": "user", "content": usuario}, {"role": "assistant", "content": asistente}])

    # Por último, agregamos el mensaje del usuario actual
    conversacion.append({"role": "user", "content": mensaje})

    # Convertimos la conversación en tokens de entrada utilizando el tokenizador
    input_ids = tokenizer.apply_chat_template(conversacion, return_tensors="pt")

    # Si la longitud de los tokens de entrada excede un límite, los recortamos
    if input_ids.shape[1] > 2048:
        input_ids = input_ids[:, -2048:]
        #gr.Advertencia(f"Se recortó la entrada de la conversación, ya que era más larga que {2048} tokens.")

    # Transferimos los tokens de entrada al dispositivo del modelo
    input_ids = input_ids.to(model.device)

    # Configuramos un "streamer" para obtener las respuestas en tiempo real
    streamer = TextIteratorStreamer(tokenizer, timeout=10.0, skip_prompt=True, skip_special_tokens=True)

    # Definimos los parámetros para generar la respuesta
    generate_kwargs = dict(
        {"input_ids": input_ids},
        streamer=streamer,
        max_new_tokens=max_tokens_nuevos,
        do_sample=True,
        top_p=top_p,
        top_k=top_k,
        temperature=temperatura,
        num_beams=1,
        repetition_penalty=penalización_repetición,
    )

    t = Thread(target=model.generate, kwargs=generate_kwargs)
    t.start()

    # Inicializamos una lista para almacenar las salidas
    salidas = []

    # Recorremos las respuestas obtenidas del "streamer" y las agregamos a la lista
    for texto in streamer:
        salidas.append(texto)
        # Generamos la salida acumulada hasta el momento
        yield "".join(salidas)

def vote(data: gr.LikeData):
    if data.liked:
        print("Fue util: " + data.value)
    else:
        print("No fue util: " + data.value)

# Crear instancias de ChatInterface para cada materia
chat_interface_math = gr.ChatInterface(
    generar_respuesta,
    title="EDUAI-BOT: Asistente de Chat (Matemáticas)",
    description="¡Bienvenido a EDUAI-BOT! Estoy aquí para ayudarte con preguntas de matemáticas.",
    theme="dark",
    examples=[["¿Puedes ayudarme con álgebra?"]],
)

chat_interface_fisica = gr.ChatInterface(
    generar_respuesta,
    title="EDUAI-BOT: Asistente de Chat (Física)",
    description="¡Bienvenido a EDUAI-BOT! Estoy aquí para ayudarte con preguntas de física.",
    theme="dark",
    examples=[["¿Qué es la ley de Newton?"]],
)

chat_interface_quimica = gr.ChatInterface(
    generar_respuesta,
    title="EDUAI-BOT: Asistente de Chat (Química)",
    description="¡Bienvenido a EDUAI-BOT! Estoy aquí para ayudarte con preguntas de química.",
    theme="dark",
    examples=[["¿Qué es una reacción de síntesis?"]],
)

chat_interface_biologia = gr.ChatInterface(
    generar_respuesta,
    title="EDUAI-BOT: Asistente de Chat (Biología)",
    description="¡Bienvenido a EDUAI-BOT! Estoy aquí para ayudarte con preguntas de biología.",
    theme="dark",
    examples=[["Explícame la fotosíntesis."]],
)

chat_interface_ingles = gr.ChatInterface(
    generar_respuesta,
    title="EDUAI-BOT: Asistente de Chat (Inglés)",
    description="¡Bienvenido a EDUAI-BOT! Estoy aquí para ayudarte con preguntas de inglés.",
    theme="dark",
    examples=[["Translate 'hello' to Spanish."]],
)

with gr.Blocks() as demo:
    chat_interface_math.render()

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