Spaces:
Paused
Paused
import gradio as gr | |
import pandas as pd | |
from PyPDF2 import PdfReader | |
import torch | |
from transformers import BertForQuestionAnswering, BertTokenizer, pipeline | |
from sentence_transformers import SentenceTransformer, util | |
# Configuración inicial | |
model_name = 'dccuchile/bert-base-spanish-wwm-cased' | |
tokenizer = BertTokenizer.from_pretrained(model_name) | |
model_qa = BertForQuestionAnswering.from_pretrained(model_name) | |
nlp = pipeline("question-answering", model=model_qa, tokenizer=tokenizer) | |
embedder = SentenceTransformer('hiiamsid/sentence_similarity_spanish_es') | |
# Base de conocimiento | |
knowledge_base = { | |
"textos": [], | |
"embeddings": [] | |
} | |
# Configuración de personalidad | |
personalidad = { | |
"formal": True, | |
"humor": 0.2, | |
"temperatura": 0.7, | |
"emojis": False | |
} | |
def cargar_conocimiento(archivo): | |
"""Carga conocimiento de diferentes formatos""" | |
if archivo.name.endswith('.csv'): | |
df = pd.read_csv(archivo.name) | |
return df.to_dict('records') | |
elif archivo.name.endswith('.xlsx'): | |
df = pd.read_excel(archivo.name) | |
return df.to_dict('records') | |
elif archivo.name.endswith('.pdf'): | |
reader = PdfReader(archivo.name) | |
text = "\n".join([page.extract_text() for page in reader.pages]) | |
return [{"contenido": text}] | |
return [] | |
def actualizar_personalidad(formal, humor, temperatura, emojis): | |
"""Actualiza los parámetros de personalidad""" | |
personalidad["formal"] = formal | |
personalidad["humor"] = humor | |
personalidad["temperatura"] = temperatura | |
personalidad["emojis"] = emojis | |
return "Personalidad actualizada ✔️" | |
def procesar_pregunta(pregunta): | |
"""Procesa la pregunta usando el modelo y la base de conocimiento""" | |
# Buscar en la base de conocimiento | |
query_embedding = embedder.encode(pregunta) | |
hits = util.semantic_search(query_embedding, knowledge_base["embeddings"], top_k=3) | |
contexto = "\n".join([knowledge_base["textos"][hit['corpus_id']] | |
for hit in hits[0]]) | |
# Generar respuesta con personalidad | |
respuesta = nlp(question=pregunta, context=contexto) | |
# Aplicar personalidad | |
respuesta_texto = respuesta["answer"] | |
if personalidad["formal"]: | |
respuesta_texto = respuesta_texto.replace("Hola", "Buenos días").replace("?", "¿?") | |
if personalidad["emojis"]: | |
respuesta_texto += " 😊" if "feliz" in pregunta.lower() else " 🤔" | |
return respuesta_texto | |
def cargar_archivo(archivo): | |
"""Carga el archivo a la base de conocimiento""" | |
datos = cargar_conocimiento(archivo) | |
textos = [str(registro) for registro in datos] | |
embeddings = embedder.encode(textos) | |
knowledge_base["textos"].extend(textos) | |
knowledge_base["embeddings"].extend(embeddings) | |
return f"¡Archivo cargado! Total de registros: {len(knowledge_base['textos'])}" | |
# Interfaz Gradio | |
with gr.Blocks(title="Bot Multifunción") as demo: | |
gr.Markdown("# 🤖 Bot con Conocimiento y Personalidad Configurable") | |
with gr.Tab("Cargar Conocimiento"): | |
archivo = gr.File(label="Subir archivo (CSV/XLSX/PDF)") | |
boton_cargar = gr.Button("Cargar Conocimiento") | |
salida_carga = gr.Textbox(label="Estado", interactive=False) | |
with gr.Tab("Configurar Personalidad"): | |
formal = gr.Checkbox(label="Modo Formal", value=True) | |
humor = gr.Slider(0, 1, 0.2, label="Nivel de Humor") | |
temperatura = gr.Slider(0, 1, 0.7, label="Creatividad") | |
emojis = gr.Checkbox(label="Usar Emojis", value=False) | |
boton_personalidad = gr.Button("Actualizar Personalidad") | |
salida_personalidad = gr.Textbox(label="Estado", interactive=False) | |
with gr.Tab("Chat"): | |
chatbot = gr.Chatbot() | |
entrada = gr.Textbox(label="Escribe tu pregunta", placeholder="¿Qué necesitas saber?") | |
# Conexiones | |
boton_cargar.click(cargar_archivo, inputs=archivo, outputs=salida_carga) | |
boton_personalidad.click(actualizar_personalidad, | |
inputs=[formal, humor, temperatura, emojis], | |
outputs=salida_personalidad) | |
entrada.submit(procesar_pregunta, entrada, chatbot) | |
# Ejecución | |
if __name__ == "__main__": | |
demo.launch() |