PAL: Programovo podporované jazykové modely pre spoľahlivú finančnú aritmetiku
Po čase strávenom s literatúrou o tabuľkovom uvažovaní som chcel pochopiť komplementárny prístup: namiesto toho, aby LLM uvažovali o tabuľkách v prirodzenom jazyku, čo sa stane, keď im dovolíte písať kód a výpočet úplne odovzdáte ďalej? PAL (Gao et al., 2022, arXiv:2211.10435) je kanonickou odpoveďou a má zjavné dôsledky pre akýkoľvek systém, ktorý potrebuje spoľahlivo vykonávať aritmetiku nad finančnými údajmi.
Odborný článok
„PAL: Program-Aided Language Models“ (Gao, Madaan, Zhou, Alon, Liu, Yang, Callan, Neubig; ICML 2023) vychádza z jednoduchého pozorovania: LLM dobre rozkladajú problémy, ale zle vykonávajú aritmetiku. Promptovanie pomocou reťazca myšlienok (chain-of-thought) rieši prvý problém, ale druhý ponecháva nedotknutý. Navrhovanou opravou je zmeniť to, čo LLM produkuje ako svoje „kroky uvažovania“ — namiesto aritmetiky v prirodzenom jazyku generuje kód v jazyku Python. Interpret Pythonu potom tento kód spustí a vráti odpoveď.
Rozdelenie na dekompozíciu a vykonávanie je jasné: LLM rieši porozumenie problému a štruktúru programu; interpret rieši všetko číselné. Otázka ako „Olivia má 23 $, kúpi si päť bagiet po 3 $ — koľko jej zostane?“ sa zmení na money_left = 23 - (5 * 3), namiesto sekvencie textovej aritmetiky, ktorú by model mohol pokaziť.
Kľúčové myšlienky
- Na GSM8K (slovné matematické úlohy pre základné školy) dosahuje PAL s modelom Codex presnosť 72,0 % v porovnaní so 65,6 % pri reťazci myšlienok s rovnakým modelom Codex — čo predstavuje nárast o +6,4 p. b. — a 56,9 % pri CoT s oveľa väčším modelom PaLM-540B. Menší model vyhráva vďaka delegovaniu aritmetiky na Python.
- Na GSM-hard, verzii GSM8K, kde sú čísla nahradené väčšími hodnotami, dosahuje PAL 61,2 % oproti 23,1 % pri CoT — čo je absolútny rozdiel +38,1 p. b. Veľké čísla rozbíjajú aritmetiku na úrovni tokenov; Python nerozbíjajú.
- Pri hlasovaní väčšiny (majority voting) nad 40 vzorkami dosahuje PAL na GSM8K 80,4 %, čím tesne prekonáva Minerva-540B (78,5 %) s modelom približne o 1/10 veľkosti.
- Zisky sa zovšeobecňujú aj na symbolické uvažovanie. V úlohách BIG-Bench Hard, ako je počítanie objektov (Object Counting), dosahuje PAL skóre 96,7 % oproti 73,0 % pri CoT; pri úlohe Tučniaky v tabuľke (Penguins in a Table) 93,3 % oproti 79,2 %.
- Ablácia odhaľuje, kde sa práca v skutočnosti odohráva: keď LLM vystupuje ako vlastný interpret (bez externého Pythonu), presnosť na GSM8K klesá na 23,2 %. Interpret nie je len drobným vylepšením — vykonáva všetku aritmetiku.
- Na pomenovaní premenných záleží. Nahradenie zmysluplných názvov premenných náhodnými znakmi spôsobuje výrazný pokles presnosti v symbolických úlohách. Model číta svoj vlastný kód.
Čo obstojí — a čo nie
Hlavné tvrdenie je triviálne správne a experimenty ho presvedčivo potvrdzujú: Python je v aritmetike lepší ako LLM a GSM-hard to ukazuje brutálne jasne. Tých +38 p. b. nie je len anomália benchmarku — odráža to kategorické zlyhanie CoT pri zmene mierky.
Čo považujem za menej presvedčivé, je rámcovanie ako všeobecný prielom v uvažovaní. PAL funguje na úlohách, ktoré náhodou majú deterministické odpovede vyjadriteľné v Pythone. Veľká časť toho, na čom pri finančnom uvažovaní záleží, sa takto rozložiť nedá. Rozhodnutie, či je vzor transakcií „pre tento účet v 4. štvrťroku nezvyčajný“ alebo či si prevod vyžaduje manuálnu kontrolu, nie je redukovateľné na výraz v Pythone. PAL vám poskytne spoľahlivý aritmetický motor; neposkytne vám úsudok.
Bezpečnostný rozmer v článku nedostáva žiadnu pozornosť. Benchmarky bežia v kontrolovanom prostredí, ale akékoľvek nasadenie, ktoré generuje a vykonáva ľubovoľný Python v reakcii na vstupy od používateľov, predstavuje významný útokový povrch. Úniky z jadra (kernel escapes) zo sandboxed interpretov, prístup k súborovému systému alebo tajným kľúčom, nepriateľsky vytvorené vstupy generujúce škodlivý kód — nič z toho sa nerieši. Pre finančné aplikácie to nie je len poznámka pod čiarou.
Článok tiež hlbšie neanalyzuje režimy zlyhania, keď sa generovanie kódu nepodarí. Ak PAL vygeneruje syntakticky neplatný Python, skončí bez výsledku. Autori uvádzajú úspešnosť vykonania, ale nešpecifikujú, čo spôsobuje zlyhania generovania, ani či sú náhodné alebo systematické. Vzhľadom na to, že interpret vykonáva všetku aritmetiku, kvalita kódu je jediným úzkym hrdlom spoľahlivosti — a tá je nedostatočne analyzovaná.
Prečo na tom záleží pre finančnú AI
Toto je jeden z najpriamejšie aplikovateľných článkov na Beancount, aké som čítal. Operácie v účtovnej knihe sú takmer dokonale zosúladené s tým, čo PAL robí dobre: sčítanie transakcií podľa kategórií, uplatňovanie výmenných kurzov, výpočet daňového základu naprieč viacerými dávkami (lots), párovanie celkových súm z bankových výpisov so zostatkami v účtovnej knihe. Sú to deterministické, na aritmetiku náročné úlohy vyjadriteľné v Pythone. Agenti založení na CoT tu budú halucinovať čísla; PAL nie, pokiaľ je štruktúra programu správna.
Program of Thoughts (arXiv:2211.12588), súbežný článok, ktorý nezávisle rozvinul rovnakú myšliedku, bol vyhodnotený na troch finančných QA datasetoch — FinQA, ConvFinQA a TATQA — a vykázal priemerný zisk ~12 % oproti reťazcu myšlienok. To je najpriamejší dôkaz, že prístup generovania programov pomáha pri uvažovaní vo finančnej doméne, nielen pri matematike pre základné školy.
Otázka bezpečnosti zápisu je však v kontexte účtovnej knihy ostrejšia ako v benchmarkoch. Agent, ktorý generuje Python na čítanie údajov z Beancountu, je nízkorizikový. Ten, ktorý generuje Python na zápis záznamov do účtovnej knihy, potrebuje prísne obmedzené prostredie na vykonávanie — také, ktoré sa môže dotýkať iba objektov účtovnej knihy a ničoho iného, ktoré pri akejkoľvek výnimke bezpečne zastaví (fail closed) a ktoré vyžaduje, aby generovaný kód pred spustením prešiel whitelistom. PAL pristupuje k interpretu ako k neutrálnemu výpočtovému motoru. Produkčný finančný agent si to nemôže dovoliť.
Čo si prečítať ďalej
- Program of Thoughts Prompting (Chen et al., arXiv:2211.12588) — súbežná práca, ktorá vyhodnocuje výsledky na FinQA, ConvFinQA a TATQA a uvádza priemerný zisk ~12 % oproti CoT; finančne špecifické vyhodnotenie, ktoré PAL odkladá.
- FinQA: A Dataset of Numerical Reasoning over Financial Reports (Chen et al., EMNLP 2021) — benchmark, ktorý je základom finančných vyhodnotení PoT; pochopenie toho, čo sa v skutočnosti testuje, pomôže odhadnúť mieru dôvery pri prenose na reálne prípady použitia v Beancounte.
- Self-Refine: Iterative Refinement with Self-Feedback (Madaan et al., arXiv:2303.17651) — rovnaký prvý autor ako pri PAL, rozširuje poznatky o generovaní kódu o iteratívne slučky samoopravy; relevantné pre to, či sa agenti v štýle PAL dokážu zotaviť z vlastných zlyhaní pri generovaní kódu.
