0Pricing
AI Prompt Engineering · บทเรียน

การตรวจติดตามและแจ้งเตือนสำหรับไปป์ไลน์พรอมต์

แดชบอร์ด การตรวจจับความผิดปกติ และการแจ้งเตือนผู้รับผิดชอบเวรสำหรับพรอมต์ในระบบจริง

การตรวจติดตามและแจ้งเตือนสำหรับไปป์ไลน์พรอมต์ เป็นบทเรียน AI Prompt Engineering ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน AI Prompt Engineering และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส AI Prompt Engineering มีบทเรียนทั้งหมด 4 บทเรียน

กระบวนการพรอมต์ในระบบจริงจำเป็นต้องมีการเฝ้าติดตาม

กระบวนการพรอมต์ในระบบจริงเป็นโครงสร้างพื้นฐาน จึงต้องมีแผงควบคุม การแจ้งเตือน และคู่มือปฏิบัติการเช่นเดียวกับบริการอื่น ๆ หากไม่มีการเฝ้าติดตาม ค่าใช้จ่ายที่พุ่งสูง คุณภาพที่ถดถอย และเวลาแฝงที่เพิ่มขึ้นมากจะไม่ถูกสังเกตจนกว่าผู้ใช้จะร้องเรียนหรือใบเรียกเก็บเงินจะมาถึง

ตัวชี้วัดหลัก: เปอร์เซ็นไทล์ของเวลาแฝง

ติดตามเวลาแฝงที่ P50, P95 และ P99 ค่าเฉลี่ยบดบังพฤติกรรมส่วนปลาย เช่น P99 ที่ 30 วินาทีหมายความว่าผู้ใช้ 1% ต้องรอครึ่งนาที แม้ P50 จะอยู่ที่ 2 วินาทีก็ตาม เวลาแฝงของ LLM มีความผันผวนโดยธรรมชาติ เพราะเพิ่มขึ้นตามความยาวของผลลัพธ์

import time
import statistics
from collections import deque

class LatencyTracker:
    def __init__(self, window_size=1000):
        self.samples = deque(maxlen=window_size)

    def record(self, latency_ms):
        self.samples.append(latency_ms)

    def percentile(self, p):
        if not self.samples:
            return None
        sorted_samples = sorted(self.samples)
        idx = int(len(sorted_samples) * p / 100)
        return sorted_samples[min(idx, len(sorted_samples) - 1)]

    def report(self):
        if not self.samples:
            return {}
        return {
            'count': len(self.samples),
            'p50_ms': self.percentile(50),
            'p95_ms': self.percentile(95),
            'p99_ms': self.percentile(99),
            'max_ms': max(self.samples)
        }

tracker = LatencyTracker()
for ms in [1200, 1100, 1300, 1150, 8500, 1200, 1250, 15000, 1100, 1300]:
    tracker.record(ms)
print(tracker.report())

ตัวชี้วัดค่าใช้จ่ายรายวันบนแผงควบคุม

ติดตามค่าใช้จ่ายเอพีไอรายวันเป็นตัวชี้วัดหลักบนแผงควบคุม คำนวณจากการใช้โทเค็นแบบเรียลไทม์ และเปรียบเทียบกับค่าเฉลี่ยรายสัปดาห์แบบเลื่อน เพื่อค้นหาค่าใช้จ่ายที่พุ่งสูงได้ตั้งแต่เนิ่น ๆ

from datetime import datetime, timedelta
from collections import defaultdict

class CostTracker:
    def __init__(self):
        self.daily_costs = defaultdict(float)  # date: total_cost_usd

    def record_call(self, model, input_tokens, output_tokens):
        pricing = {
            'gpt-4o-mini': (0.15, 0.60),
            'gpt-4o': (2.50, 10.00),
            'claude-opus-4-5': (15.00, 75.00),  # per 1M tokens
            'claude-haiku-4-5': (0.25, 1.25)
        }
        if model not in pricing:
            return
        input_price, output_price = pricing[model]
        cost = (input_tokens / 1_000_000 * input_price +
                output_tokens / 1_000_000 * output_price)
        today = datetime.utcnow().date().isoformat()
        self.daily_costs[today] += cost

    def today_cost(self):
        today = datetime.utcnow().date().isoformat()
        return round(self.daily_costs[today], 4)

    def weekly_avg_daily_cost(self):
        dates = sorted(self.daily_costs.keys())[-7:]
        if not dates:
            return 0
        return round(sum(self.daily_costs[d] for d in dates) / len(dates), 4)

