การควบคุมค่าใช้จ่าย AI API เป็นสิ่งสำคัญมากสำหรับองค์กรที่ใช้ LLM ใน Production บทความนี้จะสอนการสร้าง Cost Control Dashboard ที่ช่วยติดตามงบประมาณและส่งการแจ้งเตือนอัตโนมัติเมื่อใช้งานเกินกำหนด

ตารางเปรียบเทียบค่าใช้จ่าย AI API ปี 2026

ก่อนเริ่มสร้าง Dashboard เรามาดูค่าใช้จ่ายจริงของแต่ละโมเดลกัน:

ค่าใช้จ่ายจริงต่อเดือน (10M Tokens)

โมเดลค่าใช้จ่าย/เดือนหมายเหตุ
Claude Sonnet 4.5$150,000แพงที่สุด
GPT-4.1$80,000ราคากลาง-สูง
Gemini 2.5 Flash$25,000ราคาปานกลาง
DeepSeek V3.2$4,200ประหยัดที่สุด

จะเห็นได้ว่าการเลือกโมเดลที่เหมาะสมกับงานสามารถประหยัดได้ถึง 97% หากต้องการลดต้นทุนอย่างมาก สามารถ สมัครที่นี่ เพื่อใช้งาน DeepSeek V3.2 ผ่าน HolySheep AI ด้วยอัตรา $0.42/MTok พร้อม Latency ต่ำกว่า 50ms

สร้าง Cost Tracking System พื้นฐาน

เริ่มต้นด้วยการสร้างระบบติดตามค่าใช้จ่ายแบบง่ายที่สุด:

import requests
from datetime import datetime, timedelta
import time

class AICostTracker:
    """ระบบติดตามค่าใช้จ่าย AI API แบบ Real-time"""
    
    # กำหนดราคาต่อ Million Tokens (Output) - ปี 2026
    MODEL_PRICES = {
        "gpt-4.1": 8.00,           # USD/MTok
        "claude-sonnet-4.5": 15.00, # USD/MTok
        "gemini-2.5-flash": 2.50,   # USD/MTok
        "deepseek-v3.2": 0.42       # USD/MTok
    }
    
    def __init__(self, api_key, base_url="https://api.holysheep.ai/v1"):
        self.api_key = api_key
        self.base_url = base_url
        self.total_spent = 0.0
        self.request_count = 0
        self.usage_by_model = {}
        
    def calculate_cost(self, model: str, output_tokens: int) -> float:
        """คำนวณค่าใช้จ่ายจากจำนวน Output Tokens"""
        price_per_mtok = self.MODEL_PRICES.get(model, 0)
        cost = (output_tokens / 1_000_000) * price_per_mtok
        return round(cost, 6)  # ความแม่นยำ 6 หลัก
    
    def track_request(self, model: str, output_tokens: int):
        """บันทึกค่าใช้จ่ายจาก Request"""
        cost = self.calculate_cost(model, output_tokens)
        self.total_spent += cost
        self.request_count += 1
        
        # บันทึกแยกตามโมเดล
        if model not in self.usage_by_model:
            self.usage_by_model[model] = {"cost": 0, "requests": 0, "tokens": 0}
        
        self.usage_by_model[model]["cost"] += cost
        self.usage_by_model[model]["requests"] += 1
        self.usage_by_model[model]["tokens"] += output_tokens
        
        return cost
    
    def call_api(self, model: str, prompt: str) -> dict:
        """เรียก API และบันทึกค่าใช้จ่าย"""
        endpoint = f"{self.base_url}/chat/completions"
        headers = {
            "Authorization": f"Bearer {self.api_key}",
            "Content-Type": "application/json"
        }
        
        payload = {
            "model": model,
            "messages": [{"role": "user", "content": prompt}],
            "max_tokens": 4096
        }
        
        response = requests.post(endpoint, headers=headers, json=payload)
        response.raise_for_status()
        
        result = response.json()
        output_tokens = result.get("usage", {}).get("completion_tokens", 0)
        cost = self.track_request(model, output_tokens)
        
        result["cost"] = cost
        return result
    
    def get_summary(self) -> dict:
        """สรุปค่าใช้จ่ายทั้งหมด"""
        return {
            "total_spent": round(self.total_spent, 4),
            "total_requests": self.request_count,
            "by_model": self.usage_by_model
        }

