用 Python 函數來檢查模型輸出的 JSON 是否符合 API 定義,可以直接在 5090 訓練完後,自動過濾掉那些「亂寫 API 參數」的不合格模型。
針對您的 2x RTX 5090 訓練任務,我們需要一個嚴格的驗證函數。結構化數據微調(Function Calling)最怕的就是模型「看起來在寫 JSON,但 Key 寫錯了」或是「參數型別不對」。
我們可以使用 Python 的pydantic 庫,這是工業界定義 API 規範(Schema)的標準工具。它能自動幫您檢查模型輸出的 JSON 是否完全符合您的 Calendar 或 Database 定義。1. 安裝必要函數庫
</>Bash
pip install pydantic
2. 定義 API 規範與檢查函數 (validator.py)
這段代碼定義了兩個工具的標準格式,並提供一個 check_model_output 函數供訓練後的評測使用。
</>Python
import json
from typing import Union, List
from pydantic import BaseModel, Field, ValidationError
# --- 第一步:定義 API 的精確結構 ---
class CalendarEvent(BaseModel):
"""新增行事曆的參數定義"""
title: str = Field(..., description="會議標題")
start_time: str = Field(..., pattern=r"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}", description="格式: YYYY-MM-DDTHH:MM")
class DatabaseQuery(BaseModel):
"""查詢數據庫的參數定義"""
query: str = Field(..., description="SQL 或 查詢關鍵字")
limit: int = Field(default=10, ge=1, le=100)
# 整合所有可用工具
class ToolCall(BaseModel):
tool: str
params: Union[CalendarEvent, DatabaseQuery]
# --- 第二步:編寫檢查邏輯 ---
def check_model_output(raw_output: str):
"""
檢查模型輸出的字串是否為合法的 JSON 且符合 API 定義
"""
try:
# 1. 嘗試解析 JSON 格式
# 處理模型可能在 JSON 前後加了 Markdown 標籤 (如 ```json ... ```)
clean_text = raw_output.replace("```json", "").replace("```", "").strip()
data = json.loads(clean_text)
# 2. 驗證工具名稱與參數是否匹配
validated_call = ToolCall.model_validate(data)
# 3. 額外的邏輯檢查:確保 tool 與 params 類型一致
if validated_call.tool == "add_calendar_event" and not isinstance(validated_call.params, CalendarEvent):
return False, "工具與參數類型不匹配 (應為 CalendarEvent)"
if validated_call.tool == "query_database" and not isinstance(validated_call.params, DatabaseQuery):
return False, "工具與參數類型不匹配 (應為 DatabaseQuery)"
return True, f"✅ 合格: {validated_call.tool}"
except json.JSONDecodeError:
return False, "❌ 錯誤: 無效的 JSON 格式"
except ValidationError as e:
return False, f"❌ 錯誤: 參數缺失或型別錯誤 ({e.json()})"
except Exception as e:
return False, f"❌ 異常: {str(e)}"
# --- 測試範例 ---
# model_resp = '{"tool": "add_calendar_event", "params": {"title": "5090 訓練總結", "start_time": "2026-03-04T10:00"}}'
# success, msg = check_model_output(model_resp)
# print(msg)
3. 如何在 5090 訓練流程中使用?
在您的 Trainer 評估階段(Evaluation Loop),您可以調用這個函數:
- 統計「格式正確率」 (Format Accuracy):如果 100 條測試數據中,有 95 條通過
check_model_output,代表模型已經具備助理的基本素質。 - 早期停止 (Early Stopping):如果格式正確率已經達到 100%,即使 Loss 還在下降,也可以考慮停止訓練,防止模型過擬合(Overfitting)導致說話變得很死板。
4. 針對「行動派助理」的推論建議 (Inference)
由於使用的是兩張 5090,推論速度極快,您可以實作 「自我修正機制 (Self-Correction)」:
- 如果模型第一次輸出的 JSON 沒通過
check_model_output。 - 自動將錯誤訊息餵回給模型:「你輸出的 JSON 格式錯誤(缺少 start_time),請重新輸出」。
- 5090 的算力足以讓這種「二次確認」在 0.5 秒內完成,這會讓您的助理在實際應用中顯得無比聰明且可靠。
最後的技術建議
在 2026 年的今天,Blackwell 架構的 5090 非常適合跑 FP8 精度 的推論。


















