Jazykové modely sú perfektná skriptovacia platforma
Pred časom som na blogu písal, že skriptovanie je programovacia paradigma, rýchla a špinavá alternatíva softvérového inžinierstva, nie len vlastnosť programovacieho jazyka. Ako sa ukazuje, inštruovanie jazykových modelov ako je ChatGPT má všetky vlastnosti skriptovania. Jazykové modely nie sú len použiteľné ako skriptovacie prostredie. S veľkým náskokom prekonávajú tradičné programovacie jazyky. Sú také dobré, že očakávam, že jazykové modely v budúcnosti uspokoja viac ako 90 % prípadov použitia skriptovania medzi programátormi a sprístupnia skriptovanie širokému okruhu neprogramátorov.
Je to naozaj skriptovanie?
Môžete definovať pravidlá, prilepiť vstup a nechať jazykový model vygenerovať výstup. To je veľmi podobný postup, aký by ste použili pri skriptovaní. Pravidlá zadané jazykovému modelu slúžia ako program. Pravidlá môžu byť dlhé a komplikované a pokrývať množstvo špeciálnych prípadov. Zatiaľ som sa nestretol so žiadnym obmedzením zložitosti. Pravidlá môžete zdokonaľovať interaktívne, pričom po každej zmene necháte jazykový model regenerovať výstup. Ďalší vstup môžete spracovať pomocou rovnakých pravidiel. Pravidlá môžete dokonca uložiť a neskôr ich znovu použiť, podobne ako pri použití osobnej knižnice skriptov. Takže áno, zadávanie zložitých pokynov jazykovým modelom sa podobá skriptovaniu.
Ako som vysvetlil v spomínanom príspevku na blogu, skriptovanie ako programovacia paradigma sa od softvérového inžinierstva líši tým, že predpokladá určité veci:
- Vývojár je zároveň používateľ.
- Skript je spúšťaný pod manuálnym dohľadom.
- Skript je špecializovaný na určitú úlohu.
- Skript je často spustený len raz alebo len niekoľkokrát.
Všetky tieto kritériá sú splnené pri interakcii s jazykovým modelom, takže áno, jazykové modely sa môžu používať ako skriptovacia platforma. Robia síce chyby, ale práve o tom je spúšťanie skriptov pod dohľadom. Skripty v tradičných programovacích jazykoch sú tiež náchylné na chyby, najmä pri zložitých vstupoch.
Samozrejmé programovanie
Jazykové modely prinášajú aj niečo nové: schopnosť robiť samozrejmé rozhodnutia. Pri písaní skriptu v tradičnom programovacom jazyku strávite značné množstvo času spracovaním vstupných a výstupných formátov, formalizáciou logiky rozhodovania a ošetrovaním špeciálnych prípadov a ďalších detailov. Samozrejmé rozhodovanie jazykového modelu vám umožní vyhnúť sa väčšine z toho, pretože teraz máte k dispozícii nové programovacie primitívy:
- Programovanie pomocou príkladov: Programovanie pomocou príkladov je starý koncept, ale vždy bolo jeho slabosťou množstvo možných interpretácií daného príkladu. Jazykové modely však dokážu vybrať najpravdepodobnejšiu interpretáciu príkladu, čo konečne umožňuje praktické programovanie pomocou príkladov.
- Prirodzený jazyk: Programovanie v prirodzenom jazyku kedysi vyžadovalo krehké ontologické knižnice a katalógy viet. Jazykové modely obsahujú dostatok znalostí na to, aby dlhé zoznamy definícií neboli potrebné a dokážu robustne interpretovať predtým nevidené a nejednoznačné vety.
- Logické programovanie: Logické programovanie je ďalšia stará programovacia paradigma. Implementácie založené na vyhľadávaní, ako napríklad Prolog, majú vyjadrovaciu silu a sú spoľahlivé, ale rozvláčnosť a zložitosť ich urobili nepraktickými pre väčšinu skriptovania. Samozrejmé poznatky v jazykovom modeli slúžia ako databáza implicitných pravidiel, čo umožňuje skrátiť súbor pravidiel na minimum. Jazykový model dokáže správne interpretovať zostávajúce explicitné pravidlá a pravdepodobnostne rozriešiť nejednoznačnosti a rozpory, aspoň do určitej rozumnej zložitosti.
- Rozumné predvoľby: Pravdepodobnostné uvažovanie jazykových modelov vám v podstate poskytuje rozumné predvoľby pre všetko. Ak jazykový model narazí na vstup, ktorý nie je pokrytý poskytnutými pravidlami a príkladmi, urobí proste to najrozumnejšie, čo sa dá urobiť vzhľadom na dostupný kontext. Tým sa výrazne znižuje množstvo rozhodovacej logiky, ktorú je potrebné explicitne definovať.
- Sebaprogramovanie: Jazykové modely sú dostatočne inteligentné na to, aby upravili pravidlá a aktualizovali vzorový príklad, keď im dáte spätnú väzbu, korekcie alebo nové príklady. Vypracovanie zložitých inštrukcií pre jazykový model si vyžaduje čas, ale samotný model s tým môže veľmi pomôcť.
V tradičnom programovacom jazyku pracujete nad abstrakciami, ktoré poskytujú knižnice. S jazykovým modelom namiesto toho pracujete nad pravdepodobnostným modelom sveta. Jazykový model si možno predstaviť ako obrovskú knižnicu samozrejmých vedomostí a schopností. Nepotrebuje žiadne API, pretože všetky tieto samozrejmé znalosti sa prejavujú ako rozumné predvoľby pre všetko. Musíte len špecifikovať, čo je na úlohe jedinečné alebo neobvyklé. V konečnom dôsledku tak máte oveľa kratší skript, ktorý je oveľa robustnejší v okrajových prípadoch.
Pracovné postupy
Vyvinul som tri pracovné postupy, z ktorých každý možno považovať za formu skriptovania.
Len príklady
Najjednoduchší spôsob, ako dosiahnuť, aby jazykový model niečo urobil, je ten, že mu proste dáte vstupný a výstupný príklad a necháte ho, aby sám pochopil, čo je potrebné urobiť.
- Vložte príklad vstupu uvedený slovami "Je daný tento vstup:".
- Vložte príklad výstupu uvedený slovami "Upravil som ho takto:" (alebo "preložil", "zmenil", ...).
- Vložte skutočný vstup uvedený slovami "Uprav tento podobne:".
- Nechajte jazykový model vygenerovať výstup.
- Prípadne vložte opravený výstup uvedený slovami "Toto je správny výstup:".
- Opakujte s novým vstupom od kroku 3.
Tento postup je jednoduchý a ľahko sa s ním začína. Dĺžka kontextového okna je menej obmedzujúca, pretože v okne musí byť reálne len aktuálny vstup a posledný výstup (alebo jeho oprava). Pri jednoduchších úlohách to bude často fungovať, aj keď aktuálny vstup spotrebuje 90 % okna a pre model je viditeľný len fragment posledného výstupu.
Nevýhodou je, že nefunguje pri zložitejších úlohách a model má príliš veľkú voľnosť v tom, ako interpretuje príklady. Model tiež opakovane zabúda všetko, čo sa naučil z predchádzajúcich príkladov.
Manuálne vytvorené pravidlá
Ak je kvalita výstupu veľmi dôležitá alebo ak je úloha zložitejšia, je lepšie dať modelu niektoré pokyny nad vstupom. V tomto prípade konverzácia po počiatočnej odpovedi nepokračuje. Aby model nezabudol inštrukcie, pre každý vstup začnete nový rozhovor s inštrukciami vždy nad vstupom. V ChatGPT sa to dá pohodlne urobiť prepísaním vstupu v aktuálnom rozhovore.
- Opíšte úlohu a poskytnite počiatočný zoznam pravidiel. Najlepšie je začať stručne a upresniť neskôr.
- Uveďte krátky príklad vzorového vstupu a výstupu. Model vám môže pomôcť pri tvorbe vzorového príkladu skrátením dlhšieho reálneho príkladu v samostatnom rozhovore.
- Pod to pridajte skutočný vstup.
- Nechajte model vygenerovať výstup.
- Ak je výstup nesprávny, upravte pravidlá a vzorový príklad a skúste to znova od kroku 4.
- Opakujte s novým vstupom od kroku 3.
Tento postup vám poskytne väčšiu kontrolu za cenu hrajkania sa s pravidlami a za cenu, že do kontextového okna sa okrem úplného vstupu a výstupu musia zmestiť aj pravidlá a vzorový príklad.
Sebaprogramovanie
Vytvárať pravidlá a najmä vzorový príklad ručne je dosť prácne. Namiesto toho môžeme požiadať jazykový model o zakomponovanie spätnej väzby.
- Poskytnite počiatočný zoznam pravidiel a vzorový príklad. Jedno z pravidiel hovorí, že všetky pravidlá aj vzorový príklad musí model opakovať po každej odpovedi. Ďalším štandardným pravidlom je, že po zmene pravidiel musí model zopakovať vstup a regenerovať výstup.
- Vložte aktuálny vstup.
- Nechajte model vygenerovať výstup a zopakovať pravidlá a príklad.
- Ak je výstup nesprávny, poskytnite spätnú väzbu, korekcie alebo krátky správny príklad. Požiadajte model o aktualizáciu pravidiel a vzorového príkladu. Nechajte ho regenerovať výstup. Prípadne iterujte ďalšie zmeny pravidiel.
- Opakujte s novým vstupom od kroku 2.
Tento postup je pohodlnejší a dáva modelu viac možností byť inteligentný a užitočný, ale dáva mu aj veľa príležitostí na poškodenie pravidiel a tento postup zaťažuje kontextové okno ešte viac ako predchádzajúci.
Kontextové okná a obmedzenia počtu znakov
Najväčším súčasným obmedzením je, že GPT-4 preruší svoju odpoveď po 8K výstupných znakoch. To je menej ako 2K tokenov, čo je oveľa menej ako 8K dĺžka kontextového okna GPT-4. Môžem ho požiadať, aby pokračoval, ale zvyšný výstup je často rozhádzaný a zošitie dvoch častí je oštara. Bard dokonca obmedzuje aj dotazy na 10K znakov. Niekedy môžem úlohu rozdeliť na menšie časti. Inokedy je úloha jednoducho príliš zložitá na to, aby sa dala vyriešiť v medziach súčasných limitov. OpenAI API možno nemá znakový limit (nikde o tom nie je zmienka), ale API je pre mňa v súčasnosti príliš veľký diskomfort a pravdepodobne vyjde draho, ak ho budem používať na aplikáciu skriptu na veľa vstupov.
Okrem obmedzenia počtu znakov je tu obmedzenie kontextového okna. GPT-4 má údajne 8K kontextové okno a môj malý experiment to zrejme potvrdzuje. Zabúdanie začína za hranicou 40K znakov, čo je 8K tokenov pri 5 znakoch na token. Na základe podobného experimentu odhadujem, že kontextové okno Barda je 4K tokenov. OpenAI má 32K model, ale len cez API a ako som už povedal, API znamená diskomfort a vyššiu cenu. Claude od Anthropicu má 100K okno, ale nie je dostupný na Slovensku.
Napriek tomu verím, že sa táto technológia časom zlepší a zlacnie, a nakoniec sa stane prvou voľbou pre takmer všetky skriptovacie úlohy. Osobne už väčšinu skriptovania robím pomocou GPT-4. Okrem toho skriptujem oveľa viac ako predtým, pretože jazykové modely mi to veľmi uľahčujú.
Čo bude s tradičným skriptovaním?
Skriptovanie pomocou tradičných programovacích jazykov nevyhynie. Existujú skriptovacie úlohy, ktoré sú pre jazykové modely nevhodné, pretože niektoré skripty musia mať reprodukovateľné správanie, niektoré aplikácie sú príliš riskantné a spracovanie väčšieho množstva dát si vyžaduje efektívnosť, ktorú jazykové modely zo svojej podstaty nemôžu poskytnúť. Jazykový model vám napriek tomu môže pomôcť vytvoriť skript v tradičnom programovacom jazyku, ktorý potom spustíte samostatne.