วิธีใช้งาน

tracker = AICostTracker(api_key="YOUR_HOLYSHEEP_API_KEY") result = tracker.call_api("deepseek-v3.2", "สวัสดีครับ") print(f"ค่าใช้จ่าย: ${result['cost']:.6f}") print(f"สรุปทั้งหมด: {tracker.get_summary()}")

สร้าง Alert System สำหรับแจ้งเตือนงบประมาณ

หลังจากมีระบบติดตามแล้ว ต่อไปจะสร้างระบบ Alert ที่แจ้งเตือนเมื่อใช้งานเกินงบ:

from dataclasses import dataclass
from enum import Enum
from typing import Callable, Optional
import logging

class AlertLevel(Enum):
    """ระดับความรุนแรงของการแจ้งเตือน"""
    INFO = "info"           # ใช้งานไป 50%
    WARNING = "warning"     # ใช้งานไป 75%
    CRITICAL = "critical"   # ใช้งานไป 90%
    EXCEEDED = "exceeded"   # เกินงบประมาณ

@dataclass
class BudgetAlert:
    """ข้อมูลการแจ้งเตือน"""
    level: AlertLevel
    message: str
    current_spent: float
    budget: float
    percentage: float
    timestamp: datetime

class BudgetAlertSystem:
    """ระบบแจ้งเตือนงบประมาณ AI API"""
    
    def __init__(self, monthly_budget: float):
        self.monthly_budget = monthly_budget
        self.alerts = []
        self.alert_callbacks = []
        self.spent_history = []
        
        # กำหนด Threshold สำหรับแต่ละระดับ
        self.thresholds = {
            AlertLevel.INFO: 0.50,
            AlertLevel.WARNING: 0.75,
            AlertLevel.CRITICAL: 0.90,
            AlertLevel.EXCEEDED: 1.00
        }
        
    def add_alert_callback(self, callback: Callable[[BudgetAlert], None]):
        """เพิ่มฟังก์ชันสำหรับรับการแจ้งเตือน"""
        self.alert_callbacks.append(callback)
        
    def check_budget(self, current_spent: float, model: Optional[str] = None):
        """ตรวจสอบงบประมาณและส่ง Alert หากจำเป็น"""
        percentage = current_spent / self.monthly_budget
        
        alert_to_send = None
        
        for level in [AlertLevel.EXCEEDED, AlertLevel.CRITICAL, 
                      AlertLevel.WARNING, AlertLevel.INFO]:
            threshold = self.thresholds[level]
            
            # ตรวจสอบว่าถึง Threshold และยังไม่เคยแจ้งระดับนี้
            if percentage >= threshold:
                existing = any(a.level == level for a in self.alerts 
                             if a.timestamp.date() == datetime.now().date())
                
                if not existing:
                    model_msg = f" (โมเดล: {model})" if model else ""
                    alert = BudgetAlert(
                        level=level,
                        message=f"{level.value.upper()}: ใช้งานไป {percentage*100:.1f}% "
                               f"ของงบ ${self.monthly_budget:,.2f}{model_msg}",
                        current_spent=current_spent,
                        budget=self.monthly_budget,
                        percentage=percentage,
                        timestamp=datetime.now()
                    )
                    self.alerts.append(alert)
                    alert_to_send = alert
                    break
        
        # เรียก Callback ทั้งหมด
        if alert_to_send:
            for callback in self.alert_callbacks:
                try:
                    callback(alert_to_send)
                except Exception as e:
                    logging.error(f"Alert callback error: {e}")
        
        # บันทึกประวัติ
        self.spent_history.append({
            "timestamp": datetime.now(),
            "spent": current_spent,
            "percentage": percentage
        })
        
        return alert_to_send
    
    def should_block_request(self, current_spent: float, 
                            estimated_cost: float) -> bool:
        """ตรวจสอบว่าควร Block Request หรือไม่"""
        # Block ถ้า Request นี้จะทำให้เกินงบ
        return (current_spent + estimated_cost) > self.monthly_budget
    
    def get_daily_usage(self) -> dict:
        """ดึงข้อมูลการใช้งานรายวัน"""
        today = datetime.now().date()
        today_spending = sum(
            h["spent"] for h in self.spent_history 
            if h["timestamp"].date() == today
        )
        
        avg_daily = self.monthly_budget / 30
        
        return {
            "today_spent": today_spending,
            "monthly_budget": self.monthly_budget,
            "remaining": self.monthly_budget - today_spending,
            "avg_daily_budget": avg_daily,
            "is_on_track": today_spending <= (avg_daily * datetime.now().day)
        }

