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