Mariano90 commited on
Commit
9e4de62
·
verified ·
1 Parent(s): 196d9f8

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +71 -112
app.py CHANGED
@@ -1,125 +1,84 @@
1
  import gradio as gr
2
- from pathlib import Path
3
- from transformers import pipeline
4
-
5
- # ========= CONFIGURACIÓN =========
6
-
7
- # TÍTULO (lo que verán los usuarios en la cabecera)
8
- APP_TITLE = "🤖 MarianoBot – ¿Dudas sobre mi perfil? ¡Respondo al instante!"
9
-
10
- # COPIA DE BIENVENIDA (tamaño más grande)
11
- WELCOME_MESSAGE = """
12
- <div style="font-size: 1.15rem; line-height: 1.5; font-weight: 600;">
13
- 👋 Hola, soy el Chatbot de Mariano. Pregúntame lo que quieras sobre mi experiencia, habilidades, trayectoria profesional... ¡incluso hobbies!
14
- </div>
15
- """
16
-
17
- # Imagen de saludo (sube 'marianobot.png' a tu Space y usa esta URL)
18
- # Si no tienes imagen, deja GREETING_IMAGE_URL = "" y se mostrará solo texto.
19
- GREETING_IMAGE_URL = "https://huggingface.co/spaces/Mariano90/cv/resolve/main/marianobot.png"
20
-
21
- # Color del botón "Enviar pregunta"
22
- PRIMARY_HEX = "#F89651"
23
-
24
- # ========= CARGA DEL CV =========
25
- cv_path = Path("cv.txt")
26
- if cv_path.exists():
27
- CV_TEXT = cv_path.read_text(encoding="utf-8")
28
- else:
29
- CV_TEXT = ("[AVISO] No se encontró 'cv.txt' en el repositorio. "
30
- "Crea un archivo cv.txt en la raíz de la Space con tu CV en texto plano.")
31
-
32
- # ========= MODELO =========
33
- # Intentamos FLAN-T5-BASE; si no, caemos a FLAN-T5-SMALL (más ligero).
34
- def load_model():
35
- try:
36
- return pipeline("text2text-generation", model="google/flan-t5-base")
37
- except Exception as e:
38
- print("Fallo con flan-t5-base, usando flan-t5-small. Error:", e)
39
- return pipeline("text2text-generation", model="google/flan-t5-small")
40
-
41
- qa = load_model()
42
-
43
- def generate_answer(question: str) -> str:
44
- """
45
- Genera una respuesta en ESPAÑOL, en primera persona, usando ÚNICAMENTE el contenido del CV.
46
- Si no está en el CV, admite la falta de información de forma profesional.
47
- """
48
- system_instr = (
49
- "Eres un asistente que responde a reclutadores sobre el CV de Mariano. "
50
- "Usa exclusivamente la información del CV para responder. "
51
- "Si algo no está en el CV, dilo claramente y ofrece responder sobre otros aspectos."
52
- )
53
-
54
  prompt = (
55
- f"{system_instr}\n\n"
56
- f"CV (texto):\n{CV_TEXT}\n\n"
57
- f"Pregunta del reclutador: {question}\n\n"
58
- "Responde en español, en primera persona (yo), de forma breve, específica y profesional. "
59
- "No inventes datos."
60
  )
 
 
61
 
62
- # max_new_tokens controla la longitud de la salida; sin sampling para respuestas estables
63
- out = qa(prompt, max_new_tokens=260, do_sample=False)[0]["generated_text"]
64
- return out.strip()
65
-
66
- # ========= UI (Gradio) =========
67
- CUSTOM_CSS = f"""
68
- #send-btn {{
69
- background: {PRIMARY_HEX} !important;
70
- border-color: {PRIMARY_HEX} !important;
71
- color: white !important;
72
- }}
73
- #send-btn:hover {{
74
- opacity: 0.95;
75
- }}
76
- """
77
 
78
- # Mensaje de saludo inicial dentro del chat
79
- if GREETING_IMAGE_URL:
80
- GREETING_CARD = f"![MarianoBot]({GREETING_IMAGE_URL})\n\n**¡Hola! Soy MarianoBot y estoy listo para que me preguntes.**"
81
- else:
82
- GREETING_CARD = "**¡Hola! Soy MarianoBot y estoy listo para que me preguntes.**"
83
 
84
- with gr.Blocks() as demo:
85
  chatbot = gr.Chatbot(
86
  value=[
87
- [None, "![MarianoBot](file/marianobot.png)\n\n👋 ¡Hola! Soy MarianoBot y estoy listo para que me preguntes."]
 
 
 
88
  ],
89
- label="🤖 MarianoBot – ¡Descubre y pregunta todo lo que quieras!"
90
  )
91
 
