File size: 3,199 Bytes
4ad23c1
721590a
928cd07
721590a
 
1d5b573
721590a
 
 
 
 
 
 
 
 
 
 
 
 
 
01023b1
 
 
 
 
 
721590a
 
 
 
01023b1
721590a
 
 
 
 
 
01023b1
 
721590a
 
 
 
 
 
 
 
 
 
 
 
01023b1
721590a
01023b1
 
721590a
01023b1
9ba91ec
721590a
 
 
01023b1
 
 
9ba91ec
43f1789
721590a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9ba91ec
721590a
 
9ba91ec
 
 
721590a
9ba91ec
721590a
4ad23c1
1d5b573
721590a
 
01023b1
7b48c13
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
import gradio as gr
from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline
import torch
import gc
import os

# Funci贸n para cargar el prompt desde el archivo
def get_system_prompt():
    with open("prompt.txt", "r", encoding="utf-8") as f:
        return f.read().strip()

# Funci贸n para generar respuestas
def generate_response(user_message):
    try:
        if not user_message.strip():
            return "Por favor, escribe una pregunta para que pueda ayudarte."
        
        # Obtener el prompt del sistema
        system_prompt = get_system_prompt()
        
        # Crear el prompt completo para TinyLlama
        prompt = f"""<|system|>
{system_prompt}
<|user|>
{user_message}
<|assistant|>"""
        
        # Generar respuesta usando el pipeline
        response = generator(
            prompt,
            max_new_tokens=256,  # Reducido para mayor velocidad
            temperature=0.7,
            top_p=0.9,
            do_sample=True,
            num_return_sequences=1
        )[0]["generated_text"]
        
        # Extraer solo la respuesta del asistente (despu茅s del 煤ltimo <|assistant|>)
        assistant_response = response.split("<|assistant|>")[-1].strip()
        
        # Forzar recolecci贸n de basura
        gc.collect()
        torch.cuda.empty_cache() if torch.cuda.is_available() else None
        
        return assistant_response
    
    except Exception as e:
        print(f"Error: {str(e)}")
        return f"Lo siento, ha ocurrido un error: {str(e)}"

# Cargar el modelo y crear el pipeline
print("Cargando modelo ultra ligero...")

# Usar TinyLlama, un modelo muy peque帽o (1.1B par谩metros) pero potente
model_name = "TinyLlama/TinyLlama-1.1B-Chat-v1.0"

# Configuraci贸n para reducir el uso de memoria y aumentar velocidad
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    torch_dtype=torch.float32,
    low_cpu_mem_usage=True,
    # Cargamos en 8-bit para reducir memoria y aumentar velocidad
    load_in_8bit=True
)

# Crear el pipeline de generaci贸n de texto
generator = pipeline(
    "text-generation",
    model=model,
    tokenizer=tokenizer
)

print("Modelo cargado correctamente!")

# Crear la interfaz de Gradio
demo = gr.Interface(
    fn=generate_response,
    inputs=gr.Textbox(
        placeholder="Escribe tu pregunta sobre emprendimiento aqu铆...",
        label="Tu pregunta"
    ),
    outputs=gr.Textbox(label="Respuesta de BITER"),
    title="BITER - Tu Mentor en Tiempo Real para Decisiones de Negocio",
    description="BITER es un asistente de IA que responde dudas de emprendedores como si fuera un CEO experimentado.",
    examples=[
        ["驴C贸mo puedo validar mi idea de negocio con poco presupuesto?"],
        ["驴Cu谩l es la mejor estrategia para conseguir mis primeros clientes?"],
        ["驴Deber铆a invertir en publicidad en redes sociales o en SEO?"]
    ],
    allow_flagging="never"
)

# Lanzar la aplicaci贸n con configuraci贸n para ahorrar memoria
if __name__ == "__main__":
    # Configurar menos workers para ahorrar memoria y aumentar velocidad
    demo.queue(max_size=1).launch(share=False, debug=False)