Үндсэн агуулга руу алгасах
OpenAI

2024 оны наймдугаар сарын 6

Компани

API дахь Structured Outputs-ийг танилцуулж байна

Бид API-д Structured Outputs-ийг нэвтрүүлж байна—одоо загварын гаралт нь хөгжүүлэгчийн өгсөн JSON Schema-уудыг найдвартай дагана.

Зурагт хөх, ногоон, цайвар шар өнгийн янз бүрийн туяатай жижиг дөрвөлжнүүдийн хийсвэр хээ харагдана. Дөрвөлжнүүд торон маягаар байрлаж, зөөлөн пастел өнгийн палитртай мозайк эффект үүсгэжээ.

Өнгөрсөн жил DevDay дээр бид JSON горимыг танилцуулсан бөгөөд энэ нь манай загваруудаар найдвартай аппликейшн бүтээхийг хүссэн хөгжүүлэгчдэд хэрэгтэй суурь бүрэлдэхүүн байсан. JSON горим нь хүчинтэй JSON гаралт үүсгэхэд загварын найдвартай байдлыг сайжруулдаг ч загварын хариу тодорхой схемд нийцэнэ гэдгийг баталгаажуулдаггүй. Өнөөдөр бид API-д Structured Outputs-ийг танилцуулж байна. Энэ нь загвараар үүсгэсэн гаралт хөгжүүлэгчдийн өгсөн JSON Schema-уудтай яг таарахыг хангах зориулалттай шинэ боломж юм.

Бүтэцгүй оролтоос бүтцэт өгөгдөл үүсгэх нь өнөөдрийн аппликейшнуудад AI-ийн үндсэн хэрэглээний нэг юм. Хөгжүүлэгчид OpenAI API-г ашиглан функц дуудах(шинэ цонхонд нээгдэнэ)-аар өгөгдөл татах, асуултад хариулах чадвартай хүчирхэг туслахууд бүтээх, өгөгдөл оруулах зориулалтаар бүтцэт өгөгдөл гаргаж авах, мөн LLM-үүдэд үйлдэл хийх боломж олгодог олон алхамт агент урсгалууд бүтээдэг. Хөгжүүлэгчид энэ чиглэлд LLM-ийн хязгаарлалтыг даван туулахын тулд нээлттэй эхийн хэрэгслүүд, prompt ашиглах, мөн загварын гаралт өөрсдийн системтэй харилцан ажиллахад шаардлагатай форматтай таарахыг баталгаажуулахын тулд хүсэлтийг дахин дахин илгээх зэрэг аргыг удаан хугацаанд хэрэглэсээр ирсэн. Structured Outputs нь OpenAI-ийн загваруудыг хөгжүүлэгчийн өгсөн схемүүдтэй тааруулан хязгаарлах, мөн төвөгтэй схемүүдийг илүү сайн ойлгохоор загваруудаа сургах замаар энэ асуудлыг шийддэг.

Төвөгтэй JSON схемийг дагах манай үнэлгээн дээр Structured Outputs-тэй шинэ gpt-4o-2024-08-06 загвар 100%-ийн төгс оноо авсан. Харин gpt-4-0613 40%-иас бага оноо авсан.

Structured Outputs-ийн тусламжтайгаар gpt-4o-2024-08-06 нь манай үнэлгээн дээр 100% найдвартай байдалд хүрч, гаралтын схемүүдтэй төгс таарсан.

Structured Outputs-ийг хэрхэн ашиглах вэ

Бид API-д Structured Outputs-ийг хоёр хэлбэрээр нэвтрүүлж байна: 

1. Функц дуудах: tools-ээр дамжих Structured Outputs нь таны функцийн тодорхойлолт дотор strict: true-г тохируулснаар боломжтой. Энэ боломж нь gpt-4-0613, gpt-3.5-turbo-0613 болон түүнээс хойших бүх загвар зэрэг хэрэгсэл дэмждэг бүх загварт ажиллана. Structured Outputs идэвхжсэн үед загварын гаралт нь өгсөн хэрэгслийн тодорхойлолттой таарна.

