บทนำ

ในยุคที่โรงงานอุตสาหกรรมต้องเผชิญกับข้อกำหนดด้านคาร์บอนที่เข้มงวดขึ้นทุกวัน การคำนวณและรายงานการปล่อยก๊าซเรือนกระจกกลายเป็นภาระงานที่สำคัญแต่ใช้เวลามาก ในบทความนี้ผมจะแสดงวิธีสร้าง Carbon Accounting Agent ที่ทำงานอัตโนมัติโดยใช้ประโยชน์จากหลายโมเดล LLM เพื่อให้ได้ความแม่นยำสูงสุดและลดต้นทุนให้เหลือน้อยที่สุด สิ่งที่คุณจะได้เรียนรู้ในบทความนี้:

ทำไมต้องใช้ Multi-Model Strategy

การใช้งาน LLM เพียงตัวเดียวสำหรับงาน Carbon Accounting นั้นมีความเสี่ยงหลายประการ โมเดลแต่ละตัวมีจุดแข็งและจุดอ่อนที่แตกต่างกัน Claude Sonnet 4.5 มีความแม่นยำสูงในการวิเคราะห์ข้อมูลเชิงตัวเลข แต่ค่าใช้จ่ายสูงกว่า GPT-4.1 ถึง 87.5% ในขณะที่ Gemini 2.5 Flash ราคาถูกมากแต่ความแม่นยำอาจไม่เพียงพอสำหรับงานที่ต้องการความละเอียดอ่อน ดังนั้นกลยุทธ์ที่ผมใช้ใน Production คือการกำหนด Fallback Chain ที่ชัดเจน: ลองใช้โมเดลราคาถูกก่อน ถ้าไม่ผ่านเกณฑ์คุณภาพจึงค่อย Escalate ไปใช้โมเดลที่แพงกว่า

สถาปัตยกรรมระบบ

ระบบ Carbon Accounting Agent ที่ผมออกแบบประกอบด้วย 3 Layer หลัก: **Layer 1: Data Ingestion** - รับข้อมูลการใช้พลังงานจากหลายแหล่ง เช่น Smart Meter API, SCADA System, และ Excel/CSV Files **Layer 2: Calculation Engine** - คำนวณ Carbon Emission ตาม GHG Protocol โดยใช้ Emission Factor จากแหล่งข้อมูลที่น่าเชื่อถือ **Layer 3: Intelligence Layer** - ใช้ LLM หลายตัวเพื่อเพิ่มประสิทธิภาพ ทั้งการค้นหาข้อมูล การวิเคราะห์ และการสร้างคำแนะนำ

การตั้งค่า HolySheep API

ก่อนจะเริ่มเขียนโค้ด ผมต้องตั้งค่า HolySheep API ก่อน HolySheep AI เป็นแพลตฟอร์มที่รวม LLM หลายตัวไว้ในที่เดียว ราคาประหยัดกว่า OpenAI ถึง 85% และรองรับการจ่ายเงินผ่าน WeChat/Alipay ซึ่งสะดวกมากสำหรับทีมในจีน สมัครที่นี่ แล้วรับเครดิตฟรีเมื่อลงทะเบียน
import requests
import json
from typing import Optional, Dict, Any, List
from dataclasses import dataclass
from enum import Enum
import time

class ModelType(Enum):
    GPT_4_1 = "gpt-4.1"
    CLAUDE_SONNET_4_5 = "claude-sonnet-4.5"
    GEMINI_2_5_FLASH = "gemini-2.5-flash"
    DEEPSEEK_V3_2 = "deepseek-v3.2"

@dataclass
class ModelConfig:
    name: ModelType
    cost_per_mtok: float
    max_tokens: int
    quality_score: float

กำหนดค่า Config ตามราคาจริงจาก HolySheep 2026

