Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
@@ -1,75 +1,96 @@
|
|
1 |
"""
|
2 |
-
Versión
|
|
|
3 |
"""
|
4 |
|
5 |
import gradio as gr
|
6 |
-
|
7 |
-
import
|
8 |
-
import gc
|
9 |
import os
|
10 |
|
11 |
-
#
|
12 |
-
def
|
13 |
-
|
14 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
15 |
|
16 |
-
# Función para
|
17 |
def generate_response(user_message):
|
18 |
try:
|
19 |
if not user_message.strip():
|
20 |
return "Por favor, escribe una pregunta para que pueda ayudarte."
|
21 |
|
22 |
-
#
|
23 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
24 |
|
25 |
-
#
|
26 |
-
|
|
|
27 |
|
28 |
-
#
|
29 |
-
|
30 |
-
|
31 |
-
max_new_tokens=256,
|
32 |
-
temperature=0.7,
|
33 |
-
top_p=0.9,
|
34 |
-
do_sample=True,
|
35 |
-
num_return_sequences=1
|
36 |
-
)[0]["generated_text"]
|
37 |
|
38 |
-
|
39 |
-
|
|
|
|
|
|
|
40 |
|
41 |
-
#
|
42 |
-
|
43 |
-
torch.cuda.empty_cache() if torch.cuda.is_available() else None
|
44 |
|
45 |
-
|
|
|
|
|
|
|
46 |
|
47 |
except Exception as e:
|
48 |
print(f"Error: {str(e)}")
|
49 |
return f"Lo siento, ha ocurrido un error: {str(e)}"
|
50 |
|
51 |
-
# Cargar
|
52 |
-
|
53 |
-
|
54 |
-
# Usar un modelo muy pequeño con soporte para español
|
55 |
-
model_name = "PlanTL-GOB-ES/gpt2-base-bne" # Modelo de ~125M parámetros, extremadamente ligero
|
56 |
-
|
57 |
-
# Configuración para reducir el uso de memoria
|
58 |
-
tokenizer = AutoTokenizer.from_pretrained(model_name)
|
59 |
-
model = AutoModelForCausalLM.from_pretrained(
|
60 |
-
model_name,
|
61 |
-
torch_dtype=torch.float32,
|
62 |
-
low_cpu_mem_usage=True
|
63 |
-
)
|
64 |
-
|
65 |
-
# Crear el pipeline de generación de texto
|
66 |
-
generator = pipeline(
|
67 |
-
"text-generation",
|
68 |
-
model=model,
|
69 |
-
tokenizer=tokenizer
|
70 |
-
)
|
71 |
|
72 |
-
print("
|
73 |
|
74 |
# Crear la interfaz de Gradio
|
75 |
demo = gr.Interface(
|
@@ -89,7 +110,6 @@ demo = gr.Interface(
|
|
89 |
allow_flagging="never"
|
90 |
)
|
91 |
|
92 |
-
# Lanzar la aplicación
|
93 |
if __name__ == "__main__":
|
94 |
-
# Configurar menos workers para ahorrar memoria
|
95 |
demo.queue(max_size=1).launch(share=False, debug=False)
|
|
|
1 |
"""
|
2 |
+
Versión ultra ligera usando respuestas predefinidas.
|
3 |
+
Esta versión no genera texto completo, sino que selecciona respuestas predefinidas.
|
4 |
"""
|
5 |
|
6 |
import gradio as gr
|
7 |
+
import json
|
8 |
+
import random
|
|
|
9 |
import os
|
10 |
|
11 |
+
# Cargar respuestas predefinidas
|
12 |
+
def load_responses():
|
13 |
+
try:
|
14 |
+
with open("responses.json", "r", encoding="utf-8") as f:
|
15 |
+
return json.load(f)
|
16 |
+
except:
|
17 |
+
# Respuestas por defecto si no existe el archivo
|
18 |
+
return {
|
19 |
+
"validacion": [
|
20 |
+
"Para validar tu idea con poco presupuesto, comienza con entrevistas a potenciales clientes. Habla con al menos 20 personas que encajen en tu público objetivo y pregúntales sobre sus problemas, no sobre tu solución. Luego, crea un MVP (Producto Mínimo Viable) lo más simple posible para probar si resuelve el problema. Puedes usar herramientas gratuitas como Google Forms para encuestas, Canva para diseños y páginas de aterrizaje gratuitas como Carrd.co. Lo importante es obtener datos reales antes de invertir mucho tiempo o dinero. ¿Has identificado ya quiénes son tus potenciales clientes?",
|
21 |
+
"La validación más efectiva y económica es crear una página de aterrizaje que describa tu producto/servicio y un formulario de pre-registro o lista de espera. Invierte un pequeño presupuesto (50-100€) en anuncios de Facebook o Google dirigidos a tu público objetivo. Si las personas se registran sin haber visto aún el producto real, tienes una señal positiva. Complementa esto con 5-10 entrevistas profundas para entender mejor las necesidades. Recuerda: el objetivo no es que te digan que les gusta tu idea, sino que demuestren interés con acciones concretas."
|
22 |
+
],
|
23 |
+
"clientes": [
|
24 |
+
"Para conseguir tus primeros clientes, enfócate en estas estrategias: 1) Identifica dónde está tu público objetivo (foros, grupos de Facebook, eventos) y participa genuinamente aportando valor. 2) Ofrece una prueba gratuita o versión limitada para reducir la barrera de entrada. 3) Contacta personalmente a 20-30 potenciales clientes ideales y ofréceles un descuento especial por ser early adopters. 4) Pide referidos a cada cliente satisfecho, idealmente con algún incentivo. Lo más importante es que tus primeros clientes queden extremadamente satisfechos, incluso si implica dar más de lo prometido. ¿En qué canales crees que está tu público objetivo?",
|
25 |
+
"La estrategia más efectiva para primeros clientes es lo que llamo "venta manual": identifica 50 clientes ideales y contáctalos uno por uno con mensajes personalizados. No hables de características, sino de cómo resuelves su problema específico. Ofrece un descuento o beneficio exclusivo por ser pioneros. Paralelamente, crea contenido útil y específico para tu nicho y compártelo en LinkedIn o el canal donde esté tu audiencia. La clave es la personalización y seguimiento: estos primeros clientes necesitan sentir que están recibiendo un trato VIP."
|
26 |
+
],
|
27 |
+
"marketing": [
|
28 |
+
"Entre SEO y redes sociales, la decisión depende de tu modelo de negocio y ciclo de venta. El SEO es una inversión a largo plazo (3-6 meses para ver resultados) pero con mayor retorno sostenible. Las redes sociales dan resultados inmediatos pero requieren inversión continua. Si vendes productos/servicios de decisión rápida o bajo costo, empieza con redes sociales. Si tu producto tiene un ciclo de venta más largo o mayor valor, invierte en SEO mientras complementas con una presencia básica en redes. Lo ideal es no verlo como una dicotomía sino como canales complementarios. ¿Cuál es el tiempo que puedes esperar para ver resultados?",
|
29 |
+
"Ni uno ni otro exclusivamente. Comienza con una estrategia híbrida: 70% en publicidad de redes sociales para resultados inmediatos y 30% en crear contenido SEO para el largo plazo. En redes, no disperses esfuerzos: elige una plataforma donde esté tu audiencia y domínala antes de expandirte. Para SEO, enfócate en keywords de nicho con menor competencia. Mide resultados cada 2 semanas y ajusta la distribución según el ROI que obtengas. Recuerda que el mejor marketing siempre será tener un producto excepcional que genere recomendaciones."
|
30 |
+
],
|
31 |
+
"financiacion": [
|
32 |
+
"Para financiar tu startup en etapa temprana, considera estas opciones en orden: 1) Bootstrapping: usa tus propios recursos y reinvierte los ingresos; te da control total pero crecimiento más lento. 2) FFF (Family, Friends & Fools): pequeñas inversiones de tu círculo cercano; documenta todo formalmente para evitar problemas. 3) Subvenciones y ayudas públicas: en España hay programas como ENISA o CDTI; requieren tiempo pero no diluyen tu participación. 4) Ángeles inversores: para cuando ya tienes un MVP y primeros usuarios. Antes de buscar financiación externa, pregúntate: ¿realmente la necesito ahora o puedo validar mi modelo con menos recursos?",
|
33 |
+
"La mejor estrategia de financiación depende de tu etapa. Si estás empezando, enfócate en conseguir un MVP con recursos propios o FFF (familia y amigos). Una vez tengas tracción inicial, busca programas de aceleración que ofrezcan financiación semilla (como Lanzadera, Wayra o SeedRocket). Para rondas más grandes, necesitarás métricas de crecimiento. Considera también opciones alternativas como crowdfunding (ideal para productos B2C) o financiación pública (ENISA, CDTI). Recuerda que cada euro de inversión externa tiene un costo: no solo en equity, sino en tiempo reportando a inversores y presión por crecer rápido."
|
34 |
+
],
|
35 |
+
"producto": [
|
36 |
+
"Para desarrollar un producto que realmente conecte con tus usuarios, sigue estos principios: 1) Obsesiónate con el problema, no con tu solución. 2) Construye la versión más simple que resuelva el problema central (MVP). 3) Establece un ciclo de feedback continuo con usuarios reales. 4) Mide comportamientos, no opiniones. 5) Itera rápidamente basándote en datos. El error más común es añadir demasiadas funcionalidades demasiado pronto. Enfócate en hacer una cosa excepcionalmente bien antes de expandir. ¿Has identificado claramente cuál es el problema principal que resuelves?",
|
37 |
+
"El desarrollo de producto exitoso sigue un patrón: primero, identifica un problema doloroso para un grupo específico de personas. Luego, crea la solución más simple posible que resuelva ese problema y ponla en manos de usuarios reales lo antes posible. Después, establece un ciclo de mejora continua basado en métricas de uso real, no en opiniones. Prioriza siempre las funcionalidades que resuelven los problemas más críticos de tus usuarios principales, no las que te parecen más interesantes a ti. Recuerda que un producto exitoso no es el que tiene más funcionalidades, sino el que resuelve mejor un problema específico."
|
38 |
+
],
|
39 |
+
"general": [
|
40 |
+
"Para tomar esa decisión, necesitas evaluar tres factores clave: 1) Tu público objetivo y dónde se encuentra, 2) Tu presupuesto y recursos disponibles, y 3) Tus objetivos a corto y largo plazo. Sin conocer estos detalles, es difícil darte una recomendación específica. ¿Podrías compartir más información sobre tu negocio, a quién te diriges y qué recursos tienes disponibles? Con esos datos podré ofrecerte una estrategia más personalizada.",
|
41 |
+
"Antes de responder, necesito entender mejor tu situación específica. ¿Podrías compartir más detalles sobre tu negocio, objetivos y recursos disponibles? Cada decisión estratégica debe estar alineada con tu contexto particular. Con más información, podré ofrecerte una recomendación verdaderamente útil y adaptada a tus circunstancias.",
|
42 |
+
"Hola, soy BITER, tu mentor de negocios. Estoy aquí para ayudarte con tus dudas sobre emprendimiento y estrategia empresarial. ¿En qué puedo ayudarte hoy? Puedes preguntarme sobre validación de ideas, adquisición de clientes, marketing, financiación o desarrollo de producto."
|
43 |
+
]
|
44 |
+
}
|
45 |
|
46 |
+
# Función para clasificar la pregunta y seleccionar una respuesta
|
47 |
def generate_response(user_message):
|
48 |
try:
|
49 |
if not user_message.strip():
|
50 |
return "Por favor, escribe una pregunta para que pueda ayudarte."
|
51 |
|
52 |
+
# Palabras clave para clasificación simple
|
53 |
+
keywords = {
|
54 |
+
"validacion": ["validar", "idea", "mvp", "viable", "testear", "probar", "hipótesis", "problema", "solución", "encuesta"],
|
55 |
+
"clientes": ["cliente", "usuario", "vender", "captar", "adquirir", "retener", "fidelizar", "early adopter", "primeros", "target"],
|
56 |
+
"marketing": ["marketing", "publicidad", "redes", "social", "seo", "anuncio", "promoción", "contenido", "tráfico", "visibilidad"],
|
57 |
+
"financiacion": ["financiar", "dinero", "inversión", "capital", "fondo", "préstamo", "subvención", "ayuda", "bootstrap", "revenue"],
|
58 |
+
"producto": ["producto", "servicio", "desarrollo", "feature", "funcionalidad", "diseño", "ux", "experiencia", "usuario", "iterar"]
|
59 |
+
}
|
60 |
+
|
61 |
+
# Clasificación simple basada en palabras clave
|
62 |
+
user_message_lower = user_message.lower()
|
63 |
|
64 |
+
# Si es un saludo simple
|
65 |
+
if user_message_lower in ["hola", "buenos días", "buenas", "saludos", "hey"]:
|
66 |
+
return random.choice(all_responses["general"])
|
67 |
|
68 |
+
# Buscar coincidencias de palabras clave
|
69 |
+
max_matches = 0
|
70 |
+
category = "general"
|
|
|
|
|
|
|
|
|
|
|
|
|
71 |
|
72 |
+
for cat, words in keywords.items():
|
73 |
+
matches = sum(1 for word in words if word in user_message_lower)
|
74 |
+
if matches > max_matches:
|
75 |
+
max_matches = matches
|
76 |
+
category = cat
|
77 |
|
78 |
+
# Obtener respuestas para esa categoría
|
79 |
+
responses = all_responses.get(category, all_responses["general"])
|
|
|
80 |
|
81 |
+
# Seleccionar una respuesta aleatoria de esa categoría
|
82 |
+
response = random.choice(responses)
|
83 |
+
|
84 |
+
return response
|
85 |
|
86 |
except Exception as e:
|
87 |
print(f"Error: {str(e)}")
|
88 |
return f"Lo siento, ha ocurrido un error: {str(e)}"
|
89 |
|
90 |
+
# Cargar respuestas predefinidas
|
91 |
+
all_responses = load_responses()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
92 |
|
93 |
+
print("Sistema de respuestas predefinidas cargado correctamente!")
|
94 |
|
95 |
# Crear la interfaz de Gradio
|
96 |
demo = gr.Interface(
|
|
|
110 |
allow_flagging="never"
|
111 |
)
|
112 |
|
113 |
+
# Lanzar la aplicación
|
114 |
if __name__ == "__main__":
|
|
|
115 |
demo.queue(max_size=1).launch(share=False, debug=False)
|