JSON

1
POST /v1/chat/completions
2
{
3
"model": "gpt-4o-2024-08-06",
4
"messages": [
5
{
6
"role": "system",
7
"content": "You are a helpful assistant. The current date is August 6, 2024. You help users query for the data they are looking for by calling the query function."
8
},
9
{
10
"role": "user",
11
"content": "look up all my orders in may of last year that were fulfilled but not delivered on time"
12
}
13
],
14
"tools": [
15
{
16
"type": "function",
17
"function": {
18
"name": "query",
19
"description": "Execute a query.",
20
"strict": true,
21
"parameters": {
22
"type": "object",
23
"properties": {
24
"table_name": {
25
"type": "string",
26
"enum": ["orders"]
27
},
28
"columns": {
29
"type": "array",
30
"items": {
31
"type": "string",
32
"enum": [
33
"id",
34
"status",
35
"expected_delivery_date",
36
"delivered_at",
37
"shipped_at",
38
"ordered_at",
39
"canceled_at"
40
]
41
}
42
},
43
"conditions": {
44
"type": "array",
45
"items": {
46
"type": "object",
47
"properties": {
48
"column": {
49
"type": "string"
50
},
51
"operator": {
52
"type": "string",
53
"enum": ["=", ">", "<", ">=", "<=", "!="]
54
},
55
"value": {
56
"anyOf": [
57
{
58
"type": "string"
59
},
60
{
61
"type": "number"
62
},
63
{
64
"type": "object",
65
"properties": {
66
"column_name": {
67
"type": "string"
68
}
69
},
70
"required": ["column_name"],
71
"additionalProperties": false
72
}
73
]
74
}
75
},
76
"required": ["column", "operator", "value"],
77
"additionalProperties": false
78
}
79
},
80
"order_by": {
81
"type": "string",
82
"enum": ["asc", "desc"]
83
}
84
},
85
"required": ["table_name", "columns", "conditions", "order_by"],
86
"additionalProperties": false
87
}
88
}
89
}
90
]
91
}

2. response_format параметрийн шинэ сонголт: хөгжүүлэгчид одоо response_format параметрийн шинэ сонголт болох json_schema-аар JSON Schema өгөх боломжтой. Энэ нь загвар хэрэгсэл дуудаж биш, харин хэрэглэгчид бүтцэт байдлаар хариулж байгаа үед хэрэгтэй. Энэ боломж манай хамгийн шинэ GPT‑4o загваруудтай ажиллана: өнөөдөр гарсан gpt-4o-2024-08-06 болон gpt-4o-mini-2024-07-18. response_format-ийг strict: true-тэй өгсөн үед загварын гаралт нь өгсөн схемтэй таарна.

Хүсэлт

1
POST /v1/chat/completions
2
{
3
"model": "gpt-4o-2024-08-06",
4
"messages": [
5
{
6
"role": "system",
7
"content": "You are a helpful math tutor."
8
},
9
{
10
"role": "user",
11
"content": "solve 8x + 31 = 2"
12
}
13
],
14
"response_format": {
15
"type": "json_schema",
16
"json_schema": {
17
"name": "math_response",
18
"strict": true,
19
"schema": {
20
"type": "object",
21
"properties": {
22
"steps": {
23
"type": "array",
24
"items": {
25
"type": "object",
26
"properties": {
27
"explanation": {
28
"type": "string"
29
},
30
"output": {
31
"type": "string"
32
}
33
},
34
"required": ["explanation", "output"],
35
"additionalProperties": false
36
}
37
},
38
"final_answer": {
39
"type": "string"
40
}
41
},
42
"required": ["steps", "final_answer"],
43
"additionalProperties": false
44
}
45
}
46
}
47
}

Аюулгүй Structured Outputs

