zalo
Chat ngay

Giới thiệu Đầu ra có cấu trúc trong API

Chúng tôi đang giới thiệu Đầu ra có cấu trúc trong API—đầu ra của mô hình hiện tuân thủ đáng tin cậy theo Sơ đồ JSON do nhà phát triển cung cấp

Xem thêm: mua tài khoản Chat GPT Plus chính hãng giá rẻ

Năm ngoái tại DevDay, chúng tôi đã giới thiệu chế độ JSON—một khối xây dựng hữu ích cho các nhà phát triển muốn xây dựng các ứng dụng đáng tin cậy với các mô hình của chúng tôi. Mặc dù chế độ JSON cải thiện độ tin cậy của mô hình để tạo ra các đầu ra JSON hợp lệ, nhưng nó không đảm bảo rằng phản hồi của mô hình sẽ tuân thủ theo một lược đồ cụ thể. Hôm nay, chúng tôi giới thiệu Structured Outputs trong API, một tính năng mới được thiết kế để đảm bảo các đầu ra do mô hình tạo ra sẽ khớp chính xác với các lược đồ JSON do các nhà phát triển cung cấp.

Tạo dữ liệu có cấu trúc từ các đầu vào không có cấu trúc là một trong những trường hợp sử dụng cốt lõi của AI trong các ứng dụng ngày nay. Các nhà phát triển sử dụng API OpenAI để xây dựng các trợ lý mạnh mẽ có khả năng truy xuất dữ liệu và trả lời các câu hỏi thông qua lệnh gọi hàm (mở trong cửa sổ mới), trích xuất dữ liệu có cấu trúc để nhập dữ liệu và xây dựng quy trình làm việc tác nhân nhiều bước cho phép LLM thực hiện hành động. Các nhà phát triển từ lâu đã giải quyết các hạn chế của LLM trong lĩnh vực này thông qua công cụ nguồn mở, nhắc nhở và thử lại các yêu cầu nhiều lần để đảm bảo rằng đầu ra của mô hình khớp với các định dạng cần thiết để tương tác với hệ thống của họ. Structured Outputs giải quyết vấn đề này bằng cách hạn chế các mô hình OpenAI để khớp với các lược đồ do nhà phát triển cung cấp và bằng cách đào tạo các mô hình của chúng tôi để hiểu rõ hơn các lược đồ phức tạp.

Trong các đánh giá của chúng tôi về lược đồ JSON phức tạp sau đây, mô hình mới của chúng tôi gpt-4o-2024-08-06với Đầu ra có cấu trúc đạt điểm hoàn hảo 100%. Trong khi đó, gpt-4-0613điểm của mô hình này thấp hơn 40%.

 

Với Structured Outputs, gpt-4o-2024-08-06đạt được độ tin cậy 100% trong các đánh giá của chúng tôi, hoàn toàn khớp với các lược đồ đầu ra.

Cách sử dụng Đầu ra có cấu trúc

Sở hữu ngay tài khoản Chat GPT 4 chỉ với vài bước đơn giản

Chúng tôi đang giới thiệu Đầu ra có cấu trúc dưới hai hình thức trong API: 

Gọi hàm: Structured Outputs via toolscó sẵn bằng cách thiết lập strict: truetrong định nghĩa hàm của bạn. Tính năng này hoạt động với tất cả các mô hình hỗ trợ công cụ, bao gồm tất cả các mô hình gpt-4-0613và gpt-3.5-turbo-0613sau đó. Khi Structured Outputs được bật, đầu ra mô hình sẽ khớp với định nghĩa công cụ được cung cấp.

JSON

 
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
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
}
JSON
 
1234567891011121314151617181920212223242526272829
1
{
2
"table_name":"orders",
3
"columns":["id","status","expected_delivery_date","delivered_at"],
4
"conditions":[
5
{
6
"column":"status",
7
"operator":"=",
8
"value":"fulfilled"
9
},
10
{
11
"column":"ordered_at",
12
"operator":">=",
13
"value":"2023-05-01"
14
},
15
{
16
"column":"ordered_at",
17
"operator":"<",
18
"value":"2023-06-01"
19
},
20
{
21
"column":"delivered_at",
22
"operator":">",
23
"value":{
24
"column_name":"expected_delivery_date"
25
}
26
}
27
],
28
"order_by":"asc"
29
}

