'Elke voldoende geavanceerde technologie is niet te onderscheiden van magie.' Arthur C. Clarke
In het SBC neuraal netwerk post zagen we een 1k-gewichtennetwerk getraind met 10k-monsters om de sinusfunctie te benaderen. In dit bericht zullen we een 175G-gewicht gebruiken dat is getraind met 450G-samples die beter kunnen programmeren dan de gemiddelde programmeur. De afmetingen van deze modellen zijn indrukwekkend, maar eigenlijk weet niemand echt hoe ze werken of wat hun beperkingen zijn.
GitHub Copilot is een AI-tool die softwareontwikkeling versnelt, waardoor de programmeur veel dingen kan doen die voorheen onmogelijk waren. In eerste instantie lijkt het erop om StackOverflow te gebruiken, een website waar programmeurs vragen sturen als ze iets niet weten, maar Copilot gaat veel verder, het is in staat om een nieuw antwoord voor ons probleem te synthetiseren.
Copilot is opgenomen in een Microsoft Visual Studio-code en stelt continu grijscodes voor die u kunt accepteren door op de tab-knop te drukken. Deze voorgestelde code kan grofweg worden gedefinieerd als de "meest voorkomende" overeenkomst tussen uw zoekopdracht (uw code) en de trainingsgegevensset (GitHub-code).
Voorbeeld 1
In dit voorbeeld definiëren we onze functie en zijn docstring en vragen we Copilot om voltooiing. Zoals we zien, komt de voltooiing overeen met de docstring. De eerste intuïtie is dat Copilot fungeert als een zoekmachine en eenvoudig uw zoekopdracht koppelt aan zijn trainingsdataset (150 GB aan open source-projecten), maar zo werkt het niet.
Voorbeeld 2
Hier maken we een willekeurige/gekke string die niet in de trainingsset kan zitten. Het resultaat lijkt nog steeds de meest coherente oplossing die kan worden geboden, in dit geval: de som van de invoerparameters.
Voorbeeld 3
In dit voorbeeld vragen we (in het Spaans) om het snijpunt van twee cirkels op te tellen, gegeven het middelpunt en de straal. Copilot begrijpt de Spaanse tekst zonder problemen en stelt de functienaam, de parameters en de hele functietekst voor. Na een korte review lijkt het erop dat de code zou moeten werken.
Voorbeeld 4
Nu maken we een hypothetische vraag/antwoordtekst. Dit zorgt ervoor dat Copilot de zoekopdracht koppelt aan sommige onderzoeken die in deze trainingsgegevensset kunnen voorkomen. We vragen gewoon naar de hoofdstad van Spanje en Copilot genereert het juiste antwoord.
Voorbeeld 5
Als we echter vragen naar een niet-bestaand land, geeft Copilot ook het beste antwoord dat er ook "correct" uitziet.
Voorbeeld 6
In dit voorbeeld keren we het proces om, we geven het antwoord om te proberen de vraag te genereren. Copilot genereert een vraag die we niet hadden verwacht. We verwachtten 'Wat is de hoofdstad van Frankrijk?' en Copilot vroeg 'Wat is het resultaat van de volgende code?' maar toch kunnen we een juiste suggestie begrijpen.
Voorbeeld 7
Hier dwingen we Copilot om te vragen wat we willen veranderen in een meer algemene taal en het toevoegen van de eerste letter. Het genereert echter een andere vraag, deze keer helemaal fout en heeft geen relatie met het antwoord.
Samengevat, Copiloot:
- Bouwt een suggestie op basis van de meest voorkomende oplossing.
- Is meestal juist als uw vraag zinvol is.
- Is meestal verkeerd wanneer uw zoekopdracht eruitziet als een veelvoorkomend probleem, maar dat niet is, en het heeft eigenlijk een heel ander doel.
Copilot met open source-bibliotheken
Copilot is getraind met open source projecten. Het bevat miljoenen use-cases van elke open source-bibliotheek zoals numpy, opencv, qt... Dit maakt Copilot erg nuttig omdat het de programmeur helpt met de meest voorkomende suggestie die meestal de beste is.
Voorbeeld 8
In dit voorbeeld gebruiken we de hoofdstuk toets python-module, en Copilot weet dat de unittest.TestCase heeft een methode genaamd beweren Gelijk en weet dat ook voo( 1, 2 ) moet 3 zijn.
Voorbeeld 9
Hierboven creëren we een meer complexe foo functie (waarvan we aannemen dat het niet in de trainingsgegevens kan zitten), om te zien of Copilot de code echt begrijpt. Na het uitvoeren van de code met 17 testgevallen, faalden er slechts 6, wat een succesratio van 65% opleverde.
Het lijkt misschien niet veel, maar houd er rekening mee dat Copilot geen python-interpreter is, het heeft de functie niet uitgevoerd om de uitvoer te krijgen ... Copilot heeft wat tijdens de training geleerd is gebruikt om onze query om te zetten in de uitvoer met een perfecte python-syntaxis en werkt ook goed 65% van de tijd.
Voorbeeld 10
Je zou verwachten dat een lange invoertekst ervoor zorgt dat Copilot faalt, maar dat is niet het geval, hoe meer informatie we geven, hoe betere antwoorden de copilot kan genereren.
In het bovenstaande voorbeeld vragen we om een complexe taak, een compleet programma dat verschillende inzichten vereist om op te lossen, zoals: programmeervaardigheden in python, micropython-specifieke bibliotheken en hoe deze correct te gebruiken, zelfs bij het begrijpen van menselijke tekstbeschrijvingen.
De volledige hint wordt weergegeven in de volgende cel. Merk op dat het zeer goed overeenkomt met de programmabeschrijving. De toepassingsklasse is logisch en zelfs de micropython-bibliotheken (PIN, UART, ADC, PIN.irq ...) worden correct gebruikt. Het is niet 100% perfect, bijvoorbeeld in dit geval temp_sensor is een ADC-object, dat niet heeft temp_sensor.init() methode en andere kleine fouten kunnen worden gegenereerd, maar de hele structuur van het programma is absoluut correct en de kleine fouten kunnen eenvoudig worden verholpen.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | importeren tijd importeren machine klasse Aanvraag: def __in het__(zelf): zelf. = machine.Pin(0, automaat.pin.IN) zelf.temperatuur_sensor = machine.ADC (machine).Pin(1)) zelf.uart = machine.UART(1, 115200) zelf.uart.in het(115200, beetjes=8, pariteit=Geen, hou op=1) zelf.laatste evenement = 0 zelf.laatste_temp = 0 zelf.laatste keer = 0 zelf. .irq(trigger)=machine.pin.IRQ_FALLING, begeleider=zelf.knop ingedrukt) zelf. .irq(trigger)=machine.pin.IRQ_RISING, afhandelaar=zelf.button_released) zelf.temperatuur_sensor.in het() def knop ingedrukt(zelf, pinnen): zelf.laatste evenement = 1 zelf.laatste keer = tijd.tikken_ms() zelf.uart.schrijven (b'{},{},{}\n'.formaat(zelf.laatste keer, zelf.laatste evenement, zelf.laatste_temp)) def knop_losgelaten(zelf, pinnen): zelf.laatste evenement = 0 zelf.laatste keer = tijd.tikken_ms() zelf.uart.schrijven (b'{},{},{}\n'.formaat(zelf.laatste keer, zelf.laatste evenement, zelf.laatste_temp)) def lees_temp(zelf): zelf.laatste_temp = zelf.temperatuur_sensor.lezen() zelf.uart.schrijven (b'{},{},{}\n'.formaat(zelf.laatste keer, zelf.laatste evenement, zelf.laatste_temp)) def lopen(zelf): en Waar: zelf.read_temp() tijd.slaap(0.1) |
Voorbeeld 11
Ten slotte gebruiken we in het onderstaande voorbeeld Copilot om de opmerkingen aan de vorige code toe te voegen. We kopiëren de klas twee keer en voegen een gids toe aan Copilot, zoals "Docstring-versie van de bovenstaande klas". Copilot genereert de klas en opmerkingen voor elke regel.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | # Docstring-versie van de bovenstaande klasse klasse Aanvraag: """ Kort: Dit is een eenvoudige applicatie die de temperatuursensor leest en de gegevens naar de UART stuurt. De gegevens worden verzonden in het formaat: tijd, gebeurtenis, temp De tijd is de tijd in milliseconden sinds de start van de toepassing. De gebeurtenis is 1 als de knop wordt ingedrukt en 0 als de knop wordt losgelaten. De temp is de temperatuur in graden Celsius. "" " def __in het__(zelf): # Maak een knopobject zelf. = machine.Pin(0, automaat.pin.IN) # Maak een temperatuursensorobject zelf.temperatuur_sensor = machine.ADC (machine).Pin(1)) # Maak een UART-object zelf.uart = machine.UART(1, 115200) # Initialiseer het UART-object zelf.uart.in het(115200, beetjes=8, pariteit=Geen, hou op=1) # Maak een variabele om de laatste gebeurtenis op te slaan zelf.laatste evenement = 0 # Maak een variabele om de laatste temperatuur op te slaan zelf.laatste_temp = 0 # Maak een variabele om de laatste keer op te slaan zelf.laatste keer = 0 # Registreer de op de knop gedrukte gebeurtenis-handler zelf. .irq(trigger)=machine.pin.IRQ_FALLING, begeleider=zelf.knop ingedrukt) # Registreer de knop vrijgegeven event handler zelf. .irq(trigger)=machine.pin.IRQ_RISING, afhandelaar=zelf.button_released) # Initialiseer de temperatuursensor zelf.temperatuur_sensor.in het() def knop ingedrukt(zelf, pinnen): # Stel de laatste gebeurtenis in op 1 zelf.laatste evenement = 1 # Stel de laatste tijd in op de huidige tijd zelf.laatste keer = tijd.tikken_ms() # Stuur de laatste tijd, laatste gebeurtenis en laatste temperatuur naar de UART zelf.uart.schrijven (b'{},{},{}\n'.formaat(zelf.laatste keer, zelf.laatste evenement, zelf.laatste_temp)) def knop_losgelaten(zelf, pinnen): # Stel de laatste gebeurtenis in op 0 zelf.laatste evenement = 0 # Stel de laatste tijd in op de huidige tijd zelf.laatste keer = tijd.tikken_ms() # Stuur de laatste tijd, laatste gebeurtenis en laatste temperatuur naar de UART zelf.uart.schrijven (b'{},{},{}\n'.formaat(zelf.laatste keer, zelf.laatste evenement, zelf.laatste_temp)) def lees_temp(zelf): # Stel de laatste temperatuur in op de huidige temperatuur zelf.laatste_temp = zelf.temperatuur_sensor.lezen() # Stuur de laatste tijd, laatste gebeurtenis en laatste temperatuur naar de UART zelf.uart.schrijven (b'{},{},{}\n'.formaat(zelf.laatste keer, zelf.laatste evenement, zelf.laatste_temp)) def lopen(zelf): en Waar: # Lees de temperatuur zelf.lees_temp() # Wacht 0.1 seconden tijd.slaap(0.1) |