Аюулгүй байдал нь OpenAI-ийн хамгийн чухал тэргүүлэх чиглэлүүдийн нэг бөгөөд шинэ Structured Outputs боломж нь манай одоогийн аюулгүй байдлын бодлогыг мөрдөж, загварт аюултай хүсэлтээс татгалзах боломжийг хэвээр олгоно. Хөгжүүлэлтийг илүү хялбар болгохын тулд API хариун дээр шинэ refusal string утга нэмэгдсэн бөгөөд энэ нь загвар схемд таарах гаралтын оронд татгалзсан хариу үүсгэсэн эсэхийг хөгжүүлэгчид программчилсан аргаар илрүүлэх боломж олгодог. Хариунд татгалзалт агуулагдаагүй бөгөөд загварын хариу хугацаанаасаа өмнө тасалдаагүй бол (finish_reason-оор илэрхийлэгдсэнчлэн) загварын хариу нь өгсөн схемтэй таарах хүчинтэй JSON-ийг найдвартай үүсгэнэ.

JSON

1
{
2
"id": "chatcmpl-9nYAG9LPNonX8DAyrkwYfemr3C8HC",
3
"object": "chat.completion",
4
"created": 1721596428,
5
"model": "gpt-4o-2024-08-06",
6
"choices": [
7
{
8
"index": 0,
9
"message": {
10
"role": "assistant",
11
"refusal": "I'm sorry, I cannot assist with that request."
12
},
13
"logprobs": null,
14
"finish_reason": "stop"
15
}
16
],
17
"usage": {
18
"prompt_tokens": 81,
19
"completion_tokens": 11,
20
"total_tokens": 92
21
},
22
"system_fingerprint": "fp_3407719c7f"
23
}

Уугуул SDK дэмжлэг

Манай Python болон Node SDK-ууд Structured Outputs-ийн уугуул дэмжлэгтэйгээр шинэчлэгдсэн. Хэрэгслүүдэд эсвэл хариу формат болгон схем өгөх нь Pydantic эсвэл Zod объект өгөхтэй адил хялбар болсон бөгөөд манай SDK-ууд өгөгдлийн төрлийг дэмжигдэх JSON схем болгон хөрвүүлэх, JSON хариуг төрлөөр тодорхойлогдсон өгөгдлийн бүтэц рүү автоматаар десериалчлах, мөн шаардлагатай үед татгалзалтыг задлан унших ажлыг хийнэ.

Дараах жишээнүүд нь функц дуудахтай Structured Outputs-ийн уугуул дэмжлэгийг харуулж байна.

Python

1
from enum import Enum
2
from typing import Union
3

4
from pydantic import BaseModel
5

6
import openai
7
from openai import OpenAI
8

9

10
class Table(str, Enum):
11
orders = "orders"
12
customers = "customers"
13
products = "products"
14

15

16
class Column(str, Enum):
17
id = "id"
18
status = "status"
19
expected_delivery_date = "expected_delivery_date"
20
delivered_at = "delivered_at"
21
shipped_at = "shipped_at"
22
ordered_at = "ordered_at"
23
canceled_at = "canceled_at"
24

25

26
class Operator(str, Enum):
27
eq = "="
28
gt = ">"
29
lt = "<"
30
le = "<="
31
ge = ">="
32
ne = "!="
33

34

35
class OrderBy(str, Enum):
36
asc = "asc"
37
desc = "desc"
38

39

40
class DynamicValue(BaseModel):
41
column_name: str
42

43

44
class Condition(BaseModel):
45
column: str
46
operator: Operator
47
value: Union[str, int, DynamicValue]
48

49

50
class Query(BaseModel):
51
table_name: Table
52
columns: list[Column]
53
conditions: list[Condition]
54
order_by: OrderBy
55

56

57
client = OpenAI()
58

59
completion = client.beta.chat.completions.parse(
60
model="gpt-4o-2024-08-06",
61
messages=[
62
{
63
"role": "system",
64
"content": "You are a helpful assistant. The current date is August 6, 2024. You help users query for the data they are looking for by calling the query function.",
65
},
66
{
67
"role": "user",
68
"content": "look up all my orders in may of last year that were fulfilled but not delivered on time",
69
},
70
],
71
tools=[
72
openai.pydantic_function_tool(Query),
73
],
74
)
75