Một tùy chọn mới cho tham response_formatsố: các nhà phát triển hiện có thể cung cấp một JSON Schema thông qua json_schema, một tùy chọn mới cho tham response_formatsố. Điều này hữu ích khi mô hình không gọi một công cụ, mà thay vào đó, phản hồi cho người dùng theo cách có cấu trúc. Tính năng này hoạt động với các mô hình GPT-4o mới nhất của chúng tôi: gpt-4o-2024-08-06, được phát hành ngày hôm nay và gpt-4o-mini-2024-07-18. Khi a response_formatđược cung cấp với strict: true, đầu ra của mô hình sẽ khớp với lược đồ được cung cấp.

Lời Yêu Cầu
 
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
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
}
Đầu Ra JSON
 
1234567891011121314151617
1
{
2
"steps":[
3
{
4
"explanation":"Subtract 31 from both sides to isolate the term with x.",
5
"output":"8x + 31 - 31 = 2 - 31"
6
},
7
{
8
"explanation":"This simplifies to 8x = -29.",
9
"output":"8x = -29"
10
},
11
{
12
"explanation":"Divide both sides by 8 to solve for x.",
13
"output":"x = -29 / 8"
14
}
15
],
16
"final_answer":"x = -29 / 8"
17
}

Đầu ra có cấu trúc an toàn

An toàn là ưu tiên hàng đầu đối với OpenAI—chức năng Structured Outputs mới sẽ tuân thủ các chính sách an toàn hiện tại của chúng tôi và vẫn cho phép mô hình từ chối yêu cầu không an toàn. Để đơn giản hóa quá trình phát triển, có một refusalgiá trị chuỗi mới trên các phản hồi API cho phép các nhà phát triển phát hiện theo chương trình nếu mô hình đã tạo ra lệnh từ chối thay vì đầu ra khớp với lược đồ. Khi phản hồi không bao gồm lệnh từ chối và phản hồi của mô hình không bị gián đoạn sớm (như được chỉ ra bởi finish_reason), thì phản hồi của mô hình sẽ tạo ra JSON hợp lệ khớp với lược đồ được cung cấp một cách đáng tin cậy.

JSON
 
1234567891011121314151617181920212223
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
}

Hỗ trợ SDK gốc

SDK Python và Node của chúng tôi đã được cập nhật với hỗ trợ gốc cho Structured Outputs. Việc cung cấp lược đồ cho các công cụ hoặc dưới dạng định dạng phản hồi cũng dễ dàng như việc cung cấp đối tượng Pydantic hoặc Zod và SDK của chúng tôi sẽ xử lý việc chuyển đổi kiểu dữ liệu sang lược đồ JSON được hỗ trợ, tự động hủy tuần tự phản hồi JSON thành cấu trúc dữ liệu đã nhập và phân tích cú pháp các từ chối nếu chúng phát sinh.

Các ví dụ sau đây cho thấy sự hỗ trợ gốc cho Đầu ra có cấu trúc với lệnh gọi hàm.

 
 
TrănNút
TrănNút
 
Con Trăn
 
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
1
enum Enumfromimport
2
typing fromimportUnion
3
 
4
pydantic BaseModelfromimport
5
 
6
openaiimport
7
openai OpenAIfromimport
8
 
9
 
10
(, Enum):classTablestr
11
orders = "orders"
12
customers = "customers"
13
products = "products"
14
 
15
 
16
(, Enum):classColumnstr
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
(, Enum):classOperatorstr
27
eq = "="
28
gt = ">"
29
lt = "<"
30
le = "<="
31
ge = ">="
32
ne = "!="
33
 
34
 
35
(, Enum):classOrderBystr
36
asc = "asc"
37
desc = "desc"
38
 
