|
import gradio as gr |
|
import torch |
|
from transformers import AutoModelForCausalLM, AutoTokenizer, MarianMTModel, MarianTokenizer |
|
import time |
|
from functools import wraps |
|
import sys |
|
import os |
|
|
|
|
|
def medir_tiempo(func): |
|
@wraps(func) |
|
def wrapper(*args, **kwargs): |
|
inicio = time.time() |
|
resultado = func(*args, **kwargs) |
|
fin = time.time() |
|
tiempo_transcurrido = fin - inicio |
|
print(f"Tiempo de ejecución de '{func.__name__}': {tiempo_transcurrido:.2f} segundos") |
|
return resultado |
|
return wrapper |
|
|
|
|
|
device = "cuda" if torch.cuda.is_available() else "cpu" |
|
if device == "cpu": |
|
print("Advertencia: CUDA no está disponible. Se usará la CPU, lo que puede ser lento.") |
|
|
|
|
|
hf_token = os.getenv("HUGGINGFACE_TOKEN") |
|
if not hf_token: |
|
print("Error: El token de Hugging Face no está configurado en los secretos.") |
|
sys.exit(1) |
|
|
|
|
|
model_name = "dmis-lab/selfbiorag_7b" |
|
|
|
try: |
|
print("Cargando el tokenizador y el modelo de generación desde HuggingFace...") |
|
tokenizer_gen = AutoTokenizer.from_pretrained(model_name, use_auth_token=hf_token) |
|
model_gen = AutoModelForCausalLM.from_pretrained( |
|
model_name, |
|
torch_dtype=torch.float16 if device == "cuda" else torch.float32, |
|
use_auth_token=hf_token |
|
).to(device) |
|
except ValueError as e: |
|
print(f"Error al cargar el tokenizador de generación: {e}") |
|
sys.exit(1) |
|
except Exception as e: |
|
print(f"Error al cargar el modelo de generación: {e}") |
|
sys.exit(1) |
|
|
|
|
|
|
|
translation_models = { |
|
"Español": "Helsinki-NLP/opus-mt-en-es", |
|
"Portugués": "Helsinki-NLP/opus-mt-en-pt", |
|
"Francés": "Helsinki-NLP/opus-mt-en-fr", |
|
"Alemán": "Helsinki-NLP/opus-mt-en-de", |
|
|
|
} |
|
|
|
|
|
tokenizer_trans = {} |
|
model_trans = {} |
|
|
|
for lang, model_name_trans in translation_models.items(): |
|
try: |
|
print(f"Cargando el tokenizador y el modelo de traducción para {lang} desde HuggingFace...") |
|
tokenizer = MarianTokenizer.from_pretrained(model_name_trans, use_auth_token=hf_token) |
|
model = MarianMTModel.from_pretrained(model_name_trans, use_auth_token=hf_token).to(device) |
|
tokenizer_trans[lang] = tokenizer |
|
model_trans[lang] = model |
|
except Exception as e: |
|
print(f"Error al cargar el modelo de traducción para {lang}: {e}") |
|
sys.exit(1) |
|
|
|
@medir_tiempo |
|
def generar_y_traducir_respuesta(consulta, idioma_destino): |
|
""" |
|
Función que genera una respuesta a partir de una consulta dada y la traduce al idioma seleccionado. |
|
""" |
|
try: |
|
if not consulta.strip(): |
|
return "Por favor, ingresa una consulta válida.", "" |
|
|
|
|
|
inputs = tokenizer_gen.encode(consulta, return_tensors="pt").to(device) |
|
|
|
|
|
generation_kwargs = { |
|
"max_new_tokens": 100, |
|
"do_sample": False |
|
|
|
} |
|
|
|
|
|
with torch.no_grad(): |
|
outputs = model_gen.generate(input_ids=inputs, **generation_kwargs) |
|
|
|
|
|
respuesta_en = tokenizer_gen.decode(outputs[0], skip_special_tokens=True, clean_up_tokenization_spaces=True) |
|
|
|
|
|
if idioma_destino in translation_models: |
|
tokenizer_tr = tokenizer_trans[idioma_destino] |
|
model_tr = model_trans[idioma_destino] |
|
|
|
|
|
traducir_inputs = tokenizer_tr.encode(respuesta_en, return_tensors="pt").to(device) |
|
|
|
|
|
with torch.no_grad(): |
|
traduccion_outputs = model_tr.generate(input_ids=traducir_inputs, max_length=512) |
|
|
|
|
|
respuesta_traducida = tokenizer_tr.decode(traduccion_outputs[0], skip_special_tokens=True, clean_up_tokenization_spaces=True) |
|
else: |
|
respuesta_traducida = "Idioma de destino no soportado." |
|
|
|
return respuesta_en, respuesta_traducida |
|
except Exception as e: |
|
print(f"Error durante la generación o traducción de la respuesta: {e}") |
|
return f"Error al generar la respuesta: {e}", "" |
|
|
|
|
|
titulo = "Generador y Traductor de Respuestas con SelfBioRAG 7B" |
|
descripcion = ( |
|
"Ingresa una consulta y el modelo generará una respuesta en inglés. " |
|
"Luego, puedes seleccionar un idioma para traducir la respuesta generada." |
|
) |
|
|
|
idiomas_disponibles = list(translation_models.keys()) |
|
|
|
iface = gr.Interface( |
|
fn=generar_y_traducir_respuesta, |
|
inputs=[ |
|
gr.Textbox(lines=5, placeholder="Escribe tu consulta aquí...", label="Consulta"), |
|
gr.Dropdown(choices=idiomas_disponibles, value="Español", label="Idioma de Traducción") |
|
], |
|
outputs=[ |
|
gr.Textbox(label="Respuesta en Inglés"), |
|
gr.Textbox(label="Respuesta Traducida") |
|
], |
|
title=titulo, |
|
description=descripcion, |
|
examples=[ |
|
[ |
|
"Clasifica el siguiente informe de radiología según la parte del cuerpo a la que se refiere (por ejemplo, pecho, abdomen, cerebro, etc.): Los discos intervertebrales en L4-L5 y L5-S1 muestran signos de degeneración con leve abultamiento que comprime la raíz nerviosa adyacente.", |
|
"Español" |
|
], |
|
[ |
|
"Resume los puntos clave sobre el papel de las mutaciones en los genes BRCA1 y BRCA2 en el aumento del riesgo de cáncer de mama.", |
|
"Portugués" |
|
] |
|
], |
|
cache_examples=False |
|
) |
|
|
|
|
|
if __name__ == "__main__": |
|
iface.launch() |
|
|