92
- with gr.Row():
93
- msg = gr.Textbox(placeholder="Escribe tu pregunta aquí…", scale=4)
94
- send = gr.Button("Enviar pregunta", elem_id="send-btn", scale=1)
95
- clear = gr.Button("Borrar conversación", scale=1)
96
-
97
- EXAMPLES = [
98
- ["¿Cuántos años de experiencia tienes en marketing?"],
99
- ["¿Has trabajado como community manager?"],
100
- ["¿Qué logros destacas?"],
101
- ["¿Qué herramientas dominas?"],
102
- ["¿Has liderado equipos? ¿De cuántas personas?"],
103
- ]
104
- gr.Examples(
105
- examples=EXAMPLES,
106
- inputs=[msg],
107
- label="Preguntas rápidas (pulsa para autocompletar)"
108
  )
109
 
110
- def respond(user_message, chat_history):
111
- if not user_message or not user_message.strip():
112
- return "", chat_history
113
- bot_msg = generate_answer(user_message.strip())
114
- chat_history.append((user_message, bot_msg))
115
- return "", chat_history
116
-
117
- # Enviar con Enter
118
- msg.submit(respond, [msg, chatbot], [msg, chatbot])
119
- # Enviar con botón
120
- send.click(respond, [msg, chatbot], [msg, chatbot])
121
- # Limpiar chat
122
- clear.click(lambda: [], None, chatbot, queue=False)
123
-
124
- if __name__ == "__main__":
125
- demo.launch()
 
 
 
 
 
 
 
 
 
1
  import gradio as gr
2
+ from transformers import AutoTokenizer, AutoModelForSeq2SeqLM, pipeline
3
+
4
+ # ---------------------------
5
+ # CONFIGURACIÓN DEL MODELO
6
+ # ---------------------------
7
+ model_name = "google/flan-t5-small"
8
+
9
+ tokenizer = AutoTokenizer.from_pretrained(model_name)
10
+ model = AutoModelForSeq2SeqLM.from_pretrained(model_name)
11
+
12
+ qa_pipeline = pipeline(
13
+ "text2text-generation",
14
+ model=model,
15
+ tokenizer=tokenizer
16
+ )
17
+
18
+ # ---------------------------
19
+ # CARGAR CV
20
+ # ---------------------------
21
+ with open("cv.txt", "r", encoding="utf-8") as f:
22
+ cv_text = f.read()
23
+
24
+ # ---------------------------
25
+ # FUNCIÓN DE RESPUESTA
26
+ # ---------------------------
27
+ def answer_question(question):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
28
  prompt = (
29
+ f"Usa SOLO la información del CV proporcionado para responder la pregunta. "
30
+ f"En español, primera persona, breve y profesional. No inventes datos.\n\n"
31
+ f"Pregunta: {question}\n\nCV:\n{cv_text}"
 
 
32
  )
33
+ response = qa_pipeline(prompt, max_length=300, do_sample=False)
34
+ return response[0]['generated_text']
35
 
36
+ # ---------------------------
37
+ # INTERFAZ GRADIO
38
+ # ---------------------------
39
+ with gr.Blocks() as demo:
 
 
 
 
 
 
 
 
 
 
 
40
 
41
+ # Título del chat
42
+ gr.Markdown("## 🤖 MarianoBot – ¡Descubre y pregunta todo lo que quieras!")
 
 
 
43
 
44
+ # Imagen + saludo inicial
45
  chatbot = gr.Chatbot(
46
  value=[
47
+ [
48
+ None,
49
+ "![MarianoBot](file/marianobot.png)\n\n👋 ¡Hola! Soy MarianoBot y estoy listo para que me preguntes."
50
+ ]
51
  ],
52
+ label="Chat de Mariano"
53
  )
54
 
55
+ # Entrada de texto
56
+ question_input = gr.Textbox(
57
+ label="Escribe tu pregunta...",
58
+ placeholder="Pregunta sobre mi experiencia, habilidades o trayectoria"
 
 
 
 
 
 
 
 
 
 
 
 
59
  )
60
 
61
+ # Botones de preguntas frecuentes (opcionales)
62
+ with gr.Row():
63
+ btn1 = gr.Button("¿Cuántos años de experiencia tienes en marketing?")
64
+ btn2 = gr.Button("¿Cuál es tu experiencia en SEO y SEM?")
65
+ btn3 = gr.Button("Háblame de tus hobbies")
66
+
67
+ # Función para actualizar chatbot
68
+ def submit_question(user_input, history):
69
+ answer = answer_question(user_input)
70
+ history = history + [[user_input, answer]]
71
+ return history, ""
72
+
73
+ # Conectar la entrada de texto
74
+ question_input.submit(submit_question, [question_input, chatbot], [chatbot, question_input])
75
+
76
+ # Conectar botones de ejemplo
77
+ btn1.click(lambda: submit_question("¿Cuántos años de experiencia tienes en marketing?", chatbot.value), None, [chatbot, question_input])
78
+ btn2.click(lambda: submit_question("¿Cuál es tu experiencia en SEO y SEM?", chatbot.value), None, [chatbot, question_input])
79
+ btn3.click(lambda: submit_question("Háblame de tus hobbies", chatbot.value), None, [chatbot, question_input])
80
+
81
+ # ---------------------------
82
+ # INICIAR INTERFAZ
83
+ # ---------------------------
84
+ demo.launch()