cost_tracker = CostTracker()
cost_tracker.record_call('gpt-4o-mini', 800, 200)
print('Today cost:', cost_tracker.today_cost())

การเฝ้าติดตามอัตราข้อผิดพลาด

ติดตามอัตราข้อผิดพลาดในรูปเปอร์เซ็นต์ของคำขอทั้งหมด ข้อผิดพลาดรวมถึงความล้มเหลวของเอพีไอ การหมดเวลา ผลลัพธ์รูปแบบไม่ถูกต้องที่ไม่ผ่านการแยกวิเคราะห์ และการปฏิเสธของโมเดล ควรแยกประเภทข้อผิดพลาดเพื่อให้การแจ้งเตือนนำไปดำเนินการได้

from collections import Counter

class ErrorRateTracker:
    ERROR_TYPES = [
        'api_error', 'timeout', 'rate_limit',
        'parse_failure', 'model_refusal', 'context_length_exceeded'
    ]

    def __init__(self, window_size=1000):
        self.total = 0
        self.errors = Counter()
        self.recent = deque(maxlen=window_size)  # True=error, False=success

    def record(self, success, error_type=None):
        self.total += 1
        self.recent.append(not success)
        if not success and error_type:
            self.errors[error_type] += 1

    def error_rate(self):
        if not self.recent:
            return 0.0
        return sum(self.recent) / len(self.recent)

    def report(self):
        return {
            'error_rate': round(self.error_rate(), 4),
            'total_requests': self.total,
            'error_breakdown': dict(self.errors.most_common())
        }

err_tracker = ErrorRateTracker()
for i in range(100):
    if i % 20 == 0:
        err_tracker.record(False, 'timeout')
    else:
        err_tracker.record(True)
print(err_tracker.report())

การติดตามแนวโน้มคะแนนคุณภาพ

ติดตามคะแนนคุณภาพเป็นอนุกรมเวลาแบบเลื่อน เพื่อให้มองเห็นแนวโน้มได้ การลดลงของคุณภาพอย่างค่อยเป็นค่อยไปตลอดหลายวันสังเกตได้ยากกว่าการลดลงอย่างรวดเร็ว แต่สามารถทำลายความไว้วางใจของผู้ใช้ได้ไม่แพ้กัน

from datetime import datetime
import statistics

class QualityTrendTracker:
    def __init__(self, window_minutes=60):
        self.window_seconds = window_minutes * 60
        self.samples = []  # (timestamp, score)

    def record(self, score):
        now = time.time()
        self.samples.append((now, score))
        # Purge old samples outside window
        cutoff = now - self.window_seconds
        self.samples = [(t, s) for t, s in self.samples if t >= cutoff]

    def rolling_avg(self):
        if not self.samples:
            return None
        return round(statistics.mean(s for _, s in self.samples), 3)

    def trend(self):
        if len(self.samples) < 10:
            return 'insufficient_data'
        mid = len(self.samples) // 2
        first_half_avg = statistics.mean(s for _, s in self.samples[:mid])
        second_half_avg = statistics.mean(s for _, s in self.samples[mid:])
        delta = second_half_avg - first_half_avg
        if delta > 0.1:
            return 'improving'
        elif delta < -0.1:
            return 'declining'
        return 'stable'

qt = QualityTrendTracker(window_minutes=60)
for score in [4.2, 4.1, 4.0, 3.9, 3.8, 3.7, 3.6, 3.5, 3.4, 3.3]:
    qt.record(score)
print('Rolling avg:', qt.rolling_avg(), '| Trend:', qt.trend())

การออกแบบส่วนแสดงผลบนแผงควบคุม

แผงควบคุมสำหรับการเฝ้าติดตามที่ออกแบบมาอย่างดีจะจัดกลุ่มตัวชี้วัดเป็นส่วนต่าง ๆ อย่างมีเหตุผล โปรดกำหนดส่วนแสดงผลหลักสี่ส่วนที่แผงควบคุมของกระบวนการพรอมต์ทุกแห่งควรมี

