Preskočiť na obsah

Štruktúrované výstupy: získanie spoľahlivého JSON z jazykového modelu

Blog / Zverejnené 

Prvá verzia každej integrácie LLM analyzuje prózu. Požiadate o „tri hlavné riziká, jedno na riadok“, rozdelené na nové riadky a funguje to až do dňa, keď model napíše úvodnú vetu ako prvý. Na ukončenie tejto slučky existujú štruktúrované výstupy: dáte modelu schému JSON, dekodér je obmedzený, takže nemôže vysielať nič, čo by ho porušovalo, a dostanete späť užitočné zaťaženie s poľami, ktoré ste požadovali. Táto záruka je skutočná, ale užšia, ako sa zdá, a rozdiel je v tom, kde chyby žijú.

Na čo sa záruka v skutočnosti vzťahuje

Obmedzené záruky dekódovania tvar. Odpoveď bude analyzovať ako JSON, bude mať vaše kľúče, typy sa budú zhodovať a polia enum budú obsahovať jednu z vašich uvedených hodnôt. To je veľké zlepšenie oproti promptu a nádeji.

Nezaručuje nič o obsahu. Pole zadané ako reťazec bude obsahovať reťazec; či je tento reťazec presný alebo vynájdený tak, aby vyhovoval schéme, sa od predchádzajúceho nemení. V skutočnosti striktná schéma robí vynález o niečo pravdepodobnejším, pretože povinné pole musí byť niečím vyplnené a model nemôže povedať „neprítomný v zdroji“. Toto je jediná najčastejšia porucha vo výrobe: povinná invoice_number v dokumente, ktorý nemá žiadne.

Dizajn okolo toho. Ak je neprítomnosť možná, povoľte hodnotu null, pridajte explicitnú hodnotu found: boolean alebo a "unknown" enum člen a nikdy nevyžadujte pole, pokiaľ odpoveď skutočne neexistuje v každom vstupe.

Navrhovanie schémy, ktorú môže model vyplniť

Schémy napísané na overenie a schémy napísané na generovanie vyzerajú odlišne. Niekoľko pravidiel, ktoré platia pre všetkých poskytovateľov:

Poskytovatelia tiež obmedzujú, ktoré kľúčové slová schémy JSON podporujú v prísnom režime: oneOfObmedzenia vzorov, numerické hranice a rekurzia sú bežne obmedzené alebo ignorované. Predpokladajme, že schéma obmedzuje iba štruktúru a po analýze presadzujte svoje obchodné pravidlá sami.

Napriek tomu overiť

Dokonca aj v prísnom režime overte každú odpoveď skôr, ako sa dotkne vašej databázy. Prísny režim môže byť deaktivovaný zmenou konfigurácie, záložná cesta môže zasiahnuť model, ktorý ju nepodporuje, opakovaný pokus siete môže vrátiť chybový objekt a odpoveď môže byť skrátená limitom tokenu v strede objektu – čo vytvára neplatný JSON, ktorému nebráni žiadny režim schémy.

Keď užitočné zaťaženie zlyhá, užitočná otázka je, ktoré pole a prečo. The Validátor schémy JSON vezme dokument a schému a nahlási jeden riadok pre každý problém s cestou ukazovateľa JSON, kľúčovým slovom, ktoré zlyhalo, a skutočne nájdenou hodnotou. To je presne ten formulár, ktorý chcete na dva účely: oprava schémy počas vývoja a spätné zaslanie do opätovného pokusu – správa o zlyhaní overenia prilepená do následnej správy je mimoriadne efektívna výzva na opravu, pretože model presne vidí, čo sa pokazilo.

Uzáver opakovania na jeden alebo dva. Model, ktorý dvakrát zlyhá v schéme, je zvyčajne požiadaný o niečo, čo vstup neobsahuje, a tretí pokus to vymyslí.

Od ukážkového užitočného zaťaženia až po kód

Väčšina schém začína život ako vzorová odpoveď, ktorú niekto vložil do chatu. Ručná premena na napísaný a overený kód je únavná a náchylná na chyby, takže to nerobte.

Vložte vzorku do JSON do schémy Zod a získate schému Zod plus odvodený typ TypeScript. Odvodzuje podľa poľa namiesto paušálneho zadávania všetkého ako reťazca: hodnoty, ktoré vyzerajú ako e-maily, adresy URL, UUID alebo dátumy ISO, získajú .email(), .url(), .uuid() a .datetime() namiesto holého z.string(), polia nesú svoj typ prvku a pole, ktorého typ sa mení v rôznych výskytoch, sa stáva zjednotením, namiesto toho, aby si ticho vybralo prvé, ktoré videlo. Toto posledné správanie sa oplatí zámerne doplniť: vložte tri alebo štyri zreťazené skutočné odpovede, nie jednu, takže voliteľné a polymorfné polia sa zobrazia ako spojenia namiesto toho, aby boli uzamknuté na čokoľvek, čo prvá vzorka obsahovala.

Ak potrebujete iba typy a nie validáciu runtime – pretože užitočné zaťaženie pochádza zo zdroja, ktorému už dôverujete – JSON na TypeScript vytvára rozhrania priamo, pričom vnorené objekty sú rozdelené ako pomenované podrozhrania a nie ako vnorené anonymné bloby.

Udržujte smer pravdy rovný: jedna definícia schémy so všetkým ostatným, čo je z nej vygenerované. Schéma Zod a schéma JSON udržiavané oddelene sa do mesiaca nezhodnú a nezhoda sa prejaví ako chyba produkčnej analýzy a nie ako zlyhanie testu.

Čítanie toho, čo sa vrátilo

Odpovede modelov prichádzajú zmenšené na jednom riadku, čo spôsobuje, že ich sledovanie je nešťastné. The formátovač JSON odsadí a roztriedi ich do niečoho čitateľného a jeho validácia okamžite zachytí prípad skrátenia – užitočné zaťaženie, ktoré končí v strede reťazca, je podpisom limitu prístupových tokenov a opravou je vyšší výstupný limit alebo menšia schéma, nie rýchla zmena.

Keď porovnávate dva modely vyrobené z rovnakého vstupu alebo kontrolujete, či rýchla zmena zmenila výstup spôsobom, ktorý ste nezamýšľali, namiesto čítania oboch porovnávajte naformátované užitočné zaťaženia. Štrukturálne rozdiely, ktoré sú neviditeľné v stene JSON – poľa, ktoré sa potichu zmenilo na reťazec číslic namiesto čísla – okamžite vyniknú v rozdiele.

Verzia

Schémy sa menia a s nimi sa mení aj výstup modelu. Vložte pole verzie do užitočného obsahu od prvého dňa, aby uložené záznamy mali tvar, pod ktorým boli napísané. Retro-montáž, že keď máte milión riadkov neoznačeného JSON, je druh migrácie, na ktorý si nikto neplánuje čas.

Všetky tieto nástroje bežia lokálne vo vašom prehliadači, čo je pre tento pracovný postup dôležitejšie ako zvyčajne: vzorové užitočné zaťaženia, ktoré meníte na schémy, sú zvyčajne skutočné odpovede rozhrania API so skutočnými údajmi o zákazníkoch a nemali by sa nahrávať do formátovacej služby, aby boli vopred upravené.

Napísal Ján Turský

Tvorca TextArray – vytváranie bezplatných nástrojov na ochranu súkromia, ktoré bežia výhradne vo vašom prehliadači.