76
print(completion.choices[0].message.tool_calls[0].function.parsed_arguments)

response_format-д мөн уугуул Structured Outputs дэмжлэг бий.

Python

1
from pydantic import BaseModel
2

3
from openai import OpenAI
4

5

6
class Step(BaseModel):
7
explanation: str
8
output: str
9

10

11
class MathResponse(BaseModel):
12
steps: list[Step]
13
final_answer: str
14

15

16
client = OpenAI()
17

18
completion = client.beta.chat.completions.parse(
19
model="gpt-4o-2024-08-06",
20
messages=[
21
{"role": "system", "content": "You are a helpful math tutor."},
22
{"role": "user", "content": "solve 8x + 31 = 2"},
23
],
24
response_format=MathResponse,
25
)
26

27
message = completion.choices[0].message
28
if message.parsed:
29
print(message.parsed.steps)
30
print(message.parsed.final_answer)
31
else:
32
print(message.refusal)

Нэмэлт хэрэглээний тохиолдлууд

Хөгжүүлэгчид янз бүрийн хэрэглээнд зориулан бүтцэт өгөгдөл үүсгэхдээ OpenAI-ийн загваруудыг түгээмэл ашигладаг. Нэмэлт жишээнүүдээс дурдвал:

Хэрэглэгчийн зорилгод үндэслэн UI-г динамикаар үүсгэх

Жишээлбэл, хөгжүүлэгчид Structured Outputs-ийг ашиглан код эсвэл UI үүсгэдэг аппликейшн хийж болно. Дараах бүх жишээ ижил response_format-ийг ашигладаг бөгөөд хэрэглэгчийн оролтоос хамааран янз бүрийн UI үүсгэхэд ашиглаж болно.

Систем
Та хэрэглэгчийн интерфэйсийн туслах юм. Таны ажил бол хэрэглэгчдэд өөрсдийн вэбсайт болон аппын санаагаа дүрслэн харахад нь туслах явдал юм.
Хариу формат
Туслах
1
{
2
"type": "div",
3
"label": "",
4
"children": [
5
{
6
"type": "header",
7
"label": "",
8
"children": [
9
{
10
"type": "div",
11
"label": "Green Thumb Gardening",
12
"children": [],
13
"attributes": [{ "name": "className", "value": "site-title" }]
14
},
15
{
16
"type": "div",
17
"label": "Bringing Life to Your Garden",
18
"children": [],
19
"attributes": [{ "name": "className", "value": "site-tagline" }]
20
}
21
],
22
"attributes": [{ "name": "className", "value": "header" }]
23
},
24
{
25
"type": "section",
26
"label": "",
27
"children": [
28
{
29
"type": "div",
30
"label": "",
31
"children": [
32
{
33
"type": "div",
34
"label": "About Us",
35
"children": [
36
{
37
"type": "div",
38
"label": "At Green Thumb Gardening, we specialize in transforming your outdoor spaces into beautiful, thriving gardens. Our team has decades of experience in horticulture and landscape design.",
39
"children": [],
40
"attributes": [
41
{ "name": "className", "value": "about-description" }
42
]
43
}
44
],
45
"attributes": [{ "name": "className", "value": "about-section" }]
46
}
47
],
48
"attributes": [{ "name": "className", "value": "content" }]
49
}
50
],
51
"attributes": [{ "name": "className", "value": "about-container" }]
52
},
53
{
54
"type": "section",
55
"label": "",
56
"children": [
57
{
58
"type": "div",
59
"label": "",
60
"children": [
61
{
62
"type": "div",
63
"label": "Our Services",
64
"children": [
65
{
66
"type": "div",
67
"label": "Garden Design",
68
"children": [],
69
"attributes": [
70
{ "name": "className", "value": "service-item" }
71
]
72
},
73
{
74
"type": "div",
75
"label": "Plant Care & Maintenance",
76
"children": [],
77
"attributes": [
78
{ "name": "className", "value": "service-item" }
79
]
80
},
81
{
82
"type": "div",
83
"label": "Seasonal Cleanup",
84
"children": [],
85
"attributes": [
86
{ "name": "className", "value": "service-item" }
87
]
88
},
89
{
90
"type": "div",
91
"label": "Custom Landscaping",
92
"children": [],
93
"attributes": [
94
{ "name": "className", "value": "service-item" }
95
]
96
}
97
],
98
"attributes": [{ "name": "className", "value": "services-list" }]
99
}
100
],
101
"attributes": [{ "name": "className", "value": "content" }]
102
}
103
],
104
"attributes": [{ "name": "className", "value": "services-container" }]
105
}
106
],
107
"attributes": [{ "name": "className", "value": "landing-page" }]
108
}
109