39
 
40
():classDynamicValueBaseModel
41
column_name: str
42
 
43
 
44
():classConditionBaseModel
45
column: str
46
operator: Operator
47
value: [, , DynamicValue]Unionstrint
48
 
49
 
50
():classQueryBaseModel
51
table_name: Table
52
columns: [Column]list
53
conditions: [Condition]list
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
(completion.choices[].message.tool_calls[].function.parsed_arguments)print00
JavaScript
 
123456789101112131415161718192021222324252627282930313233343536373839404142434445
1
;importOpenAIfrom'openai'
2
z ;importfrom'zod'
3
{ zodFunction } ;importfrom'openai/helpers/zod'
4
 
5
= z.([, , ]);constTableenum'orders''customers''products'
6
= z.([constColumnenum
7
,'id'
8
,'status'
9
,'expected_delivery_date'
10
,'delivered_at'
11
,'shipped_at'
12
,'ordered_at'
13
,'canceled_at'
14
]);
15
= z.([, , , , , ]);constOperatorenum'=''>''<''<=''>=''!='
16
= z.([, ]);constOrderByenum'asc''desc'
17
 
18
= z.({constDynamicValueobject
19
: z.(),column_namestring
20
});
21
 
22
= z.({constConditionobject
23
: z.(),columnstring
24
: ,operatorOperator
25
: z.([z.(), z.(), ]),valueunionstringnumberDynamicValue
26
});
27
 
28
= z.({constQueryArgsobject
29
: ,table_nameTable
30
: z.(),columnsarrayColumn
31
: z.(),conditionsarrayCondition
32
: ,order_byOrderBy
33
});
34
 
35
client = ();constnewOpenAI
36
 
37
completion = client....({constawaitbetachatcompletionsparse
38
: ,model'gpt-4o-2024-08-06'
39
: [messages
40
{ : , : },role'system'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.'
41
{ : , : }role'user'content'look up all my orders in may of last year that were fulfilled but not delivered on time'
42
],
43
: [({ : , : })],toolszodFunctionname'query'parametersQueryArgs
44
});
45
.(completion.[]..[]..);consolelogchoices0messagetool_calls0functionparsed_arguments

Hỗ trợ Đầu ra có cấu trúc gốc cũng khả dụng cho response_format.

 
 
Con Trăn
 
1234567891011121314151617181920212223242526272829303132
1
pydantic BaseModelfromimport
2
 
3
openai OpenAIfromimport
4
 
5
 
6
():classStepBaseModel
7
explanation: str
8
output: str
9
 
10
 
11
():classMathResponseBaseModel
12
steps: [Step]list
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[].message0
28
message.parsed:if
29
(message.parsed.steps)print
30
(message.parsed.final_answer)print
31
:else
32
(message.refusal)print
JavaScript
 
12345678910111213141516171819202122232425262728293031323334353637
1
;importOpenAIfrom'openai'
2
{ zodResponseFormat } ;importfrom'openai/helpers/zod'
3
{ z } ;importfrom'zod'
4
 
5
 
6
= z.({constStepobject
7
: z.(),explanationstring
8
: z.(),outputstring
9
})
10
 
11
= z.({constMathResponseobject
12
: z.(),stepsarrayStep
13
: z.(),final_answerstring
14
})
15
 
16
 
17
client = ();constnewOpenAI
18
 
19
completion = client....({constawaitbetachatcompletionsparse
20
: ,model'gpt-4o-2024-08-06'
21
: [messages
22
{
23
: ,"role""system"
24
: ,"content""You are a helpful math tutor. Only use the schema for math responses."
25
},
26
{ : , : },"role""user""content""solve 8x + 3 = 21"
27
],
28
: (, ),response_formatzodResponseFormatMathResponse'mathResponse'
29
});
30
 
31
message = completion.[]?.;constchoices0message
32
(message?.) {ifparsed
33
.(message..);consolelogparsedsteps
34
.(message..);consolelogparsedfinal_answer
35
} {else
36
.(message.);consolelogrefusal
37
}

