from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import PeftModel
import gradio as gr
import os
import torch
device = "cuda" if torch.cuda.is_available() else "cpu"
# Asegúrate de que tu token de Hugging Face está cargado como una variable de entorno
hf_token = os.environ.get("token")
if hf_token is not None:
from huggingface_hub import HfFolder
HfFolder.save_token(hf_token)
# Configuración inicial
tokenizer = AutoTokenizer.from_pretrained("somosnlp/chaterapia_model")
model_base = AutoModelForCausalLM.from_pretrained("google/gemma-2b-it").to(device)
model_base.resize_token_embeddings(len(tokenizer))
model_with_adapter = PeftModel.from_pretrained(model_base, "somosnlp/chaterapia_model").to(device)
CHAT_TEMPLATE= """{% for message in messages %}
{% if message['role'] == 'user' %}
{{' ' + message['content'].strip() + ' ' }}
{% elif message['role'] == 'system' %}
{{'\\n' + message['content'].strip() + '\\n\\n\\n' }}
{% elif message['role'] == 'assistant' %}
{{ message['content'].strip() + ' ' + eos_token }}
{% elif message['role'] == 'input' %}
{{' ' + message['content'] + ' ' }}
{% endif %}
{% endfor %}""" # Asegúrate de usar tu CHAT_TEMPLATE aquí
tokenizer.chat_template = CHAT_TEMPLATE
chat_history = [] # Historial de chat global
chatbot_text = []
def generate_response(user_input):
global chat_history
# Agregar input del usuario al historial
chat_history.append({"content": user_input, "role": "user"})
# Preparación del input para el modelo
user_input = tokenizer.apply_chat_template(chat_history, tokenize=False)
input_tokens = tokenizer(user_input, return_tensors='pt', padding=True, truncation=True, max_length=1024).to(device)
# Generación de la respuesta del modelo
output_tokens = model_with_adapter.generate(**input_tokens, max_length=1024, pad_token_id=tokenizer.eos_token_id, top_k=50, do_sample=True, top_p=0.95, temperature=0.7)
generated_text = tokenizer.decode(output_tokens[0], skip_special_tokens=True)
# Extracción de la respuesta generada
last_us = generated_text.rfind("") + len("")
last_as = generated_text.rfind("")
generated_text = generated_text[last_us:last_as].strip()
# Agregar la respuesta del bot al historial
chat_history.append({"content": generated_text, "role": "assistant"})
return generated_text
def respond(message):
global chatbot_text
if message: # Verificar si el mensaje no está vacío
bot_response = generate_response(message)
chatbot_text.append((message, bot_response))
return chatbot_text
return [("", "")]
def clear_chat_and_history():
global chat_history
global chatbot_text
chat_history.clear()# Vaciar el historial de chat
chatbot_text.clear()
return "", []
with gr.Blocks() as demo:
chatbot = gr.Chatbot()
# Usar un Button regular en lugar de ClearButton para tener control sobre la función que se ejecuta
with gr.Row():
msg = gr.Textbox(label="Tu mensaje", placeholder="Escribe aquí...", lines=1)
send_btn = gr.Button("Enviar")
clear_btn = gr.Button("Limpiar Chat")
# Acción al presionar el botón Enviar
send_btn.click(fn=respond, inputs=msg, outputs=chatbot)
clear_btn.click(fn=clear_chat_and_history, inputs=None, outputs=[msg, chatbot])
demo.launch()