File size: 4,104 Bytes
4ad23c1
928cd07
 
 
b06d928
1d5b573
4ad23c1
 
 
43f1789
928cd07
 
 
 
43f1789
4ad23c1
 
 
 
 
b06d928
4ad23c1
 
b06d928
4ad23c1
 
b06d928
4ad23c1
 
b06d928
 
4ad23c1
 
b06d928
 
 
 
 
 
 
 
4ad23c1
 
 
928cd07
4ad23c1
 
928cd07
4ad23c1
 
928cd07
 
 
 
b06d928
 
 
 
928cd07
b06d928
 
928cd07
b06d928
928cd07
b06d928
928cd07
 
 
b06d928
 
928cd07
 
 
 
 
 
 
 
 
b06d928
 
 
 
 
 
928cd07
4ad23c1
1d5b573
928cd07
 
4ad23c1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1d5b573
b06d928
4ad23c1
b06d928
 
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import gradio as gr
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
import os
import gc

# Variables globales para el modelo y tokenizador
model = None
tokenizer = None

# 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 cargar el modelo (se ejecutar谩 solo cuando sea necesario)
def load_model_if_needed():
    global model, tokenizer
    
    if model is None:
        print("Cargando modelo Mistral-7B-Instruct-v0.1...")
        
        # Cargar el tokenizador
        model_name = "mistralai/Mistral-7B-Instruct-v0.1"
        tokenizer = AutoTokenizer.from_pretrained(model_name)
        
        # Configuraci贸n para CPU con optimizaciones de memoria
        model = AutoModelForCausalLM.from_pretrained(
            model_name,
            torch_dtype=torch.float32,  # Usar float32 para CPU
            low_cpu_mem_usage=True,     # Optimizaci贸n para CPU con poca memoria
        )
        
        # Mover el modelo a CPU expl铆citamente
        model = model.to("cpu")
        
        # Forzar recolecci贸n de basura para liberar memoria
        gc.collect()
        torch.cuda.empty_cache() if torch.cuda.is_available() else None
        
        print("Modelo cargado correctamente en CPU!")

# Funci贸n principal que procesa las preguntas del usuario
def generate_response(user_message):
    try:
        # Cargar el modelo si a煤n no est谩 cargado
        load_model_if_needed()
        
        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()
        
        # Formato de prompt para Mistral-7B-Instruct-v0.1
        prompt = f"""<s>[INST] {system_prompt}

Pregunta del usuario: {user_message} [/INST]</s>"""
        
        # Tokenizar el prompt
        inputs = tokenizer(prompt, return_tensors="pt")
        
        # Configuraci贸n de generaci贸n optimizada para CPU
        generation_config = {
            "max_new_tokens": 512,      # Limitar tokens para ahorrar memoria
            "temperature": 0.7,
            "top_p": 0.9,
            "do_sample": True,
            "pad_token_id": tokenizer.eos_token_id,
            "num_return_sequences": 1
        }
        
        # Generar respuesta
        with torch.no_grad():
            outputs = model.generate(**inputs, **generation_config)
        
        # Decodificar la respuesta
        full_response = tokenizer.decode(outputs[0], skip_special_tokens=True)
        
        # Extraer solo la respuesta del asistente (despu茅s del prompt)
        assistant_response = full_response.replace(prompt.replace("<s>", "").replace("</s>", ""), "").strip()
        
        # Forzar recolecci贸n de basura para liberar memoria
        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)}"

# 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
    demo.queue(max_size=1).launch(share=False, debug=False)