Kukedlc commited on
Commit
ee3a363
·
verified ·
1 Parent(s): e95c8ce

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +182 -0
app.py ADDED
@@ -0,0 +1,182 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import spaces
2
+ import os
3
+ import random
4
+ from llama_cpp import Llama
5
+ from llama_cpp_agent import LlamaCppAgent, MessagesFormatterType
6
+ from llama_cpp_agent.providers import LlamaCppPythonProvider
7
+ from llama_cpp_agent.chat_history import BasicChatHistory
8
+ from llama_cpp_agent.chat_history.messages import Roles
9
+ import gradio as gr
10
+ from huggingface_hub import hf_hub_download
11
+
12
+ token_huggingface = os.getenv("HUGGINGFACE_TOKEN")
13
+
14
+ hf_hub_download(
15
+ repo_id="bartowski/gemma-2-2b-it-abliterated-GGUF",
16
+ filename="gemma-2-2b-it-abliterated-Q4_K_M.gguf",
17
+ local_dir="./models",
18
+ token=token_huggingface
19
+ )
20
+
21
+ llm = None
22
+
23
+ # Arrays para la generación de personalidades
24
+ rasgos_personalidad = [
25
+ "extrovertido", "introvertido", "amable", "reservado", "creativo", "analítico",
26
+ "aventurero", "cauteloso", "optimista", "pesimista", "empático", "pragmático"
27
+ ]
28
+
29
+ intereses = [
30
+ "ciencia", "arte", "deportes", "literatura", "tecnología", "cocina",
31
+ "viajes", "música", "cine", "historia", "filosofía", "naturaleza"
32
+ ]
33
+
34
+ profesiones = [
35
+ "médico", "ingeniero", "artista", "profesor", "chef", "escritor",
36
+ "deportista", "científico", "músico", "empresario", "abogado", "periodista"
37
+ ]
38
+
39
+ def generar_personalidad():
40
+ rasgos = random.sample(rasgos_personalidad, 3)
41
+ interes = random.choice(intereses)
42
+ profesion = random.choice(profesiones)
43
+
44
+ prompt_personalidad = f"""Crea una personalidad detallada basada en los siguientes rasgos:
45
+ - Rasgos principales: {', '.join(rasgos)}
46
+ - Interés principal: {interes}
47
+ - Profesión: {profesion}
48
+
49
+ Proporciona una descripción de 3-4 oraciones sobre cómo es esta persona, su forma de hablar y comportarse."""
50
+
51
+ return generar_descripcion_personalidad(prompt_personalidad)
52
+
53
+ def generar_descripcion_personalidad(prompt):
54
+ global llm
55
+
56
+ if llm is None:
57
+ llm = Llama(
58
+ model_path="models/gemma-2-2b-it-abliterated-Q4_K_M.gguf",
59
+ flash_attn=True,
60
+ n_gpu_layers=81,
61
+ n_batch=1024,
62
+ n_ctx=8192,
63
+ )
64
+
65
+ proveedor = LlamaCppPythonProvider(llm)
66
+ agente = LlamaCppAgent(
67
+ proveedor,
68
+ system_prompt="Eres un creador de personalidades detalladas y creativas.",
69
+ predefined_messages_formatter_type=MessagesFormatterType.GEMMA_2,
70
+ debug_output=False
71
+ )
72
+
73
+ configuracion = proveedor.get_provider_default_settings()
74
+ configuracion.temperature = 0.7
75
+ configuracion.max_tokens = 300
76
+
77
+ respuesta = agente.get_chat_response(prompt, llm_sampling_settings=configuracion)
78
+ return respuesta
79
+
80
+ @spaces.GPU(duration=120)
81
+ def responder(
82
+ mensaje,
83
+ historial: list[tuple[str, str]],
84
+ mensaje_sistema,
85
+ max_tokens,
86
+ temperatura,
87
+ top_p,
88
+ top_k,
89
+ penalizacion_repeticion,
90
+ ):
91
+ plantilla_chat = MessagesFormatterType.GEMMA_2
92
+ global llm
93
+
94
+ if llm is None:
95
+ llm = Llama(
96
+ model_path="models/gemma-2-2b-it-abliterated-Q4_K_M.gguf",
97
+ flash_attn=True,
98
+ n_gpu_layers=81,
99
+ n_batch=1024,
100
+ n_ctx=8192,
101
+ )
102
+
103
+ proveedor = LlamaCppPythonProvider(llm)
104
+ agente = LlamaCppAgent(
105
+ proveedor,
106
+ system_prompt=f"{mensaje_sistema}",
107
+ predefined_messages_formatter_type=plantilla_chat,
108
+ debug_output=True
109
+ )
110
+
111
+ configuracion = proveedor.get_provider_default_settings()
112
+ configuracion.temperature = temperatura
113
+ configuracion.top_k = top_k
114
+ configuracion.top_p = top_p
115
+ configuracion.max_tokens = max_tokens
116
+ configuracion.repeat_penalty = penalizacion_repeticion
117
+ configuracion.stream = True
118
+
119
+ mensajes = BasicChatHistory()
120
+ for msj in historial:
121
+ usuario = {
122
+ 'role': Roles.user,
123
+ 'content': msj[0]
124
+ }
125
+ asistente = {
126
+ 'role': Roles.assistant,
127
+ 'content': msj[1]
128
+ }
129
+ mensajes.add_message(usuario)
130
+ mensajes.add_message(asistente)
131
+
132
+ flujo = agente.get_chat_response(
133
+ mensaje,
134
+ llm_sampling_settings=configuracion,
135
+ chat_history=mensajes,
136
+ returns_streaming_generator=True,
137
+ print_output=False
138
+ )
139
+
140
+ salida = ""
141
+ for fragmento in flujo:
142
+ salida += fragmento
143
+ yield salida
144
+
145
+ def actualizar_mensaje_sistema(personalidad):
146
+ return f"Eres un personaje con la siguiente personalidad: {personalidad}. Actúa y responde de acuerdo a estas características en todo momento."
147
+
148
+ def interfaz_chat():
149
+ with gr.Blocks() as demo:
150
+ gr.Markdown("# Chat de Rol Play con Gemma 2B")
151
+
152
+ with gr.Row():
153
+ generar_btn = gr.Button("Generar Nueva Personalidad")
154
+ personalidad_output = gr.Textbox(label="Personalidad Generada", lines=4, interactive=False)
155
+
156
+ chatbot = gr.Chatbot(scale=1, likeable=False, show_copy_button=True)
157
+ msg = gr.Textbox(label="Tu mensaje")
158
+ clear = gr.Button("Limpiar")
159
+
160
+ with gr.Accordion("Configuración Avanzada", open=False):
161
+ sistema_msg = gr.Textbox(value="Eres un asistente útil.", label="Mensaje del sistema", lines=3)
162
+ max_tokens = gr.Slider(minimum=1, maximum=4096, value=2048, step=1, label="Tokens máximos")
163
+ temperatura = gr.Slider(minimum=0.1, maximum=4.0, value=0.7, step=0.1, label="Temperatura")
164
+ top_p = gr.Slider(minimum=0.1, maximum=1.0, value=0.95, step=0.05, label="Top-p")
165
+ top_k = gr.Slider(minimum=0, maximum=100, value=40, step=1, label="Top-k")
166
+ penalizacion = gr.Slider(minimum=0.0, maximum=2.0, value=1.1, step=0.1, label="Penalización por repetición")
167
+
168
+ def on_generar_personalidad():
169
+ personalidad = generar_personalidad()
170
+ sistema_msg.update(value=actualizar_mensaje_sistema(personalidad))
171
+ return personalidad
172
+
173
+ generar_btn.click(on_generar_personalidad, outputs=[personalidad_output, sistema_msg])
174
+
175
+ msg.submit(responder, [msg, chatbot, sistema_msg, max_tokens, temperatura, top_p, top_k, penalizacion], [chatbot, msg])
176
+ clear.click(lambda: None, None, chatbot, queue=False)
177
+
178
+ return demo
179
+
180
+ if __name__ == "__main__":
181
+ demo = interfaz_chat()
182
+ demo.launch()