Welcome to Green Thumb Gardening
Bringing Life to Your Garden
At Green Thumb Gardening, we specialize in transforming your outdoor spaces into beautiful, thriving gardens. Our team has decades of experience in horticulture and landscape design.
Our services
Garden Design
Plant Care & Maintenance
Seasonal Cleanup
Custom Landscaping

Эцсийн хариуг дэмжих сэтгэн бодох явц эсвэл нэмэлт тайлбараас салгах

Хариуны эцсийн чанарыг сайжруулахын тулд загварт chain of thought-д зориулсан тусдаа талбар өгөх нь ашигтай байж болно.

JSON

1
{
2
"model": "gpt-4o-2024-08-06",
3
"messages": [
4
{
5
"role": "system",
6
"content": "You are a helpful assistant"
7
},
8
{
9
"role": "user",
10
"content": "9.11 and 9.9 -- which is bigger?"
11
}
12
],
13
"response_format": {
14
"type": "json_schema",
15
"json_schema": {
16
"name": "reasoning_schema",
17
"strict": true,
18
"schema": {
19
"type": "object",
20
"properties": {
21
"reasoning_steps": {
22
"type": "array",
23
"items": {
24
"type": "string"
25
},
26
"description": "The reasoning steps leading to the final conclusion."
27
},
28
"answer": {
29
"type": "string",
30
"description": "The final answer, taking into account the reasoning steps."
31
}
32
},
33
"required": ["reasoning_steps", "answer"],
34
"additionalProperties": false
35
}
36
}
37
}
38
}

Бүтэцгүй өгөгдлөөс бүтцэт өгөгдөл гаргаж авах

Жишээлбэл, уулзалтын тэмдэглэлээс хийх ажлууд, дуусах хугацаа, хуваарилалтыг гаргаж авахыг загварт зааварлах.

JSON

1
POST /v1/chat/completions
2
{
3
"model": "gpt-4o-2024-08-06",
4
"messages": [
5
{
6
"role": "system",
7
"content": "Extract action items, due dates, and owners from meeting notes."
8
},
9
{
10
"role": "user",
11
"content": "...meeting notes go here..."
12
}
13
],
14
"response_format": {
15
"type": "json_schema",
16
"json_schema": {
17
"name": "action_items",
18
"strict": true,
19
"schema": {
20
"type": "object",
21
"properties": {
22
"action_items": {
23
"type": "array",
24
"items": {
25
"type": "object",
26
"properties": {
27
"description": {
28
"type": "string",
29
"description": "Description of the action item."
30
},
31
"due_date": {
32
"type": ["string", "null"],
33
"description": "Due date for the action item, can be null if not specified."
34
},
35
"owner": {
36
"type": ["string", "null"],
37
"description": "Owner responsible for the action item, can be null if not specified."
38
}
39
},
40
"required": ["description", "due_date", "owner"],
41
"additionalProperties": false
42
},
43
"description": "List of action items from the meeting."
44
}
45
},
46
"required": ["action_items"],
47
"additionalProperties": false
48
}
49
}
50
}
51
}

Дотоод ажиллагаа

