Réduire l'écart entre les juges LLM et les experts humains avec MemAlign et MLflow.
par Stepan Nosov, Pavle Martinović, Tejas Sundaresan, Alkis Polyzotis et Nemanja Petrovic
Le Genie Code, annoncé récemment, est le partenaire d'IA autonome de Databricks, spécialement conçu pour le travail sur les données. Il a remplacé Databricks Assistant, tout en intégrant plusieurs agents et en offrant de nouveaux points d'intégration et de nouvelles capacités. Genie Code est profondément intégré à Unity Catalog, ce qui signifie qu'il comprend vos tables, colonnes, lignage, vues métriques et définitions métier (sémantique). Cette conscience contextuelle rend Genie Code beaucoup plus utile pour les praticiens de données que les chatbots génériques.
Lorsque Genie Code génère un notebook pour des tâches de ML traditionnelles, telles que "construire un modèle de prédiction de churn", nous nous attendons à ce qu'il produise un flux de travail prêt pour la production, incluant l'installation des bibliothèques Python appropriées, l'exploration et le prétraitement des données, l'entraînement, le réglage, l'enregistrement et le déploiement du modèle, ainsi que l'évaluation de ses performances. Nous nous attendons également à ce que chaque étape soit réellement informée par les données : par exemple, Genie Code doit comprendre que des classes déséquilibrées dans un problème de classification binaire entraînent des flux de travail et des métriques de succès radicalement différents.
Pour garantir que Genie Code suive systématiquement les meilleures pratiques natives de Databricks et évite, par exemple, de sauter la validation croisée, de ne pas remarquer les fuites de données ou une imputation de données incorrecte, nous avions besoin d'un moyen rigoureux de répondre à une question : Comment savoir si le code généré est réellement bon ? Le notebook généré dépendra grandement du problème que le client essaie de résoudre, et cela peut varier considérablement d'un client à l'autre, c'est donc une question très non triviale.
Dans cet article, nous allons expliquer comment nous avons construit un pipeline d'évaluation pour les capacités de ML traditionnelles de Genie Code et comment nous avons utilisé MemAlign (un nouveau framework d'alignement open-source dans MLflow) pour combler l'énorme fossé que nous avons trouvé entre les juges LLM et les experts humains. Les juges améliorés nous ont aidés à identifier et à corriger des lacunes dans les conseils ML de Genie Code que nous aurions autrement manquées.
Un cadre d'évaluation robuste est requis pour :
L'évaluation des notebooks ML traditionnels est l'une des tâches d'évaluation les plus complexes car elle couvre l'évaluation de la qualité du code, des meilleures pratiques ML et des adaptations/personnalisations basées sur les données. Pour gérer une tâche aussi large et désordonnée que l'évaluation des notebooks ML, nous utilisons un LLM-as-a-judge - un "expert" LLM formé par des humains sur ce à quoi ressemble un bon notebook. Nous avons créé neuf juges qui sont invités à évaluer les notebooks ML selon neuf dimensions qui apparaissent dans la plupart des flux de travail ML :
| Dimensions | Ce que nous évaluons |
|---|---|
| Installation de la bibliothèque | Dépendances appropriées |
| Analyse exploratoire des données | EDA approfondie et |
| Imputation des données | Temps moyen de confinement |
| Gestion des valeurs manquantes sans fuite. | Ingénierie des caractéristiques |
| Sélection/transformation des caractéristiques. | Entraînement du modèle |
| Sélection du modèle, Validation croisée, Réglage des hyperparamètres | Réutilisation du modèle entraîné pour effectuer l'inférence. |
| Évaluation des métriques | Logique d'inférence et métriques appropriées à la tâche (par exemple, MAPE pour la prévision, MAE pour la régression, Précision pour la classification). |
| Suivi MLflow | Configuration du suivi des expériences. |
| Organisation des cellules | Division du code en cellules, propreté du code, lisibilité, en-têtes markdown, journalisation appropriée. |
Pour chaque dimension, nous avons rédigé des grilles de notation (réutilisées entre les évaluateurs humains et les juges LLM) qui attribuent un score de 1 à 3, et 0 pour "non applicable" :
Pour donner une idée de la granularité, voici la grille spécifique que nous utilisons pour la dimension "imputation des données" :
Parallèlement aux juges, nous maintenons un ensemble de cas de test d'évaluation qui couvrent une gamme de tâches ML (classification, régression, prévision), différentes tailles de jeux de données, domaines et niveaux de complexité. Chaque cas de test comprend un prompt utilisateur qui indique à Genie Code la tâche ML qu'il est censé résoudre sur le jeu de données spécifié ("J'ai des données de passagers dans les tables titanic_train_table et titanic_test_table. Pouvez-vous déterminer qui a survécu ?"). La boucle d'évaluation consiste à utiliser Genie Code pour générer un ou plusieurs notebooks pour chaque cas de test, puis à évaluer chaque notebook selon toutes les dimensions applicables.
En utilisant des juges LLM, au lieu d'humains, pour évaluer les artefacts de Genie Code, nous avons essentiellement échangé un problème difficile contre un autre : le juge prêt à l'emploi est incompétent dans la tâche à accomplir et désaligné avec les évaluations humaines. Notre problème est de faire en sorte que les scores des juges LLM correspondent à ceux des évaluateurs humains.
L'ensemble d'évaluation pour l'appréciation des juges LLM contient 50 notebooks générés par Genie Code ("cas de test") où des experts humains ont noté chaque dimension applicable, fournissant à la fois un score et une courte justification servant de vérité terrain. Dans les zones grises entre deux scores, les évaluateurs étaient autorisés à exprimer leur propre jugement, mais les schémas étaient rédigés de manière à ce que cela soit rarement le cas.
La mesure de l'alignement humain-machine est l'erreur absolue moyenne (MAE) entre les scores dans chaque dimension. Les résultats ont été mitigés, certaines dimensions ont montré un fort alignement (4 dimensions avaient une MAE de <= 0,10), tandis que d'autres ont révélé un désaccord significatif :
Cet écart existe parce que les humains et les LLM n'interprètent pas la même grille de notation de la même manière. Alors qu'un évaluateur humain peut repérer une stratégie d'imputation subtilement erronée ou une boucle d'entraînement qui "fonctionne" mais est logiquement unsound, un juge LLM manque souvent cette nuance technique. Nous avons également constaté que le juge souffrait d'un biais de positivité classique - il était simplement trop "poli" et cela l'empêchait d'obtenir des résultats objectifs.
Il est devenu évident qu'étant donné la même grille de notation, les juges LLM et les humains ne produiraient pas les mêmes résultats - un désalignement. C'est exactement le scénario pour lequel MemAlign a été conçu.

