利用 JSON 輸出增強 AI 模型的提示工程

利用 JSON 輸出增強 AI 模型的提示工程

重點摘要

JSON 對於 LLM 應用至關重要,能提供結構化輸出以確保一致性、資料萃取與無縫整合。像 Pydantic 與 API 這類工具可加強 schema 驗證與維護性。

儘管 JSON 有其優點,但仍存在部分 schema 支援不足、Token 限制以及可能產生內容幻覺等限制。了解其優勢與限制對於打造高效、智慧的系統至關重要。

Novita AI 即將推出各 LLM 的能力描述功能,您可以直接在模型庫中檢視。

在現代應用程式開發中——尤其是隨著先進大型語言模型(LLM)的崛起——可預測且結構化的資料交換變得越來越重要。雖然 LLM 擅長生成自然語言,但許多使用案例要求其輸出必須符合特定格式,以確保能與其他系統、資料庫或流程順利整合。此時,結構化輸出的概念便應運而生,而 JSON(JavaScript Object Notation) 已成為定義並強制執行這些結構的首選格式。本文將探討 JSON 輸出在結構化資料中的本質,並強調其優點、應用與限制。

什麼是結構化輸出的 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 格式能帶來哪些好處?

https://youtu.be/jw\_lL6SJQZg

JSON(JavaScript Object Notation)廣泛用於結構化輸出與資料交換,在現代應用程式開發中提供一系列優勢。以下是其關鍵好處的簡要概述:

1. 可預測且一致的輸出

  • JSON 確保輸出嚴格遵循預先定義的 schema,消除變異性,讓下游系統能更可靠地處理資料。
  • 嚴格的 schema 遵循可降低 LLM 產生意外或「幻覺」欄位的可能性,確保結果一致且準確。

2. 可靠的資料萃取與機器可讀性

  • JSON 的結構化與階層式特性使其非常適合從輸出中萃取特定資訊,無論是資料分析、報告還是整合到應用程式中。
  • 機器易於解析與處理,從而實現無縫自動化與工作流程。

3. 易於解析與整合

  • JSON 輕量、基於文字的格式既易於人類閱讀,也方便機器解析,提升可用性。
  • 大多數現代程式語言原生支援 JSON 或可透過函式庫使用,簡化整合。例如:
    • Pythonjson 模組
    • Goencoding/json 套件
    • Node.js:內建 JSON 物件
    • Java:Jackson 和 Gson 函式庫
    • ASP.NETSystem.Text.JsonNewtonsoft.Json
    • Rubyjson 函式庫

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 規格的子集。數字的 minimummaximum 或陣列的 minItemsmaxItems 等功能可能不受支援,限制了您可以施加的約束。

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 願景成真。

推薦閱讀