"Jakákoli dostatečně pokročilá technologie je k nerozeznání od magie." Arthur C. Clarke
v Neuronová síť SBC příspěvek jsme viděli 1k vah síť trénovanou s 10k vzorky k přiblížení sinus funkce. V tomto příspěvku použijeme 175G závaží trénované se 450G vzorky, které umí programovat lépe než průměrný programátor. Velikost těchto modelů je působivá, ale ve skutečnosti nikdo neví, jak vlastně fungují nebo jaká jsou jejich omezení.
GitHub Copilot je nástroj AI, který urychluje vývoj softwaru a umožňuje programátorovi dělat mnoho věcí, které byly dříve nemožné. Zpočátku se to zdá podobné použití StackOverflow, webu, kam programátoři posílají otázky, když něco nevědí, ale Copilot jde mnohem dál, je schopen syntetizovat novou odpověď na náš problém.
Copilot je součástí kódu Microsoft Visual Studio Code a neustále navrhuje kódy v šedé barvě, které můžete přijmout stisknutím tlačítka tabulátoru. Tento navrhovaný kód lze zhruba definovat jako „nejběžnější“ shodu mezi vaším dotazem (vaším kódem) a trénovací datovou sadou (kód GitHub).
Příklad 1
V tomto příkladu definujeme naši funkci a její dokumentační řetězec a požádáme Copilota o dokončení. Jak vidíme, dokončení odpovídá docstringu. První intuicí je, že Copilot funguje jako vyhledávač a jednoduše spojí váš dotaz s jeho tréninkovou datovou sadou (150 GB open source projektů), ale takhle to nefunguje.
Příklad 2
Zde vytvoříme nějaký náhodný/šílený řetězec, který nemůže být v trénovací sadě. Výsledek stále vypadá, že je to nejkoherentnější řešení, které lze v tomto případě poskytnout: součet vstupních parametrů.
Příklad 3
V tomto příkladu žádáme (ve španělštině) o sečtení oblasti průsečíku dvou kružnic vzhledem k jejich středu a poloměru. Copilot rozumí španělskému textu bez problémů a navrhuje název funkce, parametry a celé tělo funkce. Po krátké kontrole to vypadá, že by kód měl fungovat.
Příklad 4
Nyní vytvoříme hypotetický text otázky/odpovědi. Díky tomu Copilot přiřazuje dotaz k některým zkouškám, které mohou být v této tréninkové datové sadě. Jednoduše se zeptáme na hlavní město Španělska a Copilot vygeneruje správnou odpověď.
Příklad 5
Pokud se však zeptáme na neexistující zemi, Copilot také dá svou nejlepší odpověď, která také vypadá „správně“.
Příklad 6
V tomto příkladu obrátíme proces, dáme odpověď, abychom se pokusili vygenerovat otázku. Copilot generuje otázku, kterou jsme nečekali. Očekávali jsme "Jaké je hlavní město Francie?" a Kopilot se zeptal: "Co je výsledkem následujícího kódu?" ale přesto můžeme pochopit správný návrh.
Příklad 7
Zde nutíme Copilota, aby se zeptal na to, co chceme změnit na běžnější jazyk a přidat první písmeno. Generuje však další otázku, tentokrát zcela chybnou a nemá žádnou souvislost s odpovědí.
Stručně řečeno, Copilot:
- Vytvoří návrh na základě nejběžnějšího řešení.
- Obvykle je správně, pokud váš dotaz dává smysl.
- Obvykle je chybný, když váš dotaz vypadá jako běžný problém, ale není, a ve skutečnosti má velmi odlišný cíl.
Kopilot využívající open source knihovny
Copilot byl vyškolen s open source projekty. Zahrnuje miliony případů použití jakékoli knihovny s otevřeným zdrojovým kódem, jako je numpy, opencv, qt… Díky tomu je Copilot opravdu užitečný, protože pomáhá programátorovi s nejběžnějším návrhem, který je obvykle nejlepší.
Příklad 8
V tomto příkladu používáme unittest python modul a Copilot ví, že unittest.TestCase má pojmenovanou metodu tvrdit Rovný a také to ví foo (1, 2) by měla být 3.
Příklad 9
Výše vytvoříme komplex Foo funkce (o které předpokládáme, že nemůže být v trénovacích datech), abychom zjistili, zda Copilot skutečně rozumí kódu. Po spuštění kódu se 17 testovacími případy selhalo pouze 6, což představuje 65% úspěšnost.
Může se to zdát málo, ale mějte na paměti, že Copilot není pythonový interpret, neprovedl funkci, aby získal svůj výstup… Copilot použil to, co se naučil během školení, aby převedl náš dotaz na výstup, který má perfektní syntaxi pythonu a také funguje dobře 65 % času.
Příklad 10
Dalo by se očekávat, že dlouhý vstupní text způsobí selhání funkce Copilot, ale nestalo se tak, čím více informací poskytneme, tím lepší odpovědi může druhý pilot generovat.
Ve výše uvedeném příkladu požadujeme složitý úkol, kompletní program, který vyžaduje různá porozumění k řešení, jako jsou: dovednosti programování v pythonu, knihovny specifické pro mikropython a jak je správně používat i při porozumění popisu lidského textu.
Úplná nápověda se zobrazí v další buňce. Všimněte si, že velmi dobře odpovídá popisu programu. Třída aplikace dává smysl a dokonce i knihovny micropython (PIN, UART, ADC, PIN.irq…) jsou správně použity. Není to 100% dokonalé, například v tomto případě temp_senor je objekt ADC, který nemá temp_sensor.init() a mohou být generovány další drobné chyby, ale celá struktura programu je rozhodně správná a drobné chyby lze snadno opravit.
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 | import čas import stroj třída editaci videa: def __init__(vlastní): vlastní.tlačítko = stroj.Kolík(0, stroj.Pin.V) vlastní.temp_sensor = stroj.ADC (stroj.Kolík(1)) vlastní.uart = stroj.UART(1, 115200) vlastní.uart.init(115200, bitů=8, parita=Nevyplněno, stop=1) vlastní.poslední_událost = 0 vlastní.poslední_temp = 0 vlastní.naposledy = 0 vlastní.tlačítko.irq(spouštěč=stroj.Pin.IRQ_FALLING, handler=vlastní.tlačítko_stisknuto) vlastní.tlačítko.irq(spouštěč=stroj.Pin.IRQ_RISING, obsluha=vlastní.button_released) vlastní.temp_sensor.init() def tlačítko_stisknuto(vlastní, špendlík): vlastní.poslední_událost = 1 vlastní.naposledy = čas.ticks_ms() vlastní.uart.napsat (b'{}, {}, {}\n'.formát(vlastní.naposledy, vlastní.poslední_událost, vlastní.last_temp)) def button_released(vlastní, špendlík): vlastní.poslední_událost = 0 vlastní.naposledy = čas.ticks_ms() vlastní.uart.napsat (b'{}, {}, {}\n'.formát(vlastní.naposledy, vlastní.poslední_událost, vlastní.last_temp)) def read_temp(vlastní): vlastní.poslední_temp = vlastní.temp_sensor.číst() vlastní.uart.napsat (b'{}, {}, {}\n'.formát(vlastní.naposledy, vlastní.poslední_událost, vlastní.last_temp)) def běh(vlastní): zatímco Pravdivý: vlastní.read_temp() čas.spát(0.1) |
Příklad 11
Nakonec v níže uvedeném příkladu používáme Copilot k přidání komentářů k předchozímu kódu. Zkopírujeme třídu dvakrát a přidáme průvodce do Copilota, jako je „Docstring verze výše uvedené třídy“. Copilot generuje třídu a komentáře pro každý řádek.
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 verze výše uvedené třídy třída editaci videa: """ Stručně: Jedná se o jednoduchou aplikaci, která čte teplotní senzor a odesílá data do UART. Údaje se zasílají ve formátu: čas, událost, teplota Čas je čas v milisekundách od spuštění aplikace. Událost je 1 při stisknutí tlačítka a 0 při uvolnění tlačítka. Teplota je teplota ve stupních Celsia. "" " def __init__(vlastní): # Vytvořte objekt tlačítka vlastní.tlačítko = stroj.Kolík(0, stroj.Pin.V) # Vytvořte objekt snímače teploty vlastní.temp_sensor = stroj.ADC (stroj.Kolík(1)) # Vytvořte objekt UART vlastní.uart = stroj.UART(1, 115200) # Inicializujte objekt UART vlastní.uart.init(115200, bitů=8, parita=Nevyplněno, stop=1) # Vytvořte proměnnou pro uložení poslední události vlastní.poslední_událost = 0 # Vytvořte proměnnou pro uložení poslední teploty vlastní.poslední_temp = 0 # Vytvořte proměnnou pro uložení poslední doby vlastní.naposledy = 0 # Zaregistrujte obsluhu události po stisknutí tlačítka vlastní.tlačítko.irq(spouštěč=stroj.Pin.IRQ_FALLING, handler=vlastní.tlačítko_stisknuto) # Zaregistrujte obslužnou rutinu události uvolněnou tlačítkem vlastní.tlačítko.irq(spouštěč=stroj.Pin.IRQ_RISING, obsluha=vlastní.button_released) # Inicializujte teplotní senzor vlastní.temp_sensor.init() def tlačítko_stisknuto(vlastní, špendlík): # Nastavte poslední událost na 1 vlastní.poslední_událost = 1 # Nastavte poslední čas na aktuální čas vlastní.naposledy = čas.ticks_ms() # Odešlete do UART poslední čas, poslední událost a poslední teplotu vlastní.uart.napsat (b'{}, {}, {}\n'.formát(vlastní.naposledy, vlastní.poslední_událost, vlastní.last_temp)) def button_released(vlastní, špendlík): # Nastavte poslední událost na 0 vlastní.poslední_událost = 0 # Nastavte poslední čas na aktuální čas vlastní.naposledy = čas.ticks_ms() # Odešlete do UART poslední čas, poslední událost a poslední teplotu vlastní.uart.napsat (b'{}, {}, {}\n'.formát(vlastní.naposledy, vlastní.poslední_událost, vlastní.last_temp)) def read_temp(vlastní): # Nastavte poslední teplotu na aktuální teplotu vlastní.poslední_temp = vlastní.temp_sensor.číst() # Odešlete do UART poslední čas, poslední událost a poslední teplotu vlastní.uart.napsat (b'{}, {}, {}\n'.formát(vlastní.naposledy, vlastní.poslední_událost, vlastní.last_temp)) def běh(vlastní): zatímco Pravdivý: # Odečtěte teplotu vlastní.read_temp() # Počkejte 0.1 sekundy čas.spát(0.1) |