chat_bot_vq / app.py
Cosio's picture
Upload 3 files
cc39422 verified
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()