Spaces:
Runtime error
Runtime error
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) |