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 ChatGPT et 02 interagir avec l'utilisateur. Pour interroger les endpoints, je me sers de la classique lib 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


Thomas


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.