trainer / app.py
GhostNetworkUser's picture
Update app.py
fd52d45 verified
import os
import math
import gradio as gr
import json
import logging
from datasets import load_dataset, concatenate_datasets #list_datasets, load_from_disk
from transformers import (
AutoTokenizer,
AutoModelForCausalLM,
DataCollatorForLanguageModeling,
TrainingArguments,
Trainer,
pipeline,
AutoModelForQuestionAnswering,
)
import evaluate # type: ignore
from huggingface_hub import login
from translate import Translator
from datasets import load_dataset, DownloadConfig
# Modelo base
MODEL_KEY = "EleutherAI/gpt-neo-125M"
tokenizer = AutoTokenizer.from_pretrained(MODEL_KEY)
model = AutoModelForCausalLM.from_pretrained(MODEL_KEY)
generator = pipeline("text-generation", model=model, tokenizer=tokenizer)
# Cargar modelos para Preguntas y Respuestas (QA)
qa_model = AutoModelForQuestionAnswering.from_pretrained("deepset/roberta-base-squad2")
qa_tokenizer = AutoTokenizer.from_pretrained("deepset/roberta-base-squad2")
qa_pipeline = pipeline("question-answering", model=qa_model, tokenizer=qa_tokenizer)
# Agregar más datasets para mejorar las respuestas
context_map = {
"imdb": "Dom: Cine | Estilo: Opinión",
"daily_dialog": "Dom: Conversación | Estilo: Diálogo diario",
"go_emotions": "Dom: Emociones | Estilo: Clasificación emocional",
"wikitext": "Dom: Enciclopedia | Estilo: Conocimiento general",
"math": "Dom: Matemáticas | Estilo: Problema matemático", # Agregar problemas de matemáticas
"empathetic_dialogues": "Dom: Psicología | Estilo: Apoyo emocional", # Para el comportamiento emocional
"math_advanced": "Dom: Matemáticas Avanzadas | Estilo: Trigonometría y Cálculo", # Dataset de matemáticas avanzadas
"programming": "Dom: Programación | Estilo: Resolución de código", # Dataset para programación
"social_sciences": "Dom: Ciencias Sociales | Estilo: Preguntas sobre historia y geografía", # Dataset de sociales
"economics": "Dom: Economía | Estilo: Problemas económicos y teorías", # Dataset de economía
"health": "Dom: Salud | Estilo: Información médica y de salud", # Dataset de salud
}
# Detectar idioma automáticamente
def detect_language(text):
try:
return detect(text) # Detecta el idioma de la entrada
except:
return "en" # Si no se puede detectar, se asume inglés
# Generación de texto (si se solicita un cuento, por ejemplo)
def generate_text(prompt, max_length=100):
output = generator(prompt, max_length=int(max_length), num_return_sequences=1)[0]["generated_text"]
return output
# Preguntas y respuestas basadas en contexto
def answer_question(question, context):
result = qa_pipeline(question=question, context=context)
return result['answer']
# Traducción
def translate_text(text, lang):
translator = Translator(to_lang=lang)
try:
return translator.translate(text)
except Exception as e:
return f"Error: {str(e)}"
# Selección del contexto y modelo según la solicitud
def process_input(user_input):
# Detectar idioma
detected_lang = detect_language(user_input)
print(f"Idioma detectado: {detected_lang}")
# Si la entrada es una pregunta, usaremos un modelo de Preguntas y Respuestas
if '?' in user_input:
context = "Este es un contexto general. Puedo responder preguntas específicas sobre cine, ciencia, o emociones."
# Identificar tipo de pregunta (matemáticas, programación, etc.)
if "matemática" in user_input.lower() or "cálculo" in user_input.lower() or "trigonometría" in user_input.lower():
context = "Dom: Matemáticas Avanzadas | Estilo: Trigonometría y Cálculo. Ejemplo: ¿Cuál es la derivada de x^2?"
elif "programación" in user_input.lower():
context = "Dom: Programación | Estilo: Resolución de código. Ejemplo: ¿Cómo se resuelve un bucle en Python?"
elif "historia" in user_input.lower() or "geografía" in user_input.lower():
context = "Dom: Ciencias Sociales | Estilo: Preguntas sobre historia y geografía. Ejemplo: ¿Quién fue Sócrates?"
elif "economía" in user_input.lower():
context = "Dom: Economía | Estilo: Problemas económicos y teorías. Ejemplo: ¿Qué es la inflación?"
elif "salud" in user_input.lower():
context = "Dom: Salud | Estilo: Información médica y de salud. Ejemplo: ¿Qué es la diabetes?"
answer = answer_question(user_input, context)
return answer
elif "math" in user_input.lower():
# Si se detecta una pregunta matemática
return "Resolviendo la operación matemática..."
elif "cuento" in user_input.lower():
# Si el usuario solicita un cuento
prompt = "Había una vez, en un reino lejano..."
return generate_text(prompt, max_length=200)
elif "emoción" in user_input.lower():
# Si es una solicitud de apoyo emocional
context = "Dom: Psicología | Estilo: Apoyo emocional. ¿Cómo te sientes hoy?"
return generate_text(context + " Estoy aquí para apoyarte", max_length=100)
else:
return "No entiendo la solicitud, por favor intenta preguntar algo más específico."
# Interfaz de Gradio
with gr.Blocks() as demo:
gr.Markdown("# 🧠 MultiDomain Text Generator + Translator")
with gr.Tab("Generar respuestas y contar historias"):
user_input = gr.Textbox(label="Tu pregunta o solicitud", placeholder="Haz una pregunta o pide un cuento...")
output_text = gr.Textbox(label="Respuesta generada")
btn_generate = gr.Button("Generar respuesta o cuento")
btn_generate.click(process_input, inputs=user_input, outputs=output_text)
with gr.Tab("Traducir texto"):
input_text = gr.Textbox(label="Texto a traducir")
lang = gr.Textbox(label="Código de idioma destino", value="en")
output_translation = gr.Textbox(label="Texto traducido")
btn_translate = gr.Button("Traducir")
btn_translate.click(translate_text, inputs=[input_text, lang], outputs=output_translation)
demo.launch()