nmarafo commited on
Commit
ad5faaa
1 Parent(s): 719e873

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +109 -75
app.py CHANGED
@@ -26,82 +26,116 @@ model = AutoModelForCausalLM.from_pretrained(
26
  token=token
27
  )
28
 
29
- # Definir terminadores de secuencia
30
- terminators = [
31
- tokenizer.eos_token_id,
32
- tokenizer.convert_tokens_to_ids("<|eot_id|>")
33
- ]
34
-
35
- # Mensaje del sistema (system message)
36
- SYS_PROMPT = """Eres un asistente que responde preguntas de forma conversacional.
37
- Se te proporciona una pregunta y contexto adicional. Proporciona una respuesta clara y precisa.
38
- Si no sabes la respuesta, simplemente di "No lo sé". No inventes una respuesta."""
39
-
40
- # Función principal para manejar la conversación
41
- def talk(prompt, history):
42
- formatted_prompt = f"Pregunta: {prompt}\nContexto: {SYS_PROMPT}"
43
- formatted_prompt = formatted_prompt[:2000] # Limitar a 2000 caracteres para evitar problemas de OOM
44
-
45
- # Preparar los mensajes para el modelo
46
- messages = [{"role": "system", "content": SYS_PROMPT}, {"role": "user", "content": formatted_prompt}]
47
-
48
- # Tokenizar el prompt
49
- input_ids = tokenizer.apply_chat_template(
50
- messages,
51
- add_generation_prompt=True,
52
- return_tensors="pt"
53
- ).to(model.device)
54
-
55
- # Configurar el generador de texto con streaming
56
- streamer = TextIteratorStreamer(
57
- tokenizer, timeout=10.0, skip_prompt=True, skip_special_tokens=True
58
- )
59
-
60
- # Configurar los argumentos para la generación
61
- generate_kwargs = dict(
62
- input_ids=input_ids,
63
- streamer=streamer,
64
- max_new_tokens=512, # Reducido para evitar OOM
65
- do_sample=True,
66
- top_p=0.95,
67
- temperature=0.75,
68
- eos_token_id=terminators,
69
- )
70
-
71
- # Iniciar el hilo para la generación de texto
72
- t = Thread(target=model.generate, kwargs=generate_kwargs)
73
- t.start()
74
-
75
- # Recoger los resultados de forma incremental
76
- outputs = []
77
- for text in streamer:
78
- outputs.append(text)
79
- yield "".join(outputs)
80
-
81
-
82
- # Configuración de la interfaz de Gradio
83
- TITLE = "# Chatbot de Respuestas"
84
- DESCRIPTION = """
85
- Este chatbot responde preguntas de manera conversacional usando un modelo cuantizado.
86
- """
87
-
88
- # Crear la interfaz del chatbot en Gradio
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
89
  demo = gr.ChatInterface(
90
- fn=talk,
91
- chatbot=gr.Chatbot(
92
- show_label=True,
93
- show_share_button=True,
94
- show_copy_button=True,
95
- likeable=True,
96
- layout="bubble",
97
- bubble_full_width=False,
98
- ),
99
- theme="Soft",
100
- examples=[["¿Qué es la anarquía?"]],
101
- title=TITLE,
102
- description=DESCRIPTION,
103
  )
104
 
105
- # Lanzar la interfaz de Gradio
106
  if __name__ == "__main__":
107
- demo.launch(debug=True)
 
26
  token=token
27
  )
28
 