DASHBOARD_PANELS = {
    'Panel 1: Availability': [
        'Error rate (%) — last 1h, 24h, 7d',
        'Error type breakdown (timeout vs API vs parse)',
        'P99 latency (alert if > 10s)',
        'Success rate by prompt_id and version'
    ],
    'Panel 2: Performance': [
        'P50 / P95 / P99 latency (time series)',
        'Latency by model and prompt version',
        'Time to first token (streaming)',
        'Latency heatmap by hour of day'
    ],
    'Panel 3: Cost': [
        'Daily cost USD (actual vs budget)',
        'Cost per request by model',
        'Cost trend (7-day rolling)',
        'Top 10 most expensive prompt_ids'
    ],
    'Panel 4: Quality': [
        'Average quality score (rolling 1h)',
        'Quality trend by prompt version',
        'User satisfaction (thumbs, retry rate)',
        'Low-quality alert rate'
    ]
}

for panel, metrics in DASHBOARD_PANELS.items():
    print(f'\n{panel}:')
    for m in metrics:
        print(f'  - {m}')

การนำกฎการแจ้งเตือนไปใช้

การแจ้งเตือนจะทำงานเมื่อตัวชี้วัดเกินเกณฑ์ที่กำหนด ให้ใช้การแจ้งเตือนเป็นการตรวจสอบสถานะอย่างง่ายที่ทำงานตามกำหนดเวลา และส่งการแจ้งเตือนไปยัง PagerDuty สแล็ก หรืออีเมล

ALERT_RULES = [
    {
        'name': 'HighErrorRate',
        'condition': lambda m: m['error_rate'] > 0.05,
        'severity': 'CRITICAL',
        'message': 'Error rate {error_rate:.1%} exceeds 5% threshold',
        'for_minutes': 5
    },
    {
        'name': 'HighLatencyP95',
        'condition': lambda m: m.get('p95_latency_ms', 0) > 10000,
        'severity': 'WARNING',
        'message': 'P95 latency {p95_latency_ms}ms exceeds 10s threshold',
        'for_minutes': 3
    },
    {
        'name': 'CostSpike',
        'condition': lambda m: m.get('today_cost', 0) > m.get('weekly_avg', 1) * 2,
        'severity': 'WARNING',
        'message': 'Daily cost ${today_cost:.2f} is 2x weekly average',
        'for_minutes': 60
    },
    {
        'name': 'QualityRegression',
        'condition': lambda m: m.get('quality_avg', 5) < 3.5,
        'severity': 'CRITICAL',
        'message': 'Quality score {quality_avg:.2f} below 3.5 threshold',
        'for_minutes': 15
    }
]

def check_alerts(metrics):
    fired = []
    for rule in ALERT_RULES:
        if rule['condition'](metrics):
            msg = rule['message'].format(**metrics)
            fired.append({'name': rule['name'], 'severity': rule['severity'],
                           'message': msg})
    return fired

การส่งการแจ้งเตือน

ควรกำหนดเส้นทางการแจ้งเตือนตามระดับความรุนแรง: การแจ้งเตือนระดับ CRITICAL ต้องแจ้งวิศวกรเวรทันที การแจ้งเตือนระดับ WARNING ให้โพสต์ในสแล็ก และการแจ้งเตือนระดับ INFO ให้ส่งไปยังไฟล์บันทึก ใช้ตัวจับเวลาการยกระดับสำหรับการแจ้งเตือนระดับวิกฤตที่ยังไม่มีผู้รับทราบ

import requests

SLACK_WEBHOOK = 'https://hooks.slack.com/services/YOUR/WEBHOOK/URL'
PAGERDUTY_API_KEY = 'YOUR_PD_KEY'

def send_slack_alert(message, severity='WARNING'):
    emoji = ':rotating_light:' if severity == 'CRITICAL' else ':warning:'
    payload = {'text': f'{emoji} *{severity}*: {message}'}
    try:
        requests.post(SLACK_WEBHOOK, json=payload, timeout=5)
        print(f'Slack alert sent: {message[:60]}')
    except Exception as e:
        print(f'Slack notification failed: {e}')

def send_pagerduty_alert(summary, severity='critical'):
    payload = {
        'routing_key': PAGERDUTY_API_KEY,
        'event_action': 'trigger',
        'payload': {
            'summary': summary,
            'severity': severity,
            'source': 'prompt-pipeline-monitor'
        }
    }
    try:
        response = requests.post(
            'https://events.pagerduty.com/v2/enqueue',
            json=payload, timeout=10
        )
        print(f'PagerDuty alert: {response.status_code}')
    except Exception as e:
        print(f'PagerDuty notification failed: {e}')

