Úlohy pre jazykové modely by mali byť široké a plytké
Keď som písal o obmedzenej inteligencii súčasných jazykových modelov, stručne som spomenul, že im vyhovujú široké a plytké úlohy. Tu rozviniem, prečo si to myslím a čo to znamená v praxi, najmä v kontexte vývoja softvéru.
Pre úplnosť ešte vysvetlím, že:
- Široká úloha znamená robiť veľa samostatných zmien, dotýkajúcich sa mnohých riadkov kódu, pokojne aj cez 100 riadkov.
- Plytká úloha znamená, že každá jednotlivá zmena je malá a jednoduchá.
Prečo široké a plytké?
- Diffy: Plytké úlohy vedú k relatívne čistým a čitateľným diffom.
- Spoľahlivosť: Plytké úlohy nevyvíjajú taký tlak na inteligenciu jazykového modelu. Výsledky sú spoľahlivejšie a kontrola kódu sa môže zredukovať na zbežné prečítanie.
- Cena: Široké úlohy v podstate zabalia veľký počet podúloh do jedného dotazu pre jazykový model, čo minimalizuje náklady na jednu podúlohu. To nám umožňuje používať väčšie modely s dlhším kontextom.
- Réžia: Široké úlohy rozložia konštantnú réžiu (zadanie dotazu, latencia jazykového modelu, ...) na viacero podúloh.
- Pohodlie: Plytké úlohy sú pre toho, kto robí kontrolu kódu (mňa), kognitívne nenáročné, čo robí prácu menej únavnou a nabáda ma, aby som sa ponáhľal.
- Konzistentnosť: Jazykové modely majú tendenciu odpovedať konzistentne v rámci celej úlohy, takže akékoľvek štylistické alebo logické problémy sa dajú riešiť naraz v celej úlohe.
- Autonómia: Široké úlohy dávajú jazykovému modelu dostatok autonómie, aby ukázal svoje silné stránky, prevzal zodpovednosť a prispel k produktivite.
- Rast: Široké a plytké úlohy benefitujú z lepších jazykových modelov, ktoré tolerujú menej detailnú špecifikáciu a potrebujú menej dôkladnú kontrolu.
A čo úlohy s nerovnomernou náročnosťou?
Píšem o vývoji softvéru, ktorý nevyhnutne zahŕňa úlohy so širokým rozptylom náročnosti v rámci tej istej úlohy. To nie je ideálne, pretože jazykové modely sa stratia v najzložitejších častiach kódu a práve tam budú všetky chyby.
Aby som sa s tým vyrovnal, vyrovnávam náročnosť v popise úlohy. Pridávam viac detailov do špecifikácie tam, kde má úloha príliš veľkú hĺbku. A z opačnej strany, nechávam jazykový model hádať tam, kde je úloha plytká. Počas kontroly kódu venujem viac pozornosti kódu, ktorý je zložitý, a triviálne zmeny len zbežne prejdem.
Zložitým úlohám v programovaní sa nedá úplne vyhnúť. Niekedy musíte niečo urobiť ručne. V konečnom dôsledku programovaniu vždy prospieva väčší a inteligentnejší model.
Príklady
Tu je niekoľko príkladov širokých a plytkých programátorských úloh:
- Napísať unit testy.
- Napísať základnú API dokumentáciu.
- Transformovať kód spôsobom, ktorý presahuje možnosti refaktoringu v IDE, ale ktorý je stále v dosahu jazykových modelov.
- Napísať implementáciu existujúceho rozhrania podľa jasných a jednoduchých požiadaviek.
- Napodobniť existujúci kód pri implementácii podobnej alebo súvisiacej funkcie.
Zložitejšie úlohy zvyčajne majú špecifikáciu s 5-20 bodmi, pričom každý obsahuje jasný príkaz alebo obmedzenie. Systémový prompt je štruktúrovaný podobne. Formulovanie špecifikácie ako zoznamu mi tiež umožňuje pripojiť menšie nesúvisiace úlohy k hlavnej úlohe bez toho, aby som musel zadávať ďalší dotaz jazykovému modelu.