JSON Schema-тай таарах загварын гаралтын найдвартай байдлыг сайжруулахын тулд бид хоёр хэсэгтэй арга хэрэглэсэн. Нэгдүгээрт, бид хамгийн шинэ загвар болох gpt-4o-2024-08-06-г төвөгтэй схемүүдийг ойлгож, тэдгээрт хамгийн сайн таарах гаралтыг хэрхэн үүсгэхийг сургаж бэлтгэсэн. Гэвч загварын зан төлөв угаасаа детерминистик бус—энэ загварын гүйцэтгэл сайжирсан ч (манай жишиг дээр 93%) хөгжүүлэгчдэд бат бөх аппликейшн бүтээхэд хэрэгтэй найдвартай түвшинд хүрээгүй. Тиймээс бид загварын гаралтыг хязгаарлаж 100% найдвартай байдалд хүргэхийн тулд инженерчлэлд суурилсан, детерминистик аргыг мөн хэрэглэсэн.

Хязгаарласан декодчлол

Манай арга нь constrained sampling буюу constrained decoding гэж нэрлэгддэг техник дээр суурилдаг. Анхдагчаар загвараас гаралт үүсгэхээр сэмпл хийх үед тэдгээр нь огт хязгаарлагдмал биш бөгөөд дараагийн гаралт болгон үгийн сан дахь ямар ч токеныг сонгож чадна. Энэ уян хатан байдал нь загварт алдаа гаргах боломж олгодог; жишээлбэл, хүчинтэй JSON үүсгэхгүй байсан ч хаалттай буржгар хаалт токеныг ерөнхийдөө хүссэн үедээ сэмпл хийж болно. Хүчинтэй гаралтыг албадуулахын тулд бид загваруудаа боломжит бүх токеноор биш, харин өгсөн схемийн дагуу хүчинтэй байх токенуудаар л хязгаарладаг.

Практикт энэ хязгаарлалтыг хэрэгжүүлэх нь төвөгтэй байж болно, учир нь хүчинтэй токенууд нь загварын гаралтын явцад байнга өөрчлөгддөг. Дараах схем бидэнд байна гэж үзье:

JSON

1
{
2
"type": "object",
3
"properties": {
4
"value": { "type": "number" }
5
},
6
"required": ["value"],
7
"additionalProperties": false
8
}