29
+ # Función para generar el prompt dependiendo del idioma seleccionado
30
+ def generar_prompt(message, tipo_clasificacion, idioma):
31
+ if idioma == "Español":
32
+ politicas = {
33
+ "Contenido Peligroso": """
34
+ * "No al contenido peligroso": El mensaje no debe contener ni buscar la generación de contenido que cause daño a uno mismo o a otros (por ejemplo, acceder o fabricar armas de fuego o explosivos, promoción del terrorismo, instrucciones para el suicidio).
35
+ """,
36
+ "Acoso": """
37
+ * "No al acoso": El mensaje no debe contener ni buscar la generación de contenido que sea malicioso, intimidante, que fomente el bullying o abusivo dirigido a otra persona (por ejemplo, amenazas físicas, negación de eventos trágicos, menosprecio a víctimas de violencia).
38
+ """,
39
+ "Discurso de Odio": """
40
+ * "No al discurso de odio": El mensaje no debe contener ni buscar la generación de contenido que ataque la identidad o atributos protegidos (por ejemplo, insultos raciales, promoción de la discriminación, llamados a la violencia contra grupos protegidos) o que deshumanice, menosprecie o vilipendie por motivos de raza, etnia, religión, discapacidad, edad, nacionalidad, estatus de veterano, orientación sexual, género, identidad de género, casta, u otro estatus protegido.
41
+ """,
42
+ "Contenido Sexual": """
43
+ * "No al contenido sexual explícito": El mensaje no debe contener ni buscar la generación de contenido que haga referencia a actos sexuales u otro contenido lascivo (por ejemplo, descripciones gráficas sexuales, contenido destinado a causar excitación). Los términos médicos o científicos relacionados con la anatomía humana o la educación sexual están permitidos.
44
+ """
45
+ }
46
+ else: # English
47
+ politicas = {
48
+ "Dangerous Content": """
49
+ * "No Dangerous Content": The prompt shall not contain or seek generation of content that harms oneself and/or others (e.g., accessing or building firearms and explosive devices, promotion of terrorism, instructions for suicide).
50
+ """,
51
+ "Harassment": """
52
+ * "No Harassment": The prompt shall not contain or seek generation of content that is malicious, intimidating, bullying, or abusive content targeting another individual (e.g., physical threats, denial of tragic events, disparaging victims of violence).
53
+ """,
54
+ "Hate Speech": """
55
+ * "No Hate Speech": The prompt shall not contain or seek generation of content that targets identity and/or protected attributes (e.g., racial slurs, promotion of discrimination, calls to violence against protected groups) or dehumanizing/belittling/vilifying based on race, ethnicity, religion, disability, age, nationality, veteran status, sexual orientation, gender, gender identity, caste, or any other protected status.
56
+ """,
57
+ "Sexually Explicit Information": """
58
+ * "No Sexually Explicit Information": The prompt shall not contain or seek generation of content that contains references to sexual acts or other lewd content (e.g., sexually graphic descriptions, content aimed at causing arousal). Medical or scientific terms related to human anatomy or sex education are permitted.
59
+ """
60
+ }
61
+
62
+ # Formatear el prompt según el tipo de clasificación seleccionado
63
+ politica_seguridad = politicas.get(tipo_clasificacion, "")
64
+
65
+ if idioma == "Español":
66
+ prompt = f"""Eres un experto en políticas tratando de determinar si un mensaje del usuario
67
+ viola las políticas de seguridad definidas.
68
+
69
+ <inicio_turno>
70
+ Pregunta del usuario: {message.strip()}
71
+ <fin_turno>
72
+
73
+ Nuestro principio de seguridad se define a continuación:
74
+
75
+ {politica_seguridad.strip()}
76
+
77
+ ¿La pregunta del usuario viola el principio anterior? Tu respuesta debe comenzar con
78
+ 'Sí' o 'No'. Luego, explica paso a paso para asegurarte de que respondemos correctamente.
79
+ """
80
+ else: # Default to English
81
+ prompt = f"""You are a policy expert trying to help determine whether a user prompt is in
82
+ violation of the defined safety policies.
83
+
84
+ <start_of_turn>
85
+ Human Question: {message.strip()}
86
+ <end_of_turn>
87
+
88
+ Our safety principle is defined below:
89
+
90
+ {politica_seguridad.strip()}
91
+
92
+ Does the human question violate the above principle? Your answer must start with
93
+ 'Yes' or 'No'. Then walk through step by step to be sure we answer correctly.
94
+ """
95
+
96
+ return prompt
97
+
98
+ # Función para procesar la respuesta y clasificar según las políticas de seguridad
99
+ def respond(message, history: list[tuple[str, str]], system_message, max_tokens, temperature, top_p, language, harm_type):
100
+ prompt = generar_prompt(message, harm_type, language)
101
+
102
+ inputs = tokenizer(prompt, return_tensors="pt").to("cuda")
103
+
104
+ with torch.no_grad():
105
+ logits = model(**inputs).logits
106
+
107
+ # Extraer los logits para los tokens 'Yes'/'No' en inglés o 'Sí'/'No' en español
108
+ vocab = tokenizer.get_vocab()
109
+ if language == "Español":
110
+ selected_logits = logits[0, -1, [vocab['Sí'], vocab['No']]]
111
+ else:
112
+ selected_logits = logits[0, -1, [vocab['Yes'], vocab['No']]]
113
+
114
+ # Convertir los logits en una probabilidad con softmax
115
+ probabilities = softmax(selected_logits, dim=0)
116
+
117
+ # Devolver la probabilidad de 'Sí'/'Yes' y la respuesta generada
118
+ score_yes = probabilities[0].item()
119
+
120
+ if language == "Español":
121
+ response = f"Puntuación para 'Sí' (violación): {score_yes:.4f}"
122
+ else:
123
+ response = f"Score for 'Yes' (violation): {score_yes:.4f}"
124
+
125
+ return response
126
+
127
+ # Crear la interfaz de Gradio con selección de idioma y tipo de contenido
128
  demo = gr.ChatInterface(
129
+ respond,
130
+ additional_inputs=[
131
+ gr.Textbox(value="You are a friendly Chatbot.", label="System message"),
132
+ gr.Slider(minimum=1, maximum=2048, value=512, step=1, label="Max new tokens"),
133
+ gr.Slider(minimum=0.1, maximum=4.0, value=0.7, step=0.1, label="Temperature"),
134
+ gr.Slider(minimum=0.1, maximum=1.0, value=0.95, step=0.05, label="Top-p (nucleus sampling)"),
135
+ gr.Dropdown(choices=["English", "Español"], value="English", label="Idioma/Language"),
136
+ gr.Dropdown(choices=["Dangerous Content", "Harassment", "Hate Speech", "Sexually Explicit Information"], value="Harassment", label="Harm Type")
137
+ ],
 
 
 
 
138
  )
139
 
 
140
  if __name__ == "__main__":
141
+ demo.launch()