You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: notebooks/tps/chatbot/README-chatbot-nb.md
+59-8Lines changed: 59 additions & 8 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -63,15 +63,21 @@ on met à votre disposition **deux serveurs** `ollama`:
63
63
64
64
## objectif
65
65
66
-
ce qu'on veut faire, c'est fabriquer une UI sommaire qui permet de choisir le serveur, le modèle, et de poser ensuite des questions comme avec chatGPT
66
+
ce qu'on veut faire, c'est fabriquer une UI sommaire qui permet
67
+
- de choisir le serveur,
68
+
- de choisir le modèle,
69
+
- et de poser ensuite des questions comme avec chatGPT
70
+
- enfin sur cette implémentation on a également un bouton qui permet d'enabler le *streaming*
71
+
l'idée consiste à afficher les résultats "au fur et à mesure" plutôt qu'en une seule fois à la fin de l'échange avec le serveur, on en reparlera...
72
+
73
+
74
+
ça pourrait ressembler à ceci:
67
75
68
76
```{image} media/chatbot-sample.png
69
77
:align: center
70
-
:width: 500px
78
+
:width: 600px
71
79
```
72
80
73
-
sur cette implémentation on a également un bouton qui permet d'enabler le *streaming*, l'idée consiste à afficher les résultats "au fur et à mesure" plutôt qu'en une seule fois à la fin de l'échange avec le serveur, on en reparlera...
74
-
75
81
+++
76
82
77
83
## v01: starter code
@@ -117,20 +123,35 @@ vous aurez envie de *bookmark* ces entrées dans la doc, pour plus d'info:
117
123
*<https://flet.dev> le point d'entrée principal
118
124
*<https://flet.dev/docs/controls> pour les détails des objets disponibles
119
125
120
-
+++
126
+
````{admonition} python ou flet run
127
+
:class: dropdown
121
128
122
-
## pour les forts
129
+
on peut **aussi* lancer le programme de manière plus traditionnelle avec juste `python chatbot.py`
130
+
mais dans ce cas on n'a pas le *hot reload* et l'usage c'est une grosse différence de confort !
131
+
en outre il est conseillé de regarder les possibilités offertes par la CLI (i.e. le programme `flet`)
132
+
qui permet de faire **aussi** d'autres choses très utiles:
133
+
```{image} media/flet-help.png
134
+
:width: 400px
135
+
```
136
+
````
123
137
124
-
si cet énoncé vous inspire, vous pouvez simplement suivre votre voie pour développer l'application
138
+
+++
125
139
126
-
sinon pour les autres, voici un chemin possible pour y arriver; évidemment je vous donne ces étapes **entièrement à titre indicatif**
140
+
##pour les forts
127
141
142
+
si cet énoncé vous inspire, vous pouvez simplement suivre votre voie pour développer l'application
143
+
sinon pour les autres, voici un chemin possible pour y arriver; évidemment je vous donne ces étapes **entièrement à titre indicatif**
128
144
bref, dans tous les cas, n'hésitez pas à faire comme vous le sentez...
129
145
130
146
+++
131
147
132
148
## v02: ajoutons un titre
133
149
150
+
```{image} media/chatbot-02.png
151
+
:width: 400px
152
+
:align: right
153
+
```
154
+
134
155
pour vous familiariser avec le modèle de lignes et colonnes de `flet`, **ajoutez un titre principal**, comme sur l'illustration
135
156
136
157
- regardez `ft.Column`
@@ -157,6 +178,11 @@ ceci est une étape **totalement optionnelle**, mais je vous recommande de **cr
157
178
158
179
## v04: une classe `History`
159
180
181
+
```{image} media/chatbot-04.png
182
+
:width: 400px
183
+
:align: right
184
+
```
185
+
160
186
toujours pour éviter de finir avec un gros paquet de spaguettis, on pourrait imaginer à ce stade **écrire une classe `History`** (tout ceci est totalement indicatif...) qui:
161
187
162
188
- hérite, là encore de `ft.Column`
@@ -188,6 +214,11 @@ quelques indices:
188
214
189
215
## v06: on affiche la réponse
190
216
217
+
```{image} media/chatbot-06.png
218
+
:width: 400px
219
+
:align: right
220
+
```
221
+
191
222
dans cette version, on utilise la réponse du serveur pour **afficher le dialogue** dans notre application
192
223
pour cela on va devoir faire quelques modifications à la classe `History`; en effet vous devez avoir observé à ce stade que la réponse vient "en petits morceaux", ce qui fait qu'on pourrait avoir envie de modifier un peu la classe `History` de sorte qu'elle expose à présent les méthodes
193
224
@@ -205,6 +236,11 @@ pour cela voyez dans `flet` l'attribut `disabled`
205
236
206
237
## v08: supporter le mode *streaming*
207
238
239
+
```{image} media/chatbot-08.png
240
+
:width: 400px
241
+
:align: right
242
+
```
243
+
208
244
une requête HTTP "classique" est d'une grande simplicité: on envoie une requête, on reçoit une réponse
209
245
dans notre cas toutefois, ce modèle n'est pas tout à fait adapté, car l'IA met du temps à élaborer sa réponse, et on aimerait mieux **voir la réponse au fur et à mesure**, plutôt que de devoir attendre la fin, qui est le comportement que vous obeservez si vous avez suivi mes indications jusqu'ici
210
246
c'est ce à quoi on va s'attacher maintenant
@@ -235,12 +271,27 @@ c'est juste une question d'ajouter, dans l'appel à `requests.post`, un paramèt
235
271
236
272
## v10 (optionnel): acquérir la liste des modèles
237
273
274
+
```{image} media/chatbot-10.png
275
+
:width: 400px
276
+
:align: right
277
+
```
278
+
238
279
plutôt que de proposer une liste de modèles "en dur" comme dans le *starter code*, on pourrait à ce stade **acquérir**, auprès du serveur choisi, la **liste des modèles** connus; pour cela `ollama` met à notre disposition l'API `/api/tags`
239
280
240
281
dans mon implémentation j'ai choisi de "cacher" ce résultat, pour ne pas redemander plusieurs fois cette liste à un même serveur (cette liste bouge très très peu...); mais c'est optionnel; par contre ce serait sympa pour les utilisateurs de conserver, lorsque c'est possible, le modèle choisi lorsqu'on change de serveur...
241
282
242
283
+++
243
284
285
+
## plein d'améliorations possibles
286
+
287
+
en vrac:
288
+
289
+
- ajouter un bouton "Cancel" - en fait idéalement on en aurait besoin le plus tôt possible car le développement peut vite devenir fastidieux (ne pas hésiter à quitter et relancer); mais le truc c'est que c'est non trivial à faire en fait !
290
+
- ou pourrait imaginer soumettre le même prompt à plusieurs modèles pour les comparer
291
+
- etc...
292
+
293
+
+++
294
+
244
295
## pour aller plus loin
245
296
246
297
* je vous signale une page pleine de tutoriels intéressants, et un peu du même genre, à propos de la librairie `flet`:
0 commit comments