Passer au contenu principal
Il s’agit d’un notebook interactif. Vous pouvez l’exécuter localement ou utiliser les liens suivants :
Générer du code de haute qualité avec une structure adéquate, une documentation claire et des tests est une tâche complexe. Ce guide s’adresse aux développeurs qui souhaitent créer un flux de travail de génération de code alimenté par un LLM et en mesurer systématiquement la qualité. Ce notebook montre comment créer un pipeline de génération de code qui produit des fonctions Python évaluées avec la suite de tests HumanEval. Le pipeline utilise Weave pour comparer les évaluations et assurer le suivi, ainsi que les modèles GPT d’OpenAI pour la génération de code avec des sorties structurées.
Tableau de bord d’évaluation Weave comparant des runs de génération de code

Pourquoi utiliser Weave

Ce tutoriel utilise Weave pour implémenter et évaluer un pipeline de génération de code. Vous apprenez à :
  • Suivre votre pipeline LLM : consigner les entrées, les sorties et les étapes intermédiaires de votre processus de génération de code.
  • Évaluer les sorties du LLM : créer et comparer des évaluations de votre code généré à l’aide d’outils de débogage et de visualisations.

Configurez l’environnement

Configurez votre environnement et importez les bibliothèques nécessaires. Ces dépendances fournissent les outils de mise en forme, le chargeur de jeu de données, ainsi que les clients OpenAI et Weave utilisés tout au long du pipeline.
Weave suit automatiquement les appels à l’API OpenAI, y compris les entrées, les sorties et les métadonnées. Vous n’avez pas besoin d’ajouter de code de journalisation supplémentaire pour vos interactions avec OpenAI. Weave s’en charge en arrière-plan.

Sorties structurées et modèles Pydantic

Ce pipeline de génération de code utilise le mode de sorties structurées d’OpenAI et des modèles Pydantic pour garantir des réponses cohérentes et correctement formatées de la part du modèle de langage. Cette approche offre plusieurs avantages :
  • Sécurité des types : en définissant des modèles Pydantic pour les sorties attendues, nous appliquons une structure stricte au code généré, aux exécutants de programme et aux tests unitaires.
  • Analyse simplifiée : le mode de sortie structurée nous permet d’interpréter directement la réponse du modèle dans les modèles Pydantic prédéfinis, ce qui réduit le besoin de post-traitements complexes.
  • Fiabilité accrue : en spécifiant le format exact attendu, nous réduisons le risque d’obtenir des sorties inattendues ou mal formées du modèle de langage.
L’exemple suivant définit des modèles Pydantic et les utilise avec les sorties structurées d’OpenAI :

Implémenter un formateur de code

Pour produire un code cohérent et propre, implémentez une classe CodeFormatter à l’aide des opérations Weave. Ce formateur applique des règles de linting et de style au code généré, au runner du programme et aux tests unitaires.
Cette classe CodeFormatter fournit plusieurs opérations Weave pour nettoyer et mettre en forme le code généré :
  • Remplacer les sauts de ligne échappés par de vrais sauts de ligne.
  • Supprimer les imports et les variables inutilisés.
  • Trier les imports.
  • Appliquer le formatage conforme à la PEP 8.
  • Ajouter les imports manquants.

Définir le CodeGenerationPipeline

Trace Weave d’un run du pipeline de génération de code
Une fois le module de formatage en place, l’étape suivante consiste à implémenter la logique centrale de génération de code, qui relie le prompt, l’appel LLM et le formateur. Cet exemple utilise un weave.Model afin que le modèle soit automatiquement versionné lorsqu’il est modifié. Le model_name est conservé comme attribut afin que vous puissiez tester différentes valeurs, voir les différences et les comparer dans Weave. Les appels de fonction sont suivis avec @weave.op afin que les entrées et les sorties soient enregistrées pour faciliter le suivi des erreurs et le débogage.
Cette classe CodeGenerationPipeline encapsule la logique de génération de code sous forme de modèle Weave, ce qui offre plusieurs avantages :
  • Suivi automatique des expériences : Weave capture les entrées, les sorties et les paramètres pour chaque run du modèle.
  • Gestion des versions : Les modifications apportées aux attributs ou au code du modèle sont automatiquement versionnées, créant un historique de l’évolution de votre pipeline de génération de code au fil du temps.
  • Reproductibilité : La gestion des versions et le suivi vous permettent de reproduire tout résultat ou toute configuration antérieure de votre pipeline de génération de code.
  • Gestion des hyperparamètres : Les attributs du modèle (comme model_name) sont définis et suivis d’un run à l’autre, ce qui facilite l’expérimentation.
  • Intégration à l’écosystème Weave : L’utilisation de weave.Model relie votre pipeline à d’autres outils Weave, comme les évaluations et les fonctionnalités de serving.

Implémenter des métriques d’évaluation

Pour évaluer la qualité du code généré, implémentez des métriques d’évaluation à l’aide d’une sous-classe de weave.Scorer. Cette opération exécute score sur chaque model_output du jeu de données. model_output provient de la sortie de la fonction predict de weave.Model. Le prompt est extrait du jeu de données human-eval.
Ces fonctions d’évaluation exécutent le code généré et renvoient une valeur booléenne indiquant si le code a réussi le test défini dans le jeu de données.
Trace Weave d’un scorer HumanEval évaluant le code généré

Créer un jeu de données Weave et effectuer une évaluation

Une fois le pipeline et le scorer définis, la dernière étape consiste à constituer le jeu de données d’évaluation et à l’exécuter de bout en bout. Pour évaluer notre pipeline, nous allons créer un jeu de données Weave et effectuer une évaluation :
Ce code crée un jeu de données avec nos prompts d’exemple, définit notre scorer de test humaneval et lance une évaluation de notre pipeline de génération de code. Une fois l’évaluation terminée, les résultats sont disponibles dans l’interface Weave pour inspection et comparaison entre les runs.
Tableau de bord d’évaluation Weave affichant les résultats du scorer HumanEval

Conclusion

Cet exemple montre comment implémenter un pipeline de génération de code avec Weave et les modèles de langage d’OpenAI. Vous avez appris à :
  • Créer des opérations Weave pour chaque étape du processus de génération de code.
  • Encapsuler le pipeline dans un modèle Weave afin de rationaliser le suivi et l’évaluation.
  • Implémenter des métriques d’évaluation personnalisées à l’aide d’opérations Weave.
  • Créer un jeu de données et lancer une évaluation du pipeline.
Weave suit les entrées, les sorties et les étapes intermédiaires tout au long du processus de génération de code, ce qui facilite le débogage, l’optimisation et l’évaluation de votre application LLM. Pour en savoir plus sur Weave et ses fonctionnalités, voir la documentation Weave. Vous pouvez adapter cet exemple pour traiter des jeux de données plus volumineux, implémenter des métriques d’évaluation plus sophistiquées ou l’intégrer à d’autres flux de travail LLM.