學習LLM大語言模型之路(七) - FastAPI 深入解析與實戰(2) : Pydantic

更新於 發佈於 閱讀時間約 10 分鐘

Pydantic :資料驗證的超強幫手

Pydantic 是 Python 中強型別資料驗證與處理的標準工具,特別適合用於 API 的請求 / 回應資料結構驗證。

1️⃣ 資料模型定義(BaseModel)

基本用法:定義一個「資料模型」,自動提供初始化、型別檢查、序列化功能。

from pydantic import BaseModel

class User(BaseModel):
id: int
name: str
is_active: bool = True # 預設值

使用方式:

user = User(id=1, name="Alice")
print(user.model_dump()) # {'id': 1, 'name': 'Alice', 'is_active': True}

2️⃣ 自動驗證(輸入時)

自動驗證資料類型與格式:

user = User(id="123", name="Bob")  # id 自動轉換為 int
print(user.id) # 123

User(id="not_a_number", name="Bob")
# 🚨 ValueError: value is not a valid integer

3️⃣ 輸出轉換(dict / JSON / model_copy)

print(user.model_dump())       # 輸出 Python dict
print(user.model_dump_json()) # 輸出 JSON 字串
new_user = user.model_copy(update={"name": "Charlie"})

4️⃣ 自訂欄位限制(Field)

使用 Field() 來指定:

  • 預設值 / 必填
  • 描述(給 API 文件看)
  • 長度、大小範圍
  • 正則表達式
  • 限制值域
from pydantic import BaseModel, Field

class Product(BaseModel):
name: str = Field(..., min_length=2, max_length=50, description="商品名稱")
price: float = Field(..., gt=0, description="價格需大於 0")
tag: str = Field(default="general", pattern="^[a-z_]+$")

示例輸入:

Product(name="A", price=-5)
# 🚨 name 太短, price < 0 會報錯

print(Product(name="Apple", price=10.5, tag="fruit").model_dump())
# {'name': 'Apple', 'price': 10.5, 'tag': 'fruit'}

5️⃣ Email、URL、IPv4、Decimal...:特化型別驗證

Pydantic 提供大量內建型別:

from typing import Annotated
from pydantic import BaseModel, EmailStr, HttpUrl, IPvAnyAddress, condecimal

class Contact(BaseModel):
email: EmailStr
website: HttpUrl
ip: IPvAnyAddress
score: Annotated[float, condecimal(gt=0, lt=10)]

6️⃣ Optional / Union(選填與多型別)

from typing import Optional, Union

class Example(BaseModel):
note: Optional[str] # 可以是 str 或 None
value: Union[int, str] # 可以是 int 或 str
example = Example(note=None, value=42)
print(example.model_dump())  # {'note': None, 'value': 42}

7️⃣ 巢狀模型(Nested Models)

class Address(BaseModel):
city: str
zipcode: str

class User(BaseModel):
name: str
address: Address

data = {
"name": "Tom",
"address": {
"city": "Taipei",
"zipcode": "100"
}
}
user = User(**data)
print(user.model_dump())  # {'name': 'Tom', 'address': {'city': 'Taipei', 'zipcode': '100'}}
print(user.address.city)  # 'Taipei'
print(user.address.zipcode)  # '100'
# 直接使用嵌套模型
print(user.model_dump_json(indent=2))  # 美化的 JSON 輸出
# 嵌套模型的驗證
# user = User(name="Alice", address={"city": "New York", "zipcode": "10001"})
# print(user.model_dump())  # {'name': 'Alice', 'address': {'city': 'New York', 'zipcode': '10001'}}

8️⃣ 自訂欄位轉換(validator)

使用 @field_validator(v2)或 @validator(v1) 來自訂欄位邏輯:

from pydantic import BaseModel, field_validator

class User(BaseModel):
username: str

@field_validator("username")
@classmethod
def check_lowercase(cls, v):
if not v.islower():
raise ValueError("username 必須為小寫")
return v

# 使用小寫字母的 username
user = User(username="alice")
print(user.model_dump())  # {'username': 'alice'}

# 使用大寫字母的 username
try:
    user = User(username="Alice")
except ValueError as e:
    print(e)  # username 必須為小寫

9️⃣ 模型設定(Config)

自訂模型的行為:

Pydantic v2 的設定方法:使用 model_config

from pydantic import BaseModel

class User(BaseModel):
name: str
age: int

