Robert Važan

Jazykové modely sú o kontexte

Označovať jazykové modely (LLM) za generatívnu umelú inteligenciu je vlastne nesprávne. Hoci jazykové modely skutočne generujú text, dôležitá nuansa je v tom, že tento proces je podmienený promptom a širším kontextom. Jazykové modely sa správajú skôr ako kompilátory alebo prekladače než ako generátory. Ich výstup je zrkadlovým obrazom ich vstupu.

V dôsledku toho kvalita výstupu závisí od kvality vstupu. Závisí aj od samotného jazykového modelu, ale väčšina z nás už používa najlepší model, aký si môže dovoliť, a výrazné zlepšenie modelov je vzdialené mesiace až roky. Fine-tuning má veľký potenciál, ale v súčasnosti je komplikovaný, krehký a drahý. Vzhľadom na stagnujúci výkon jazykových modelov je jedinou pákou, ktorá nám zostala, kontext. Všetky dnes používané techniky pre jazykové modely sa v konečnom dôsledku dajú chápať ako príprava čo najlepšieho kontextu.

Prejdime si v súčasnosti populárne techniky, aby sme videli, ako všetky obohacujú kontext. Chcem ukázať, že rozmanité techniky, vrátane premýšľania a agentov, sú v skutočnosti len optimalizáciami kontextu.

Jazykové modely s dlhým kontextom

Zjavne, ak sa snažíte zostaviť čo najlepší kontext, mať preň viac miesta je výhodou. Jazykovým modelom vo všeobecnosti dlhší kontext prospieva. Samozrejme, v určitom bode narazíte na klesajúci prínos z ďalšieho naťahovania kontextu. A dlhý kontext je drahý, takže je tu aj ekonomický aj technický limit. Ale takmer vždy je lepšie naplniť najväčšie kontextové okno, aké si môžete dovoliť.

Niektorí ľudia tvrdia, že zbytočný kontext model rozptyľuje a zhoršuje jeho výkon, ale podľa mňa to platí len pre jednoduché problémy a pre jazykové modely bez schopnosti premýšľania. Pri programátorských úlohách neexistuje nič také ako zbytočný kontext.

Premýšľajúce jazykové modely

Premýšľanie, propagované ako metóda na škálovanie výkonu počas inferencie, má za cieľ dať jazykovému modelu extra výpočtový výkon, ale podľa mňa je jeho hlavným efektom zvýšenie užitočnosti kontextu.

Kontextová pamäť (KV cache) je nevyhnutne plytká, pretože jazykový model má len obmedzený počet vrstiev a transformer architektúra neumožňuje žiadnu rekurziu. Premýšľanie umožňuje robiť výpočty neobmedzenej hĺbky, čo jazykovým modelom dovoľuje rozbaliť hlboké implicitné informácie. Keďže tokeny reprezentujúce premýšľanie sa stávajú súčasťou kontextu, premýšľanie robí rozbalené informácie explicitnými a dostupnými prostredníctvom kontextovej pamäte.

Premýšľanie tiež zhromažďuje relevantné informácie a umiestňuje ich na koniec kontextu, kam jazykové modely sústredia väčšinu svojej pozornosti. Prečo sa pozornosť sústredí na koniec? Myslím si, že to má niekoľko príčin: posuvné okno pozornosti (sliding window attention), škálovanie RoPE a prirodzená lokalita informácií v trénovacích dátach.

Ak sa na to pozriete takto, premýšľanie nemusí byť v skutočnosti logické. Ak model len voľne a náhodne uvažuje o relevantných informáciách v kontexte, podarí sa mu vyniesť na povrch implicitné informácie a presunúť relevantné informácie na koniec, aj keď myšlienky nie sú obzvlášť logické.

RAG

RAG je v podstate slabou, ale lacnou vrstvou pozornosti. Spôsob, akým porovnáva vektor promptu s vektormi dokumentov, je pozoruhodne podobný mechanizmu pozornosti v jazykových modeloch. RAG tak v podstate dáva jazykovému modelu prístup k obrovskému kontextu, hoci tento kontext je veľmi nízkej kvality.

