Passer au contenu principal
Il s’agit d’un notebook interactif. Vous pouvez l’exécuter localement ou utiliser les liens ci-dessous :

Génération de code avec Weave et OpenAI

Générer du code de haute qualité, avec une structure, une documentation et des tests appropriés, est une tâche complexe. Ce guide montre comment mettre en œuvre un pipeline de génération de code. Vous apprendrez à créer un pipeline de génération de code capable de produire des fonctions Python de haute qualité pour la suite de tests humaneval. Nous utiliserons Weave pour comparer les évaluations et assurer le suivi, ainsi que les modèles GPT d’OpenAI pour générer du code à l’aide de sorties structurées.
Évaluation

Pourquoi utiliser Weave ?

Dans ce tutoriel, nous utiliserons Weave pour implémenter et évaluer un pipeline de génération de code. Vous apprendrez à :
  1. Suivre votre pipeline LLM : consigner les entrées, les sorties et les étapes intermédiaires de votre processus de génération de code.
  2. Évaluer les sorties du LLM : créer et comparer des évaluations de votre code généré à l’aide d’outils de débogage avancés et de visualisations.

Configurer l’environnement

Commencez par configurer votre environnement et importer les bibliothèques nécessaires :
Weave suit automatiquement les appels à l’API OpenAI, y compris les entrées, les sorties et les métadonnées. Vous n’avez donc pas besoin d’ajouter de code de journalisation pour vos interactions avec OpenAI : Weave s’en charge de façon transparente en arrière-plan.

Tirer parti des sorties structurées et des modèles Pydantic

Dans ce pipeline de génération de code, nous utilisons 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 :
  1. Sécurité des types : en définissant des modèles Pydantic pour nos sorties attendues, nous appliquons une structure stricte au code généré, aux exécutants de programme et aux tests unitaires.
  2. Analyse simplifiée : le mode de sortie structurée nous permet d’interpréter directement la réponse du modèle dans nos modèles Pydantic prédéfinis, ce qui réduit le besoin de post-traitements complexes.
  3. 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.
Voici un exemple de la façon dont nous définissons nos modèles Pydantic et les utilisons avec les sorties structurées d’OpenAI :

Implémenter un formateur de code

Pour garantir un code produit cohérent et propre, nous implémentons une classe CodeFormatter à l’aide d’opérations Weave. Ce formateur applique diverses règles de linting et de style au code généré, au runner du programme et aux tests unitaires.
Cette classe CodeFormatter propose plusieurs opérations Weave pour nettoyer et mettre en forme le code généré :
  • Remplacement des retours à la ligne échappés par de vrais retours à la ligne
  • Suppression des imports et des variables inutilisés
  • Tri des imports
  • Application du formatage PEP 8
  • Ajout des imports manquants

Définir le CodeGenerationPipeline

Pipeline de génération de code
Implémentons maintenant la logique principale de génération de code : Nous utilisons un weave.Model pour qu’il soit automatiquement versionné à chaque modification. Nous conservons également model_name comme attribut afin de pouvoir expérimenter avec et comparer facilement les différences dans Weave. Nous suivons les appels de notre fonction 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 notre logique de génération de code sous forme de Weave Model, offrant plusieurs avantages clés :
  1. Suivi automatique des expériences : Weave capture les entrées, les sorties et les paramètres pour chaque exécution du modèle.
  2. Gestion des versions : Les modifications apportées aux attributs ou au code du modèle sont automatiquement versionnées, ce qui crée un historique clair de l’évolution de votre pipeline de génération de code au fil du temps.
  3. Reproductibilité : La gestion des versions et le suivi permettent de reproduire facilement tout résultat ou toute configuration précédente de votre pipeline de génération de code.
  4. Gestion des hyperparamètres : Les attributs du modèle (comme model_name) sont clairement définis et suivis d’une exécution à l’autre, ce qui facilite l’expérimentation.
  5. Intégration avec l’écosystème Weave : L’utilisation de weave.Model permet une intégration fluide avec d’autres outils Weave, tels que les évaluations et les fonctionnalités de serving.

Implémenter des métriques d’évaluation

Pour évaluer la qualité du code généré, nous allons implémenter des métriques d’évaluation simples à l’aide d’une sous-classe weave.Scorer. Cette sous-classe exécutera score sur chaque model_output de notre jeu de données. model_output provient du résultat de la fonction predict dans notre weave.Model. prompt est extrait de notre 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 fourni dans le jeu de données.
Évaluation

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

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.
Évaluation finale

Conclusion

Dans cet exemple, nous avons montré comment implémenter un pipeline de génération de code avec Weave et les modèles de langage d’OpenAI. Nous avons vu comment :
  1. Créer des opérations Weave pour chaque étape du processus de génération de code
  2. Encapsuler le pipeline dans un Weave Model afin de faciliter le suivi et l’évaluation
  3. Implémenter des métriques d’évaluation personnalisées à l’aide d’opérations Weave
  4. Créer un jeu de données et lancer une évaluation du pipeline
L’intégration transparente de Weave nous permet de suivre 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 notre application LLM. Pour en savoir plus sur Weave et ses fonctionnalités, consultez 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.