MODEL_CONFIGS = { ModelType.GPT_4_1: ModelConfig( name=ModelType.GPT_4_1, cost_per_mtok=8.0, max_tokens=128000, quality_score=0.92 ), ModelType.CLAUDE_SONNET_4_5: ModelConfig( name=ModelType.CLAUDE_SONNET_4_5, cost_per_mtok=15.0, max_tokens=200000, quality_score=0.96 ), ModelType.GEMINI_2_5_FLASH: ModelConfig( name=ModelType.GEMINI_2_5_FLASH, cost_per_mtok=2.50, max_tokens=1000000, quality_score=0.85 ), ModelType.DEEPSEEK_V3_2: ModelConfig( name=ModelType.DEEPSEEK_V3_2, cost_per_mtok=0.42, max_tokens=64000, quality_score=0.88 ), } class HolySheepClient: def __init__(self, api_key: str): self.base_url = "https://api.holysheep.ai/v1" self.headers = { "Authorization": f"Bearer {api_key}", "Content-Type": "application/json" } self.session = requests.Session() self.session.headers.update(self.headers) self.request_count = 0 self.total_cost = 0.0 def chat_completion( self, model: ModelType, messages: List[Dict[str, str]], temperature: float = 0.7, max_tokens: Optional[int] = None ) -> Dict[str, Any]: """เรียก HolySheep API สำหรับ Chat Completion""" endpoint = f"{self.base_url}/chat/completions" payload = { "model": model.value, "messages": messages, "temperature": temperature } if max_tokens: payload["max_tokens"] = max_tokens start_time = time.time() response = self.session.post(endpoint, json=payload) latency = (time.time() - start_time) * 1000 if response.status_code != 200: raise Exception(f"API Error: {response.status_code} - {response.text}") result = response.json() # คำนวณค่าใช้จ่ายจริงจาก Response usage = result.get("usage", {}) prompt_tokens = usage.get("prompt_tokens", 0) completion_tokens = usage.get("completion_tokens", 0) total_tokens = prompt_tokens + completion_tokens cost = (total_tokens / 1_000_000) * MODEL_CONFIGS[model].cost_per_mtok self.request_count += 1 self.total_cost += cost return { "content": result["choices"][0]["message"]["content"], "usage": usage, "latency_ms": latency, "cost_usd": cost } def get_stats(self) -> Dict[str, Any]: return { "total_requests": self.request_count, "total_cost_usd": round(self.total_cost, 4), "avg_cost_per_request": round(self.total_cost / self.request_count, 4) if self.request_count > 0 else 0 }
โค้ดข้างต้นสร้าง Client พื้นฐานสำหรับเรียก HolySheep API ซึ่งรองรับทั้ง GPT-4.1, Claude Sonnet 4.5, Gemini 2.5 Flash และ DeepSeek V3.2 โดยใช้ base_url ที่ถูกต้องตามข้อกำหนด

Emission Factor Retrieval Agent

การดึงข้อมูล Emission Factor เป็นหัวใจสำคัญของระบบ Carbon Accounting Emission Factor คือค่าสัมประสิทธิ์ที่ใช้แปลงข้อมูลการใช้พลังงานเป็นปริมาณ CO2 ที่ปล่อยออกมา ซึ่งมีหลายแหล่งข้อมูลที่ต้องอ้างอิง เช่น IPCC, IEA, หรือข้อมูลเฉพาะของประเทศ Claude Sonnet 4.5 เหมาะมากสำหรับงานนี้เพราะมี Context Window กว้างถึง 200K tokens และมีความแม่นยำสูงในการวิเคราะห์ข้อมูลเชิงตัวเลข ผมจึงตั้งค่าให้ใช้ Claude เป็นโมเดลหลักสำหรับงานดึงข้อมูล Emission Factor
from typing import Dict, Optional, Tuple
from datetime import datetime
import hashlib

ฐานข้อมูล Emission Factor (ตัวอย่าง)