MemAlign est un framework au sein de MLflow qui peut, avec une très petite quantité de feedback en langage naturel humain, effectuer un alignement entre les évaluateurs humains et les juges LLM. Ceci est réalisé grâce à deux types de "mémoires" formées en lisant le feedback humain :
Au moment de l'inférence, MemAlign construit un contexte de travail en extrayant toutes les directives sémantiques et en récupérant les exemples épisodiques les plus pertinents pour l'entrée actuelle. Le juge charge tout cela dans son contexte, avec la grille d'évaluation d'origine, et utilise les connaissances accumulées pour donner un score plus précis à tous les futurs notebooks.
La propriété clé qui a fait ressortir MemAlign est ses hautes performances en utilisant seulement un petit nombre d'exemples. C'est parce que MemAlign distille efficacement l'apprentissage à partir de riches signaux d'apprentissage dans les commentaires en langage naturel, et les intègre dans le système de double mémoire.
Voici un exemple de certains extraits de mémoire sémantique générés pour la dimension « imputation de données », comblant les lacunes de la grille d'évaluation que nous avions définie en fournissant généralement des points d'ancrage, des exemples et des contre-exemples :
De plus, comme mentionné précédemment, la mémoire sémantique reflétée dans l'invite est complétée par des exemples pertinents de la mémoire épisodique du juge au moment de la notation, donnant ainsi au juge encore plus de contexte pour interpréter les instructions optimisées.
En suivant le paradigme d'entraînement-test ML, nous avons appliqué la validation croisée K-fold (K=4) sur 50 cas de test (notebooks), évitant ainsi la fuite de données et la nécessité d'étiqueter un ensemble de test distinct. Pour chaque pli, nous avons fait ce qui suit :
Pour calculer les intervalles de confiance sans données étiquetées supplémentaires, nous avons généré 100 échantillons bootstrap avec remplacement à partir des 50 d'origine. En répétant cela 10 000 fois et en suivant la MAE entre les scores humains et machine, nous avons calculé les intervalles de confiance pour l'alignement humain-machine avec un IC à 95 % définissant un changement statistiquement significatif.
Le pipeline d'évaluation est implémenté comme un seul extrait MLflow qui orchestre l'ensemble du processus :
L'optimiseur MemAlign est capable d'aligner les juges LLM en fonction des traces des cas de test en seulement quelques lignes de code. Nous avons utilisé ce nouveau juge « aligné » pour calculer la nouvelle MAE. L'alignement d'un juge sur une seule dimension prend environ 25 secondes par pli, donc l'alignement lui-même n'est pas un goulot d'étranglement.

