Presentem els resultats estructurats a l’API
Presentem els resultats estructurats a l’API: les sortides dels models ara segueixen de manera fiable els JSON Schemas proporcionats pels desenvolupadors.

L’any passat, al DevDay, vam presentar el mode JSON, un bloc de construcció útil per als desenvolupadors que volen crear aplicacions fiables amb els nostres models. Tot i que el mode JSON millora la fiabilitat del model a l’hora de generar sortides JSON vàlides, no garanteix que la resposta del model s’ajusti a un esquema concret. Avui presentem els resultats estructurats a l’API, una nova funcionalitat dissenyada per garantir que les sortides generades pel model coincideixin exactament amb els JSON Schemas proporcionats pels desenvolupadors.
La generació de dades estructurades a partir d’entrades no estructurades és un dels casos d’ús fonamentals de la IA en les aplicacions actuals. Els desenvolupadors fan servir l’API d’OpenAI per crear assistents potents amb la capacitat d’obtenir dades i respondre preguntes mitjançant crida a funcions(s'obre en una finestra nova), extreure dades estructurades per a l’entrada de dades i crear fluxos de treball agentics de diversos passos que permeten als LLM dur a terme accions. Els desenvolupadors fa temps que esquiven les limitacions dels LLM en aquest àmbit mitjançant eines de codi obert, indicacions i repetint sol·licituds per assegurar-se que les sortides del model coincideixen amb els formats necessaris per interoperar amb els seus sistemes. Els resultats estructurats resolen aquest problema restringint els models d’OpenAI perquè coincideixin amb els esquemes proporcionats pels desenvolupadors i entrenant els nostres models perquè entenguin millor els esquemes complicats.
A les nostres avaluacions de seguiment d’esquemes JSON complexos, el nostre nou model gpt-4o-2024-08-06 amb resultats estructurats obté un 100% perfecte. En comparació, gpt-4-0613 obté menys del 40%.
Amb els resultats estructurats, gpt-4o-2024-08-06 assoleix una fiabilitat del 100% a les nostres avaluacions, coincidint perfectament amb els esquemes de sortida.
Presentem els resultats estructurats a l’API en dues formes:
1. Crida a funcions: els resultats estructurats mitjançant tools estan disponibles establint strict: true dins de la definició de la funció. Aquesta funcionalitat funciona amb tots els models que admeten eines, incloent-hi tots els models gpt-4-0613 i gpt-3.5-turbo-0613 i posteriors. Quan els resultats estructurats estan habilitats, les sortides del model coincidiran amb la definició de l’eina proporcionada.
2. Una opció nova per al paràmetre response_format: els desenvolupadors ara poden proporcionar un JSON Schema mitjançant json_schema, una opció nova per al paràmetre response_format. Això és útil quan el model no crida una eina, sinó que respon a l’usuari de manera estructurada. Aquesta funcionalitat funciona amb els nostres models GPT‑4o més nous: gpt-4o-2024-08-06, llançat avui, i gpt-4o-mini-2024-07-18. Quan es proporciona un response_format amb strict: true, les sortides del model coincidiran amb l’esquema proporcionat.
La seguretat és una prioritat màxima per a OpenAI: la nova funcionalitat de resultats estructurats complirà les nostres polítiques de seguretat actuals i continuarà permetent que el model rebutgi una sol·licitud no segura. Per simplificar el desenvolupament, hi ha un nou valor de cadena refusal a les respostes de l’API que permet als desenvolupadors detectar de manera programàtica si el model ha generat un rebuig en lloc d’una sortida que coincideixi amb l’esquema. Quan la resposta no inclou cap rebuig i la resposta del model no s’ha interromput prematurament (tal com indica finish_reason), la resposta del model generarà de manera fiable un JSON vàlid que coincideixi amb l’esquema proporcionat.
Els nostres SDK de Python i Node s’han actualitzat amb suport natiu per a resultats estructurats. Proporcionar un esquema per a eines o com a format de resposta és tan fàcil com proporcionar un objecte Pydantic o Zod, i els nostres SDK s’encarregaran de convertir el tipus de dades en un esquema JSON compatible, deserialitzar automàticament la resposta JSON a l’estructura de dades tipada i analitzar els rebutjos si es produeixen.
Els exemples següents mostren el suport natiu per a resultats estructurats amb crida a funcions.
El suport natiu per a resultats estructurats també està disponible per a response_format.
Els desenvolupadors fan servir sovint els models d’OpenAI per generar dades estructurades per a diversos casos d’ús. Alguns exemples addicionals inclouen:
Per exemple, els desenvolupadors poden fer servir resultats estructurats per crear aplicacions que generin codi o interfícies d’usuari. Tots els exemples següents fan servir el mateix response_format i es poden fer servir per generar interfícies d’usuari variades segons l’entrada de l’usuari.
Ets un assistent d'interfície d'usuari. La teva feina és ajudar els usuaris a visualitzar les seves idees de lloc web i d'aplicació.Pot ser útil donar al model un camp separat per a la cadena de pensament per millorar la qualitat final de la resposta.
Per exemple, demanar al model que extregui elements com ara tasques pendents, dates de venciment i assignacions de notes de reunió.
Hem adoptat un enfocament en dues parts per millorar la fiabilitat de les sortides del model que coincideixen amb JSON Schema. En primer lloc, hem entrenat el nostre model més nou, gpt-4o-2024-08-06, perquè entengui esquemes complicats i la millor manera de produir sortides que hi coincideixin. Tanmateix, el comportament del model és intrínsecament no determinista: malgrat les millores de rendiment d’aquest model (93% a la nostra prova de referència), encara no assolia la fiabilitat que els desenvolupadors necessiten per crear aplicacions robustes. Per això també hem adoptat un enfocament determinista basat en enginyeria per restringir les sortides del model i aconseguir una fiabilitat del 100%.
El nostre enfocament es basa en una tècnica coneguda com a mostreig restringit o descodificació restringida. Per defecte, quan es mostregen models per produir sortides, no tenen cap restricció i poden seleccionar qualsevol segment del vocabulari com a sortida següent. Aquesta flexibilitat és el que permet que els models cometin errors; per exemple, generalment són lliures de mostrejar un segment de clau en qualsevol moment, fins i tot quan això no produiria un JSON vàlid. Per forçar sortides vàlides, restringim els nostres models perquè només puguin produir segments que siguin vàlids segons l’esquema proporcionat, en lloc de tots els segments disponibles.
Implementar aquesta restricció a la pràctica pot ser difícil, ja que els segments que són vàlids varien al llarg de la sortida del model. Suposem que tenim l’esquema següent:
Els segments que són vàlids al començament de la sortida inclouen coses com {, {“, {, etc. Tanmateix, un cop el model ja ha mostrejat {“val, { deixa de ser un segment vàlid. Per tant, hem d’implementar una descodificació restringida dinàmica i determinar quins segments són vàlids després de generar cada segment, en lloc de fer-ho per endavant al començament de la resposta.
Per fer-ho, convertim el JSON Schema proporcionat en una gramàtica lliure de context (CFG). Una gramàtica és un conjunt de regles que defineixen un llenguatge, i una gramàtica lliure de context és una gramàtica que compleix regles específiques. Podeu pensar en JSON i JSON Schema com a llenguatges particulars amb regles per definir què és vàlid dins del llenguatge. De la mateixa manera que en anglès no és correcte tenir una frase sense verb, en JSON no és vàlid tenir una coma final.
Així doncs, per a cada JSON Schema, calculem una gramàtica que representa aquest esquema i preprocessem els seus components perquè siguin fàcilment accessibles durant el mostreig del model. Per això la primera sol·licitud amb un esquema nou comporta una penalització de latència: hem de preprocessar l’esquema per generar aquest artefacte que després podem fer servir de manera eficient durant el mostreig.
Durant el mostreig, després de cada segment, el nostre motor d’inferència determinarà quins segments són vàlids per produir-se a continuació basant-se en els segments generats prèviament i en les regles de la gramàtica que indiquen quins segments són vàlids a continuació. Després fem servir aquesta llista de segments per emmascarar el pas de mostreig següent, cosa que redueix efectivament la probabilitat dels segments no vàlids a 0. Com que hem preprocessat l’esquema, podem fer-ho de manera eficient amb una estructura de dades en memòria cau, amb una sobrecàrrega de latència mínima.
Els enfocaments alternatius a aquest problema sovint fan servir màquines d’estats finits (FSM) o expressions regulars (generalment implementades amb FSM) per a la descodificació restringida. Funcionen de manera similar en el fet que actualitzen dinàmicament quins segments són vàlids després de produir cada segment, però tenen algunes diferències clau respecte de l’enfocament CFG. En particular, les CFG poden expressar una classe de llenguatges més àmplia que les FSM. A la pràctica, això no importa per a esquemes molt simples com l’esquema value mostrat més amunt. Tanmateix, trobem que la diferència és significativa per a esquemes més complexos que impliquen estructures de dades imbricades o recursives. Per exemple, les FSM generalment no poden expressar tipus recursius, cosa que significa que els enfocaments basats en FSM poden tenir dificultats per fer coincidir parèntesis en JSON profundament imbricat. El següent és un esquema recursiu d’exemple compatible amb l’API d’OpenAI amb resultats estructurats però que no seria possible expressar amb una FSM.
Tingueu en compte que cada element de la IU pot tenir fills arbitraris que fan referència a l’esquema arrel de manera recursiva. Aquesta flexibilitat és una de les coses que permet l’enfocament CFG.
Hi ha algunes limitacions que cal tenir presents quan es fan servir resultats estructurats:
- Els resultats estructurats només admeten un subconjunt de JSON Schema, descrit amb detall a la nostra documentació(s'obre en una finestra nova). Això ens ajuda a garantir el millor rendiment possible.
- La primera resposta de l’API amb un esquema nou comportarà latència addicional, però les respostes posteriors seran ràpides i sense penalització de latència. Això és així perquè, durant la primera sol·licitud, processem l’esquema tal com s’ha indicat més amunt i després emmagatzemem aquests artefactes a la memòria cau per poder-los reutilitzar ràpidament més endavant. Els esquemes típics triguen menys de 10 segons a processar-se en la primera sol·licitud, però els esquemes més complexos poden trigar fins a un minut.
- És possible que el model no segueixi l’esquema si decideix rebutjar una sol·licitud no segura. Si decideix rebutjar-la, el missatge de retorn tindrà el booleà
refusalestablert a true per indicar-ho. - És possible que el model no segueixi l’esquema si la generació arriba a
max_tokenso a una altra condició d’aturada abans d’acabar. - Els resultats estructurats no eviten tots els tipus d’errors del model. Per exemple, el model encara pot cometre errors dins dels valors de l’objecte JSON (p. ex., equivocar-se en un pas d’una equació matemàtica). Si els desenvolupadors troben errors, recomanem proporcionar exemples a les instruccions del sistema o dividir les tasques en subtasques més senzilles.
- Els resultats estructurats no són compatibles amb les crides a funcions en paral·lel. Quan es genera una crida a funcions en paral·lel, pot ser que no coincideixi amb els esquemes proporcionats. Definiu
parallel_tool_calls: falseper desactivar la crida a funcions en paral·lel. - Els JSON Schemas proporcionats amb resultats estructurats no poden acollir-se a la retenció de dades nul·la(s'obre en una finestra nova) (ZDR).
Els resultats estructurats ja estan disponibles de manera general a l’API.
Els resultats estructurats amb crida a funcions estan disponibles en tots els models que admeten crida a funcions a l’API. Això inclou els nostres models més nous (gpt-4o, gpt-4o-mini), tots els models a partir de gpt-4-0613 i gpt-3.5-turbo-0613, i qualsevol model ajustat fi que admeti crida a funcions. Aquesta funcionalitat està disponible a l’API de complecions de xat, l’Assistants API i la Batch API. Els resultats estructurats amb crida a funcions també són compatibles amb entrades de visió.
Els resultats estructurats amb formats de resposta estan disponibles a gpt-4o-mini i gpt-4o-2024-08-06 i a qualsevol ajust fi basat en aquests models. Aquesta funcionalitat està disponible a l’API de complecions de xat, l’Assistants API i la Batch API. Els resultats estructurats amb formats de resposta també són compatibles amb entrades de visió.
En canviar al nou gpt-4o-2024-08-06, els desenvolupadors estalvien un 50% en entrades ($2.50/1M segments d’entrada) i un 33% en sortides ($10.00/1M segments de sortida) en comparació amb gpt-4o-2024-05-13.
Per començar a fer servir els resultats estructurats, consulteu la nostra documentació(s'obre en una finestra nova).
Els resultats estructurats s’inspiren en l’excel·lent feina de la comunitat de codi obert: concretament, les biblioteques outlines(s'obre en una finestra nova), jsonformer(s'obre en una finestra nova), instructor(s'obre en una finestra nova), guidance(s'obre en una finestra nova) i lark(s'obre en una finestra nova).
Autor
Col·laboradors principals
Chris Colby, Melody Guan, Michelle Pokrass, Ted Sanders, Brian Zhang
Agraïments
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