EMISSION_FACTORS_DB = { "coal": { "factor": 2.42, # kg CO2/kWh "unit": "kg CO2/kWh", "source": "IPCC 2006", "confidence": 0.95 }, "natural_gas": { "factor": 0.40, "unit": "kg CO2/kWh", "source": "EPA 2024", "confidence": 0.93 }, "electricity_grid": { "china_east": { "factor": 0.67, "unit": "kg CO2/kWh", "source": "NDRC 2024", "confidence": 0.88 }, "china_north": { "factor": 0.79, "unit": "kg CO2/kWh", "source": "NDRC 2024", "confidence": 0.85 } } } class EmissionFactorAgent: def __init__(self, client: HolySheepClient, cache_ttl_seconds: int = 86400): self.client = client self.cache: Dict[str, Tuple[Any, datetime]] = {} self.cache_ttl = cache_ttl_seconds self.quality_threshold = 0.90 def _get_cache_key(self, energy_type: str, region: str, year: int) -> str: """สร้าง Cache Key จากพารามิเตอร์""" raw = f"{energy_type}:{region}:{year}" return hashlib.md5(raw.encode()).hexdigest() def _is_cache_valid(self, key: str) -> bool: """ตรวจสอบว่า Cache ยัง valid หรือไม่""" if key not in self.cache: return False _, timestamp = self.cache[key] age = (datetime.now() - timestamp).total_seconds() return age < self.cache_ttl def retrieve_factor( self, energy_type: str, region: Optional[str] = None, year: int = 2024 ) -> Dict[str, Any]: """ ดึงข้อมูล Emission Factor พร้อม Multi-Model Fallback Strategy: 1. ลอง DeepSeek V3.2 ก่อน (ถูกที่สุด) 2. ถ้า confidence ต่ำกว่า threshold → ลอง Gemini 2.5 Flash 3. ถ้า confidence ยังต่ำ → ใช้ Claude Sonnet 4.5 """ cache_key = self._get_cache_key(energy_type, region or "default", year) # ตรวจสอบ Cache ก่อน if self._is_cache_valid(cache_key): print(f"[Cache Hit] {cache_key}") return self.cache[cache_key][0] result = self._retrieve_with_fallback(energy_type, region, year) # เก็บลง Cache self.cache[cache_key] = (result, datetime.now()) return result def _retrieve_with_fallback( self, energy_type: str, region: Optional[str], year: int ) -> Dict[str, Any]: """ดึงข้อมูลด้วย Fallback Strategy""" # Model Fallback Chain fallback_chain = [ (ModelType.DEEPSEEK_V3_2, 0.85), (ModelType.GEMINI_2_5_FLASH, 0.90), (ModelType.CLAUDE_SONNET_4_5, 0.95) ] last_error = None for model, quality_threshold in fallback_chain: try: result = self._query_model(model, energy_type, region, year) confidence = result.get("confidence", 0) print(f"[Model: {model.value}] Confidence: {confidence:.2f}") if confidence >= quality_threshold: print(f"[✓] Accepting result from {model.value}") return result else: print(f"[!] Confidence {confidence:.2f} < {quality_threshold}, trying next model...") continue except Exception as e: last_error = e print(f"[✗] {model.value} failed: {e}") continue # ถ้าทุกโมเดลล้มเหลว ใช้ข้อมูลจากฐานข้อมูล print("[⚠] All models failed, using fallback database") return self._get_fallback_factor(energy_type, region, year) def _query_model( self, model: ModelType, energy_type: str, region: Optional[str], year: int ) -> Dict[str, Any]: """ส่ง Query ไปยังโมเดล LLM""" system_prompt = """คุณคือผู้เชี่ยวชาญด้านการคำนวณคาร์บอน ให้ค้นหา Emission Factor จากแหล่งข้อมูลที่น่าเชื่อถือ และระบุ confidence level ของข้อมูล กรุณาตอบเป็น JSON format: { "factor": [number], "unit": "[unit]", "source": "[source name and year]", "confidence": [0-1], "notes": "[additional notes]" }""" user_prompt = f"""ค้นหา Emission Factor สำหรับ: - ประเภทพลังงาน: {energy_type} - ภูมิภาค: {region or 'ทั่วไป'} - ปี: {year} หากไม่พบข้อมูลที่แม่นยำ ให้ระบุค่าประมาณการพร้อม confidence ที่ต่ำลง""" response = self.client.chat_completion( model=model, messages=[ {"role": "system", "content": system_prompt}, {"role": "user", "content": user_prompt} ], temperature=0.3, max_tokens=2000 ) # Parse JSON response try: content = response["content"] # ดึง JSON จาก response (อาจมี markdown wrapper) if "```json" in content: content = content.split("``json")[1].split("``")[0] elif "```" in content: content = content.split("``")[1].split("``")[0] result = json.loads(content.strip()) result["model_used"] = model.value result["latency_ms"] = response["latency_ms"] result["cost_usd"] = response["cost_usd"] return result except json.JSONDecodeError: raise ValueError(f"Failed to parse model response as JSON: {response['content'][:100]}") def _get_fallback_factor( self, energy_type: str, region: Optional[str], year: int ) -> Dict[str, Any]: """ใช้ข้อมูลจากฐานข้อมูลเมื่อโมเดลทำงานไม่ได้""" if energy_type in EMISSION_FACTORS_DB: factor_data = EMISSION_FACTORS_DB[energy_type] if region and isinstance(factor_data, dict) and region in factor_data: data = factor_data[region] elif isinstance(factor_data, dict) and "factor" in factor_data: data = factor_data else: data = factor_data return { "factor": data["factor"], "unit": data["unit"], "source": data["source"], "confidence": data["confidence"] * 0.8, # ลด confidence "model_used": "fallback_db", "latency_ms": 0, "cost_usd": 0, "notes": "Retrieved from fallback database" } raise ValueError(f"Unknown energy type: {energy_type}")
ระบบ Fallback ที่ออกแบบไว้จะทำให้มั่นใจว่างานจะเสร็จสิ้นเสมอ แม้ว่าโมเดลบางตัวจะทำงานไม่ได้ ซึ่งเป็นสิ่งสำคัญมากในระบบ Production ที่ต้องการ Uptime สูง

Carbon Calculation Engine

from dataclasses import dataclass
from typing import List, Optional
from datetime import datetime

@dataclass
class EnergyConsumption:
    source: str  # e.g., "coal", "natural_gas", "electricity_grid"
    amount: float  # kWh หรือหน่วยที่เหมาะสม
    unit: str
    region: Optional[str] = None
    timestamp: datetime = None

@dataclass
class CarbonEmission:
    energy_type: str
    emission_factor: float
    factor_unit: str
    total_emission: float
    emission_unit: str
    source: str
    confidence: float
    calculation_date: datetime

class CarbonCalculator:
    def __init__(self, factor_agent: EmissionFactorAgent):
        self.factor_agent = factor_agent
        
    def calculate(
        self,
        consumption: EnergyConsumption,
        year: int = 2024
    ) -> CarbonEmission:
        """คำนวณ Carbon Emission จากข้อมูลการใช้พลังงาน"""
        
        # ดึง Emission Factor
        factor_data = self.factor_agent.retrieve_factor(
            energy_type=consumption.source,
            region=consumption.region,
            year=year
        )
        
        emission_factor = factor_data["factor"]
        
        # คำนวณ Emission
        # สูตร: Emission (kg CO2) = Energy (kWh) × Emission Factor (kg CO2/kWh)
        total_emission = consumption.amount * emission_factor
        
        return CarbonEmission(
            energy_type=consumption.source,
            emission_factor=emission_factor,
            factor_unit=factor_data["unit"],
            total_emission=total_emission,
            emission_unit="kg CO2",
            source=factor_data["source"],
            confidence=factor_data["confidence"],
            calculation_date=datetime.now()
        )
    
    def calculate_batch(
        self,
        consumptions: List[EnergyConsumption],
        year: int = 2024
    ) -> List[CarbonEmission]:
        """คำนวณหลายรายการพร้อมกัน"""
        return [self.calculate(c, year) for c in consumptions]
    
    def calculate_total(
        self,
        emissions: List[CarbonEmission]
    ) -> Dict[str, Any]:
        """สรุปผลรวมทั้งหมด"""
        total_kg = sum(e.total_emission for e in emissions)
        total_ton = total_kg / 1000
        
        weighted_confidence = sum(
            e.total_emission * e.confidence for e in emissions
        ) / total_kg if total_kg > 0 else 0
        
        return {
            "total_emission_kg": round(total_kg, 2),
            "total_emission_ton": round(total_ton, 2),
            "total_emission_mt_co2": round(total_ton / 1000, 4),
            "weighted_confidence": round(weighted_confidence, 3),
            "item_count": len(emissions),
            "breakdown": [
                {
                    "type": e.energy_type,
                    "emission_kg": round(e.total_emission, 2),
                    "percentage": round(e.total_emission / total_kg * 100, 2)
                }
                for e in sorted(emissions, key=lambda x: x.total_emission, reverse=True)
            ]
        }

Emission Reduction Advisor ด้วย GPT-4.1

หลังจากคำนวณ Carbon Emission เสร็จแล้ว ขั้นตอนถัดไปคือการสร้างคำแนะนำลดคาร์บอน ซึ่งผมใช้ GPT-4.1 เป็นโมเดลหลักเพราะมีความสามารถในการสร้างข้อความที่เป็นประโยชน์และครอบคลุม โดยมีราคาถูกกว่า Claude ถึง 46%
from typing import List, Dict, Any
from dataclasses import dataclass, field

@dataclass
class ReductionRecommendation:
    category: str
    action: str
    description: str
    estimated_reduction_percent: float
    implementation_difficulty: str  # "easy", "medium", "hard"
    estimated_cost_cny: float
    roi_months: int
    priority: int  # 1 = highest

class EmissionReductionAdvisor:
    def __init__(self, client: HolySheepClient):
        self.client = client
        self.industry_knowledge_base = self._load_industry_kb()
        
    def _load_industry_kb(self) -> Dict[str, Any]:
        """โหลดความรู้เฉพาะทางอุตสาหกรรม"""
        return {
            "common_sectors": [
                "steel", "cement", "chemical", "electronics", 
                "textile", "food_processing", "automotive"
            ],
            "best_practices": {
                "high_efficiency_motor": {
                    "reduction_potential": "15-25%",
                    "payback_period": "2-3 years",
                    "cost_range_cny": "50000-200000"
                },
                "solar_installation": {
                    "reduction_potential": "20-40%",
                    "payback_period": "5-7 years",
                    "cost_range_cny": "500000-2000000"
                },
                "heat_recovery": {
                    "reduction_potential": "10-30%",
                    "payback_period": "1-2 years",
                    "cost_range_cny": "30000-150000"
                }
            }
        }
    
    def generate_recommendations(
        self,
        emission_data: Dict[str, Any],
        sector: str,
        target_reduction_percent: float = 30.0
    ) -> List[ReductionRecommendation]:
        """
        สร้างคำแนะนำลดคาร์บอนแบบ Personalized
        
        Strategy:
        - ใช้ GPT-4.1 สำหรับคำแนะนำทั่วไป
        - ถ้าต้องการวิเคราะห์เชิงลึก → ใช้ Claude Sonnet 4.5
        """
        
        prompt = self._build_recommendation_prompt(emission_data, sector, target_reduction_percent)
        
        try:
            # ลองใช้ GPT-4.1 ก่อน
            response = self.client.chat_completion(
                model=ModelType.GPT_4_1,
                messages=[
                    {"role": "system", "content": "คุณคือที่ปรึกษาด้านพลังงานและความยั่งยืนสำหรับโรงงานอุตสาหกรรม"},
                    {"role": "user", "content": prompt}
                ],
                temperature=0.7,
                max_tokens=3000
            )
            
            recommendations = self._parse_recommendations(response["content"])
            
            # ตรวจสอบคุณภาพ
            if self._validate_recommendations(recommendations, target_reduction_percent):
                return recommendations
            else:
                # Fallback ไปใช้ Claude สำหรับคำแนะนำที่มีคุณภาพสูงกว่า
                return self._generate_with_claude(emission_data, sector, target_reduction_percent)
                
        except Exception as e:
            print(f"[Warning] GPT-4.1 failed: {e}, trying Claude...")
            return self._generate_with_claude(emission_data, sector, target_reduction_percent)
    
    def