Các trường hợp sử dụng bổ sung

Các nhà phát triển thường sử dụng các mô hình của OpenAI để tạo dữ liệu có cấu trúc cho nhiều trường hợp sử dụng khác nhau. Một số ví dụ bổ sung bao gồm:

Tạo giao diện người dùng động dựa trên ý định của người dùng

Ví dụ, các nhà phát triển có thể sử dụng Structured Outputs để tạo các ứng dụng tạo mã hoặc UI. Tất cả các ví dụ sau đều sử dụng cùng một response_format, và có thể được sử dụng để tạo ra các UI khác nhau dựa trên đầu vào của người dùng.

 
Hệ thống
You are a user interface assistant. Your job is to help users visualize their website and app ideas.
 
 
Định dạng phản hồi
Xem lược đồ JSON
 
 
Trợ lý
 
 
Trang đích dành cho người làm vườnMàn hình đăng ký ứng dụngTiện ích giá cổ phiếu
Trang đích dành cho người làm vườnMàn hình đăng ký ứng dụngTiện ích giá cổ phiếu
 
 
 
{
 
"type":"div",
 
"label":"",
 
"children":[
 
{
 
"type":"header",
 
"label":"",
 
"children":[
 
{
 
"type":"div",
 
"label":"Green Thumb Gardening",
 
"children":[],
 
"attributes":[{"name":"className","value":"site-title"}]
 
},
 
{
 
"type":"div",
 
"label":"Bringing Life to Your Garden",
 
"children":[],
 
"attributes":[{"name":"className","value":"site-tagline"}]
 
}
 
],
 
"attributes":[{"name":"className","value":"header"}]
 
},
 
{
 
"type":"section",
 
"label":"",
 
"children":[
 
{
 
"type":"div",
 
"label":"",
 
"children":[
 
{
 
"type":"div",
 
"label":"About Us",
 
"children":[
 
{
 
"type":"div",
 
"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.",
 
"children":[],
 
"attributes":[
 
{"name":"className","value":"about-description"}
 
]
 
}
 
],
 
"attributes":[{"name":"className","value":"about-section"}]
 
}
 
],
 
"attributes":[{"name":"className","value":"content"}]
 
}
 
],
 
"attributes":[{"name":"className","value":"about-container"}]
 
},
 
{
 
"type":"section",
 
"label":"",
 
"children":[
 
{
 
"type":"div",
 
"label":"",
 
"children":[
 
{
 
"type":"div",
 
"label":"Our Services",
 
"children":[
 
{
 
"type":"div",
 
"label":"Garden Design",
 
"children":[],
 
"attributes":[
 
{"name":"className","value":"service-item"}
 
]
 
},
 
{
 
"type":"div",
 
"label":"Plant Care & Maintenance",
 
"children":[],
 
"attributes":[
 
{"name":"className","value":"service-item"}
 
]
 
},
 
{
 
"type":"div",
 
"label":"Seasonal Cleanup",
 
"children":[],
 
"attributes":[
 
{"name":"className","value":"service-item"}
 
]
 
},
 
{
 
"type":"div",
 
"label":"Custom Landscaping",
 
"children":[],
 
"attributes":[
 
{"name":"className","value":"service-item"}
 
]
 
}
 
],
 
"attributes":[{"name":"className","value":"services-list"}]
 
}
 
],
 
"attributes":[{"name":"className","value":"content"}]
 
}
 
],
 
"attributes":[{"name":"className","value":"services-container"}]
 
}
 
],
 
"attributes":[{"name":"className","value":"landing-page"}]
 
}
 
 

Tách câu trả lời cuối cùng khỏi lý lẽ hỗ trợ hoặc bình luận bổ sung

Có thể hữu ích khi cung cấp cho mô hình một trường riêng biệt cho chuỗi suy nghĩ để cải thiện chất lượng cuối cùng của phản hồi.

 

JSON
 
1234567891011121314151617181920212223242526272829303132333435363738
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
}
 

