Представљамо структуриране излазе у API-ју
Представљамо структуриране излазе у API-ју — излази модела сада се поуздано придржавају JSON Schema шема које достављају програмери.

Прошле године смо на DevDay-у представили JSON режим — користан градивни блок за програмере који желе да праве поуздане апликације са нашим моделима. Иако JSON режим побољшава поузданост модела при генерисању исправних JSON излаза, он не гарантује да ће одговор модела бити у складу са одређеном шемом. Данас представљамо структуриране излазе у API-ју, нову функцију осмишљену да обезбеди да излази које модел генерише тачно одговарају JSON Schema шемама које достављају програмери.
Генерисање структурираних података из неструктурираних улаза један је од кључних случајева употребе AI-ја у данашњим апликацијама. Програмери користе OpenAI API за изградњу моћних асистената који имају могућност да прибављају податке и одговарају на питања путем позивања функције(отвара се у новом прозору), издвајају структуриране податке за унос података и граде вишекорачне агентске токове рада који омогућавају великим језичким моделима (LLM) да предузимају радње. Програмери већ дуго заобилазе ограничења великих језичких модела (LLM) у овој области помоћу open source алата, инструкција и поновљеног слања захтева како би осигурали да излази модела одговарају форматима потребним за интероперабилност са њиховим системима. Структурирани излази решавају овај проблем тако што ограничавају OpenAI моделе да одговарају шемама које достављају програмери и тако што обучавају наше моделе да боље разумеју сложене шеме.
У нашим евалуацијама праћења сложених JSON Schema шема, наш нови модел gpt-4o-2024-08-06 са структурираним излазима постиже савршених 100%. Поређења ради, gpt-4-0613 постиже мање од 40%.
Са структурираним излазима, gpt-4o-2024-08-06 постиже 100% поузданости у нашим евалуацијама, уз савршено поклапање са излазним шемама.
Представљамо структуриране излазе у два облика у API-ју:
1. Позивање функције: структурирани излази преко tools доступни су подешавањем strict: true унутар дефиниције ваше функције. Ова функција ради са свим моделима који подржавају алатке, укључујући све моделе gpt-4-0613 и gpt-3.5-turbo-0613 и новије. Када су структурирани излази омогућени, излази модела ће одговарати достављеној дефиницији алатке.
2. Нова опција за параметар response_format: програмери сада могу да наведу JSON Schema преко json_schema, нове опције за параметар response_format. Ово је корисно када модел не позива алатку, већ уместо тога одговара кориснику на структуриран начин. Ова функција ради са нашим најновијим GPT‑4o моделима: gpt-4o-2024-08-06, објављеним данас, и gpt-4o-mini-2024-07-18. Када се response_format наведе са strict: true, излази модела ће одговарати достављеној шеми.
Безбедност је највећи приоритет за OpenAI — нова функционалност структурираних излаза придржаваће се наших постојећих безбедносних политика и и даље ће омогућавати моделу да одбије небезбедан захтев. Да би развој био једноставнији, у API одговорима постоји нова стринг вредност refusal која омогућава програмерима да програмски открију да ли је модел генерисао одбијање уместо излаза који одговара шеми. Када одговор не укључује одбијање и одговор модела није превремено прекинут (као што показује finish_reason), тада ће одговор модела поуздано произвести исправан JSON који одговара достављеној шеми.
Наши Python и Node SDK-ови су ажурирани са изворном подршком за структуриране излазе. Достављање шеме за алатке или као формат одговора једноставно је као достављање Pydantic или Zod објекта, а наши SDK-ови ће се побринути за претварање типа података у подржану JSON шему, аутоматску десеријализацију JSON одговора у типизирану структуру података и рашчлањивање одбијања ако до њих дође.
Следећи примери приказују изворну подршку за структуриране излазе са позивањем функције.
Изворна подршка за структуриране излазе доступна је и за response_format.
Програмери често користе OpenAI моделе за генерисање структурираних података за разне случајеве употребе. Неки додатни примери укључују:
На пример, програмери могу да користе структуриране излазе за прављење апликација које генеришу код или кориснички интерфејс. Сви следећи примери користе исти response_format и могу се користити за генерисање различитих корисничких интерфејса на основу уноса корисника.
Помоћник сте за кориснички интерфејс. Ваш задатак је да помогнете корисницима да визуализују своје идеје за веб-сајт и апликацију.Може бити корисно дати моделу засебно поље за chain of thought како би се побољшао коначни квалитет одговора.
На пример, да се моделу зада да издвоји ствари као што су обавезе, рокови и задужења из бележака са састанка.
Применили смо дводелни приступ за побољшање поузданости излаза модела који одговарају JSON Schema шеми. Прво, обучили смо наш најновији модел gpt-4o-2024-08-06 да разуме сложене шеме и како да на најбољи начин производи излазе који им одговарају. Међутим, понашање модела је по својој природи недетерминистичко — упркос побољшањима перформанси овог модела (93% на нашем бенчмарку), он и даље није достигао поузданост која је програмерима потребна за изградњу робусних апликација. Зато смо применили и детерминистички, инжењерски заснован приступ да ограничимо излазе модела и постигнемо 100% поузданост.
Наш приступ је заснован на техници познатој као ограничено узорковање или ограничено декодирање. Подразумевано, када се модели узоркују да би произвели излазе, они су потпуно неограничени и могу изабрати било који токен из речника као следећи излаз. Управо та флексибилност омогућава моделима да греше; на пример, углавном су слободни да у било ком тренутку изаберу токен витичасте заграде, чак и када то не би произвело исправан JSON. Да бисмо форсирали исправне излазе, ограничавамо наше моделе само на токене који би били важећи према достављеној шеми, а не на све доступне токене.
Ово ограничење може бити тешко спровести у пракси, пошто се токени који су важећи мењају током излаза модела. Рецимо да имамо следећу шему:
Токени који су важећи на почетку излаза укључују ствари као што су {, {“, { итд. Међутим, када је модел већ изабрао {“val, онда { више није важећи токен. Зато морамо да применимо динамичко ограничено декодирање и да одредимо који су токени важећи после сваког генерисаног токена, уместо унапред на почетку одговора.
Да бисмо то урадили, достављену JSON Schema шему претварамо у бесконтекстну граматику (CFG). Граматика је скуп правила која дефинишу језик, а бесконтекстна граматика је граматика која је у складу са одређеним правилима. Можете размишљати о JSON-у и JSON Schema шеми као о посебним језицима са правилима која дефинишу шта је у њима важеће. Као што у енглеском није исправно имати реченицу без глагола, тако ни у JSON-у није исправно имати завршни зарез.
Зато за сваку JSON Schema шему израчунавамо граматику која представља ту шему и унапред обрађујемо њене компоненте да би биле лако доступне током узорковања модела. Зато први захтев са новом шемом има кашњење — морамо унапред да обрадимо шему да бисмо генерисали овај артефакт који можемо ефикасно да користимо током узорковања.
Током узорковања, после сваког токена, наш механизам за инференцију ће одредити који су токени важећи за следећу производњу на основу претходно генерисаних токена и правила унутар граматике која указују који су токени следећи важећи. Затим користимо ову листу токена да маскирамо следећи корак узорковања, што ефективно снижава вероватноћу неважећих токена на 0. Пошто смо шему унапред обрадили, можемо користити кеширану структуру података да то урадимо ефикасно, уз минимално додатно кашњење.
Алтернативни приступи овом проблему често користе коначне аутомате (FSM) или регуларне изразе (који се углавном имплементирају помоћу FSM-а) за ограничено декодирање. Они функционишу слично по томе што динамички ажурирају који су токени важећи након што се сваки токен произведе, али имају неке кључне разлике у односу на CFG приступ. Посебно, CFG-ови могу да изразе ширу класу језика него FSM-ови. У пракси, то није важно за веома једноставне шеме као што је горе приказана шема value. Међутим, сматрамо да је та разлика значајна за сложеније шеме које укључују угнежђене или рекурзивне структуре података. На пример, FSM-ови генерално не могу да изразе рекурзивне типове, што значи да приступи засновани на FSM-у могу имати потешкоћа да упаре заграде у дубоко угнежђеном JSON-у. Следи пример рекурзивне шеме која је подржана у OpenAI API-ју са структурираним излазима, али је не би било могуће изразити помоћу FSM-а.
Имајте на уму да сваки елемент корисничког интерфејса може имати произвољну децу која се рекурзивно позивају на коренску шему. Ова флексибилност је нешто што CFG приступ омогућава.
Постоји неколико ограничења која треба имати на уму када користите структуриране излазе:
- Структурирани излази дозвољавају само подскуп JSON Schema, детаљно описан у нашој документацији(отвара се у новом прозору). То нам помаже да обезбедимо најбоље могуће перформансе.
- Први API одговор са новом шемом имаће додатну латенцију, али ће наредни одговори бити брзи без додатне латенције. То је зато што током првог захтева обрађујемо шему као што је горе наведено, а затим кеширамо те артефакте за брзу поновну употребу касније. Обичним шемама је потребно мање од 10 секунди за обраду при првом захтеву, али сложенијим шемама може бити потребно и до једног минута.
- Модел можда неће испоштовати шему ако одлучи да одбије небезбедан захтев. Ако одлучи да одбије, повратна порука ће имати логичку вредност
refusalпостављену на true да то укаже. - Модел можда неће испоштовати шему ако генерисање достигне
max_tokensили неки други услов заустављања пре завршетка. - Структурирани излази не спречавају све врсте грешака модела. На пример, модел и даље може правити грешке унутар вредности JSON објекта (нпр. погрешити корак у математичкој једначини). Ако програмери уоче грешке, препоручујемо да дају примере у системским инструкцијама или да задатке поделе на једноставније подзадатке.
- Структурирани излази нису компатибилни са паралелним позивима функција. Када се генерише паралелни позив функције, он можда неће одговарати достављеним шемама. Подесите
parallel_tool_calls: falseда бисте онемогућили паралелно позивање функција. - JSON Schema шеме достављене са структурираним излазима не испуњавају услове за незадржавање података(отвара се у новом прозору) (ZDR).
Структурирани излази су од данас опште доступни у API-ју.
Структурирани излази са позивањем функције доступни су на свим моделима који подржавају позивање функције у API-ју. То укључује наше најновије моделе (gpt-4o, gpt-4o-mini), све моделе почев од gpt-4-0613 и gpt-3.5-turbo-0613, као и све фино подешене моделе који подржавају позивање функције. Ова функционалност је доступна у API-ју за довршавање ћаскања, Assistants API-ју и Batch API-ју. Структурирани излази са позивањем функције су такође компатибилни са визуелним улазима.
Структурирани излази са форматима одговора доступни су на gpt-4o-mini и gpt-4o-2024-08-06, као и на свим фино подешеним верзијама заснованим на тим моделима. Ова функционалност је доступна у API-ју за довршавање ћаскања, Assistants API-ју и Batch API-ју. Структурирани излази са форматима одговора су такође компатибилни са визуелним улазима.
Преласком на нови gpt-4o-2024-08-06, програмери штеде 50% на улазима ($2.50/1M улазних токена) и 33% на излазима ($10.00/1M излазних токена) у поређењу са gpt-4o-2024-05-13.
Да бисте почели да користите структуриране излазе, погледајте нашу документацију(отвара се у новом прозору).
Структурирани излази су инспирисани одличним радом open source заједнице: конкретно, библиотекама outlines(отвара се у новом прозору), jsonformer(отвара се у новом прозору), instructor(отвара се у новом прозору), guidance(отвара се у новом прозору) и lark(отвара се у новом прозору).
Аутор
Кључни сарадници
Chris Colby, Melody Guan, Michelle Pokrass, Ted Sanders, Brian Zhang
Захвалнице
John Allard, Filipe de Avila Belbute Peres, Ilan Bigio, Owen Campbell-Moore, Chen Ding, Atty Eleti, Elie Georges, Katia Gil Guzman, Jeff Harris, Johannes Heidecke, Beth Hoover, Romain Huet, Tomer Kaftan, Jillian Khoo, Karolis Kosas, Ryan Liu, Kevin Lu, Lindsay McCallum, Rohan Nuttall, Joe Palermo, Leher Pathak, Ishaan Singal, Felipe Petroski Such, Freddie Sulit, David Weedon