« L’IA ne vous remplacera pas. Une personne utilisant l’IA le fera. ”
-Santiago @svpino
Dans notre travail de conseillers en ingénierie logicielle et IA, nous sommes souvent interrogés sur l’efficacité de grands modèle de langage (LLM) des outils comme Copilote, Fantôme écrivainou Tabnine. L’innovation récente dans la development et la conservation des LLM démontre des outils puissants pour la manipulation de texte. En trouvant des modèles dans de grands corps de texte, ces modèles peuvent prédire le mot suivant pour écrire des phrases et des paragraphes de contenu cohérent. L’inquiétude autour de ces outils est forte – de Les écoles de New York interdisent l’utilisation de ChatGPT pour Débordement de pile et Reddit interdire les réponses et l’artwork généré à partir des LLM. Alors que de nombreuses functions sont strictement limitées à l’écriture de texte, quelques functions explorent également les modèles pour travailler sur le code. Le battage médiatique autour de ces functions va de l’adoration (« J’ai reconstruit mon flux de travail autour de ces outils ») à la peur, l’incertitude et le doute (« Les LLM vont me prendre mon travail »). Dans le Communication de l’ACM, Matt Welsh va jusqu’à déclarer que nous avons atteint « La fin de la programmation.” Alors que les environnements de développement intégrés disposent d’outils de génération de code et d’automatisation depuis des années, dans cet article, j’explorerai ce que les nouvelles avancées de l’IA et des LLM signifient pour le développement de logiciels.
Besoin irrésistible et montée du développeur citoyen
Tout d’abord, un peu de contexte. Le besoin d’experience logicielle dépasse toujours la main-d’œuvre disponible. La demande d’ingénieurs logiciels seniors de haute qualité augmente. Le Bureau américain des statistiques du travail estime la croissance à 25% par an de 2021 à 2031. Alors que la fin de 2022 a vu d’importants licenciements et fermetures d’entreprises technologiques, la demande de logiciels ne faiblit pas. Comme Marc Andreessen l’a écrit en 2011, « Le logiciel dévore le monde. » Nous assistons toujours à des perturbations de nombreuses industries par des improvements dans les logiciels. Il existe de nouvelles opportunités d’innovation et de rupture dans chaque industrie grâce à l’amélioration des logiciels. Gartner a récemment introduit le terme développeur citoyen:
un employé qui crée des fonctionnalités d’utility à utiliser par lui-même ou par d’autres, en utilisant des outils qui ne sont pas activement interdits par les providers informatiques ou les unités commerciales. Un développeur citoyen est un personnage, pas un titre ou un rôle ciblé.
Les développeurs citoyens ne sont pas des ingénieurs qui exploitent des environnements à code faible ou nul pour développer de nouveaux workflows ou processus à partir de composants développés par des développeurs professionnels plus traditionnels.
Entrez dans les grands modèles de langage
Les grands modèles de langage sont les réseaux de neurones formé sur de grands ensembles de données de données textuelles, des téraoctets aux pétaoctets d’informations provenant d’Web. Ces ensembles de données vont de collections de communautés en ligne, telles que Reddit, Wikipedia et Github, à des collections organisées de paperwork de référence bien compris. En utilisant l’structure Transformer, les nouveaux modèles peuvent établir des relations entre différents éléments de données, en apprenant les connexions entre les mots et les ideas. En utilisant ces relations, les LLM sont capables de générer du matériel basé sur différents sorts d’invitations. Les LLM prennent des entrées et peuvent trouver des mots ou des ideas et des phrases associés qu’ils renvoient en sortie à l’utilisateur. Les exemples suivants ont été générés avec ChatGPT :
Les LLM ne génèrent pas vraiment de nouvelles pensées autant qu’ils rappellent ce qu’ils ont vu auparavant dans l’espace sémantique. Plutôt que de considérer les LLM comme des oracles qui produisent du contenu à partir de l’éther, il peut être utile de considérer les LLM comme des moteurs de recherche sophistiqués capables de rappeler et de synthétiser des options à partir de celles qu’ils ont vues dans leurs ensembles de données de formation. Une façon de penser aux modèles génératifs est qu’ils prennent en entrée les données d’apprentissage et produisent des résultats qui sont les membres « manquants » de l’ensemble d’apprentissage.
Par exemple, imaginez que vous trouviez un jeu de cartes à jouer avec des combinaisons de fers à cheval, d’arcs-en-ciel, de licornes et de lunes. Si quelques-unes des cartes manquaient, vous seriez probablement en mesure de remplir les blancs grâce à votre connaissance des jeux de cartes. Le LLM gère ce processus avec des quantités massives de statistiques basées sur des quantités massives de données connexes, permettant une synthèse de nouveau code basé sur des éléments sur lesquels le modèle n’a peut-être pas été formé mais peut déduire des données de formation.
Remark tirer parti des LLM
Dans de nombreux modernes environnements de développement intégrés (IDE), la complétion de code permet aux programmeurs de commencer à taper des mots-clés ou des fonctions et de compléter le reste de la part avec l’appel de fonction ou des squelettes à personnaliser selon vos besoins. Les outils LLM tels que CoPilot permettent aux utilisateurs de commencer à écrire du code et de fournir un mécanisme de complétion plus clever, en prenant des invitations en langage naturel écrites sous forme de commentaires et en complétant l’extrait ou la fonction avec ce qu’ils prédisent être du code pertinent. Par exemple, ChatGPT peut répondre à l’invite « écrivez-moi un exemple UIList en Swift » avec un exemple de code. La génération de code comme celle-ci peut être plus personnalisable que la plupart des autres options sans code publiées. Ces outils peuvent être puissants dans le développement de la main-d’œuvre, en fournissant une rétroaction aux travailleurs inexpérimentés ou qui manquent de compétences en programmation. Je pense à cela dans le contexte des outils sans code – les options fournies par les LLM ne sont pas parfaites, mais elles sont plus expressives et plus susceptibles de fournir des explications d’intention raisonnables en ligne.
ChatGPT réduit le level d’entrée pour essayer une nouvelle langue ou comparer des options sur les langues en comblant les lacunes dans les connaissances. Un ingénieur junior ou un programmeur inexpérimenté pourrait utiliser un LLM de la même manière qu’il approcherait un mentor ingénieur expérimenté et occupé : en demandant des exemples pour être orienté dans la bonne route. À titre expérimental, j’ai demandé à ChatGPT d’expliquer un programme Python que j’ai écrit pour l’avènement du code il y a deux ans. Ça m’a donné de la prose. J’ai demandé des commentaires en ligne, et cela m’a donné une explication ligne par ligne de ce qu’il faisait. Toutes les explications n’étaient pas claires, mais toutes les explications fournies par les ingénieurs ne le sont pas non plus. Comparé à Google ou Stack Overflow, ChatGPT a plus de possibilités pour clarifier les questions. En lui demandant de fournir plus de détails ou de cibler différents publics (« Expliquez ce idea à un enfant de 7 ans, à un enfant de 17 ans et à un étudiant diplômé »), un utilisateur peut demander à ChatGPT de présenter le matériel d’une manière qui permet une meilleure compréhension du code généré. Cette approche peut permettre aux nouveaux programmeurs ou aux développeurs citoyens de travailler rapidement et, s’ils sont intéressés, d’approfondir les raisons pour lesquelles le programme fonctionne comme il le fait.
Faire confiance aux LLM
Dans les nouvelles récentes, nous avons vu une explosion d’intérêt dans les LLM by way of la nouvelle model bêta Open AI pour ChatGPT. ChatGPT est basé sur le modèle GPT 3.5 qui a été amélioré avec l’apprentissage par renforcement pour fournir des réponses de meilleure qualité aux invitations. Les gens ont démontré qu’ils utilisaient ChatGPT pour tout, des présentations de produits à la poésie. Lors d’expériences avec un collègue, nous avons demandé à ChatGPT d’expliquer les attaques par débordement de tampon et de fournir des exemples. ChatGPT a fourni une bonne description des débordements de tampon et un exemple de code C vulnérable à cette attaque. Nous lui avons alors demandé de réécrire la description pour un enfant de 7 ans. La description était encore raisonnablement précise et a bien expliqué le idea sans trop de ideas avancés. Pour le plaisir, nous avons essayé de le pousser plus loin –
Ce résultat était intéressant mais nous a donné une petite pause. Un haïku est traditionnellement composé de trois lignes dans un modèle cinq/sept/cinq : cinq syllabes dans la première ligne, sept dans la seconde et cinq dans la dernière. Il s’avère que même si la sortie ressemblait à un haïku, elle était subtilement fausse. Un examen plus approfondi révèle que le poème a renvoyé six syllabes dans la première ligne et huit dans la seconde, faciles à ignorer pour les lecteurs peu versés dans le haïku, mais toujours fake. Revenons à la formation des LLM. Un LLM est formé sur un grand ensemble de données et établit des relations entre ce sur quoi il est formé. Il n’a pas été expliqué remark construire un haïku : il contient beaucoup de données étiquetées comme haïku, mais très peu de syllabes d’étiquetage sur chaque ligne. Par l’commentary, le LLM a appris que les haïkus utilisent trois lignes et des phrases courtes, mais il ne comprend pas la définition formelle.
Des lacunes similaires mettent en évidence le fait que les LLM se souviennent principalement des informations de leurs ensembles de données : des articles récents de Stanford et L’Université de New York souligner que les options basées sur LLM génèrent du code non sécurisé dans de nombreux exemples. Ce n’est pas surprenant; de nombreux exemples et tutoriels sur Web sont écrits de manière non sécurisée pour transmettre des directions au lecteur, fournissant un exemple compréhensible sinon sécurisé. Pour former un modèle qui génère du code sécurisé, nous devons fournir des modèles avec un massive corpus de code sécurisé. Comme les consultants l’attesteront, une grande partie du code livré aujourd’hui n’est pas sécurisé. Atteindre la productivité au niveau humain avec un code sécurisé est une barre assez basse automobile les humains sont manifestement médiocres pour écrire du code sécurisé. Il y a des gens qui copier et coller directement de Stack Overflow sans penser aux implications.
Où nous allons à partir de maintenant : confiance calibrée
Il est essential de se rappeler que nous ne faisons que commencer avec les LLM. Au fur et à mesure que nous parcourons les premières variations et apprenons leurs limites, nous pouvons concevoir des systèmes qui s’appuient sur les premières forces et atténuent ou protègent contre les premières faiblesses. Dans « Examen de la réparation de vulnérabilité Zero-Shot avec de grands modèles de langage” les auteurs ont étudié la réparation des vulnérabilités avec les LLM. Ils ont pu démontrer qu’avec une combinaison de modèles, ils étaient capables de réparer avec succès le code vulnérable dans plusieurs scénarios. Les exemples sont start à apparaître où les développeurs utilisent les outils LLM pour développer leurs assessments unitaires.
Au cours des 40 dernières années, l’industrie du logiciel et les universités ont créé des outils et des pratiques qui aident aujourd’hui les programmeurs expérimentés et inexpérimentés à générer un code robuste, sécurisé et maintenable. Nous avons des revues de code, des outils d’analyse statique, des pratiques de codage sécurisées et des directives. Tous ces outils peuvent être utilisés par une équipe qui cherche à adopter un LLM dans ses pratiques. Les pratiques d’ingénierie logicielle qui prennent en cost une programmation efficace – définir de bonnes exigences, partager la compréhension entre les équipes et gérer les compromis des « -ités » (qualité, sécurité, maintenabilité, and so forth.) – restent des problèmes difficiles qui nécessitent une compréhension du contexte, pas seulement répétition du code précédemment écrit. Les LLM doivent être traités avec une confiance calibrée. Continuer à faire des revues de code, appliquer des assessments fuzz ou utiliser de bonnes strategies d’ingénierie logicielle aidera les utilisateurs de ces outils à les utiliser avec succès et de manière appropriée.