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)