model_config = {
"extra": "forbid", # 禁止多餘欄位
"str_strip_whitespace": True, # 自動去除字串空白
"populate_by_name": True, # 允許用欄位別名填值
}
# 使用 model_config 來設定模型行為
user = User(name="Alice", age=30)
print(user.model_dump())  # {'name': 'Alice', 'age': 30}
print(user.model_config)  # {'extra': 'forbid', 'str_strip_whitespace': True, 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}

常用設定選項說明(v2)

raw-image

🔚 總結表格

raw-image

此篇了解FastAPI最核心的兩大元件:Starlette、Pydantic的另一個Pydantic,Pydantic做為用來處理資料驗證、序列化與型別安全的模型管理工具,使用 Python 類別定義資料模型、自動進行型別轉換與資料驗證、整合 FastAPI 等框架處理 API 輸入/輸出資料、支援巢狀模型、欄位驗證、自訂邏輯等,是個還蠻完善的驗證與處理工具。


留言
avatar-img
留言分享你的想法!
avatar-img
宅D嘉的開發人生
21會員
50內容數
加密貨幣很有趣,遊戲開發也很有趣,AI也有點意思,身為一個跨多領域的軟體工程師,喜歡研究新鮮的事物,歡迎來到我的世界,一起坐上這艘開往未來探索新奇的列車。
宅D嘉的開發人生的其他內容
2025/06/14
FastAPI 是一個基於 Python 3.7+ 的 高效能 Web 框架,其特點是: 超高速(基於 Starlette + Pydantic) 自動產生 Swagger API 文件 嚴謹的資料驗證與型別檢查 原生支援非同步(async / await)
Thumbnail
2025/06/14
FastAPI 是一個基於 Python 3.7+ 的 高效能 Web 框架,其特點是: 超高速(基於 Starlette + Pydantic) 自動產生 Swagger API 文件 嚴謹的資料驗證與型別檢查 原生支援非同步(async / await)
Thumbnail
2025/06/07
目標 ✅ 建立 FastAPI API,讓應用可以透過 REST API 進行 LLM 查詢 ✅ 結合 RAG 技術,提高 LLM 回應的準確度 ✅ 存入及查詢 FAISS 向量資料庫,讓 LLM 檢索外部知識庫
Thumbnail
2025/06/07
目標 ✅ 建立 FastAPI API,讓應用可以透過 REST API 進行 LLM 查詢 ✅ 結合 RAG 技術,提高 LLM 回應的準確度 ✅ 存入及查詢 FAISS 向量資料庫,讓 LLM 檢索外部知識庫
Thumbnail
2025/05/31
AI幻覺(AI Hallucination)是指人工智慧(AI)生成的內容包含錯誤、不準確或完全虛構的資訊,但卻表現得像是真實可靠的答案。這種現象通常發生在大型語言模型(LLM)或其他生成式AI系統中,並可能導致誤導性的結果。
2025/05/31
AI幻覺(AI Hallucination)是指人工智慧(AI)生成的內容包含錯誤、不準確或完全虛構的資訊,但卻表現得像是真實可靠的答案。這種現象通常發生在大型語言模型(LLM)或其他生成式AI系統中,並可能導致誤導性的結果。
看更多
你可能也想看
Thumbnail
常常被朋友問「哪裡買的?」嗎?透過蝦皮分潤計畫,把日常購物的分享多加一個步驟,就能轉換成現金回饋。門檻低、申請簡單,特別適合學生與上班族,讓零碎時間也能創造小確幸。
Thumbnail
常常被朋友問「哪裡買的?」嗎?透過蝦皮分潤計畫,把日常購物的分享多加一個步驟,就能轉換成現金回饋。門檻低、申請簡單,特別適合學生與上班族,讓零碎時間也能創造小確幸。
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
特徵工程是機器學習中的核心技術,通過將原始數據轉換為有意義的特徵,以提升模型的準確性和穩定性。常見的特徵工程方法包括異常值檢測、特徵轉換、特徵縮放、特徵表示、特徵選擇和特徵提取。本文將深入探討這些方法的適用情況及具體實施流程,以幫助讀者有效利用特徵工程來優化機器學習模型表現。
Thumbnail
特徵工程是機器學習中的核心技術,通過將原始數據轉換為有意義的特徵,以提升模型的準確性和穩定性。常見的特徵工程方法包括異常值檢測、特徵轉換、特徵縮放、特徵表示、特徵選擇和特徵提取。本文將深入探討這些方法的適用情況及具體實施流程,以幫助讀者有效利用特徵工程來優化機器學習模型表現。
Thumbnail
在資料分析過程中,透過衡量變數之間的線性或非線性關係,能有效探索數據集,篩選出重要特徵,並進行預測建模。本文介紹瞭如何理解數據、使用相關矩陣找出變數關聯性,以及利用互資訊評估變數之間的依賴程度,幫助資料科學家在建模過程中選擇適當的變數,提升模型效果。
Thumbnail
在資料分析過程中,透過衡量變數之間的線性或非線性關係,能有效探索數據集,篩選出重要特徵,並進行預測建模。本文介紹瞭如何理解數據、使用相關矩陣找出變數關聯性,以及利用互資訊評估變數之間的依賴程度,幫助資料科學家在建模過程中選擇適當的變數,提升模型效果。
Thumbnail
Python資料視覺化在數據分析中扮演關鍵角色,透過視覺化捕捉數據模式、趨勢和異常,透過Matplotlib等工具創建專業圖表變相對簡單和高效。
Thumbnail
Python資料視覺化在數據分析中扮演關鍵角色,透過視覺化捕捉數據模式、趨勢和異常,透過Matplotlib等工具創建專業圖表變相對簡單和高效。
Thumbnail
本文介紹了在進行資料分析時,將類別欄位轉換為數值欄位的方法,包括Label Encoding、One-Hot Encoding、Binary Encoding、Target Encoding和Frequency Encoding。每種方法的應用範例、優缺點和適用場景都有詳細說明。
Thumbnail
本文介紹了在進行資料分析時,將類別欄位轉換為數值欄位的方法,包括Label Encoding、One-Hot Encoding、Binary Encoding、Target Encoding和Frequency Encoding。每種方法的應用範例、優缺點和適用場景都有詳細說明。
Thumbnail
pandas是用於資料操縱和分析的Python軟體庫。它建造在 NumPy 基礎上,並為操縱數值表格和時間序列,提供了資料結構和運算操作。 Pandas 的主要資料結構包含 Series 和 DataFrame 物件,由於 Pandas 本身基 Numpy 所以在使用大量資料運算時效能表現也優於原
Thumbnail
pandas是用於資料操縱和分析的Python軟體庫。它建造在 NumPy 基礎上,並為操縱數值表格和時間序列,提供了資料結構和運算操作。 Pandas 的主要資料結構包含 Series 和 DataFrame 物件,由於 Pandas 本身基 Numpy 所以在使用大量資料運算時效能表現也優於原
Thumbnail
Python是一種易學且功能強大的程式語言,具有直譯、動態語法等特性,並擁有豐富的標準庫。它在各領域如Web開發、數據科學和人工智慧等得到廣泛應用,並被許多大公司如Google和Facebook等使用。Python還有強大的框架、豐富的交互機能、和龐大的社區。
Thumbnail
Python是一種易學且功能強大的程式語言,具有直譯、動態語法等特性,並擁有豐富的標準庫。它在各領域如Web開發、數據科學和人工智慧等得到廣泛應用,並被許多大公司如Google和Facebook等使用。Python還有強大的框架、豐富的交互機能、和龐大的社區。
Thumbnail
當我們在開發一個AI應用服務時, 常常會需要載入大模型, But… 我們總不可能每一次的請求就載入一次模型吧! 這樣太沒有效率了, 也非常的浪費資源, 因此我們通常會希望應用程式啟動時就能夠載入模型, 之後每一次的請求只要讓模型進行運算即可, 那麼在FastAPI的框架中究竟要如何使用呢? 首
Thumbnail
當我們在開發一個AI應用服務時, 常常會需要載入大模型, But… 我們總不可能每一次的請求就載入一次模型吧! 這樣太沒有效率了, 也非常的浪費資源, 因此我們通常會希望應用程式啟動時就能夠載入模型, 之後每一次的請求只要讓模型進行運算即可, 那麼在FastAPI的框架中究竟要如何使用呢? 首
Thumbnail
本文介紹了如何使用資料樞紐分析的功能來整理所需的資料,並設定圖表的中文字型,最後提供了繪圖的程式碼範例。
Thumbnail
本文介紹了如何使用資料樞紐分析的功能來整理所需的資料,並設定圖表的中文字型,最後提供了繪圖的程式碼範例。
Thumbnail
如何用Python為某欄做分類,例如:判斷分數是否及格 
Thumbnail
如何用Python為某欄做分類,例如:判斷分數是否及格 
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News