ตัวอย่างการใช้งาน Alert System

def handle_alert(alert: BudgetAlert): """ฟังก์ชันจัดการเมื่อได้รับการแจ้งเตือน""" emoji = { AlertLevel.INFO: "ℹ️", AlertLevel.WARNING: "⚠️", AlertLevel.CRITICAL: "🚨", AlertLevel.EXCEEDED: "🛑" } print(f"{emoji[alert.level]} {alert.message}") # ส่ง Email, Slack, LINE ตามระดับความรุนแรง if alert.level in [AlertLevel.CRITICAL, AlertLevel.EXCEEDED]: # ส่งการแจ้งเตือนฉุกเฉิน print("🚨 ส่งการแจ้งเตือนฉุกเฉินไปยังทีม!")

ตั้งค่าระบบแจ้งเตือน

alert_system = BudgetAlertSystem(monthly_budget=1000.0) # $1,000/เดือน alert_system.add_alert_callback(handle_alert)

ทดสอบการแจ้งเตือน

alert_system.check_budget(500.0) # 50% - INFO alert_system.check_budget(800.0) # 80% - WARNING alert_system.check_budget(950.0) # 95% - CRITICAL alert_system.check_budget(1100.0) # 110% - EXCEEDED

สร้าง Dashboard ด้วย Dash/Streamlit

หากต้องการ Dashboard แบบ Interactive สามารถใช้ Streamlit หรือ Plotly Dash ได้:

# dash_dashboard.py
import dash
from dash import dcc, html
from dash.dependencies import Input, Output
import plotly.express as px
import plotly.graph_objects as go
from datetime import datetime, timedelta
import random

สร้าง Dash App

app = dash.Dash(__name__)

ข้อมูลตัวอย่าง (ใน Production ดึงจาก Database)

def generate_sample_data(): """สร้างข้อมูลตัวอย่างสำหรับแสดงผล""" data = [] models = ["deepseek-v3.2", "gemini-2.5-flash", "gpt-4.1", "claude-sonnet-4.5"] for i in range(30): for model in models: data.append({ "date": (datetime.now() - timedelta(days=29-i)).strftime("%Y-%m-%d"), "model": model, "requests": random.randint(100, 1000), "tokens": random.randint(50000, 500000), "cost": random.uniform(0.5, 50.0) }) return data

ราคาต่อ MTok (2026)

MODEL_PRICES = { "gpt-4.1": 8.00, "claude-sonnet-4.5": 15.00, "gemini-2.5-flash": 2.50, "deepseek-v3.2": 0.42 }

Layout ของ Dashboard