Trois dimensions sur 9 ont montré une amélioration statistiquement significative :
Ces 3 dimensions font partie des 4 dimensions initiales qui étaient fortement désalignées. Un faible alignement initial est indicatif d'une compréhension fondamentalement différente des grilles d'évaluation partagées par les LLM et les humains, et la mémoire injectée par MemAlign semble fournir suffisamment de contexte pour les mettre « sur la même longueur d'onde ».
La structure de double mémoire de MemAlign nous a amené à nous demander si les deux contribuent réellement à l'alignement du juge. En particulier, la mémoire épisodique est censée aider le juge en lui donnant un ensemble des notebooks annotés les plus similaires comme point de référence (en utilisant la recherche du voisin le plus proche). Mais que se passe-t-il si les notebooks récupérés (voisins les plus proches) ne sont pas réellement similaires à celui actuel, mais seulement les moins dissemblables ? Les charger dans le contexte du juge pourrait embrouiller les choses plutôt que d'aider. L'espace de problèmes que nous évaluons (notebooks ML) est très large, et nous avions initialement émis l'hypothèse qu'un ensemble de 50 notebooks ne suffirait tout simplement pas pour obtenir un ensemble de mémoires suffisamment dense pour que le juge puisse s'en souvenir.
Sans mémoire épisodique, l'image se dégrade considérablement :

C'était le contraire de ce que nous attendions. Nous avions initialement émis l'hypothèse que notre ensemble annoté épars finirait par confondre le juge, mais presque toutes les dimensions se sont détériorées sans mémoire épisodique. La seule exception était l'exploration des données, où la suppression des exemples épisodiques a pu aider - sans les notebooks spécifiques sur lesquels nos annotateurs étaient en désaccord, le juge n'avait que les directives distillées, et un signal moins bruyant pour travailler.
La leçon à retenir : même lorsque vos entrées sont volumineuses et désordonnées, la mémoire épisodique améliore considérablement les performances du juge. Les mémoires sémantique et épisodique sont toutes deux intégrales au fonctionnement de MemAlign.
Juger si un agent de codage fait son travail est déjà assez difficile, tandis qu'évaluer un partenaire IA autonome dans la construction et l'exécution de flux de travail ML traditionnels est d'un autre niveau de complexité. En raison de l'itération rapide sur les produits d'IA, il n'y a tout simplement pas assez de temps pour que des experts surveillent l'« intégration continue » de l'agent. La seule solution évolutive viable sont les juges LLM - mais nous avons toujours besoin d'un jury humain pour garder le juge LLM sous contrôle.
En appliquant MemAlign, nous avons réduit l'erreur du juge de 74 à 89 % sur les dimensions où cela importait le plus. Mais, comme pour tout travail ML/LLM, le résultat n'est aussi bon que les informations que vous y mettez, alors assurez-vous que l'étiquetage est compétent.
Points à retenir :
MemAlign est livré avec MLflow et il a fonctionné pour nous avec seulement ~50 exemples étiquetés. Si vos juges LLM ne correspondent pas à vos experts, cela vaut la peine d'y consacrer un après-midi.
(Cet article de blog a été traduit à l'aide d'outils basés sur l'intelligence artificielle) Article original
Abonnez-vous à notre blog et recevez les derniers articles directement dans votre boîte mail.