askgpt
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quod quidem iam fit etiam in Academia. Quid, de quo nulla dissensio est? At ille pellit, qui permulcet sensum voluptate. Falli igitur possumus.
This tool illustrates how large language models (LLM) work. It is a wrapper to the API exposed by OpenAI, two Mistral models are also available. It uses various functions like /chat/completions and /embeddings capable of generating words (or tokens) statistically. The advantage is that you can see the probability of generating alternative tokens, i.e. those that could have been chosen by the agent. This tool is designed for educational use.
Tout est parti d'un exemple
Built a token-wise likelihood visualizer for GPT-2 over the weekend. There are some interesting patterns and behaviors you can easily pick up from a visualization like this, like induction heads and which kinds of words/grammar LMs like to guess. @thesephist (X)
Ce petit outil sympathique permet de visualiser les probabilités de génération
par un modèle de langage (LLM
). Le but de l'auteur est d'illustrer le degré de
surprise d'un mot pour un modèle, à partir des mots précédents. Essayez-le,
c'est ici. Il utilise un modèle GPT-2
local. J'ai trouvé l'idée intéressante.
Moins de 1000 lignes
Le projet est en ligne ici et le code est
sur notre forge. Vous pouvez vous
servir des deux, tant qu'il reste des crédits sur mes comptes OpenAI
et
Mistral
. Personne ne lèvera des millions avec ce bout de code, je préfère vous
prévenir.
Sous le capot
Allez, on va voir ce qu'il y a sous le capot.
Je ne vais pas spoiler grand mode : le code est très direct et ne présente aucune difficulté.
Il s'articule autour de deux fonctionnalités : 01 interroger les API
exposées par
request
, après avoir testé les appels avec Cartero. Je voulais un outil visuel et éviter curl
en ligne de commande. L'affichage se fait avec streamlit
bien entendu, toujours aussi pratique une fois qu'on l'a apprivoisé.
Dans la suite, je vais parler des API
, de la logique streamlit
et des visuels réalisés avec vega-lite
.
API /chat/completions
Première information : OpenAI
propose une documentation complète des routes
exposées. J'aurais pu parier que leur agent conversationnel était suffisamment intelligent pour fournir ces informations, formatter les requêtes à partir d'un prompt en anglais. Faux.
J'ai travaillé avec
/chat/completion au
lieu de /response que
l'éditeur recommande. J'ai besoin de récupérer les probabilités de génération
des tokens qui n'ont pas été choisis, et /response
ne les fournit pas. Il
suffit de renseigner les paramètres logprobs et top_logprobs, puis de
farfouiller dans le json de sortie. Et ça fonctionne.
Métriques
J'ai menti. Il a fallu sortir la carte bleue et inévitablement acheter quelques crédits. J'ai actuellement généré 52968 tokens pour 1260 appels, pour un total de 0.05$. Une véritable fortune.
Si j'étais un connard menteur, je dirais que j'ai conçu un agent IA. En réalité, j'ai dépensé quelques centimes en intelligence tarifée et j'ai écrit des requêtes HTTP
POST
. J'estime avoir passé entre deux et trois heures sur cette tâche, entre la découverte de la documentation, l'écriture des prompts, le paramétrage, l'examen des résultats fournis par ChatGPT
et la conception de l'ensemble. L'ensemble du développement, avec le cahier des charges et la recherche rapide dans la documentation des API m'a pris 34h, dont 8h pour la refactorisation complète de la première version. Comme d'habitude, le second passage sur le code a permis de nettoyer le code, simplifier la logique et repenser l'interface.
UX/UI avec streamlit
Concevoir une interface est long, spécifique et rigolo. C'est bien entendu la partie la plus importante à mes yeux, car c'est ce que voit l'utilisateur.
Je n'ai bien entendu aucune formation en design et conception
d'interface. Manque de bol, j'en fais beaucoup depuis que j'ai découvert
streamlit
. Ce cadriciel est sympa. Il permet de prototyper des applications web
rapidement sans s'embeter avec HTML/CSS et autres javascript.
Streamlit
a de nombreux
défauts
; il montre selon moins ses plus sérieuses limites sur l'authentification
(difficile ou nulle) et sur l'empreinte mémoire quand différents utilisateurs se
connectent.
Les interactions avec les différents éléments graphiques (widgets) provoquent la mises à jour systématique de l'interface : c'est lourd. Il faut un peu d'habitude pour jongler avec le flux des interactions, les st.rerun()
, les données de sessions etc. Mais on s'en sort.
Heureuse nouvelle, j'ai découvert que le décorateur
fragment
permettait de fluidifier la mise à jour de l'interface. J'ai profité de la
refactorisation du code pour essayer cette fonctionnalité avec
bonheur. Allez-y. Fragment
existe depuis la 1.37, soit presque un an, c'est
probablement stable et correctement débuggé aujourd'hui. Ce petit tour de veille
sur mon framework d'UI préféré m'a donné l'occasion de rencontrer
nicegui, une sorte de concurrent. J'ai donc naturellement
et immédiatement envie de le tester.
Les fonctionnalités
J'ai intégré quatre fonctionnalités dans ce petit outil. La prédiction du prochain mot et de la phrase, l'analyse de la surprise d'un texte et une arithmétique sur les mots. Je me suis arrêté car j'étais à court d'idées et il était temps de rédiger ce billet.
J'ai très nettement conscience que ce travail est très banal quand on interagit avec un modèle de langage. J'ai gardé peu de lien avec les formations en informatique, mais je dirais que ce programme ressemble à un projet sur quelques semaines pour un étudiant en licence, voire avant. Il faudrait trouver des cobayes.
Prédire le mot suivant
décrire + expliquer
Finir la phrase
décrire + expliquer
Analyse de la surprise
décrire + expliquer
Arithmétique
décrire + expliquer
une forme de conclusion
bla
ce que j'en ai tiré
bla
Nous ne sommes toujours pas des machines. Nos textes sont pensés et écrits par des humains. Aucun texte n’est généré. Tout soutien sera le bienvenu.