L'agent d'ALLinOne, une plateforme de recrutement par IA. Elle répond aux
questions, passe de vrais appels téléphoniques, cherche dans les données
et écrit dans la plateforme. Elle dispose pour cela d'une quarantaine
d'outils, chacun encadré par des règles qui limitent ce qu'elle peut
modifier.
Elle s'appelle Adèle parce que c'est moi qui l'ai nommée. Adel, Adèle.
Personne n'a relevé, et le nom est resté. Elle est depuis passée sur M6,
Brut et Le Parisien.
Un agent qui se contente de répondre à des questions apporte peu de
choses. L'intérêt commence quand il agit sur les données, et c'est aussi
à ce moment-là que le risque apparaît.
Un recruteur répète les mêmes gestes toute la journée : retrouver
une annonce, filtrer des candidatures, appeler quelqu'un, replanifier un
entretien, relancer. Chacun de ces gestes prend une ou deux minutes. Mis
bout à bout, ils occupent l'essentiel du temps de travail.
Automatiser la lecture est simple. Automatiser l'écriture,
c'est-à-dire créer, modifier et envoyer, demande beaucoup plus de
précautions. Un modèle qui se trompe en lecture donne une réponse fausse
et on la corrige. Un modèle qui se trompe en écriture abîme les données
d'un client.
Il fallait aussi que tout cela fonctionne au téléphone, avec de
vrais candidats et en temps réel.
02
Ce que j'ai construit
Une boucle d'agent outillée
Adèle s'appuie sur un orchestrateur qui enchaîne les appels d'outils sur
plusieurs tours, en flux continu, jusqu'à produire une réponse. Chaque
outil est déclaré avec son schéma, sa nature (lecture ou écriture) et sa
portée. Une quarantaine d'outils couvrent les annonces, les
candidatures, les appels, les statistiques et la planification.
Le cycle d'écriture en deux temps
C'est la partie la plus importante du système. Un outil d'écriture ne
s'exécute jamais directement. Il renvoie d'abord ce qu'il ferait :
l'ancienne valeur, la nouvelle, l'enregistrement concerné. L'utilisateur
voit l'effet exact et confirme. L'exécution part ensuite avec un
jeton d'action signé qui encode l'opération validée.
Le modèle ne peut donc exécuter que ce qui a été affiché à l'écran.
C'est le jeton, vérifié au moment de l'exécution, qui apporte cette
garantie.
Les appels vocaux temps réel
Adèle passe et reçoit de vrais appels. Le flux audio de la téléphonie
est ponté vers un modèle vocal temps réel, dans les deux sens, pendant
toute la durée de l'appel. Elle qualifie le candidat, propose des
créneaux et confirme un rendez-vous. Elle gère aussi le cas où son
interlocuteur lui coupe la parole.
Le cloisonnement
La plateforme héberge plusieurs clients sur la même infrastructure.
Chaque outil filtre par organisation au niveau de la requête,
et non à l'affichage. Les données personnelles sont masquées avant
l'envoi au modèle, puis restaurées au retour : le fournisseur du
LLM ne reçoit jamais un numéro de téléphone ou un nom de candidat en
clair.
03
Ce qui était difficile
La mémoire entre les tours d'outils
« Les appels de cette semaine », puis « rappelle le
premier ». Si le contexte ne conserve que les identifiants des
résultats précédents et pas les données associées, l'agent ne sait plus
qui est « le premier ». Il repose la question, ou il désigne
la mauvaise personne.
La correction passe par les outils. J'ai standardisé le format de
retour de tous les outils : un même contenant, une même clé
d'identité, un même libellé. Cette normalisation corrige d'un seul coup
la mémoire entre les tours, le masquage des données personnelles et la
qualité des résumés.
L'interruption au téléphone
Quand un candidat coupe la parole, arrêter la lecture audio ne suffit
pas. Le modèle croit avoir prononcé toute sa phrase et poursuit comme
s'il avait été écouté. Il faut tronquer son historique et lui indiquer
où la lecture s'est réellement arrêtée. Le calcul se fait sur
l'audio effectivement entendu, pas sur l'audio envoyé, parce que la
téléphonie met le son en tampon.
Sans cette correction, le décalage s'accumule à chaque interruption et
l'agent finit par répondre à la question précédente.
Un prompt système qui grossit
Un prompt système qui enfle indique presque toujours des outils mal
conçus : on écrit en langage naturel ce qui aurait dû être une
contrainte de schéma. Corriger les outils permet de raccourcir le
prompt, ce qui améliore à la fois la fiabilité, la latence et le coût.
Ce qui n'apparaît qu'en production
Les fournisseurs de téléphonie rejouent leurs webhooks. C'est documenté
et c'est normal. Deux appelants peuvent aussi confirmer le même créneau
à deux cents millisecondes d'intervalle. Ces situations ne se présentent
pas en démonstration, elles se présentent une fois le service ouvert aux
utilisateurs. Le traitement est classique : rendre chaque opération
idempotente, et poser un verrou là où deux écritures peuvent se croiser.
Ce que j'en retiens
La qualité d'un agent se joue dans la conception de ses outils et dans
les garde-fous qui encadrent ses écritures. Un client accepte de
laisser une IA modifier ses données quand il voit l'aperçu avant
l'exécution, qu'il confirme lui-même, et qu'il sait comment revenir en
arrière.
04
La stack
Back-endNestJS et TypeScript, architecture modulaire, files de traitement asynchrone
DonnéesMongoDB, cloisonnement par organisation appliqué au niveau de la requête
Front-endReact et TypeScript, état réactif, affichage des réponses au fil de leur génération
AgentBoucle multi-outils, schémas déclaratifs, aperçu puis confirmation, jetons d'action signés, protection contre le rejeu
VoixFlux audio téléphonique ponté vers un modèle vocal temps réel, gestion de l'interruption
ConfidentialitéMasquage des données personnelles avant l'envoi au modèle, quotas par utilisateur
Temps réelWebSocket pour les mises à jour, flux serveur pour les réponses de l'agent
Un agent pour votre métier ?
Décrivez-moi la tâche que vos équipes répètent vingt fois par jour, et
je vous dis quelle part un agent peut prendre en charge.