EDUCHAT-AI / app.py
Zethearc's picture
Update app.py
5430171
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)