หลายคนที่ใช้ AI API คงเคยเจอปัญหาแบบนี้ คือส่งคำถามไปแล้วได้คำตอบกลับมาเป็นข้อความยาวๆ อ่านยาก แถมจะเอาไปใช้ต่อก็ลำบาก Pydantic จะช่วยแก้ปัญหานี้ได้ เพราะมันจะบอก AI ว่าต้องการข้อมูลแบบไหน แล้วมันจะตรวจสอบให้อัตโนมัติว่าข้อมูลถูกต้องหรือไม่
Pydantic คืออะไร
Pydantic เป็นไลบรารีภาษา Python ที่ทำหน้าที่ตรวจสอบและแปลงข้อมูลให้เป็นระเบียบ ลองนึกภาพว่าคุณกำลังรับข้อมูลจาก AI ซึ่งเปรียบเสมือนกล่องดำ ข้อมูลที่ได้ออกมาอาจไม่ตรงตามที่ต้องการ Pydantic จะเป็นตัวกรองที่คอยตรวจสอบว่าข้อมูลถูกรูปแบบหรือไม่
เครื่องมือที่ต้องเตรียม
ก่อนเริ่มต้น ให้ติดตั้งโปรแกรมและไลบรารีที่จำเป็น เปิดหน้าต่าง Terminal หรือ Command Prompt แล้วพิมพ์คำสั่งติดตั้งดังนี้
pip install pydantic openai python-dotenv
ในการเรียกใช้ AI API เราจะใช้บริการของ HolySheep AI เพราะมีความเร็วตอบสนองต่ำกว่า 50 มิลลิวินาที แถมอัตราแลกเปลี่ยนถูกมาก คิดเป็นเงินบาทไทยประหยัดได้ถึง 85 เปอร์เซ็นต์ โดยราคาต่อล้านโทเคนเริ่มต้นที่เพียง 0.42 ดอลลาร์สหรัฐ สมัครสมาชิกวันนี้รับเครดิตฟรีทันที
ขั้นตอนที่ 1: สร้างไฟล์กำหนดค่า
สร้างไฟล์ใหม่ชื่อ .env เพื่อเก็บรหัส API โดยไม่ต้องพิมพ์รหัสตรงๆ ในโค้ด ซึ่งเป็นวิธีที่ปลอดภัยกว่า
HOLYSHEEP_API_KEY=YOUR_HOLYSHEEP_API_KEY
จากนั้นสร้างไฟล์ Python ใหม่ชื่อ config.py เพื่ออ่านค่าจากไฟล์ .env
from dotenv import load_dotenv
import os
load_dotenv()
API_KEY = os.getenv("HOLYSHEEP_API_KEY")
BASE_URL = "https://api.holysheep.ai/v1"
ขั้นตอนที่ 2: กำหนดรูปแบบข้อมูลด้วย Pydantic
สมมติว่าคุณต้องการให้ AI วิเคราะห์รีวิวสินค้าแล้วแยกออกมาเป็น คะแนน ข้อดี และข้อเสีย คุณสามารถกำหนดรูปแบบข้อมูลที่ต้องการได้ดังนี้
from pydantic import BaseModel, Field, ValidationError
from typing import Optional
class ProductReview(BaseModel):
rating: int = Field(..., ge=1, le=5, description="คะแนนสินค้า 1-5 ดาว")
pros: list[str] = Field(default_factory=list, description="ข้อดีของสินค้า")
cons: list[str] = Field(default_factory=list, description="ข้อเสียของสินค้า")
summary: str = Field(..., min_length=5, description="สรุปรีวิวสั้นๆ")
recommended: bool = Field(..., description="แนะนำหรือไม่แนะนำ")
class ReviewAnalysis(BaseModel):
reviews: list[ProductReview]
total_reviews: int
average_rating: float
จากโค้ดข้างต้น คุณได้กำหนดโครงสร้างข้อมูลที่ต้องการแล้ว ตัวอย่างเช่น rating ต้องเป็นตัวเลขตั้งแต่ 1 ถึง 5 เท่านั้น ส่วน summary ต้องมีความยาวอย่างน้อย 5 ตัวอักษร ถ้าข้อมูลที่ได้จาก AI ไม่ตรงตามเงื่อนไข Pydantic จะแจ้งข้อผิดพลาดทันที
ขั้นตอนที่ 3: เรียกใช้ AI API และแปลงข้อมูล
ต่อไปจะเป็นการเขียนฟังก์ชันที่ส่งข้อมูลไปให้ AI ประมวลผลแล้วรับผลลัพธ์กลับมาในรูปแบบที่กำหนดไว้
from openai import OpenAI
import json
client = OpenAI(api_key=API_KEY, base_url=BASE_URL)
def analyze_reviews(reviews: list[str]) -> ReviewAnalysis:
prompt = """คุณคือผู้เชี่ยวชาญในการวิเคราะห์รีวิวสินค้า
กรุณาวิเคราะห์รีวิวต่อไปนี้แล้วส่งผลลัพธ์เป็น JSON:
{
"reviews": [
{
"rating": คะแนน 1-5,
"pros": ["ข้อดี1", "ข้อดี2"],
"cons": ["ข้อเสีย1"],
"summary": "สรุปสั้น",
"recommended": true/false
}
],
"total_reviews": จำนวนรีวิวทั้งหมด,
"average_rating": คะแนนเฉลี่ย
}"""
response = client.chat.completions.create(
model="gpt-4.1",
messages=[
{"role": "system", "content": "คุณเป็นผู้ช่วยวิเคราะห์รีวิวสินค้าที่แม่นยำ"},
{"role": "user", "content": f"{prompt}\n\nรีวิว: {reviews}"}
],
response_format={"type": "json_object"}
)
raw_data = json.loads(response.choices[0].message.content)
return ReviewAnalysis(**raw_data)
ตัวอย่างการใช้งาน
reviews = [
"สินค้าคุณภาพดีมาก แต่แพงไปหน่อย จัดส่งเร็ว แนะนำครับ",
"ไม่ค่อยประทับใจ สีไม่ตรงกับในรูป และบรรจุภัณฑ์เสียหาย"
]
result = analyze_reviews(reviews)
print(f"รีวิวทั้งหมด: {result.total_reviews}")
print(f"คะแนนเฉลี่ย: {result.average_rating}")
print(f"แนะนำ: {'ใช่' if result.reviews[0].recommended else 'ไม่'}")
ขั้นตอนที่ 4: จัดการข้อผิดพลาดอย่างมืออาชีพ
ในการใช้งานจริง อาจเกิดปัญหาได้เสมอ เช่น AI ตอบกลับมาในรูปแบบที่ไม่ตรงตามที่กำหนด หรือข้อมูลบางส่วนหายไป การจัดการข้อผิดพลาดจึงสำคัญมาก
def safe_analyze_reviews(reviews: list[str], max_retries: int = 3):
for attempt in range(max_retries):
try:
result = analyze_reviews(reviews)
# ตรวจสอบข้อมูลซ้ำอีกครั้ง
if result.total_reviews != len(reviews):
raise ValueError("จำนวนรีวิวไม่ตรงกัน")
return {"success": True, "data": result}
except ValidationError as e:
print(f"ครั้งที่ {attempt + 1}: ข้อมูลไม่ถูกต้อง - {e}")
if attempt == max_retries - 1:
return {"success": False, "error": "ไม่สามารถวิเคราะห์ได้"}
except Exception as e:
print(f"ครั้งที่ {attempt + 1}: เกิดข้อผิดพลาด - {e}")
if attempt == max_retries - 1:
return {"success": False, "error": str(e)}
return {"success": False, "error": "จำนวนครั้งที่ลองเกินกำหนด"}
วิธีดูผลลัพธ์การทำงาน
เมื่อรันโค้ดแล้ว คุณจะเห็นข้อมูลที่ถูกแยกออกมาเรียบร้อย ตัวอย่างผลลัพธ์ที่ได้
รีวิวทั้งหมด: 2
คะแนนเฉลี่ย: 3.5
แนะนำ: ใช่
ข้อดี: ['คุณภาพดี', 'จัดส่งเร็ว']
ข้อเสีย: ['ราคาสูง', 'สีไม่ตรงกับรูป']
จะเห็นได้ว่าข้อมูลถูกจัดระเบียบเรียบร้อย อ่านเข้าใจง่าย และนำไปใช้ต่อได้ทันที เช่น เก็บลงฐานข้อมูล หรือนำไปแสดงผลบนเว็บไซต์
ข้อผิดพลาดที่พบบ่อยและวิธีแก้ไข
- ข้อผิดพลาด: API Key ไม่ถูกต้อง
แหล่งข้อมูลที่เกี่ยวข้อง
บทความที่เกี่ยวข้อง