crscardellino commited on
Commit
9591b5b
1 Parent(s): 3c4fc8b

First part of the presentation notebook

Browse files
Files changed (3) hide show
  1. flisol-cordoba-2023.ipynb +518 -0
  2. img/gandalf.gif +3 -0
  3. img/me.jpg +3 -0
flisol-cordoba-2023.ipynb ADDED
@@ -0,0 +1,518 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "markdown",
5
+ "id": "65c9fdf3",
6
+ "metadata": {
7
+ "slideshow": {
8
+ "slide_type": "slide"
9
+ }
10
+ },
11
+ "source": [
12
+ "Hugging Face: IA Colaborativa\n",
13
+ "========================="
14
+ ]
15
+ },
16
+ {
17
+ "cell_type": "markdown",
18
+ "id": "32a802c2",
19
+ "metadata": {
20
+ "slideshow": {
21
+ "slide_type": "subslide"
22
+ }
23
+ },
24
+ "source": [
25
+ "¿Quién soy?\n",
26
+ "------------------\n",
27
+ "\n",
28
+ "<div style=\"text-align:center\">\n",
29
+ " <h4 style=\"font-size:1.5em;margin:5px\">Cristian Cardellino</h4>\n",
30
+ " <h5 style=\"font-style:normal;font-size:1em;margin:5px\">Profesor de FAMAFyC (UNC) - Investigador en Mercado Libre</h5>\n",
31
+ " <div style=\"display:inline-block;margin-right:0px;\">\n",
32
+ " <img src=\"./img/me.jpg\" style=\"height:10em;width:auto;\"/>\n",
33
+ " </div>\n",
34
+ " <h6 style=\"font-style:normal;font-size:0.9em;margin:5px;\">\n",
35
+ " <a href=\"https://twitter.com/crscardellino\" style=\"color:royalblue;\" target=\"_blank\">@crscardellino</a> -\n",
36
+ " <a href=\"https://mastodon.social/@crscardellino\" style=\"color:royalblue;\" target=\"_blank\">@crscardellino@mastodon.social</a> -\n",
37
+ " <a href=\"https://crscardellino.ar\" style=\"color:royalblue;\" target=\"_blank\">https://crscardellino.ar</a>\n",
38
+ " </h6>\n",
39
+ "</div>"
40
+ ]
41
+ },
42
+ {
43
+ "cell_type": "markdown",
44
+ "id": "bb685a55",
45
+ "metadata": {
46
+ "slideshow": {
47
+ "slide_type": "subslide"
48
+ }
49
+ },
50
+ "source": [
51
+ "## Esquema de la charla\n",
52
+ "\n",
53
+ "1. [¿Qué hay detrás de ChatGPT?](#¿Qué-hay-detrás-de-ChatGPT?)\n",
54
+ "2. [Hugging Face](#Hugging-Face)\n",
55
+ "3. [Utilizando un modelo de Hugging Face](#Utilizando-un-modelo-de-Hugging-Face)\n",
56
+ "4. Personalizando un modelo de Hugging Face"
57
+ ]
58
+ },
59
+ {
60
+ "cell_type": "markdown",
61
+ "id": "eb7f3997",
62
+ "metadata": {
63
+ "slideshow": {
64
+ "slide_type": "slide"
65
+ }
66
+ },
67
+ "source": [
68
+ "# ¿Qué hay detrás de ChatGPT?"
69
+ ]
70
+ },
71
+ {
72
+ "cell_type": "markdown",
73
+ "id": "87d1ca59",
74
+ "metadata": {
75
+ "slideshow": {
76
+ "slide_type": "subslide"
77
+ }
78
+ },
79
+ "source": [
80
+ "## ¿Cómo continúa esta frase?\n",
81
+ "\n",
82
+ "<h2 style=\"text-align:center;font-weight:normal;\">You ...</h2>"
83
+ ]
84
+ },
85
+ {
86
+ "cell_type": "markdown",
87
+ "id": "1e5a5c6b",
88
+ "metadata": {
89
+ "slideshow": {
90
+ "slide_type": "fragment"
91
+ }
92
+ },
93
+ "source": [
94
+ "<h2 style=\"text-align:center;font-weight:normal;\">You shall ...</h2>"
95
+ ]
96
+ },
97
+ {
98
+ "cell_type": "markdown",
99
+ "id": "f71da59e",
100
+ "metadata": {
101
+ "slideshow": {
102
+ "slide_type": "fragment"
103
+ }
104
+ },
105
+ "source": [
106
+ "<h2 style=\"text-align:center;font-weight:normal;\">You shall not ...</h2>"
107
+ ]
108
+ },
109
+ {
110
+ "cell_type": "markdown",
111
+ "id": "2910e985",
112
+ "metadata": {
113
+ "slideshow": {
114
+ "slide_type": "fragment"
115
+ }
116
+ },
117
+ "source": [
118
+ "<div style=\"text-align:center;\">\n",
119
+ " <h2 style=\"font-weight:normal;\">You shall not pass!</h2>\n",
120
+ " <div style=\"display:inline-block;margin-top:10px;\">\n",
121
+ " <img src=\"./img/gandalf.gif\" style=\"height:10em;width:auto;\"/>\n",
122
+ " </div>\n",
123
+ "</div>"
124
+ ]
125
+ },
126
+ {
127
+ "cell_type": "markdown",
128
+ "id": "283ca08c",
129
+ "metadata": {
130
+ "slideshow": {
131
+ "slide_type": "subslide"
132
+ }
133
+ },
134
+ "source": [
135
+ "## ¿Qué son los \"modelos de lenguaje\"? (Language Models)\n",
136
+ "\n",
137
+ "- Modelos de aprendizaje automático.\n",
138
+ "- Dado un contexto (e.g. una lista de palabras previas), predicen la palabra siguiente.\n",
139
+ "- Se entrenan con texto libre."
140
+ ]
141
+ },
142
+ {
143
+ "cell_type": "markdown",
144
+ "id": "778b5e91",
145
+ "metadata": {
146
+ "slideshow": {
147
+ "slide_type": "fragment"
148
+ }
149
+ },
150
+ "source": [
151
+ "### ¿Qué son los \"LLMs\"? (Large Language Models)\n",
152
+ "\n",
153
+ "- Modelos de lenguajes entrenados con una gran cantidad de datos y de parámetros:\n",
154
+ " - Suelen entrenarse con corpus del orden de $10^{10}$ palabras.\n",
155
+ " - Suelen tener de $10^8$ o $10^9$ parámetros en adelante.\n",
156
+ "- El término se asocia generalmente a aquellos modelos basados en la arquitectura neuronal del **Transformer**."
157
+ ]
158
+ },
159
+ {
160
+ "cell_type": "markdown",
161
+ "id": "cfc710ea",
162
+ "metadata": {
163
+ "slideshow": {
164
+ "slide_type": "subslide"
165
+ }
166
+ },
167
+ "source": [
168
+ "## ¿Qué es un \"Transformer\"?\n",
169
+ "\n",
170
+ "- Es una arquitectura de red neuronal basada en el concepto de \"Atención\" que se presentó en el paper [\"Attention is All You Need\"](https://arxiv.org/abs/1706.03762).\n",
171
+ "- Originalmente se planteó como un esquema para hacer traducción automática.\n",
172
+ " - Consta de dos partes: Un codificador y un decodificador.\n",
173
+ " - A partir de este surgieron dos variantes\n",
174
+ " - Los modelos basados en el codificador (e.g. [BERT](https://arxiv.org/abs/1810.04805)). Sirven para buscar representaciones vectoriales (embeddings) del texto.\n",
175
+ " - Los modelos basados en el decodificador (e.g. [GPT](https://arxiv.org/abs/2005.14165)). Sirven para generación de texto.\n",
176
+ "- La idea del transformer es \"definir\" una palabra de acuerdo a la relación que tiene con las palabras de su vecindario, en una operación de multiplicación matricial con pesos.\n",
177
+ " - Para una explicación más sencilla pero más detallada sugiero los posts de la serie \"The Illustrated...\" de [Jay Alammar](http://jalammar.github.io/):\n",
178
+ " - [The Illustrated Transformer](http://jalammar.github.io/illustrated-transformer/)\n",
179
+ " - [The Illustrated BERT](http://jalammar.github.io/illustrated-bert/)\n",
180
+ " - [The Illustrated GPT-2](http://jalammar.github.io/illustrated-gpt2/) / [How GPT-3 Works](http://jalammar.github.io/how-gpt3-works-visualizations-animations/)"
181
+ ]
182
+ },
183
+ {
184
+ "cell_type": "markdown",
185
+ "id": "8958cf42",
186
+ "metadata": {
187
+ "slideshow": {
188
+ "slide_type": "slide"
189
+ }
190
+ },
191
+ "source": [
192
+ "# Hugging Face"
193
+ ]
194
+ },
195
+ {
196
+ "cell_type": "markdown",
197
+ "id": "6038bd78",
198
+ "metadata": {
199
+ "slideshow": {
200
+ "slide_type": "subslide"
201
+ }
202
+ },
203
+ "source": [
204
+ "## ¿Qué es Hugging Face?\n",
205
+ "\n",
206
+ "- Una [comunidad colaborativa](https://huggingface.co/) para hacer Inteligencia Artificial (IA).\n",
207
+ "- Cuenta con repositorios para subir [modelos](https://huggingface.co/models), [datasets](https://huggingface.co/datasets) y [demos](https://huggingface.co/spaces).\n",
208
+ "- Además, ofrecen varias librerías orientadas a la IA, particularmente al Aprendizaje Profundo (Deep Learning), entre las que destacan:\n",
209
+ " - [`transformers`](https://huggingface.co/docs/transformers): La que veremos en esta charla, para todo lo relacionado a NLP con LLMs.\n",
210
+ " - [`datasets`](https://huggingface.co/docs/datasets): Una librería especializada en el tratamiento de los conjuntos de datos a utilizar para entrenar/ajustar los LLMs.\n",
211
+ " - [`tokenizers`](https://huggingface.co/docs/tokenizers): Para el proceso de \"tokenización\", i.e. la división de texto de manera discreta en palabras o subpalabras.\n",
212
+ "- Hugging Face no sólo ofrece soluciones sobre NLP, sino que también lo hace con imágenes, con librerías como [`diffusers`](https://huggingface.co/docs/diffusers), para la generación de imágenes:\n",
213
+ " - Lectura recomendada: [The Illustrated Stable Diffusion](http://jalammar.github.io/illustrated-stable-diffusion/)"
214
+ ]
215
+ },
216
+ {
217
+ "cell_type": "markdown",
218
+ "id": "25ad7d45",
219
+ "metadata": {
220
+ "slideshow": {
221
+ "slide_type": "subslide"
222
+ }
223
+ },
224
+ "source": [
225
+ "## ¿Cómo empezar con Hugging Face?\n",
226
+ "\n",
227
+ "- Primero se [crea una cuenta en la página](https://huggingface.co/join).\n",
228
+ "- Luego podemos [crear modelos](https://huggingface.co/new) a través del menú que se despliega de nuestro avatar.\n",
229
+ "- Una vez creado el modelo, este es un repositorio de git que puede accederse clonándolo localmente.\n",
230
+ " - Requiere de [`git-lfs`](https://git-lfs.com/)."
231
+ ]
232
+ },
233
+ {
234
+ "cell_type": "markdown",
235
+ "id": "3c6f89c3",
236
+ "metadata": {
237
+ "slideshow": {
238
+ "slide_type": "slide"
239
+ }
240
+ },
241
+ "source": [
242
+ "# Utilizando un modelo de Hugging Face"
243
+ ]
244
+ },
245
+ {
246
+ "cell_type": "markdown",
247
+ "id": "f91311b5",
248
+ "metadata": {
249
+ "slideshow": {
250
+ "slide_type": "subslide"
251
+ }
252
+ },
253
+ "source": [
254
+ "## Cargando los modelos\n",
255
+ "\n",
256
+ "- Hugging Face ofrece muchísimos modelos en su [repositorio](https://huggingface.co/models), para este caso elegimos el modelo [`bigscience/bloom-3b`](https://huggingface.co/bigscience/bloom-3b) de la organización [Big Science](https://bigscience.huggingface.co/blog/bloom).\n",
257
+ " - Esta organización ha estado [creando modelos](https://huggingface.co/bigscience) bajo una [licencia abierta](https://bigscience.huggingface.co/blog/the-bigscience-rail-license) (con ciertas limitaciones de uso para evitar abuso).\n",
258
+ " - Son responsables del [LLM abierto más grande actualmente disponible](https://huggingface.co/bigscience/bloom).\n",
259
+ "- El modelo elegido es un modelo de 3 mil millones (3 billion) de parámetros."
260
+ ]
261
+ },
262
+ {
263
+ "cell_type": "code",
264
+ "execution_count": null,
265
+ "id": "d3225616",
266
+ "metadata": {
267
+ "slideshow": {
268
+ "slide_type": "-"
269
+ }
270
+ },
271
+ "outputs": [],
272
+ "source": [
273
+ "import torch\n",
274
+ "\n",
275
+ "from IPython.display import display, HTML\n",
276
+ "from transformers import AutoModelForCausalLM, AutoTokenizer\n",
277
+ "\n",
278
+ "BASE_MODEL = 'bigscience/bloom-3b' # More models at https://huggingface.co/models\n",
279
+ "\n",
280
+ "tokenizer = AutoTokenizer.from_pretrained(BASE_MODEL)\n",
281
+ "model = AutoModelForCausalLM.from_pretrained(\n",
282
+ " BASE_MODEL,\n",
283
+ " low_cpu_mem_usage=True,\n",
284
+ " torch_dtype='auto'\n",
285
+ ")"
286
+ ]
287
+ },
288
+ {
289
+ "cell_type": "markdown",
290
+ "id": "b523bf51",
291
+ "metadata": {
292
+ "slideshow": {
293
+ "slide_type": "subslide"
294
+ }
295
+ },
296
+ "source": [
297
+ "## Generando Texto a Partir de un PROMPT\n",
298
+ "\n",
299
+ "- Los modelos de lenguaje necesitan una semilla, denominada comúnmente **prompt**, para iniciar su conversación.\n",
300
+ "- A partir de dicha semilla, los modelos pueden empezar a predecir las palabras siguiente.\n",
301
+ "- La coherencia de la frase depende de varios aspectos:\n",
302
+ " - El tamaño y [entrenamiento](https://github.com/huggingface/notebooks/blob/main/examples/language_modeling_from_scratch.ipynb) o [ajuste](https://github.com/huggingface/notebooks/blob/main/examples/language_modeling.ipynb) (fine-tuning) del modelo.\n",
303
+ " - Modelos más grandes suelen ser mejor en escenarios \"open end\", aunque pueden desvariar (o \"alucinar\").\n",
304
+ " - El tipo de datos con el que se entrenó/ajustó el modelo.\n",
305
+ " - La [estrategia](https://github.com/huggingface/blog/blob/main/notebooks/02_how_to_generate.ipynb) a la hora de generar texto.\n",
306
+ " - La [documentación de Hugging Face](https://huggingface.co/docs/transformers/notebooks) tiene más ejemplos que pueden reproducirse."
307
+ ]
308
+ },
309
+ {
310
+ "cell_type": "markdown",
311
+ "id": "eed5b04f",
312
+ "metadata": {
313
+ "slideshow": {
314
+ "slide_type": "subslide"
315
+ }
316
+ },
317
+ "source": [
318
+ "### Estableciendo un PROMPT\n",
319
+ "\n",
320
+ "- El **prompt** inicial es el que \"ayudará\" al modelo a devolver resultados más o menos coherentes.\n",
321
+ "- Actualmente es más un arte que una ciencia.\n",
322
+ " - **No existe el \"prompt engineering\" porque los modelos no son determinísticos.**\n",
323
+ "- Depende muchísimo del modelo, la inicialización aleatoria (i.e. la suerte), la tarea que se busca resolver, entre otros factores.\n",
324
+ "- Siguiendo los ejemplos de [esta publicación](https://medium.com/@fractal.ai/create-conversational-agents-using-bloom-part-1-63a66e6321c0), y en vistas de armar un chatbot, buscaré definir 3 cosas:\n",
325
+ " - La \"identidad\", i.e. ¿Qué es?\n",
326
+ " - La \"intención\", i.e. ¿Qué hace?\n",
327
+ " - El \"comportamiento\", i.e. ¿Cómo lo hace?\n",
328
+ "- Además, se le pueden dar ejemplos concretos de cómo se espera que interactúe. Estos sirven a los LLMs para hacer lo que se conoce como \"Few Shot Learning\" (aunque no están \"aprendiendo\", los ejemplos sólo ayudan a mejorar el contexto."
329
+ ]
330
+ },
331
+ {
332
+ "cell_type": "code",
333
+ "execution_count": null,
334
+ "id": "d6f85ea7",
335
+ "metadata": {
336
+ "slideshow": {
337
+ "slide_type": "subslide"
338
+ }
339
+ },
340
+ "outputs": [],
341
+ "source": [
342
+ "PROMPT = \"\"\"\n",
343
+ "La siguiente es una conversación entre un HUMANO y un bot EXPERTO en software libre.\n",
344
+ "El EXPERTO le ayuda al HUMANO con preguntas acerca de software libre.\n",
345
+ "El EXPERTO es conversacional, optimista, flexible, creativo y genera respuestas parecidas a un humano.\n",
346
+ "\n",
347
+ "HUMANO: Hola, ¿Cómo estás?\n",
348
+ "EXPERTO: Hola, pmuy bien. Estoy acá para ayudarte con preguntas respecto al software libre.\n",
349
+ "\n",
350
+ "HUMANO: ¿Qué es el software libre?\n",
351
+ "EXPERTO:\"\"\".strip()"
352
+ ]
353
+ },
354
+ {
355
+ "cell_type": "markdown",
356
+ "id": "fc3a8ded",
357
+ "metadata": {
358
+ "slideshow": {
359
+ "slide_type": "subslide"
360
+ }
361
+ },
362
+ "source": [
363
+ "### Generando texto de manera \"Greedy\"\n",
364
+ "\n",
365
+ "- La estrategia para generar texto puede variar. La opción más directa es **greedy**, i.e. devolver la palabra que es más probable después de la secuencia.\n",
366
+ " - La principal ventaja de esta alternativa, es que es determinística, i.e. ante la misma entrada debería devolver la misma salida.\n",
367
+ " - La principal desventaja es que tiende a repetir y quedar limitada a ciertas frases o palabras."
368
+ ]
369
+ },
370
+ {
371
+ "cell_type": "code",
372
+ "execution_count": null,
373
+ "id": "33e984d7",
374
+ "metadata": {
375
+ "slideshow": {
376
+ "slide_type": "fragment"
377
+ }
378
+ },
379
+ "outputs": [],
380
+ "source": [
381
+ "MAX_TOKENS = 50\n",
382
+ "input_ids = tokenizer.encode(PROMPT, return_tensors='pt')\n",
383
+ "greedy_output = model.generate(input_ids, max_length=input_ids.shape[1] + MAX_TOKENS)\n",
384
+ "output = tokenizer.decode(greedy_output[0], skip_special_tokens=True)\n",
385
+ "\n",
386
+ "print(output)"
387
+ ]
388
+ },
389
+ {
390
+ "cell_type": "markdown",
391
+ "id": "db1bc6cc",
392
+ "metadata": {
393
+ "slideshow": {
394
+ "slide_type": "subslide"
395
+ }
396
+ },
397
+ "source": [
398
+ "### Generando texto usando aleatoriedad\n",
399
+ "\n",
400
+ "- Si bien hay [varias estrategias para generar texto libre](https://github.com/huggingface/blog/blob/main/notebooks/02_how_to_generate.ipynb) una que resulta muy interesante es mediante el sampleo estadístico.\n",
401
+ "- La idea es que la manera de seleccionar la siguiente palabra es con cierta probabilidad estadística (i.e. no siempre la más probable).\n",
402
+ " - La principal ventaja es que hace el texto más \"creativo\" y más \"humano\".\n",
403
+ " - La principal desventaja es que no es determinístico y es suceptible de \"alucinar\".\n",
404
+ " - En este caso se samplea de las `top_k` palabras más probable que a su vez son la menor cantidad de palabras cuya probabilidad conjunta es mayor que `top_p`."
405
+ ]
406
+ },
407
+ {
408
+ "cell_type": "code",
409
+ "execution_count": null,
410
+ "id": "bf547d6a",
411
+ "metadata": {
412
+ "slideshow": {
413
+ "slide_type": "fragment"
414
+ }
415
+ },
416
+ "outputs": [],
417
+ "source": [
418
+ "torch.manual_seed(42) # To ensure determinism\n",
419
+ "\n",
420
+ "sampling_output = model.generate(\n",
421
+ " input_ids,\n",
422
+ " do_sample=True,\n",
423
+ " max_length=input_ids.shape[1] + MAX_TOKENS,\n",
424
+ " top_k=50,\n",
425
+ " top_p=0.95,\n",
426
+ ")\n",
427
+ "output = tokenizer.decode(sampling_output[0], skip_special_tokens=True)\n",
428
+ "\n",
429
+ "print(output)"
430
+ ]
431
+ },
432
+ {
433
+ "cell_type": "markdown",
434
+ "id": "50d2c808",
435
+ "metadata": {
436
+ "slideshow": {
437
+ "slide_type": "subslide"
438
+ }
439
+ },
440
+ "source": [
441
+ "### Un Chatbot Sencillo\n",
442
+ "\n",
443
+ "- El modelo de lenguaje no tiene noción de cuando parar, porque está entrenado para continuar el mensaje dado en el **prompt**.\n",
444
+ " - Seguirá generando texto hasta alcanzar el valor del parámetro `max_length`.\n",
445
+ " - El texto generado inluirá las palabras que marcan la conversación (i.e. \"HUMANO\" y \"EXPERTO\").\n",
446
+ "- Para poder utilizar un modelo para hacer un **chatbot** requerimos de un poco de ingeniería de software clásica.\n",
447
+ " - Una opción es utilizar precisamente las palabras que definen la conversación como puntos de inicio y final, y descartar el resto.\n",
448
+ "- En [`chatbot.py`](./chatbot.py) hay un ejemplo sencillo de cómo puede realizarse esto.\n",
449
+ " - Consiste de una clase `ChatBot` que sirve como *wrapper* de los modelos de Hugging Face.\n",
450
+ " - Posee un CLI sencillo que mantiene un loop continuo para chatear."
451
+ ]
452
+ },
453
+ {
454
+ "cell_type": "code",
455
+ "execution_count": null,
456
+ "id": "cff18d7f",
457
+ "metadata": {
458
+ "slideshow": {
459
+ "slide_type": "subslide"
460
+ }
461
+ },
462
+ "outputs": [],
463
+ "source": [
464
+ "from chatbot import ChatBot\n",
465
+ "\n",
466
+ "PROMPT = \"\"\"\n",
467
+ "La siguiente es una conversación entre un HUMANO y un bot EXPERTO en software libre.\n",
468
+ "El EXPERTO le ayuda al HUMANO con preguntas acerca de software libre.\n",
469
+ "El EXPERTO es conversacional, optimista, flexible, creativo y genera respuestas parecidas a un humano.\n",
470
+ "\n",
471
+ "HUMANO: Hola, ¿Cómo estás?\n",
472
+ "EXPERTO: Hola, muy bien. Estoy acá para ayudarte con preguntas respecto al software libre.\n",
473
+ "\"\"\".strip()\n",
474
+ "\n",
475
+ "chatbot = ChatBot(\n",
476
+ " base_model=model,\n",
477
+ " tokenizer=tokenizer,\n",
478
+ " initial_prompt=PROMPT,\n",
479
+ " keep_context=True,\n",
480
+ " creative=True,\n",
481
+ " human_identifier='HUMAN',\n",
482
+ " bot_identifier='EXPERTO'\n",
483
+ ")\n",
484
+ "\n",
485
+ "while True:\n",
486
+ " input_text = input('> ')\n",
487
+ " if input_text == 'exit' or input_text == 'quit':\n",
488
+ " break\n",
489
+ " print(chatbot.chat(input_text))"
490
+ ]
491
+ }
492
+ ],
493
+ "metadata": {
494
+ "celltoolbar": "Slideshow",
495
+ "kernelspec": {
496
+ "display_name": "Python 3 (ipykernel)",
497
+ "language": "python",
498
+ "name": "python3"
499
+ },
500
+ "language_info": {
501
+ "codemirror_mode": {
502
+ "name": "ipython",
503
+ "version": 3
504
+ },
505
+ "file_extension": ".py",
506
+ "mimetype": "text/x-python",
507
+ "name": "python",
508
+ "nbconvert_exporter": "python",
509
+ "pygments_lexer": "ipython3",
510
+ "version": "3.10.8"
511
+ },
512
+ "rise": {
513
+ "scroll": true
514
+ }
515
+ },
516
+ "nbformat": 4,
517
+ "nbformat_minor": 5
518
+ }
img/gandalf.gif ADDED

Git LFS Details

  • SHA256: 08fb13734de67803e0a05ccb0d7815894708d348f98bdbedcf476de9343d7d97
  • Pointer size: 132 Bytes
  • Size of remote file: 6.3 MB
img/me.jpg ADDED

Git LFS Details

  • SHA256: 88cd8b8d54c38b9d11b5790edb392112efce80962f0dda882dcc1484b6d70e7a
  • Pointer size: 131 Bytes
  • Size of remote file: 189 kB