OpenAI官宣將支持 JSON 結構化輸出!吃瓜群眾說 JSON 是啥?我要 GPT-5...
奧特曼在推文中表示[1]應廣大用戶的需求(這里的用戶應該特指開發者),OpenAI 將支持結構化輸出。
對于吃瓜群眾來說,有網友表示廣大用戶關心的問題是 GPT-5 和語音模式,不要試圖愚弄人們[2]...。也有網友在下面繼續回復 “不,結構化輸出對于使用 LLM 進行可靠構建來說非常重要。”
圖片
對于普通用戶來講,他們根本就不懂 JSON 格式,顯然不需要關心,能通過自然語言進行交流就可以了。
如果做過程序員,應該知道模型的結構化輸出對于程序是很重要的。因為程序的運行是結構化的,如果大模型能輸出結構化的結果,我們就可以更好和程序相結合。
開發人員長期以來一直在通過開源工具、提示和反復重試請求來解決 LLM 在這方面的局限性,以確保模型輸出符合與其系統互操作所需的格式。之前微軟搞的開源項目 TypeSpec 也是來做類似的事情的。
OpenAI 在去年的 DevDay 上推出了 JSON 模式,但它不能保證模型的響應符合特定的架構。此次,OpenAI 推出的結構化輸出是一項新功能[3],旨在確保模型生成的輸出與開發人員提供的 JSON 架構完全匹配。
OpenAI 采用結構化輸出的新模型是 gpt-4o-2024-08-06,對復雜 JSON 模式跟蹤的評估中該模型獲得了滿分(100%),之前的 gpt-4-0613 得分不到 40%
圖片
使用結構化輸出的方式有兩種:
1. 函數調用,通過設置 strict:true 參數,支持 gpt-4-0613 和 gpt-3.5-turbo-0613 及更高版本的模型
請求:
圖片
響應:
圖片
2. 新增 response_format 參數選項
請求:
圖片
響應:
圖片
原生支持 Node.js 和 Python SDK
OpenAI 提供的 Python 和 Node.js SDK 已更新,原生支持結構化輸出。
例如,在 Node.js 中可以通過 Zod 這個庫,來約束響應數據結構。如下所示:
import OpenAI from 'openai';
import z from 'zod';
import { zodFunction } from 'openai/helpers/zod';
const Table = z.enum(['orders', 'customers', 'products']);
const Column = z.enum([
'id',
'status',
'expected_delivery_date',
'delivered_at',
'shipped_at',
'ordered_at',
'canceled_at',
]);
const Operator = z.enum(['=', '>', '<', '<=', '>=', '!=']);
const OrderBy = z.enum(['asc', 'desc']);
const DynamicValue = z.object({
column_name: z.string(),
});
const Condition = z.object({
column: z.string(),
operator: Operator,
value: z.union([z.string(), z.number(), DynamicValue]),
});
const QueryArgs = z.object({
table_name: Table,
columns: z.array(Column),
conditions: z.array(Condition),
order_by: OrderBy,
});
const client = new OpenAI();
const completion = await client.beta.chat.completions.parse({
model: 'gpt-4o-2024-08-06',
messages: [
{ 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.' },
{ role: 'user', content: 'look up all my orders in may of last year that were fulfilled but not delivered on time' }
],
tools: [zodFunction({ name: 'query', parameters: QueryArgs })],
});
console.log(completion.choices[0].message.tool_calls[0].function.parsed_arguments);
參考資料
[1]奧特曼在推文中表示: https://x.com/sama/status/1820881534909300769
[2]有網友表示廣大用戶關心的問題是 GPT-5 和語音模式,不要試圖愚弄人們: https://x.com/ai_for_success/status/1820883341748662513
[3]OpenAI 推出的結構化輸出是一項新功能: https://openai.com/index/introducing-structured-outputs-in-the-api/