重點摘要
JSON 對於 LLM 應用至關重要,能提供結構化輸出以確保一致性、資料萃取與無縫整合。像 Pydantic 與 API 這類工具可加強 schema 驗證與維護性。
儘管 JSON 有其優點,但仍存在部分 schema 支援不足、Token 限制以及可能產生內容幻覺等限制。了解其優勢與限制對於打造高效、智慧的系統至關重要。
Novita AI 即將推出各 LLM 的能力描述功能,您可以直接在模型庫中檢視。
在現代應用程式開發中——尤其是隨著先進大型語言模型(LLM)的崛起——可預測且結構化的資料交換變得越來越重要。雖然 LLM 擅長生成自然語言,但許多使用案例要求其輸出必須符合特定格式,以確保能與其他系統、資料庫或流程順利整合。此時,結構化輸出的概念便應運而生,而 JSON(JavaScript Object Notation) 已成為定義並強制執行這些結構的首選格式。本文將探討 JSON 輸出在結構化資料中的本質,並強調其優點、應用與限制。
什麼是結構化輸出的 JSON 輸出?

來源:Langchain
JSON 簡介
JSON 結構化輸出是一種與 大型語言模型(LLM) 搭配使用的技術,能確保模型回應符合預先定義的 schema,通常以 JSON 格式表達。
- 提供 LLM 詳細的期望輸出結構說明,包括:
- 欄位
- 資料型別
- 限制
使用工具實作
像 Pydantic(一個 Python 函式庫)這類工具可用來:
- 透過型別提示定義 schema。
- 將這些 schema 轉換為 JSON schema。
使用 Pydantic 等工具的好處:
- 確保結構化輸出。
- 提升程式碼可讀性與可維護性。
透過 API 實作
- 某些 API,例如 OpenAI 的 ChatCompletions API,允許開發者透過支援 JSON schema 功能來強制結構化輸出。
- 這些 API 可提供不同層級的功能:
- 例如,OpenAI 的 API 支援 JSON schema 功能的有限子集。
- 其他 API 可能提供更廣泛的 schema 支援。
OpenAI 範例
輸入:
from pydantic import BaseModel
from openai import OpenAI
client = OpenAI()
class Step(BaseModel):
explanation: str
output: str
class MathReasoning(BaseModel):
steps: list[Step]
final_answer: str
completion = client.beta.chat.completions.parse(
model="gpt-4o-2024-08-06",
messages=[
{"role": "system", "content": "You are a helpful math tutor. Guide the user through the solution step by step."},
{"role": "user", "content": "how can I solve 8x + 7 = -23"}
],
response_format=MathReasoning,
)
math_reasoning = completion.choices[0].message.parsed
輸出:
{
"steps": [
{
"explanation": "Start with the equation 8x + 7 = -23.",
"output": "8x + 7 = -23"
},
{
"explanation": "Subtract 7 from both sides to isolate the term with the variable.",
"output": "8x = -23 - 7"
},
{
"explanation": "Simplify the right side of the equation.",
"output": "8x = -30"
},
{
"explanation": "Divide both sides by 8 to solve for x.",
"output": "x = -30 / 8"
},
{
"explanation": "Simplify the fraction.",
"output": "x = -15 / 4"
}
],
"final_answer": "x = -15 / 4"
}
JSON 格式能帶來哪些好處?
JSON(JavaScript Object Notation)廣泛用於結構化輸出與資料交換,在現代應用程式開發中提供一系列優勢。以下是其關鍵好處的簡要概述:
1. 可預測且一致的輸出
- JSON 確保輸出嚴格遵循預先定義的 schema,消除變異性,讓下游系統能更可靠地處理資料。
- 嚴格的 schema 遵循可降低 LLM 產生意外或「幻覺」欄位的可能性,確保結果一致且準確。
2. 可靠的資料萃取與機器可讀性
- JSON 的結構化與階層式特性使其非常適合從輸出中萃取特定資訊,無論是資料分析、報告還是整合到應用程式中。
- 機器易於解析與處理,從而實現無縫自動化與工作流程。
3. 易於解析與整合
- JSON 輕量、基於文字的格式既易於人類閱讀,也方便機器解析,提升可用性。
- 大多數現代程式語言原生支援 JSON 或可透過函式庫使用,簡化整合。例如:
- Python:
json模組 - Go:
encoding/json套件 - Node.js:內建
JSON物件 - Java:Jackson 和 Gson 函式庫
- ASP.NET:
System.Text.Json或Newtonsoft.Json - Ruby:
json函式庫
- Python:
4. Schema 定義與驗證
- JSON Schema 提供標準化方式來定義輸出的預期結構與資料型別。
- 驗證可確保輸出符合預先定義的 schema,實現自動錯誤偵測,並防止格式錯誤的資料。
5. 選擇性參數的靈活性
- JSON 支援選擇性欄位,讓 schema 設計更具彈性。
- 像 Python 中的 Pydantic 等工具,可讓開發者使用選擇性型別註解定義 schema,處理某些欄位可能不總是存在的情況。
6. 效率與效能
- JSON 簡潔的語法確保資料表示精簡且高效,特別適合頻寬有限的環境。
- 在像 Baseten 的實作中,預先計算的 schema token 遮罩可最小化後續呼叫的延遲,進一步提升效能。
7. 互通性與可擴充性
- JSON 與多種程式語言、框架和工具相容,確保在不同系統與平台間無縫整合。
- 其靈活的結構允許開發者在不破壞現有工作流程或相容性的前提下,擴展或修改資料格式。
8. 與 API 和資料庫整合
- JSON 是許多現代 API 的預設資料格式,確保客戶端與伺服器之間一致且可預測的通訊。
- 多種資料庫(例如 MongoDB、PostgreSQL)原生支援 JSON,使其在儲存與擷取結構化資料時更有效率。
9. 人類可讀格式
JSON 簡單直觀的結構讓開發者與非技術人員都能輕鬆閱讀與理解,簡化除錯與協作。
結合 可預測性 、 效率 、 易用性 ** 與 ** 靈活性,JSON 已成為現代應用程式開發的基石。它能夠強制結構化輸出、確保可靠資料交換,並與工具、API 及資料庫無縫整合,使其成為開發者與組織不可或缺的格式。
JSON 格式的應用
JSON 在結構化輸出中的用途廣泛,並持續在多個領域擴展:
1. 網頁抓取
- 從網頁中萃取特定元素(如標題、段落、連結、圖片),並以結構化 JSON 格式呈現。
2. 從文字中萃取資料
- 將非結構化文字轉換為結構化 JSON 物件,用於資訊檢索、資料分析或內容整理等任務。
3. 建立聊天機器人與對話代理
- 確保聊天機器人回應遵循預先定義的 JSON 結構,特別是在與後端系統或 API 整合時。
Novita AI 已推出各 LLM 的能力描述功能,您可以直接在 主控台 與 文件 中檢視。
JSON 格式的限制
儘管 JSON 有其優點,但在結構化輸出中使用仍存在某些限制:
1. 部分 JSON Schema 支援
- 某些 LLM API,例如 OpenAI 的 ChatCompletions API,僅支援完整 JSON Schema 規格的子集。數字的
minimum和maximum或陣列的minItems和maxItems等功能可能不受支援,限制了您可以施加的約束。
2. 格式限制
- 某些格式規格,例如 Pydantic schema 中的日期時間格式,可能無法由 API 直接處理,需要額外的後驗證步驟。
3. 可能產生幻覺
- 雖然 JSON 確保了輸出的結構,但結構化欄位內的內容仍可能產生幻覺。例如,產品 ID 可能格式正確為字串,但 ID 本身可能是無效或無意義的。
4. 輸出 Token 限制
- JSON 輸出受到 LLM Token 限制(例如 OpenAI 模型有 16,384 個 Token 的上限)。如果結構化輸出超過此上限,可能會被截斷,導致無效的 JSON。
5. Schema 複雜度限制
- 深度巢狀且包含大量物件屬性的 schema 可能導致 API 錯誤。建議保持 schema 相對扁平與簡單,以獲得較佳效能並避免錯誤。
6. 動態 Schema 能力有限
- 高度動態或任意的 schema,例如鍵值對清單中鍵未預先定義的情況,難以透過結構化輸出實現。在這種情況下,使用標準 JSON 模式並在系統提示中加入指示可能更有效。
7. 延遲開銷
- 處理結構化 schema 可能會為初始請求引入延遲,因為需要處理並可能快取 schema。
8. 缺乏原生註解
- JSON 不支援在資料內加入註解,這可能使複雜結構在沒有外部文件的情況下更難理解。
JSON 是現代 LLM 應用程式開發的基石,為結構化輸出提供了一種強大且廣泛使用的格式。透過強制執行預先定義的 schema,它確保了一致性、促進了資料萃取,並簡化了跨系統的整合。儘管存在部分 JSON Schema 支援不足以及可能出現內容幻覺等限制,但其可預測性、易用性與相容性使其成為打造智慧型整合應用程式的必要工具。清楚了解其優勢與限制對於最佳化 LLM 驅動的解決方案至關重要。
常見問題
使用 JSON 的結構化輸出一定能保證零錯誤嗎?
雖然結構化輸出能保證回應是符合 schema 的有效 JSON 物件,但 無法保證該結構內內容的準確性或有效性。幻覺仍然可能發生。
使用 JSON 的結構化輸出會減慢 LLM 回應速度嗎?
初始處理 schema 時可能會有些微 延遲開銷。然而,在某些實作中,由於快取與其他最佳化,這個開銷在最初幾個請求後就會降到最低。
JSON 模式與 JSON Schema 模式有什麼不同?
在 **JSON 模式 ** 中,你指示 LLM 回傳一個有效的 JSON 物件,但未指定詳細的 schema。在 JSON Schema 模式 中,你提供一個特定的 JSON schema,LLM 被迫在其輸出中遵循此結構。
Novita AI 是一個一站式雲端平台,為您的 AI 抱負提供支援。整合 API、無伺服器、GPU 實例——您所需的經濟高效工具。免除基礎設施煩惱,免費開始,讓您的 AI 願景成真。


