Čo dnes jazykové modely zvládnu a čo nie
Pri nasadzovaní jazykových modelov vo vývoji softvéru som dosiahol značný pokrok. Ako sa blížim k vyčerpaniu možností automatizácie, ktoré súčasné jazykové modely (LLM) zvládajú, je čoraz jasnejšie, čo zatiaľ nedokážu. Tieto ťažké problémy teraz zaberajú väčšinu môjho času. Limity schopností jazykových modelov tak určujú limity mojej produktivity. Je preto dobré zrevidovať, kde sa tieto limity nachádzajú, aby som sa uistil, že neprehliadam žiadne podstatné príležitosti na automatizáciu.
Čo jazykovým modelom podľa mojej skúsenosti ide dobre
- Unit testy: Generované unit testy som už takmer úplne prestal kontrolovať, pretože sú dostatočne dobré. Testy iba pridávajú redundanciu. Ak v nich aj sú chyby, projekt bude len menej dôkladne otestovaný, ale nemôžu nič pokaziť.
- Interná dokumentácia: Keďže ľudia aj jazykové modely čítajúce internú dokumentáciu tolerujú chyby, nedostatky v internej dokumentácii nie sú vážnym problémom. Generovanú dokumentáciu tiež väčšinou preskakujem bez kontroly.
- Aktualizácia miest volaní: Dnešné jazykové modely sú dosť veľké a inteligentné na to, aby spoľahlivo aktualizovali miesta volaní podľa zmien v signatúre alebo správaní volaného kódu. Tieto zmeny si stále v rýchlosti pozriem, ale chybu v takýchto úpravách vidím len veľmi zriedka.
- Nudný aplikačný kód: S jasnými požiadavkami a usmerňujúcimi inštrukciami produkujú jazykové modely aplikačný kód celkom spoľahlivo. Tu však narážam na veľa chýb, takže je nutná dôsledná kontrola. Viď tiež poznámky o algoritmoch a API dizajne nižšie.
- Repetitívne upratovanie kódu: Sem patria hromadné upratovania, ktoré idú nad rámec refaktorovacích funkcií v IDE, ale sú stále dosť jednoduché na to, aby ich špičkové modely zvládli spoľahlivo. Ak je úloha dobre definovaná, chyby sú veľmi zriedkavé. Nejednoznačná úloha však môže viesť k toľkým štylistickým nedostatkom, že si vyžiada pripomienky pri kontrole kódu.
- Rozsiahle, ale jednoduché zmeny: Toto je nebezpečnejšie než upratovanie, pretože sa mení funkcionalita, ale ak požadovaná transformácia nie je príliš zložitá, jazykové modely ju zvládnu bez problémov.
- Preklad medzi jazykmi: To zahŕňa tak ľudské, ako aj programovacie jazyky. Jazykové modely prekladajú dobre, hoci po sebe zvyčajne nechávajú štylistické a sémantické nedostatky, ktoré si vyžadujú pomerne veľa manuálnych zásahov. Stále je to oveľa jednoduchšie, než robiť všetko sám.
- Mikrooptimalizácie: Jazykové modely dokážu vziať kód na vysokej úrovni a transformovať ho na mikrooptimalizovaný nízkoúrovňový kód. Sú v tom celkom dobré, ale toto už testuje ich limity, pretože je to na hrane algoritmického programovania. Výsledný kód si vyžaduje dôkladnú kontrolu, ale zvyčajne je správny.
- Zhrnutia: Aj menšie modely sú celkom dobré v písaní zhrnutí. Vo vývoji softvéru to zahŕňa prehľady súborov a adresárov, ako aj git commity.
S čím majú jazykové modely zatiaľ problémy
- Algoritmy: Ešte nikdy som nevidel kombináciu jazykového modelu, agenta a inštrukcií, ktorá by dokázala spoľahlivo písať algoritmy. Nejde len o binárne vyhľadávanie a hashovanie. Jazykové modely nedokážu písať dopyty nad aplikačnými dátami. Zlyhajú pri implementácii
for
cyklu s jednou stavovou premennou a dvoma podmienkami. Naozaj je to také zlé. Ak ich požiadate, aby napísali algoritmus, ktorý sa zmestí do 5–10 riadkov elegantného kódu, vyprodukujú 30 riadkov špagetového kódu, ktorý nefunguje. Ak na chyby upozorníte, model natiahne kód na 50-riadkové monštrum, ktoré stále nefunguje. - Konzistentné uplatňovanie štandardov kvality: Očakávajte, že jazykové modely náhodne odignorujú asi polovicu systémového promptu. Niektoré inštrukcie budú ignorovať konzistentne pri každej dotaze. A nejde len o nejednoznačné všeobecné inštrukcie. Jazykové modely často ignorujú aj priamočiare pokyny k formátu výstupu. Bez dôsledného dodržiavania inštrukcií a bez fine-tuningu na konkrétnych úlohách sa nedá jazykovým modelom dôverovať, že dodržia štandardy kvality projektu v akejkoľvek oblasti.
- Kontrola kódu: Ak jazykové modely nedokážu uplatňovať štandardy kvality, nedokážu si svoj kód ani skontrolovať. Iste, samokontrola môže trochu pomôcť, ale nevyhnete sa konečnej manuálnej kontrole, ktorá je pre produktivitu rozhodujúca.
- Dizajn API: API produkované jazykovými modelmi bývajú škaredé a nekonzistentné, aj keď modelu poskytnete rozsiahlu štylistickú príručku. API sú dôležité. Sú používateľským rozhraním vášho kódu. Všetky externé a dôležité interné API vyžadujú ľudský dohľad.
- Dizajn UI: Zatiaľ nemám skúsenosti s užívateľským rozhraním generovaným jazykovými modelmi, ale očakávam rovnaké problémy, aké vidím pri návrhu API. Iní s väčšími skúsenosťami v tejto oblasti už problémy s generovanými UI hlásili.
- Architektúra a štruktúra projektu: Toto je ešte ťažšie než návrh API, pretože si to vyžaduje širší kontext a prehľad o histórii projektu. To v súčasnosti dokážu len ľudia.
- Vývoj nových abstrakcií, konceptov a terminológie: Abstrakcie sa vyvíjajú najmä myšlienkovými experimentmi. Myslím, že jazykové modely s tým majú problém z dvoch dôvodov. Po prvé, hoci v princípe dokážu vykonávať myšlienkové experimenty vo fáze premýšľania, je to pre ne pracný a neintuitívny proces. Po druhé, nedokážu riadne internalizovať ponaučenia z týchto experimentov, pretože majú zmrazené parametre. Jazykové modely sú v súčasnosti dobré len v identifikovaní a uplatňovaní štandardných dizajnových vzorov (design patterns).
- Zber a vyhodnocovanie dát o použiteľnosti: Toto je úplne mimo dosahu jazykových modelov. Neočakávam v tejto oblasti pokrok, kým jazykové modely nebudú mať dostatočne výkonný kontext na to, aby si dokázali udržiavať prehľad o aktuálnom stave projektu a jeho histórii na úrovni porovnateľnej s človekom.
- Formulovanie nových požiadaviek: Toto je oveľa ťažšia verzia návrhu UI/API a vývoja konceptov. Jazykové modely v blízkej dobe nebudú samy pre seba formulovať užitočné požiadavky, aj keby dostali výsledky rozsiahleho testovania použiteľnosti.
- Posúvanie aplikačných metrík: Toto by bola konečná forma automatizácie vo vývoji softvéru. Stačí zadať cieľ a metriky úspechu a nechať jazykový model iterovať. Od tejto utópie sme nepochybne veľmi ďaleko.
Vplyv na produktivitu
Hoci konkrétny prínos sa líši od projektu k projektu, špičkové jazykové modely sú dnes dosť dobré na to, aby priniesli podstatné zvýšenie produktivity takmer všade. Moje odporúčanie je nasadzovať ich vo veľkom všade, akoby nebolo zajtrajška.
Na druhej strane, žiadna technologická singularita sa nekoná. Prínosy v produktivite sa nekumulujú a so súčasnými jazykovými modelmi nedosiahnete plnú automatizáciu. Od určitého bodu začnú ďalšie vylepšenia nástrojov a pracovných postupov prinášať klesajúce výnosy. Väčšia časť prínosov v produktivite ide do zlepšenej kvality (testy, dokumentácia) a nie do vyššej rýchlosti vývoja. Dlhé hodiny ľudskej práce sú stále nevyhnutné. Mení sa len povaha práce. Vývoj softvéru je dnes bližšie k projektovému manažmentu a ďalej od technických detailov programovania.
Budúcnosť
Osobne očakávam najrýchlejší pokrok v dodržiavaní inštrukcií a v algoritmickom programovaní. Revízia kódu by mala fungovať dobre, keď jazykové modely dokážu dôsledne dodržiavať aj nejednoznačné všeobencné inštrukcie. V dizajne API a UI sa dá nájsť nízko vysiace ovocie, hoci s týmto budú mať jazykové modely pravdepodobne ešte nejaký čas problémy. Zvyšné úlohy si podľa mňa vyžadujú oveľa výkonnejšie jazykové modely, než aké máme dnes.