RAG tiež vkladá nájdené fragmenty dokumentov do natívneho kontextu jazykového modelu, kde sú spracované s väčšou dôkladnosťou. V minulosti bolo udržiavanie krátkeho kontextu a spoliehanie sa na RAG lepšie než napĺňanie veľkého kontextu, pretože RAG umiestňoval všetky nájdené informácie do nedávneho kontextu, ktorý je lepšie pokrytý pozornosťou jazykového modelu. Myslím, že dnes to už neplatí, pretože jazykové modely dokážu pomocou premýšľania presunúť ktorúkoľvek časť svojho kontextu na koniec.

Agenti

Agenti robia aj iné veci než len napĺňanie kontextu, ale agentické načítavanie dokumentov (retrieval) je podstatnou súčasťou ich úspechu. Načítavanie riadené jazykovým modelom býva inteligentnejšie než RAG. A na rozdiel od RAG, jazykový model má šancu skúsiť to znova, ak načítané dokumenty neobsahujú relevantné informácie.

Agentické načítavanie nie je len jednoduché načítanie súborov. Agenti môžu oťukávať svoje prostredie a vidieť výsledky. Môžu používať nástroje na získanie informácií, ktoré nie sú v znalostnej báze alebo v nej nie sú explicitné. Agenti dostávajú spätnú väzbu pre všetky svoje kroky. Niekedy je táto spätná väzba ich vlastná, pretože vidia v kontexte svoj vlastný výstup.

Príklady v prompte

Poskytnutie niekoľkých príkladov v kontexte (few-shot prompting) pomáha aj pri používaní inštrukčne ladených jazykových modelov. Príklady dopĺňajú inštrukcie. Správne a relevantné príklady v kontexte zvyšujú pravdepodobnosť, že odpoveď jazykového modelu bude tiež správna a relevantná.

Príklady nemusia byť páry prompt-odpoveď. Už len zahrnutie niektorých súborov z projektu do kontextu zvyšuje pravdepodobnosť, že jazykový model bude dodržiavať konvencie projektu a používať interné pomocné funkcie.

Moja teória je, že jazykové modely sa počas trénovania učia podvádzať tým, že sa spoliehajú na kontext namiesto svojich vedomostí. Napĺňajú svoju kontextovú pamäť vzormi pozorovanými v kontexte. Keď sa jazykový model musí rozhodnúť o nasledujúcom tokene, zhromaždí tieto vzory z kontextovej pamäte, pokiaľ možno z podobných miest v kontexte, a napodobňuje to, čo už videl. Naplnenie kontextu informáciami podobnými požadovanému výstupu potom zaisťuje, že jazykový model sa môže vždy oprieť o relevantné vzory v kontextovej pamäti popri svojich vlastných vedomostiach.

Kompresia kontextu

Pozor, nezamieňajte si komresiu kontextu s kompresiou kontextovej pamäte (ktorá znižuje jej veľkosť v pamäti počítača) alebo so zhrnutím kontextu (ktoré poskytuje prehľad pre ľudí). Kompresia kontextu sa obvykle používa na to, aby sa do kontextu zmestilo viac informácií za cenu vynechania detailov. Je to stratová kompresia kontextu. V programovaní sú príkladmi kompresie kontextu, ktoré vynechávajú detaily, zoznamy súborov a mapy symbolov.

Hoci sa kompresia kontextu dá použiť na šetrenie nákladov na tokeny alebo na predchádzanie pretečeniu kontextového okna, ja ju vnímam hlavne ako spôsob, ako očistiť kontext, odstrániť informácie najnižšej kvality (špekulatívne premýšľanie, neúspešné akcie, zastarané informácie, história krokov), aby sa viac pozornosti dostalo informáciám najvyššej kvality (inštrukcie, vstupy, pôvodný a súčasný stav).

Kedy sa to oplatí?

Pekné na tom, že všetky vyššie uvedené techniky považujeme za optimalizácie kontextu, je to, že sú teraz zameniteľné a môžeme si vybrať tie najefektívnejšie. Ktoré z nich teda stoja za námahu?

Ako príklad lacnej techniky by som uviedol premýšľanie. Je úplne celé v réžii dodávateľa jazykového modelu, takže vy nemusíte robiť nič. Na druhej strane by som poukázal na RAG ako na príklad techniky s neprimeranou zložitosťou a malým prínosom. Agenti sú v strede škály zložitosti. Môžu byť veľmi účinné, všeobecné a zároveň jednoduché, ak jazykovému modelu jednoducho dovolíte písať a spúšťať skripty v sandboxe. Few-shot prompting pridávaním existujúcim projektových súborov do kontextu je tiež jednoduchý a účinný.