OpenClaw Skills #11|Structured Output:讓 AI Agent 的輸出從「隨機文字」變成「可信賴資料」

OpenClaw Skills #11|Structured Output:讓 AI Agent 的輸出從「隨機文字」變成「可信賴資料」

發布時間:2026-03-11 | 分類:OpenClaw Skills 深度研究
---

一、開場破題

你有沒有遇過這種情況:花了一週打造 AI Agent,Demo 跑得很順,一上生產環境就開始出錯——因為 LLM 某次回了一段帶解釋的文字,而不是你期待的 JSON,整個 Pipeline 直接炸掉。
這不是 Bug,這是沒有 Structured Output 的必然代價。
2026 年,AI Agent 已深度嵌入企業工作流:自動填報表、解析合約、驅動 API 呼叫。這些場景有一個共同要求:LLM 的輸出必須是機器可以直接消費的結構化資料,而不是給人讀的自然語言。
根據 CraftedStack 的生產環境統計,導入 Pydantic 結構化輸出的 Pipeline,成功解析率從 82% 提升到 97%,平均重試次數從 2.4 次降到 0.3 次。這不是錦上添花,而是 Agent 能否穩定運作的生死線。
Structured Output,是每一個 AI 工程師在走出 Prototype 前必須掌握的核心技能。
---

二、概念精講

Structured Output 的本質,是在 LLM 的輸出與下游系統之間建立一道格式契約:你定義好資料的形狀,LLM 必須按照這個形狀輸出,否則系統拒絕接受。
實現這道契約,有三個層次:

Layer 1:語法保證(Syntactic Guarantee)
  LLM 輸出必須是合法 JSON
  工具:JSON Mode、Outlines 約束解碼
       |
       v
Layer 2:結構保證(Schema Guarantee)
  輸出必須符合預定 Schema(欄位名稱、型別、必填欄位)
  工具:OpenAI Strict Mode、Anthropic Tool Use、Pydantic
       |
       v
Layer 3:語意保證(Semantic Guarantee)
  值本身必須符合業務邏輯(金額不能為負、日期不能是過去)
  工具:Pydantic Validator、自訂商業邏輯檢查
三種主流實作方式對比:

方式 A:Provider Strict Mode(最可靠)
  使用 OpenAI response_format: json_schema + strict: true
  原理:Context-Free Grammar 引擎在 token 生成層直接攔截
  成功率:100% 結構符合(gpt-4o-2024-08-06 以後)
  限制:僅適用特定模型,parallel tool calls 不支援

方式 B:Pydantic + with_structured_output(最彈性)
  LangChain 統一介面,自動選擇最佳策略
  支援跨模型(OpenAI / Anthropic / 本地模型)
  成功率:97%(含自動 retry)

方式 C:約束解碼(Outlines / llama.cpp grammar)
  Token 層級強制,適合本地模型部署
  原理:有限狀態機(FSM)過濾非法 token
  成功率:100%(但需自行部署推論服務)
---

三、實戰場景

場景 1:Agent Pipeline 的中間節點輸出
在多步驟 Agent 中,每個節點的輸出都是下一個節點的輸入。若步驟 A 的 LLM 輸出是自由文字,步驟 B 就必須做脆弱的字串解析。改用 Structured Output 後,每個節點輸出明確的 Pydantic 物件,整個 Pipeline 的穩定性大幅提升。
場景 2:資料擷取(Data Extraction)
將非結構化文件(合約 PDF、新聞稿、客服對話)轉換為結構化資料庫記錄。Structured Output 確保每次擷取的欄位完整、型別正確,可直接寫入資料庫,無需人工校驗。
場景 3:Function Calling 參數產生
Agent 決定呼叫哪個工具時,工具的參數必須精確。透過 Pydantic Schema 定義工具的輸入格式,LLM 被強制按照這個 Schema 填入參數,錯誤呼叫率從 18% 降至接近 0。
---

四、關鍵步驟

以 Python + LangChain + OpenAI 為例,建立生產級 Structured Output Pipeline:
Step 1:用 Pydantic 定義輸出 Schema
python
from pydantic import BaseModel, Field
from typing import Literal, List