def dispatch_alert(alert):
    if alert['severity'] == 'CRITICAL':
        send_pagerduty_alert(alert['message'])
        send_slack_alert(alert['message'], 'CRITICAL')
    else:
        send_slack_alert(alert['message'], 'WARNING')

โครงสร้างคู่มือปฏิบัติการสำหรับวิศวกรเวร

การแจ้งเตือนทุกประเภทควรมีคู่มือปฏิบัติการที่เกี่ยวข้อง ซึ่งระบุให้วิศวกรเวรทราบอย่างชัดเจนว่าต้องทำอะไร คู่มือปฏิบัติการที่เขียนดีช่วยลด MTTR (เวลาเฉลี่ยในการแก้ไข) จากหลายชั่วโมงเหลือเพียงไม่กี่นาที

# Runbook template for HighErrorRate alert
HIGH_ERROR_RATE_RUNBOOK = '''
## Alert: HighErrorRate
### Trigger: Error rate > 5% for > 5 minutes
### Severity: CRITICAL

## Immediate Actions (< 5 minutes)
1. Check error type breakdown in dashboard: Panel 1 > Error type breakdown
   - timeout errors -> see Timeout Runbook
   - api_error -> check LLM provider status page
   - parse_failure -> check if model output format changed

2. Check if this is related to a recent deployment:
   python manage.py prompt list-recent-activations --last-hours 2

3. If error rate > 20%, trigger emergency rollback:
   python manage.py prompt activate --prompt-id <id> --version <last-stable>

## Investigation (< 30 minutes)
4. Sample failed requests from log:
   grep error_rate /var/log/prompt-pipeline.log | tail -100

5. Check model provider status:
   - OpenAI: https://status.openai.com
   - Anthropic: https://status.anthropic.com

## Resolution
6. If provider outage: activate fallback model routing
7. If prompt change: rollback to previous version
8. If code change: rollback deployment
9. Document in post-mortem after resolution
'''

print(HIGH_ERROR_RATE_RUNBOOK[:400], '...')

การบันทึกแบบมีโครงสร้างสำหรับกระบวนการพรอมต์

บันทึกแบบมีโครงสร้าง (ข้อมูลรูปแบบโครงสร้างต่อบรรทัด) ช่วยให้กรองและรวมข้อมูลได้อย่างมีประสิทธิภาพในระบบจัดการบันทึก เช่น Datadog, Splunk หรือ CloudWatch การเรียกใช้ LLM ทุกครั้งควรสร้างรายการบันทึกแบบมีโครงสร้างหนึ่งรายการ

import json
import time
from datetime import datetime

def log_llm_call(request_id, prompt_id, version, model, messages,
                  response_text, latency_ms, input_tokens,
                  output_tokens, error=None):
    log_entry = {
        'ts': datetime.utcnow().isoformat() + 'Z',
        'level': 'ERROR' if error else 'INFO',
        'service': 'prompt-pipeline',
        'request_id': request_id,
        'prompt_id': prompt_id,
        'version': version,
        'model': model,
        'latency_ms': round(latency_ms),
        'input_tokens': input_tokens,
        'output_tokens': output_tokens,
        'error': str(error) if error else None,
        'response_preview': response_text[:100] if response_text else None
    }
    print(json.dumps(log_entry))
    # In production: ship to log aggregator
    # logger.info(json.dumps(log_entry))

# Example log output:
# {"ts":"2024-08-15T10:00:01Z","level":"INFO",
#  "prompt_id":"summarize-article","version":"1.2.0",
#  "model":"gpt-4o-mini","latency_ms":1234,
#  "input_tokens":800,"output_tokens":150,...}
log_llm_call('req-001', 'summarize-article', '1.2.0', 'gpt-4o-mini',
             [], 'Summary text...', 1234, 800, 150)

สถาปัตยกรรมระบบเฝ้าติดตาม

ประกอบส่วนประกอบทั้งหมดของระบบเฝ้าติดตามให้เป็นระบบหนึ่งเดียวที่ทำงานควบคู่ไปกับกระบวนการพรอมต์ วนตรวจสอบเป็นระยะอย่างง่ายสามารถจัดการการประเมินและส่งการแจ้งเตือนได้

import time

