การตรวจติดตามและแจ้งเตือนสำหรับไปป์ไลน์พรอมต์
แดชบอร์ด การตรวจจับความผิดปกติ และการแจ้งเตือนผู้รับผิดชอบเวรสำหรับพรอมต์ในระบบจริง
การตรวจติดตามและแจ้งเตือนสำหรับไปป์ไลน์พรอมต์ เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- กลยุทธ์การแคชพรอมต์
- การประมวลผลเป็นชุดและการทำงานแบบอะซิงโครนัส
- การกระจายโหลดระหว่างโมเดล
- การตรวจติดตามและแจ้งเตือนสำหรับไปป์ไลน์พรอมต์