class ResearchReport(BaseModel):
    title: str = Field(description="報告標題,不超過 50 字")
    summary: str = Field(description="核心結論摘要,100-200 字")
    confidence: float = Field(
        ge=0.0, le=1.0,
        description="資訊可信度,0.0 為極低,1.0 為極高"
    )
    key_findings: List[str] = Field(
        description="3-5 條關鍵發現,每條不超過 30 字"
    )
    category: Literal["bullish", "bearish", "neutral"] = Field(
        description="市場情緒分類"
    )
Step 2:建立結構化 LLM Chain
python
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
structured_llm = llm.with_structured_output(
    ResearchReport,
    method="json_schema",
    strict=True
)

result = structured_llm.invoke("分析台積電 2026Q1 財報表現")
print(result.title)       # 直接存取欄位,無需解析
print(result.confidence)  # 型別已驗證,安全使用
Step 3:加入 Semantic Validator
python
from pydantic import field_validator

class ResearchReport(BaseModel):
    key_findings: List[str] = Field(description="3-5 條關鍵發現")

    @field_validator('key_findings')
    @classmethod
    def validate_findings_count(cls, v):
        if len(v) < 3 or len(v) > 5:
            raise ValueError(f'key_findings 必須有 3-5 條,實際收到 {len(v)} 條')
        return v
Step 4:建立 Retry 機制
python
from langchain_core.output_parsers import PydanticOutputParser
from langchain.output_parsers import RetryOutputParser

base_parser = PydanticOutputParser(pydantic_object=ResearchReport)
retry_parser = RetryOutputParser.from_llm(
    parser=base_parser,
    llm=llm,
    max_retries=2  # 驗證失敗時,帶著錯誤訊息重新詢問 LLM
)
Step 5:整合進 Agent Pipeline
python
from langchain_core.runnables import RunnablePassthrough

pipeline = (
    RunnablePassthrough()
    | analysis_prompt
    | structured_llm
    | validate_business_logic
)

try:
    report = pipeline.invoke({"company": "TSMC", "period": "2026Q1"})
except ValidationError as e:
    logger.error(f"Structured output validation failed: {e}")
    report = fallback_report()
---

五、常見誤區

誤區 1:JSON Mode 等於 Structured Output
JSON Mode 只保證輸出是合法 JSON,不保證欄位完整性或型別正確。你要的欄位可能缺失,數字欄位可能被輸出為字串。2026 年的最佳實踐是直接用 Strict Mode + Schema,JSON Mode 已被視為遺留方案。
誤區 2:Schema 越簡單越好
Schema 的欄位描述(Field description)直接成為 LLM 的提示。描述越清晰,LLM 填入的值越準確。「price: float」和「price: float = Field(description='商品售價,單位為新台幣,必須大於 0')」的輸出品質天差地別。Schema 本身就是 Prompt 工程的一部分。
誤區 3:Structured Output 後就不需要驗證
Provider Strict Mode 只解決結構問題,不解決語意問題。LLM 可能輸出一個格式完全正確但值荒謬的物件(如 confidence: 0.99 對一個完全沒有資料支撐的結論)。生產環境必須在 Schema 驗證之上,疊加業務邏輯的語意驗證。
誤區 4:Retry 次數越多越好
無限制的 Retry 會在模型持續出錯時造成成本爆炸。建議最多 2-3 次 Retry,超過後觸發降級策略(返回部分結果、轉人工處理、或輸出空值加警報),而非無限重試。
---

六、延伸學習

Instructor(Python):目前最受歡迎的 Structured Output 工具庫,封裝了 OpenAI / Anthropic / Gemini 的結構化輸出,並內建 Pydantic 驗證與自動 Retry,是快速導入生產環境的首選。
Outlines:基於有限狀態機的約束解碼框架,適合本地模型部署。若你的場景需要 100% 結構保證且無法使用雲端 API,Outlines 是目前最成熟的解決方案。
LangGraph 的 TypedDict State:在多 Agent 系統中,LangGraph 用 TypedDict 定義整個工作流的共享狀態,結合 Structured Output 可確保每個節點的輸出型別安全,是打造生產級 Multi-Agent 系統的基礎。
Semantic Kernel(Microsoft):企業級 AI 框架,內建結構化輸出的 Prompt Template 系統,並提供跨語言(Python / C# / Java)支援,適合大型企業整合既有系統。
---

References

---
本文為 OpenClaw Skills 深度研究系列第 11 篇,每日 20:00 更新。