Trích xuất dữ liệu có cấu trúc từ dữ liệu không có cấu trúc

Ví dụ, hướng dẫn mô hình trích xuất những thông tin như việc cần làm, ngày đến hạn và bài tập từ ghi chú cuộc họp.

 
 
Lời yêu cầuĐầu ra có cấu trúc
Lời yêu cầuĐầu ra có cấu trúc
 
JSON
 
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
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
 
1234567891011121314151617181920212223242526272829
1
{
2
"action_items":[
3
{
4
"description":"Collaborate on optimizing the path planning algorithm",
5
"due_date":"2024-06-30",
6
"owner":"Jason Li"
7
},
8
{
9
"description":"Reach out to industry partners for additional datasets",
10
"due_date":"2024-06-25",
11
"owner":"Aisha Patel"
12
},
13
{
14
"description":"Explore alternative LIDAR sensor configurations and report findings",
15
"due_date":"2024-06-27",
16
"owner":"Kevin Nguyen"
17
},
18
{
19
"description":"Schedule extended stress tests for the integrated navigation system",
20
"due_date":"2024-06-28",
21
"owner":"Emily Chen"
22
},
23
{
24
"description":"Retest the system after bug fixes and update the team",
25
"due_date":"2024-07-01",
26
"owner":"David Park"
27
}
28
]
29
}

Dưới mui xe

Chúng tôi đã áp dụng phương pháp tiếp cận hai phần để cải thiện độ tin cậy cho các đầu ra mô hình khớp với JSON Schema. Đầu tiên, chúng tôi đã đào tạo mô hình mới nhất của mình gpt-4o-2024-08-06để hiểu các lược đồ phức tạp và cách tốt nhất để tạo ra các đầu ra khớp với chúng. Tuy nhiên, hành vi của mô hình vốn không xác định—mặc dù mô hình này đã cải thiện hiệu suất (93% so với chuẩn mực của chúng tôi), nhưng vẫn không đạt được độ tin cậy mà các nhà phát triển cần để xây dựng các ứng dụng mạnh mẽ. Vì vậy, chúng tôi cũng đã áp dụng phương pháp tiếp cận xác định dựa trên kỹ thuật để hạn chế các đầu ra của mô hình nhằm đạt được độ tin cậy 100%.

Giải mã bị hạn chế

Cách tiếp cận của chúng tôi dựa trên một kỹ thuật được gọi là lấy mẫu bị ràng buộc hoặc giải mã bị ràng buộc. Theo mặc định, khi các mô hình được lấy mẫu để tạo ra đầu ra, chúng hoàn toàn không bị ràng buộc và có thể chọn bất kỳ mã thông báo nào từ vốn từ vựng làm đầu ra tiếp theo. Tính linh hoạt này cho phép các mô hình mắc lỗi; ví dụ, chúng thường được tự do lấy mẫu mã thông báo dấu ngoặc nhọn bất kỳ lúc nào, ngay cả khi điều đó không tạo ra JSON hợp lệ. Để buộc các đầu ra hợp lệ, chúng tôi giới hạn các mô hình của mình chỉ với các mã thông báo hợp lệ theo lược đồ được cung cấp, thay vì tất cả các mã thông báo khả dụng.

Có thể rất khó để triển khai ràng buộc này trong thực tế, vì các mã thông báo hợp lệ khác nhau trong toàn bộ đầu ra của mô hình. Giả sử chúng ta có lược đồ sau:

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