Гаралтын эхэнд хүчинтэй байх токенуудад {, {“, {
зэрэг орно. Гэвч загвар {“val-ийг аль хэдийн сэмпл хийсэн бол { нь цаашид хүчинтэй токен байхаа болино. Иймээс бид динамик хязгаарласан декодчлолыг хэрэгжүүлж, хариуны эхэнд урьдчилан тогтоохын оронд токен бүр үүссэний дараа ямар токен хүчинтэйг тодорхойлох шаардлагатай болдог.

Үүнийг хийхийн тулд бид өгсөн JSON Schema-г контекстгүй дүрэм (CFG) болгон хувиргадаг. Дүрэм гэдэг нь хэлийг тодорхойлдог дүрмүүдийн цогц бөгөөд контекстгүй дүрэм нь тодорхой дүрмүүдэд нийцсэн дүрэм юм. JSON болон JSON Schema-г тухайн хэл дотор юу хүчинтэйг тодорхойлох дүрэмтэй тусгай хэлүүд гэж ойлгож болно. Англи хэлэнд үйл үггүй өгүүлбэр хүчинтэй биш байдагтай адил JSON-д төгсгөлд таслалтай байх нь хүчинтэй биш.

Иймээс JSON Schema бүрийн хувьд бид тухайн схемийг илэрхийлэх дүрмийг тооцоолж, загварын сэмпл хийх явцад хялбар хандахын тулд бүрэлдэхүүн хэсгүүдийг нь урьдчилан боловсруулдаг. Тиймээс шинэ схемтэй эхний хүсэлт саатлын нэмэлттэй байдаг—бид сэмпл хийх явцад үр ашигтай ашиглах энэ артефактыг үүсгэхийн тулд схемийг урьдчилан боловсруулах ёстой.

Сэмпл хийх явцад токен бүрийн дараа манай inference engine нь өмнө нь үүсгэсэн токенууд болон дараа нь ямар токен хүчинтэйг заадаг дүрмийн дүрмүүдэд үндэслэн дараагийн боломжит токенуудыг тодорхойлно. Дараа нь бид энэ токенуудын жагсаалтыг ашиглан дараагийн сэмпл хийх алхмыг масклаж, хүчинтэй бус токенуудын магадлалыг 0 болгон бууруулдаг. Бид схемийг урьдчилан боловсруулсан тул үүнийг хамгийн бага саатлын нэмэлттэйгээр үр ашигтай хийхийн тулд кэшлэгдсэн өгөгдлийн бүтцийг ашиглаж чадна.

Өөр аргууд

Энэ асуудлын өөр аргууд нь хязгаарласан декодчлолд ихэвчлэн finite state machine (FSM) эсвэл regex (ерөнхийдөө FSM-ээр хэрэгжүүлдэг)-ийг ашигладаг. Эдгээр нь токен бүр үүссэний дараа ямар токен хүчинтэйг динамикаар шинэчилдгээрээ төстэй боловч CFG аргатай харьцуулахад хэд хэдэн гол ялгаатай. Ялангуяа, CFG нь FSM-ээс илүү өргөн ангиллын хэлүүдийг илэрхийлж чаддаг. Практикт энэ нь дээр харуулсан value схем шиг маш энгийн схемүүдэд тийм ч чухал биш. Гэвч үүрлэсэн эсвэл рекурсив өгөгдлийн бүтцийг агуулсан илүү төвөгтэй схемүүдийн хувьд энэ ялгаа утга учиртай гэж бид үздэг. Жишээлбэл, FSM нь ерөнхийдөө рекурсив төрлүүдийг илэрхийлж чаддаггүй бөгөөд энэ нь FSM-д суурилсан аргууд гүн үүрлэсэн JSON дахь хаалтуудыг тааруулахад бэрхшээлтэй байж болохыг илтгэнэ. Дараах нь Structured Outputs-тэй OpenAI API дээр дэмжигддэг боловч FSM-ээр илэрхийлэх боломжгүй рекурсив схемийн жишээ юм.

JSON

1
{
2
"name": "ui",
3
"description": "Dynamically generated UI",
4
"strict": true,
5
"schema": {
6
"type": "object",
7
"properties": {
8
"type": {
9
"type": "string",
10
"description": "The type of the UI component",
11
"enum": ["div", "button", "header", "section", "field", "form"]
12
},
13
"label": {
14
"type": "string",
15
"description": "The label of the UI component, used for buttons or form fields"
16
},
17
"children": {
18
"type": "array",
19
"description": "Nested UI components",
20
"items": {
21
"$ref": "#"
22
}
23
},
24
"attributes": {
25
"type": "array",
26
"description": "Arbitrary attributes for the UI component, suitable for any element",
27
"items": {
28
"type": "object",
29
"properties": {
30
"name": {
31
"type": "string",
32
"description": "The name of the attribute, for example onClick or className"
33
},
34
"value": {
35
"type": "string",
36
"description": "The value of the attribute"
37
}
38
}
39
}
40
}
41
},
42
"required": ["type", "label", "children", "attributes"],
43
"additionalProperties": false
44
}
45
}

UI элемент бүр root схемийг рекурсив байдлаар заасан дурын хүүхэд элементүүдтэй байж болдгийг анхаарна уу. Энэ уян хатан байдлыг CFG арга олгодог.

Хязгаарлалт ба хоригууд

Structured Outputs-ийг ашиглахдаа анхаарах хэд хэдэн хязгаарлалт бий:

  • Structured Outputs нь зөвхөн JSON Schema-гийн нэг хэсгийг дэмждэг бөгөөд энэ талаар манай баримтжуулалтад(шинэ цонхонд нээгдэнэ) дэлгэрэнгүй тайлбарласан. Энэ нь бидэнд аль болох сайн гүйцэтгэлийг хангахад тусалдаг.
  • Шинэ схемтэй эхний API хариу нэмэлт сааталтай байна, харин дараагийн хариунууд саатлын нэмэлтгүйгээр хурдан байна. Учир нь эхний хүсэлтийн үед бид дээр дурдсанчлан схемийг боловсруулж, дараа нь хурдан дахин ашиглахын тулд эдгээр артефактуудыг кэшилдэг. Ердийн схемүүд эхний хүсэлт дээр 10 секундээс бага хугацаанд боловсруулагддаг ч илүү төвөгтэй схемүүд нэг минут хүртэл хугацаа авч болно.
  • Хэрэв загвар аюултай хүсэлтээс татгалзахаар шийдвэл схемийг дагаж чадахгүй байж болно. Татгалзсан тохиолдолд буцаах мессежийн refusal boolean нь true болж үүнийг илтгэнэ. 
  • Хэрэв үүсгэлт дуусахаас өмнө max_tokens эсвэл өөр зогсоох нөхцөлд хүрвэл загвар схемийг дагаж чадахгүй байж болно. 
  • Structured Outputs нь загварын бүх төрлийн алдааг сэргийлдэггүй. Жишээлбэл, загвар JSON объектын утгуудын дотор алдаа гаргаж болно (жиш., математикийн тэгшитгэлийн нэг алхмыг буруу хийх). Хэрэв хөгжүүлэгчид алдаа олбол системийн зааварт жишээ өгөх эсвэл ажлуудыг илүү энгийн дэд ажлуудад хуваахыг зөвлөж байна.
  • Structured Outputs нь параллель функц дуудалттай нийцдэггүй. Параллель функц дуудалт үүссэн үед энэ нь өгсөн схемүүдтэй таарахгүй байж болно. Параллель функц дуудахыг идэвхгүй болгохын тулд parallel_tool_calls: false-г тохируулна уу.
  • Structured Outputs-тэй өгсөн JSON Schema-ууд нь тэг өгөгдөл хадгалалт(шинэ цонхонд нээгдэнэ) (ZDR)-д хамрагдахгүй.

Боломжтой байдал

Structured Outputs өнөөдрөөс API-д ерөнхийд нь ашиглах боломжтой боллоо. 

Функц дуудахтай Structured Outputs нь API дахь функц дуудахыг дэмждэг бүх загварт боломжтой. Үүнд манай хамгийн шинэ загварууд (
gpt-4o, gpt-4o-mini), gpt-4-0613 болон gpt-3.5-turbo-0613-аас хойших бүх загвар, мөн функц дуудахыг дэмждэг аливаа fine-tuned загварууд орно. Энэ боломж нь Chat Completions API, Assistants API, болон Batch API дээр ашиглагдана. Функц дуудахтай Structured Outputs нь мөн vision оролттой нийцдэг.

Хариу форматын Structured Outputs нь
gpt-4o-mini, gpt-4o-2024-08-06, мөн эдгээр загварт суурилсан аливаа fine-tune дээр боломжтой. Энэ боломж нь Chat Completions API, Assistants API, болон Batch API дээр ашиглагдана. Хариу форматын Structured Outputs нь мөн vision оролттой нийцдэг. 

Шинэ
gpt-4o-2024-08-06-д шилжсэнээр хөгжүүлэгчид gpt-4o-2024-05-13-тай харьцуулахад оролт дээр 50% ($2.50/1M input tokens), гаралт дээр 33% ($10.00/1M output tokens) хэмнэнэ.

Structured Outputs-ийг ашиглаж эхлэхийн тулд манай
баримтжуулалтыг(шинэ цонхонд нээгдэнэ) үзнэ үү. 

Талархал

Structured Outputs нь нээлттэй эхийн хамтын нийгэмлэгийн гайхалтай ажлуудаас, тухайлбал outlines(шинэ цонхонд нээгдэнэ), jsonformer(шинэ цонхонд нээгдэнэ), instructor(шинэ цонхонд нээгдэнэ), guidance(шинэ цонхонд нээгдэнэ), болон lark(шинэ цонхонд нээгдэнэ) сангуудаас санаа авсан.

Зохиогч

Michelle Pokrass

Үндсэн хувь нэмэр оруулагчид

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