versae commited on
Commit
e50471b
1 Parent(s): 09379f0

Update demo

Browse files
Files changed (1) hide show
  1. gradio_app.py +168 -81
gradio_app.py CHANGED
@@ -50,9 +50,10 @@ LOW_CPU_MEM = bool(os.environ.get("LOW_CPU_MEM", False if DEVICE == "cpu" else T
50
  MODEL_NAME = os.environ.get("MODEL_NAME", "bertin-project/bertin-gpt-j-6B")
51
  MODEL_REVISION = os.environ.get("MODEL_REVISION", "main")
52
  MAX_LENGTH = int(os.environ.get("MAX_LENGTH", 1024))
53
- HEADER_INFO = """
54
- # BERTIN GPT-J-6B
55
- Spanish BERTIN GPT-J-6B Model.
 
56
  """.strip()
57
  LOGO = "https://huggingface.co/bertin-project/bertin-roberta-base-spanish/resolve/main/images/bertin.png"
58
  HEADER = f"""
@@ -83,7 +84,7 @@ span.generated-text {{
83
  <div align=center>
84
  <img src="{LOGO}" width=150/>
85
 
86
- # BERTIN GPT-J-6B
87
 
88
  BERTIN proporciona una serie de modelos de lenguaje en Español entrenados en abierto.
89
 
@@ -92,10 +93,10 @@ Este modelo ha sido entrenado con [Mesh Transformer JAX](https://github.com/king
92
  </div>
93
  """
94
 
95
- FOOTER = """
96
  <div align=center>
97
- Para más información, visite el repositorio del modelo: <a href="https://huggingface.co/bertin-project/bertin-gpt-j-6B">BERTIN-GPT-J-6B</a>.
98
- <img src="https://visitor-badge.glitch.me/badge?page_id=spaces/bertin-project/bertin-gpt-j-6B"/>
99
  <div align=center>
100
  """.strip()
101
 
@@ -103,6 +104,7 @@ EXAMPLES = [
103
  "",
104
  "Érase una vez,",
105
  "¿Cuál es la capital de Francia? Respuesta:",
 
106
  """Los templos egipcios fueron construidos para el culto oficial de los dioses y la conmemoración de los faraones del Antiguo Egipto en las regiones bajo su dominio. Los templos eran vistos como el hogar de los dioses o faraones deificados a quienes eran dedicados, y en ellos los faraones y el clero egipcio llevaban a cabo diversos rituales, las funciones centrales de la religión egipcia: realizar ofrendas a sus dioses, recrear pasajes mitológicos mediante festivales y protegerse de las fuerzas del caos. Estos rituales eran vistos como necesarios para que los dioses mantuvieran la maat, el orden divino del universo.
107
 
108
  El cuidado del hogar de los dioses era obligación de los faraones, que dedicaron ingentes cantidades de recursos para la construcción y el mantenimiento de los templos. Por necesidad, los faraones delegaban la mayoría de los rituales en una amplia casta sacerdotal, aunque la mayor parte del pueblo llano permanecía al margen de la participación directa en las ceremonias por tener prohibido el acceso a las zonas más sagradas de los templos. A pesar de ello, el templo siempre fue un importante centro religioso para todos los egipcios, que iban a ellos a rezar, realizar ofrendas y buscar la guía de los oráculos.
@@ -111,7 +113,8 @@ Pregunta: ¿Quién cuidaba del hogar los dioses?
111
  Respuesta:""",
112
  ]
113
 
114
- AGENT = "BERTIN"
 
115
  USER = "ENTREVISTADOR"
116
  CONTEXT = """La siguiente conversación es un extracto de una entrevista a {AGENT} celebrada en Madrid para Radio Televisión Española:
117
 
@@ -148,6 +151,9 @@ class TextGeneration:
148
  self.tokenizer = AutoTokenizer.from_pretrained(
149
  self.model_name_or_path, revision=MODEL_REVISION, use_auth_token=HF_AUTH_TOKEN if HF_AUTH_TOKEN else None,
150
  )
 
 
 
151
  self.model = AutoModelForCausalLM.from_pretrained(
152
  self.model_name_or_path, revision=MODEL_REVISION,
153
  use_auth_token=HF_AUTH_TOKEN if HF_AUTH_TOKEN else None,
@@ -167,24 +173,40 @@ class TextGeneration:
167
 
168
 
169
  def generate(self, text, generation_kwargs, previous_text=None):
 
 
 
 
 
 
 
 
170
  input_text = previous_text or text
171
- max_length = len(self.tokenizer(input_text)["input_ids"]) + generation_kwargs["max_length"]
172
- generation_kwargs["max_length"] = min(max_length, self.model.config.n_positions)
 
173
  generated_text = None
174
  if input_text:
 
 
 
 
 
 
175
  for _ in range(10):
176
- generated_text = self.generator(
177
  input_text,
178
  **generation_kwargs,
179
- )[0]["generated_text"]
 
180
  if generated_text.strip().startswith(input_text):
181
  generated_text = generated_text.replace(input_text, "", 1).strip()
182
- if generation_kwargs["do_clean"]:
183
  generated_text = cleaner.clean_txt(generated_text)
184
  if generated_text:
185
  if previous_text and previous_text != text:
186
  diff = [
187
- (text, None), (previous_text.replace(text, " ", 1).strip(), " "), (generated_text, AGENT)
188
  ]
189
  else:
190
  diff = [(text, None), (generated_text, AGENT)]
@@ -195,7 +217,7 @@ class TextGeneration:
195
  if not generated_text:
196
  return (
197
  "",
198
- [("Tras 10 intentos BERTIN no generó nada. Pruebe cambiando las opciones.", "ERROR")]
199
  )
200
  return (
201
  "",
@@ -215,36 +237,51 @@ cleaner = Normalizer()
215
  generator = load_text_generator()
216
 
217
 
218
- def complete_with_gpt(text, max_length, top_k, top_p, temperature, do_sample, do_clean):
219
  generation_kwargs = {
220
  "max_length": max_length,
221
  "top_k": top_k,
222
  "top_p": top_p,
 
 
223
  "temperature": temperature,
 
 
 
224
  "do_sample": do_sample,
225
  "do_clean": do_clean,
226
  }
227
  return generator.generate(text, generation_kwargs)
228
 
229
- def expand_with_gpt(hidden, text, max_length, top_k, top_p, temperature, do_sample, do_clean):
230
  generation_kwargs = {
231
  "max_length": max_length,
232
  "top_k": top_k,
233
  "top_p": top_p,
 
 
234
  "temperature": temperature,
 
 
 
235
  "do_sample": do_sample,
236
  "do_clean": do_clean,
237
  }
238
  return generator.generate(text, generation_kwargs, previous_text=hidden)
239
 
240
- def chat_with_gpt(agent, user, context, user_message, history, max_length, top_k, top_p, temperature, do_sample, do_clean):
241
  # agent = AGENT
242
  # user = USER
243
  generation_kwargs = {
244
- "max_length": 25,
245
  "top_k": top_k,
246
  "top_p": top_p,
 
 
247
  "temperature": temperature,
 
 
 
248
  "do_sample": do_sample,
249
  "do_clean": do_clean,
250
  # "num_return_sequences": 1,
@@ -295,7 +332,7 @@ def chat_with_gpt(agent, user, context, user_message, history, max_length, top_k
295
  print("RESPONSE:")
296
  print(response)
297
  if not response.strip():
298
- response = random.choice(["No sé muy bien cómo contestar a eso.", "No estoy seguro.", "Prefiero no contestar.", "Ni idea.", "¿Podemos cambiar de tema?"])
299
  history.append((user_message, response))
300
  return history, history, ""
301
 
@@ -304,54 +341,103 @@ def chat_with_gpt(agent, user, context, user_message, history, max_length, top_k
304
  with gr.Blocks() as demo:
305
  gr.Markdown(HEADER)
306
  with gr.Row():
307
- with gr.Group():
308
- with gr.Box():
309
- gr.Markdown("Opciones")
310
- max_length = gr.Slider(
311
- label='Longitud máxima',
312
- # help="Número máximo (aproximado) de palabras a generar.",
313
- minimum=1,
314
- maximum=MAX_LENGTH,
315
- value=50,
316
- step=1
317
- )
318
- top_k = gr.Slider(
319
- label='Top-k',
320
- # help="Número de palabras con alta probabilidad a mantener para el filtrado `top-k`",
321
- minimum=40,
322
- maximum=80,
323
- value=50,
324
- step=1
325
- )
326
- top_p = gr.Slider(
327
- label='Top-p',
328
- # help="Solo las palabras más probables con probabilidades que sumen `top_p` o más se mantienen para la generación.",
329
- minimum=0.0,
330
- maximum=1.0,
331
- value=0.95,
332
- step=0.01
333
- )
334
- temperature = gr.Slider(
335
- label='Temperatura',
336
- # help="Valor utilizado para modular las probabilidades de las siguientes palabras generadas.",
337
- minimum=0.1,
338
- maximum=10.0,
339
- value=0.8,
340
- step=0.05
341
- )
342
- do_sample = gr.Checkbox(
343
- label='¿Muestrear?',
344
- value = True,
345
- # options=(True, False),
346
- # help="Si no se muestrea se usará una decodificación voraz (_greedy_).",
347
- )
348
- do_clean = gr.Checkbox(
349
- label='¿Limpiar texto?',
350
- value = True,
351
- # options=(True, False),
352
- # help="Si eliminar o no las palabras repetidas y recortar las últimas frases sin terminar.",
353
- )
354
- with gr.Column():
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
355
  with gr.Tabs():
356
  with gr.TabItem("Generar"):
357
  textbox = gr.Textbox(label="Texto", placeholder="Escriba algo (o seleccione un ejemplo) y pulse 'Generar'...", lines=8)
@@ -363,13 +449,14 @@ with gr.Blocks() as demo:
363
  elem_id="htext",
364
  label="Resultado",
365
  combine_adjacent=True,
366
- color_map={AGENT: "green", "ERROR": "red", " ": "blue"},
 
367
  )
368
  with gr.Row():
369
  generate_btn = gr.Button("Generar")
370
- generate_btn.click(complete_with_gpt, inputs=[textbox, max_length, top_k, top_p, temperature, do_sample, do_clean], outputs=[hidden, output])
371
  expand_btn = gr.Button("Añadir")
372
- expand_btn.click(expand_with_gpt, inputs=[hidden, textbox, max_length, top_k, top_p, temperature, do_sample, do_clean], outputs=[hidden, output])
373
 
374
  edit_btn = gr.Button("Editar", variant="secondary")
375
  edit_btn.click(lambda x: (x, "", []), inputs=[hidden], outputs=[textbox, hidden, output])
@@ -378,23 +465,23 @@ with gr.Blocks() as demo:
378
  examples.change(lambda x: x, inputs=[examples], outputs=[textbox])
379
 
380
  with gr.TabItem("Charlar") as tab_chat:
381
- tab_chat.select(lambda: 25, inputs=[], outputs=[max_length])
382
  context = gr.Textbox(label="Contexto", value=CONTEXT, lines=5)
383
  with gr.Row():
384
  agent = gr.Textbox(label="Agente", value=AGENT)
385
  user = gr.Textbox(label="Usuario", value=USER)
386
  history = gr.Variable(value=[])
387
- chatbot = gr.Chatbot(color_map=("green", "gray"))
388
  with gr.Row():
389
  message = gr.Textbox(placeholder="Escriba aquí su mensaje y pulse 'Enviar'", show_label=False)
390
  chat_btn = gr.Button("Enviar")
391
- chat_btn.click(chat_with_gpt, inputs=[agent, user, context, message, history, max_length, top_k, top_p, temperature, do_sample, do_clean], outputs=[chatbot, history, message])
392
  gr.Markdown(FOOTER)
393
 
394
- with gr.Interface(lambda: None, inputs=["text", max_length, top_k, top_p, temperature, do_sample, do_clean], outputs=[hidden, output]) as iface:
395
- demo.examples = None
396
- demo.predict_durations = []
397
- demo.input_components = iface.input_components
398
- demo.output_components = iface.output_components
399
-
400
- demo.launch()
 
50
  MODEL_NAME = os.environ.get("MODEL_NAME", "bertin-project/bertin-gpt-j-6B")
51
  MODEL_REVISION = os.environ.get("MODEL_REVISION", "main")
52
  MAX_LENGTH = int(os.environ.get("MAX_LENGTH", 1024))
53
+ display_model_name = "BERTIN GPT-J-6B" if MODEL_NAME == "bertin-project/bertin-gpt-j-6B" else MODEL_NAME.upper()
54
+ HEADER_INFO = f"""
55
+ # {display_model_name}
56
+ Spanish {display_model_name} Model.
57
  """.strip()
58
  LOGO = "https://huggingface.co/bertin-project/bertin-roberta-base-spanish/resolve/main/images/bertin.png"
59
  HEADER = f"""
 
84
  <div align=center>
85
  <img src="{LOGO}" width=150/>
86
 
87
+ # {display_model_name}
88
 
89
  BERTIN proporciona una serie de modelos de lenguaje en Español entrenados en abierto.
90
 
 
93
  </div>
94
  """
95
 
96
+ FOOTER = f"""
97
  <div align=center>
98
+ Para más información, visite el repositorio del modelo: <a href="https://huggingface.co/{MODEL_NAME}">{display_model_name}</a>.
99
+ <img src="https://visitor-badge.glitch.me/badge?page_id=spaces/{MODEL_NAME}"/>
100
  <div align=center>
101
  """.strip()
102
 
 
104
  "",
105
  "Érase una vez,",
106
  "¿Cuál es la capital de Francia? Respuesta:",
107
+ "En un lugar de la Mancha, de cuyo nombre no quiero acordarme, no ha mucho tiempo que vivía un hidalgo de los de lanza en astillero, adarga antigua, rocín flaco y galgo corredor.",
108
  """Los templos egipcios fueron construidos para el culto oficial de los dioses y la conmemoración de los faraones del Antiguo Egipto en las regiones bajo su dominio. Los templos eran vistos como el hogar de los dioses o faraones deificados a quienes eran dedicados, y en ellos los faraones y el clero egipcio llevaban a cabo diversos rituales, las funciones centrales de la religión egipcia: realizar ofrendas a sus dioses, recrear pasajes mitológicos mediante festivales y protegerse de las fuerzas del caos. Estos rituales eran vistos como necesarios para que los dioses mantuvieran la maat, el orden divino del universo.
109
 
110
  El cuidado del hogar de los dioses era obligación de los faraones, que dedicaron ingentes cantidades de recursos para la construcción y el mantenimiento de los templos. Por necesidad, los faraones delegaban la mayoría de los rituales en una amplia casta sacerdotal, aunque la mayor parte del pueblo llano permanecía al margen de la participación directa en las ceremonias por tener prohibido el acceso a las zonas más sagradas de los templos. A pesar de ello, el templo siempre fue un importante centro religioso para todos los egipcios, que iban a ellos a rezar, realizar ofrendas y buscar la guía de los oráculos.
 
113
  Respuesta:""",
114
  ]
115
 
116
+ AGENT = os.environ.get("AGENT_NAME", "BERTIN")
117
+ PREV = "PREV"
118
  USER = "ENTREVISTADOR"
119
  CONTEXT = """La siguiente conversación es un extracto de una entrevista a {AGENT} celebrada en Madrid para Radio Televisión Española:
120
 
 
151
  self.tokenizer = AutoTokenizer.from_pretrained(
152
  self.model_name_or_path, revision=MODEL_REVISION, use_auth_token=HF_AUTH_TOKEN if HF_AUTH_TOKEN else None,
153
  )
154
+ self.tokenizer_prefix_space = AutoTokenizer.from_pretrained(
155
+ self.model_name_or_path, add_prefix_space=True, revision=MODEL_REVISION, use_auth_token=HF_AUTH_TOKEN if HF_AUTH_TOKEN else None,
156
+ )
157
  self.model = AutoModelForCausalLM.from_pretrained(
158
  self.model_name_or_path, revision=MODEL_REVISION,
159
  use_auth_token=HF_AUTH_TOKEN if HF_AUTH_TOKEN else None,
 
173
 
174
 
175
  def generate(self, text, generation_kwargs, previous_text=None):
176
+ do_clean = generation_kwargs.pop("do_clean", False)
177
+ bad_words = generation_kwargs.pop("bad_words", "")
178
+ if bad_words:
179
+ generation_kwargs["bad_words_ids"] = self.tokenizer_prefix_space(
180
+ [word.strip() for word in bad_words.split(",")], add_special_tokens=False
181
+ ).input_ids
182
+ if "repetition_penalty" in generation_kwargs:
183
+ generation_kwargs["repetition_penalty"] = float(generation_kwargs["repetition_penalty"])
184
  input_text = previous_text or text
185
+ # max_length = len(self.tokenizer(input_text)["input_ids"]) + generation_kwargs["max_length"]
186
+ # generation_kwargs["max_length"] = min(max_length, self.model.config.n_positions)
187
+ generation_kwargs["max_new_tokens"] = generation_kwargs.pop("max_length", 50)
188
  generated_text = None
189
  if input_text:
190
+ pre_input_text = ""
191
+ input_ids = self.tokenizer(input_text).input_ids
192
+ if len(input_ids) + generation_kwargs["max_new_tokens"] >= 2048:
193
+ prompt_cutoff = 2048 - generation_kwargs["max_new_tokens"] + 1
194
+ pre_input_text = self.tokenizer.decode(input_ids[:-prompt_cutoff])
195
+ input_text = self.tokenizer.decode(input_ids[-prompt_cutoff:])
196
  for _ in range(10):
197
+ generated_text = pre_input_text + (" " if do_clean else "") + self.generator(
198
  input_text,
199
  **generation_kwargs,
200
+ )[0]["generated_text"]
201
+ input_text = self.tokenizer.decode(input_ids)
202
  if generated_text.strip().startswith(input_text):
203
  generated_text = generated_text.replace(input_text, "", 1).strip()
204
+ if do_clean:
205
  generated_text = cleaner.clean_txt(generated_text)
206
  if generated_text:
207
  if previous_text and previous_text != text:
208
  diff = [
209
+ (text, None), (previous_text.replace(text, " ", 1).strip(), PREV), (generated_text, AGENT)
210
  ]
211
  else:
212
  diff = [(text, None), (generated_text, AGENT)]
 
217
  if not generated_text:
218
  return (
219
  "",
220
+ [(f"Tras 10 intentos {AGENT} no generó nada. Pruebe cambiando las opciones.", "ERROR")]
221
  )
222
  return (
223
  "",
 
237
  generator = load_text_generator()
238
 
239
 
240
+ def complete_with_gpt(text, max_length, top_k, top_p, penalty_alpha, num_beams, temperature, repetition_penalty, no_repeat_ngram_size, bad_words, do_sample, do_clean):
241
  generation_kwargs = {
242
  "max_length": max_length,
243
  "top_k": top_k,
244
  "top_p": top_p,
245
+ "penalty_alpha": penalty_alpha,
246
+ "num_beams": num_beams,
247
  "temperature": temperature,
248
+ "repetition_penalty": repetition_penalty,
249
+ "no_repeat_ngram_size": no_repeat_ngram_size,
250
+ "bad_words": bad_words,
251
  "do_sample": do_sample,
252
  "do_clean": do_clean,
253
  }
254
  return generator.generate(text, generation_kwargs)
255
 
256
+ def expand_with_gpt(hidden, text, max_length, top_k, top_p, penalty_alpha, num_beams, temperature, repetition_penalty, no_repeat_ngram_size, bad_words, do_sample, do_clean):
257
  generation_kwargs = {
258
  "max_length": max_length,
259
  "top_k": top_k,
260
  "top_p": top_p,
261
+ "penalty_alpha": penalty_alpha,
262
+ "num_beams": num_beams,
263
  "temperature": temperature,
264
+ "repetition_penalty": repetition_penalty,
265
+ "no_repeat_ngram_size": no_repeat_ngram_size,
266
+ "bad_words": bad_words,
267
  "do_sample": do_sample,
268
  "do_clean": do_clean,
269
  }
270
  return generator.generate(text, generation_kwargs, previous_text=hidden)
271
 
272
+ def chat_with_gpt(agent, user, context, user_message, history, max_length, top_k, top_p, penalty_alpha, num_beams, temperature, repetition_penalty, no_repeat_ngram_size, bad_words, do_sample, do_clean):
273
  # agent = AGENT
274
  # user = USER
275
  generation_kwargs = {
276
+ "max_length": max_length,
277
  "top_k": top_k,
278
  "top_p": top_p,
279
+ "penalty_alpha": penalty_alpha,
280
+ "num_beams": num_beams,
281
  "temperature": temperature,
282
+ "repetition_penalty": repetition_penalty,
283
+ "no_repeat_ngram_size": no_repeat_ngram_size,
284
+ "bad_words": bad_words,
285
  "do_sample": do_sample,
286
  "do_clean": do_clean,
287
  # "num_return_sequences": 1,
 
332
  print("RESPONSE:")
333
  print(response)
334
  if not response.strip():
335
+ response = random.choice(["No sé muy bien cómo contestar a eso.", "No puedo contestar con seguridad.", "Prefiero no contestar.", "Ni idea.", "¿Podemos cambiar de tema?"])
336
  history.append((user_message, response))
337
  return history, history, ""
338
 
 
341
  with gr.Blocks() as demo:
342
  gr.Markdown(HEADER)
343
  with gr.Row():
344
+ with gr.Column(scale=1):
345
+ with gr.Group():
346
+ with gr.Box():
347
+ gr.Markdown("Opciones")
348
+ with gr.Tabs():
349
+ with gr.TabItem("Generación"):
350
+ max_length = gr.Slider(
351
+ label='Palabras a generar',
352
+ # help="Número máximo (aproximado) de palabras a generar.",
353
+ minimum=1,
354
+ maximum=MAX_LENGTH,
355
+ value=50,
356
+ step=1
357
+ )
358
+ top_k = gr.Slider(
359
+ label='Top-k',
360
+ # help="Número de palabras con alta probabilidad a mantener para el filtrado `top-k`",
361
+ minimum=0,
362
+ maximum=80,
363
+ value=50,
364
+ step=1
365
+ )
366
+ top_p = gr.Slider(
367
+ label='Top-p',
368
+ # help="Solo las palabras más probables con probabilidades que sumen `top_p` o más se mantienen para la generación.",
369
+ minimum=0.01,
370
+ maximum=5.0,
371
+ value=0.95,
372
+ step=0.01
373
+ )
374
+ penalty_alpha = gr.Slider(
375
+ label='Penalización (alpha)',
376
+ # help="Penalización para contrastive search.",
377
+ minimum=0.0,
378
+ maximum=1.0,
379
+ value=0.0,
380
+ step=0.01
381
+ )
382
+ num_beams = gr.Slider(
383
+ label='Haces (beams)',
384
+ # help="Número de beams para búsqueda.",
385
+ minimum=1,
386
+ maximum=50,
387
+ value=1,
388
+ step=1
389
+ )
390
+ temperature = gr.Slider(
391
+ label='Temperatura',
392
+ # help="Valor utilizado para modular las probabilidades de las siguientes palabras generadas.",
393
+ minimum=0.0,
394
+ maximum=10.0,
395
+ value=0.8,
396
+ step=0.05
397
+ )
398
+ do_sample = gr.Checkbox(
399
+ label='¿Muestrear?',
400
+ value = True,
401
+ # options=(True, False),
402
+ # help="Si no se muestrea se usará una decodificación voraz (_greedy_).",
403
+ )
404
+ do_clean = gr.Checkbox(
405
+ label='¿Limpiar texto?',
406
+ value = False,
407
+ # options=(True, False),
408
+ # help="Si eliminar o no las palabras repetidas y recortar las últimas frases sin terminar.",
409
+ )
410
+ with gr.TabItem("Control de repetición"):
411
+ repetition_penalty = gr.Slider(
412
+ label='Penalización por repetición',
413
+ help="Un valor de 1 significa no penalización.",
414
+ minimum=1.0,
415
+ maximum=10.0,
416
+ value=1.0,
417
+ step=0.01
418
+ )
419
+ no_repeat_ngram_size = gr.Slider(
420
+ label='No repetir ngrams de tamaño',
421
+ minimum=0,
422
+ maximum=10,
423
+ value=0,
424
+ step=1
425
+ )
426
+ bad_words = gr.Textbox(
427
+ label="Palabras a evitar",
428
+ info="Lista de palabras separadas por comas",
429
+ lines=1,
430
+ value="",
431
+ )
432
+ with gr.Accordion("Estrategias", open=False):
433
+ gr.Markdown("""
434
+ - **greedy decoding** si `num_beams=1` y `do_sample=False`
435
+ - **contrastive search** si `penalty_alpha>0.0` y `top_k>1`
436
+ - **multinomial sampling** si `num_beams=1` y `do_sample=True`
437
+ - **beam-search decoding** si `num_beams>1` y `do_sample=False`
438
+ - **beam-search multinomial sampling** si `num_beams>1` y `do_sample=True`
439
+ """)
440
+ with gr.Column(scale=4):
441
  with gr.Tabs():
442
  with gr.TabItem("Generar"):
443
  textbox = gr.Textbox(label="Texto", placeholder="Escriba algo (o seleccione un ejemplo) y pulse 'Generar'...", lines=8)
 
449
  elem_id="htext",
450
  label="Resultado",
451
  combine_adjacent=True,
452
+ ).style(
453
+ color_map={AGENT: "green", "ERROR": "red", PREV: "blue"},
454
  )
455
  with gr.Row():
456
  generate_btn = gr.Button("Generar")
457
+ generate_btn.click(complete_with_gpt, inputs=[textbox, max_length, top_k, top_p, penalty_alpha, num_beams, temperature, repetition_penalty, no_repeat_ngram_size, bad_words, do_sample, do_clean], outputs=[hidden, output], api_name="generate")
458
  expand_btn = gr.Button("Añadir")
459
+ expand_btn.click(expand_with_gpt, inputs=[hidden, textbox, max_length, top_k, top_p, penalty_alpha, num_beams, temperature, repetition_penalty, no_repeat_ngram_size, bad_words, do_sample, do_clean], outputs=[hidden, output])
460
 
461
  edit_btn = gr.Button("Editar", variant="secondary")
462
  edit_btn.click(lambda x: (x, "", []), inputs=[hidden], outputs=[textbox, hidden, output])
 
465
  examples.change(lambda x: x, inputs=[examples], outputs=[textbox])
466
 
467
  with gr.TabItem("Charlar") as tab_chat:
468
+ # tab_chat.select(lambda: 25, inputs=[], outputs=[max_length])
469
  context = gr.Textbox(label="Contexto", value=CONTEXT, lines=5)
470
  with gr.Row():
471
  agent = gr.Textbox(label="Agente", value=AGENT)
472
  user = gr.Textbox(label="Usuario", value=USER)
473
  history = gr.Variable(value=[])
474
+ chatbot = gr.Chatbot().style(color_map=("green", "gray"))
475
  with gr.Row():
476
  message = gr.Textbox(placeholder="Escriba aquí su mensaje y pulse 'Enviar'", show_label=False)
477
  chat_btn = gr.Button("Enviar")
478
+ chat_btn.click(chat_with_gpt, inputs=[agent, user, context, message, history, max_length, top_k, top_p, penalty_alpha, num_beams, temperature, repetition_penalty, no_repeat_ngram_size, bad_words, do_sample, do_clean], outputs=[chatbot, history, message])
479
  gr.Markdown(FOOTER)
480
 
481
+ # with gr.Interface(lambda: None, inputs=["text", max_length, top_k, top_p, penalty_alpha, num_beams, temperature, do_sample, do_clean], outputs=[hidden, output]) as iface:
482
+ # demo.examples = None
483
+ # demo.predict_durations = []
484
+ # demo.input_components = iface.input_components
485
+ # demo.output_components = iface.output_components
486
+ demo.queue()
487
+ demo.launch(share=True)