app.layout = html.Div([ html.H1("AI API Cost Control Dashboard", style={"textAlign": "center", "color": "#2c3e50"}), # Summary Cards html.Div([ html.Div([ html.H3("ค่าใช้จ่ายรวมเดือนนี้"), html.H2(id="total-cost", children="$0.00", style={"color": "#e74c3c"}) ], className="card"), html.Div([ html.H3("จำนวน Requests"), html.H2(id="total-requests", children="0") ], className="card"), html.Div([ html.H3("งบประมาณคงเหลือ"), html.H2(id="remaining-budget", children="$0.00", style={"color": "#27ae60"}) ], className="card"), ], className="row"), # Charts html.Div([ html.Div([ dcc.Graph(id="cost-by-model") ], className="six columns"), html.Div([ dcc.Graph(id="daily-cost-trend") ], className="six columns"), ], className="row"), # Real-time Updates dcc.Interval( id="interval-component", interval=60*1000, # อัปเดตทุก 1 นาที n_intervals=0 ) ], style={"padding": "20px"}) @app.callback( [Output("total-cost", "children"), Output("total-requests", "children"), Output("remaining-budget", "children")], Input("interval-component", "n_intervals") ) def update_summary(n): """อัปเดตข้อมูลสรุป""" # ใน Production คำนวณจากข้อมูลจริง total_cost = 543.21 total_requests = 12345 budget = 1000.00 return ( f"${total_cost:,.2f}", f"{total_requests:,}", f"${budget - total_cost:,.2f}" ) if __name__ == "__main__": app.run_server(debug=True, port=8050)

Best Practices สำหรับ Cost Optimization

ข้อผิดพลาดที่พบบ่อยและวิธีแก้ไข

1. ค่าใช้จ่ายสูงผิดปกติจาก Token Count ผิด

สาเหตุ: ใช้ค่า Input Tokens แทน Output Tokens ทำให้คำนวณค่าใช้จ่ายผิด

# ❌ วิธีผิด - คำนวณจาก Input Tokens
def calculate_cost_wrong(model: str, usage: dict) -> float:
    price = MODEL_PRICES[model]  # $8/MTok
    # ผิด! ใช้ input_tokens
    return (usage["input_tokens"] / 1_000_000) * price

✅ วิธีถูก - คำนวณจาก Output Tokens เท่านั้น

def calculate_cost_correct(model: str, usage: dict) -> float: price = MODEL_PRICES[model] # $8/MTok # ถูกต้อง! ใช้ completion_tokens (Output) return (usage["completion_tokens"] / 1_000_000) * price

หรือใช้ฟังก์ชันที่มาจาก API Response

response = openai.ChatCompletion.create( model="gpt-4.1", messages=[{"role": "user", "content": "Hello"}] )

ดึงค่าจาก response.usage โดยตรง

actual_usage = response["usage"] print(f"Input: {actual_usage['prompt_tokens']}") print(f"Output: {actual_usage['completion_tokens']}") print(f"Total: {actual_usage['total_tokens']}")

2. API Key หมดอายุหรือหมด Limit โดยไม่รู้ตัว

สาเหตุ: ไม่ตรวจสอบ Error Response และไม่มี Fallback

import requests
from requests.exceptions import RequestException

def safe_api_call(tracker, model: str, prompt: str) -> dict:
    """เรียก API แบบปลอดภัยพร้อมจัดการ Error"""
    
    try:
        result = tracker.call_api(model, prompt)
        return {"success": True, "data": result}
        
    except requests.exceptions.HTTPError as e:
        error_code = e.response.status_code
        
        if error_code == 401:
            # ❌ API Key ไม่ถูกต้อง
            raise Exception("API Key ไม่ถูกต้อง กรุณาตรวจสอบ Key")
            
        elif error_code == 403:
            # ❌ เกิน Rate Limit หรือหมด Quota
            # รอสักครู่แล้วลองใหม่
            import time
            time.sleep(60)  # รอ 1 นาที
            return safe_api_call(tracker, model, prompt)  # Retry
            
        elif error_code == 429:
            # ❌ Rate Limited
            retry_after = int(e.response.headers.get("Retry-After", 60))
            time.sleep(retry_after)
            return safe_api_call(tracker, model, prompt)
            
        else:
            raise
            
    except RequestException as e:
        # เครือข่ายมีปัญหา
        time.sleep(5)
        return safe_api_call(tracker, model, prompt)

ตรวจสอบ Quota ก่อนเรียกใช้งาน

def check_remaining_quota(api_key: str) -> dict: """ตรวจสอบ Quota ที่เหลือ""" headers = {"Authorization": f"Bearer {api_key}"} response = requests.get( "https://api.holysheep.ai/v1/quota", headers=headers ) return response.json()

3. ไม่กำหนด Max Tokens ทำให้ Response ยาวเกินจำเป็น

สาเหตุ: Response ที่ยาวมากๆ ทำให้ค่าใช้จ่ายพุ่งสูงโดยไม่จำเป็น

# ❌ วิธีผิด - ไม่จำกัด Output Tokens
payload = {
    "model": "gpt-4.1",
    "messages": [{"role": "user", "content": prompt}]
    # ไม่มี max_tokens - อาจได้ Response ยาวมาก
}

✅ วิธีถูก - กำหนด max_tokens ให้เหมาะสมกับงาน

def get_optimal_max_tokens(task_type: str) -> int: """กำหนด Max Tokens ตามประเภทงาน""" limits = { "short_answer": 150, # คำตอบสั้น "explanation": 500, # อธิบายระดับกลาง "detailed_report": 2000, # รายงานละเอียด "code_generation": 1000, # เขียนโค้ด "translation": 800, # แปลภาษา } return limits.get(task_type, 500)

ใช้งาน

payload = { "model": "deepseek-v3.2", # ใช้โมเดลราคาถูก "messages": [{"role": "user", "content": prompt}], "max_tokens": get_optimal_max_tokens("short_answer"), "temperature": 0.7 # ลด temperature เพื่อให้คำตอบกระชับขึ้น }

ประหยัดได้ถึง 80-90% จากการกำหนด Max Tokens ที่เหมาะสม

4. ไม่ใช้ Caching ทำให้เรียก API ซ้ำๆ กับคำถามเดิม

สาเหตุ: ระบบถาม-ตอบ เดียวกันหลายครั้งโดยไม่จำ Response เดิม

import hashlib
from functools import lru_cache

class APICache:
    """ระบบ Cache สำหรับลดการเรียก API ซ้ำ"""
    
    def __init__(self):
        self.cache = {}
        self.hit_count = 0
        self.miss_count = 0
    
    def _generate_key(self, model: str, prompt: str) -> str:
        """สร้าง Cache Key จาก Model และ Prompt"""
        content = f"{model}:{prompt}"
        return hashlib.sha256(content.encode()).hexdigest()
    
    def get(self, model: str, prompt: str) -> str | None:
        """ดึง Response จาก Cache"""
        key = self._generate_key(model, prompt)
        result = self.cache.get(key)
        
        if result:
            self.hit_count += 1
            print(f"✅ Cache HIT (Total: {self.hit_count})")
            return result
        else:
            self.miss_count += 1
            print(f"❌ Cache MISS (Total: {self.miss_count})")
            return None
    
    def set(self, model: str, prompt: str, response: str):
        """บันทึก Response ลง Cache"""
        key = self._generate_key(model, prompt)
        self.cache[key] = response
    
    def get_stats(self) -> dict:
        """ดูสถิติ Cache"""
        total = self.hit_count + self.miss_count
        hit_rate = (self.hit_count / total * 100) if total > 0 else 0
        
        return {
            "hits": self.hit_count,
            "misses": self.miss_count,
            "hit_rate": f"{hit_rate:.1f}%"
        }

วิธีใช้งาน

cache = APICache() def smart_api_call(model: str, prompt: str, tracker: AICostTracker): """เรียก API แบบใช้ Cache""" # ตรวจสอบ Cache ก่อ