Các mã thông báo hợp lệ ở đầu đầu ra bao gồm những thứ như {{“{\n, v.v. Tuy nhiên, sau khi mô hình đã lấy mẫu {“val, thì {không còn là mã thông báo hợp lệ nữa. Do đó, chúng ta cần triển khai giải mã ràng buộc động và xác định mã thông báo nào hợp lệ sau khi mỗi mã thông báo được tạo ra, thay vì xác định trước ở đầu phản hồi.

Để thực hiện điều này, chúng tôi chuyển đổi JSON Schema được cung cấp thành ngữ pháp không ngữ cảnh (CFG). Ngữ pháp là một tập hợp các quy tắc xác định ngôn ngữ và ngữ pháp không ngữ cảnh là ngữ pháp tuân thủ các quy tắc cụ thể. Bạn có thể nghĩ về JSON và JSON Schema như các ngôn ngữ cụ thể có các quy tắc để xác định những gì hợp lệ trong ngôn ngữ. Cũng giống như việc không hợp lệ trong tiếng Anh khi có một câu không có động từ, thì việc có dấu phẩy theo sau cũng không hợp lệ trong JSON.

Do đó, đối với mỗi JSON Schema, chúng tôi tính toán một ngữ pháp biểu diễn cho lược đồ đó và xử lý trước các thành phần của nó để dễ dàng truy cập trong quá trình lấy mẫu mô hình. Đây là lý do tại sao yêu cầu đầu tiên với lược đồ mới phải chịu hình phạt về độ trễ—chúng tôi phải xử lý trước lược đồ để tạo ra hiện vật này mà chúng tôi có thể sử dụng hiệu quả trong quá trình lấy mẫu.

Trong khi lấy mẫu, sau mỗi mã thông báo, công cụ suy luận của chúng tôi sẽ xác định mã thông báo nào hợp lệ để tạo tiếp theo dựa trên các mã thông báo đã tạo trước đó và các quy tắc trong ngữ pháp chỉ ra mã thông báo nào hợp lệ tiếp theo. Sau đó, chúng tôi sử dụng danh sách mã thông báo này để che dấu bước lấy mẫu tiếp theo, điều này làm giảm hiệu quả xác suất mã thông báo không hợp lệ xuống 0. Vì chúng tôi đã xử lý sơ đồ trước, chúng tôi có thể sử dụng cấu trúc dữ liệu được lưu trong bộ nhớ đệm để thực hiện việc này một cách hiệu quả, với chi phí độ trễ tối thiểu.

Các cách tiếp cận thay thế

Các cách tiếp cận thay thế cho vấn đề này thường sử dụng máy trạng thái hữu hạn (FSM) hoặc biểu thức chính quy (thường được triển khai bằng FSM) để giải mã bị ràng buộc. Các chức năng này tương tự nhau ở chỗ chúng cập nhật động các mã thông báo hợp lệ sau khi mỗi mã thông báo được tạo ra, nhưng chúng có một số điểm khác biệt chính so với cách tiếp cận CFG. Đáng chú ý là CFG có thể biểu thị một lớp ngôn ngữ rộng hơn FSM. Trong thực tế, điều này không quan trọng đối với các lược đồ rất đơn giản như lược valueđồ được hiển thị ở trên. Tuy nhiên, chúng tôi thấy rằng sự khác biệt này có ý nghĩa đối với các lược đồ phức tạp hơn liên quan đến các cấu trúc dữ liệu lồng nhau hoặc đệ quy. Ví dụ, FSM thường không thể biểu thị các kiểu đệ quy, điều này có nghĩa là các cách tiếp cận dựa trên FSM có thể gặp khó khăn khi khớp với dấu ngoặc đơn trong JSON lồng nhau sâu. Sau đây là một lược đồ đệ quy mẫu được hỗ trợ trên API OpenAI với Đầu ra có cấu trúc nhưng không thể biểu thị bằng FSM.

JSON
 
123456789101112131415161718192021222324252627282930313233343536373839404142434445
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
}

Lưu ý rằng mỗi phần tử UI có thể có các phần tử con tùy ý tham chiếu đến lược đồ gốc theo cách đệ quy. Tính linh hoạt này là thứ mà phương pháp CFG mang lại.

Hạn chế và hạn chế

Có một số hạn chế cần lưu ý khi sử dụng Đầu ra có cấu trúc:

  • Structured Outputs chỉ cho phép một tập hợp con của JSON Schema, được nêu chi tiết trong tài liệu của chúng tôi (mở trong cửa sổ mới). Điều này giúp chúng tôi đảm bảo hiệu suất tốt nhất có thể.

  • Phản hồi API đầu tiên với lược đồ mới sẽ phải chịu thêm độ trễ, nhưng các phản hồi tiếp theo sẽ nhanh mà không bị phạt độ trễ. Điều này là do trong yêu cầu đầu tiên, chúng tôi xử lý lược đồ như đã chỉ ra ở trên và sau đó lưu trữ tạm thời các hiện vật này để sử dụng lại nhanh sau này. Các lược đồ thông thường mất dưới 10 giây để xử lý trong yêu cầu đầu tiên, nhưng các lược đồ phức tạp hơn có thể mất tới một phút.

  • Mô hình có thể không tuân theo lược đồ nếu mô hình chọn từ chối yêu cầu không an toàn. Nếu chọn từ chối, thông báo trả về sẽ có boolean refusalđược đặt thành true để chỉ ra điều này. 

  • Mô hình có thể không tuân theo lược đồ nếu quá trình tạo đạt đến max_tokenshoặc gặp phải điều kiện dừng khác trước khi hoàn tất. 

  • Structured Outputs không ngăn chặn được mọi loại lỗi mô hình. Ví dụ, mô hình vẫn có thể mắc lỗi trong các giá trị của đối tượng JSON (ví dụ, sai một bước trong phương trình toán học). Nếu các nhà phát triển tìm thấy lỗi, chúng tôi khuyên bạn nên cung cấp ví dụ trong hướng dẫn hệ thống hoặc chia nhỏ các tác vụ thành các tác vụ con đơn giản hơn.

  • Structured Outputs không tương thích với các lệnh gọi hàm song song. Khi lệnh gọi hàm song song được tạo, nó có thể không khớp với các lược đồ được cung cấp. Đặt parallel_tool_calls: falseđể vô hiệu hóa lệnh gọi hàm song song.

  • Các lược đồ JSON được cung cấp cùng với Đầu ra có cấu trúc không phải là Lưu giữ dữ liệu bằng không(mở trong cửa sổ mới) (ZDR) đủ điều kiện.

Khả dụng

Structured Outputs hiện có sẵn trong API. 

Structured Outputs với chức năng gọi hàm có sẵn trên tất cả các mô hình hỗ trợ chức năng gọi hàm trong API. Điều này bao gồm các mô hình mới nhất của chúng tôi ( gpt-4ogpt-4o-mini), tất cả các mô hình sau và bao gồm gpt-4-0613và gpt-3.5-turbo-0613, và bất kỳ mô hình tinh chỉnh nào hỗ trợ chức năng gọi hàm. Chức năng này có sẵn trên Chat Completions API, Assistants API và Batch API. Structured Outputs với chức năng gọi hàm cũng tương thích với đầu vào tầm nhìn.

Structured Outputs với định dạng phản hồi có sẵn trên gpt-4o-minivà gpt-4o-2024-08-06và bất kỳ tinh chỉnh nào dựa trên các mô hình này. Chức năng này có sẵn trên Chat Completions API, Assistants API và Batch API. Structured Outputs với định dạng phản hồi cũng tương thích với đầu vào tầm nhìn. 

Bằng cách chuyển sang , mới gpt-4o-2024-08-06, các nhà phát triển tiết kiệm 50% cho đầu vào (2,50 đô la/1 triệu mã thông báo đầu vào) và 33% cho đầu ra (10,00 đô la/1 triệu mã thông báo đầu ra) so với gpt-4o-2024-05-13. Để bắt đầu sử dụng Structured Outputs, hãy xem

tài liệu của chúng tôi(mở trong cửa sổ mới). 

Lời cảm ơn

Structured Outputs lấy cảm hứng từ những tác phẩm tuyệt vời của cộng đồng nguồn mở: cụ thể là các thư viện outlines, jsonformer, instructor, guidance và lark.

Hot Deal

Họ tên (*)

Số điện thoại (*)

Email (*)

Dịch vụ

Đăng ký để nhận bản tin mới nhất !