class PromptPipelineMonitor:
    def __init__(self):
        self.latency = LatencyTracker()
        self.errors = ErrorRateTracker()
        self.quality = QualityTrendTracker()
        self.cost = CostTracker()

    def record(self, model, latency_ms, input_tokens, output_tokens,
                quality_score=None, error=None, error_type=None):
        self.latency.record(latency_ms)
        self.errors.record(error is None, error_type)
        self.cost.record_call(model, input_tokens, output_tokens)
        if quality_score:
            self.quality.record(quality_score)

    def current_metrics(self):
        lat = self.latency.report()
        err = self.errors.report()
        return {
            **lat, **err,
            'quality_avg': self.quality.rolling_avg() or 5.0,
            'quality_trend': self.quality.trend(),
            'today_cost': self.cost.today_cost(),
            'weekly_avg': self.cost.weekly_avg_daily_cost()
        }

    def run_alert_check(self):
        metrics = self.current_metrics()
        alerts = check_alerts(metrics)
        for alert in alerts:
            dispatch_alert(alert)
        return alerts

monitor = PromptPipelineMonitor()
print('Monitor initialized. Call monitor.record() on each LLM call.')

ตรวจสอบความเข้าใจ

เวลาแฝง P50 ของกระบวนการพรอมต์อยู่ที่ 1.5 วินาที แต่ P99 อยู่ที่ 28 วินาที ข้อมูลนี้บอกอะไรเกี่ยวกับพฤติกรรมของระบบจริง

สรุปการเฝ้าติดตามและการแจ้งเตือน

การเฝ้าติดตามกระบวนการพรอมต์ในระบบจริงต้องมีหมวดหมู่การวัดห้าประเภท พร้อมกฎการแจ้งเตือนที่สอดคล้องกัน:

  • เวลาแฝง: ติดตาม P50/P95/P99 — แจ้งเตือนเมื่อ P95 > 10 วินาที
  • ค่าใช้จ่าย: ค่าใช้จ่ายรายวันเทียบกับค่าเฉลี่ยรายสัปดาห์ — แจ้งเตือนเมื่อค่าใช้จ่ายพุ่งเป็น 2 เท่า
  • อัตราข้อผิดพลาด: เปอร์เซ็นต์รวมและรายละเอียดแยกตามประเภทข้อผิดพลาด — แจ้งเตือนเมื่อ > 5%
  • คะแนนคุณภาพ: แนวโน้มค่าเฉลี่ยแบบเลื่อน — แจ้งเตือนเมื่อลดต่ำกว่า 3.5/5
  • การแจ้งเตือน: CRITICAL → PagerDuty + สแล็ก; WARNING → สแล็กเท่านั้น
  • คู่มือปฏิบัติการ: คู่มือแก้ไขปัญหาแบบทีละขั้นตอนสำหรับการแจ้งเตือนทุกประเภท
  • แผงควบคุม: ส่วนแสดงผลสี่ส่วนที่ครอบคลุมความพร้อมใช้งาน ประสิทธิภาพ ค่าใช้จ่าย และคุณภาพ

คำถามที่พบบ่อย

บทเรียน “การตรวจติดตามและแจ้งเตือนสำหรับไปป์ไลน์พรอมต์” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การตรวจติดตามและแจ้งเตือนสำหรับไปป์ไลน์พรอมต์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส AI Prompt Engineering ให้อัปเกรดเป็น CoddyKit PRO คอร์ส AI Prompt Engineering มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การตรวจติดตามและแจ้งเตือนสำหรับไปป์ไลน์พรอมต์”

แดชบอร์ด การตรวจจับความผิดปกติ และการแจ้งเตือนผู้รับผิดชอบเวรสำหรับพรอมต์ในระบบจริง คุณปฏิบัติ AI Prompt Engineering ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน AI Prompt Engineering หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน AI Prompt Engineering บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “การตรวจติดตามและแจ้งเตือนสำหรับไปป์ไลน์พรอมต์” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน AI Prompt Engineering นี้ได้ไหม

ได้ บทเรียน AI Prompt Engineering ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. กลยุทธ์การแคชพรอมต์
  2. การประมวลผลเป็นชุดและการทำงานแบบอะซิงโครนัส
  3. การกระจายโหลดระหว่างโมเดล
  4. การตรวจติดตามและแจ้งเตือนสำหรับไปป์ไลน์พรอมต์
← กลับไปที่ AI Prompt Engineering