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

การจัดการข้อผิดพลาดในพรอมป์ตเชน

ตรวจสอบผลลัพธ์ระหว่างทางและกู้คืนจากความล้มเหลวของเชน

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

เหตุใดกระบวนการต่อเนื่องจึงล้มเหลว

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

รูปแบบความล้มเหลวที่พบบ่อย:

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

การตรวจสอบผลลัพธ์หลังทุกขั้นตอน

แนวป้องกันด่านแรกคือการตรวจสอบผลลัพธ์ทันทีหลังแต่ละขั้นตอน ก่อนส่งต่อไปยังขั้นตอนถัดไป อย่าสันนิษฐานว่าโมเดลส่งคืนสิ่งที่คุณขอ

import json

def validate_json_output(raw_text, required_fields):
    'Parse and validate that required fields are present in model output.'
    try:
        data = json.loads(raw_text.strip())
    except json.JSONDecodeError as e:
        raise ValueError(f'Invalid JSON: {e}. Raw: {raw_text[:200]}')

    missing = [f for f in required_fields if f not in data]
    if missing:
        raise ValueError(f'Missing required fields: {missing}. Got: {list(data.keys())}')

    return data

# Usage after a chain step
raw = '{"sentiment": "positive", "priority": "high"}'
validated = validate_json_output(raw, required_fields=['sentiment', 'priority'])
print('Valid:', validated)

ตรรกะการลองใหม่สำหรับความล้มเหลวชั่วคราว

ความล้มเหลวของ API เช่น ข้อจำกัดอัตราการเรียก การหมดเวลา และข้อผิดพลาดของเซิร์ฟเวอร์ เป็นความล้มเหลวชั่วคราว ให้ใช้ตรรกะการลองใหม่พร้อมการหน่วงเวลาแบบทวีคูณสำหรับความล้มเหลวระดับเครือข่าย:

import anthropic, time

client = anthropic.Anthropic(api_key='YOUR_API_KEY')

def call_with_retry(prompt, max_retries=3, base_delay=1.0):
    last_error = None
    for attempt in range(max_retries):
        try:
            r = client.messages.create(
                model='claude-opus-4-5', max_tokens=500,
                messages=[{'role': 'user', 'content': prompt}]
            )
            return r.content[0].text
        except anthropic.RateLimitError as e:
            wait = base_delay * (2 ** attempt)
            print(f'Rate limited. Waiting {wait}s before retry {attempt+1}/{max_retries}...')
            time.sleep(wait)
            last_error = e
        except anthropic.APIError as e:
            last_error = e
            if attempt < max_retries - 1:
                time.sleep(base_delay)
    raise RuntimeError(f'All retries exhausted: {last_error}')

การตรวจสอบความหมาย

ความล้มเหลวบางอย่างมีโครงสร้างถูกต้องแต่ความหมายผิด — โมเดลส่งคืน JSON ที่ถูกต้องแต่มีค่าไม่ถูกต้อง ให้ใช้ขั้นตอนตรวจสอบที่มีน้ำหนักเบาเพื่อตรวจสอบความถูกต้องด้านความหมาย:

def semantic_validate(data, schema_rules):
    'Apply semantic validation rules to parsed output.'
    errors = []

    for field, rules in schema_rules.items():
        value = data.get(field)

        if rules.get('required') and value is None:
            errors.append(f'{field} is required but missing')
            continue

        if 'allowed_values' in rules and value not in rules['allowed_values']:
            errors.append(f'{field} must be one of {rules["allowed_values"]}, got: {value}')

        if 'min_length' in rules and isinstance(value, list) and len(value) < rules['min_length']:
            errors.append(f'{field} must have at least {rules["min_length"]} items, got {len(value)}')

    if errors:
        raise ValueError('Semantic validation failed: ' + '; '.join(errors))

    return data

rules = {'sentiment': {'allowed_values': ['positive', 'negative', 'mixed']}, 'issues': {'min_length': 1}}
data = {'sentiment': 'positive', 'issues': ['login bug']}
print(semantic_validate(data, rules))

พรอมต์สำรอง

เมื่อขั้นตอนล้มเหลวในการตรวจสอบหลังจากลองใหม่แล้ว พรอมต์สำรองสามารถสร้างผลลัพธ์ที่เรียบง่ายกว่าแต่ยังใช้งานได้ แทนที่จะทำให้กระบวนการต่อเนื่องทั้งหมดหยุดทำงาน:

import json

def call_with_fallback(primary_prompt, fallback_prompt, required_fields):
    # Try primary prompt
    try:
        raw = call_with_retry(primary_prompt)
        return validate_json_output(raw, required_fields)
    except (ValueError, RuntimeError) as e:
        print(f'Primary prompt failed: {e}. Trying fallback...')

    # Try simpler fallback prompt
    try:
        raw = call_with_retry(fallback_prompt)
        return validate_json_output(raw, required_fields)
    except (ValueError, RuntimeError) as e:
        print(f'Fallback also failed: {e}. Returning safe default.')

    # Return safe default — chain continues with minimal data
    return {field: None for field in required_fields}

# Usage
primary = 'Analyze this review. Return JSON with 10 fields: {...}'
fallback = 'Classify this review. Return JSON: {"sentiment": "positive|negative|neutral"}'
result = call_with_fallback(primary, fallback, ['sentiment'])
print(result)

ตัวตัดวงจร

ตัวตัดวงจรช่วยป้องกันไม่ให้กระบวนการต่อเนื่องที่ล้มเหลวสิ้นเปลืองการเรียกใช้ API หลังจากล้มเหลวติดต่อกัน N ครั้ง ตัวตัดวงจรจะเปิดวงจรและส่งคืนข้อผิดพลาดทันทีโดยไม่เรียกใช้ API เพิ่มเติม:

class CircuitBreaker:
    def __init__(self, failure_threshold=3, recovery_timeout=60):
        self.failure_count = 0
        self.threshold = failure_threshold
        self.state = 'closed'  # closed = normal, open = blocking
        self.opened_at = None

    def call(self, fn, *args, **kwargs):
        import time
        if self.state == 'open':
            elapsed = time.time() - self.opened_at
            if elapsed > 60:  # recovery_timeout
                self.state = 'half-open'
            else:
                raise RuntimeError('Circuit open — skipping API call')
        try:
            result = fn(*args, **kwargs)
            self.failure_count = 0
            self.state = 'closed'
            return result
        except Exception as e:
            self.failure_count += 1
            if self.failure_count >= self.threshold:
                self.state = 'open'
                self.opened_at = time.time()
                print(f'Circuit opened after {self.failure_count} failures.')
            raise e

cb = CircuitBreaker(failure_threshold=3)
print('Circuit breaker initialized.')

การบันทึกจุดตรวจสำหรับกระบวนการต่อเนื่องที่ยาว

สำหรับกระบวนการต่อเนื่องที่มีหลายขั้นตอนหรือมีขั้นตอนที่ใช้ทรัพยากรมาก ให้ใช้การบันทึกจุดตรวจเพื่อบันทึกผลลัพธ์ระหว่างทาง หากขั้นตอนช่วงท้ายล้มเหลว ให้ทำงานต่อจากจุดตรวจแทนการเริ่มใหม่ตั้งแต่ขั้นตอนที่ 1:

import json, os

CHECKPOINT_DIR = '/tmp/chain_checkpoints'
os.makedirs(CHECKPOINT_DIR, exist_ok=True)

def save_checkpoint(run_id, step_id, data):
    path = os.path.join(CHECKPOINT_DIR, f'{run_id}_step{step_id}.json')
    with open(path, 'w') as f:
        json.dump(data, f)
    print(f'Checkpoint saved: step {step_id}')

def load_checkpoint(run_id, step_id):
    path = os.path.join(CHECKPOINT_DIR, f'{run_id}_step{step_id}.json')
    if os.path.exists(path):
        with open(path) as f:
            return json.load(f)
    return None

def run_with_checkpoints(run_id, input_data):
    step1 = load_checkpoint(run_id, 1) or json.loads(call(f'Step 1 processing: {input_data}'))
    save_checkpoint(run_id, 1, step1)

    step2 = load_checkpoint(run_id, 2) or json.loads(call(f'Step 2 processing: {step1}'))
    save_checkpoint(run_id, 2, step2)

    return step2

print('Checkpointing system defined.')

การลดการทำงานอย่างราบรื่น

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

def process_with_degradation(tickets):
    results = []
    for ticket in tickets:
        try:
            # Full chain: extract -> classify -> respond
            extracted = json.loads(call(f'Extract issue from ticket. Return JSON: {{"issue": str}}\n\n{ticket}'))
            classified = json.loads(call(f'Classify priority. Return JSON: {{"priority": str}}\n\n{extracted["issue"]}'))
            response = call(f'Draft response for {classified["priority"]} priority: {extracted["issue"]}')
            results.append({'ticket': ticket, 'response': response, 'degraded': False})
        except Exception as e:
            print(f'Chain failed for ticket, using fallback: {e}')
            # Fallback: simple direct response without classification
            simple_response = call(f'Respond to this support ticket:\n{ticket}')
            results.append({'ticket': ticket, 'response': simple_response, 'degraded': True})
    return results

print('Graceful degradation pipeline defined.')

การบันทึกข้อผิดพลาดแบบมีโครงสร้าง

บันทึกข้อผิดพลาดพร้อมบริบทที่เพียงพอสำหรับวินิจฉัยว่าขั้นตอนไหนล้มเหลว ข้อมูลเข้าคืออะไร และโมเดลส่งคืนอะไร:

import logging, traceback
from datetime import datetime

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger('chain')

def logged_step(step_name, prompt, validator=None):
    start = datetime.utcnow()
    try:
        raw = call_with_retry(prompt)
        result = validator(raw) if validator else raw
        logger.info(f'[{step_name}] SUCCESS in {(datetime.utcnow()-start).total_seconds():.2f}s')
        return result
    except Exception as e:
        logger.error(f'[{step_name}] FAILED after {(datetime.utcnow()-start).total_seconds():.2f}s')
        logger.error(f'[{step_name}] PROMPT: {prompt[:200]}')
        logger.error(f'[{step_name}] ERROR: {traceback.format_exc()}')
        raise

print('Structured error logging defined.')

การทดสอบสถานการณ์ข้อผิดพลาด

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

from unittest.mock import patch, MagicMock

def test_fallback_on_json_error():
    with patch('__main__.call') as mock_call:
        # First call returns malformed JSON, fallback returns valid JSON
        mock_call.side_effect = [
            'This is not JSON at all',
            '{"sentiment": "positive"}'
        ]

        result = call_with_fallback(
            primary_prompt='Analyze review with 10 fields',
            fallback_prompt='Just classify sentiment as JSON',
            required_fields=['sentiment']
        )

        assert result['sentiment'] == 'positive'
        print('PASS: fallback activated correctly on JSON parse error')

def test_circuit_breaker_opens():
    cb = CircuitBreaker(failure_threshold=2)
    for i in range(2):
        try:
            cb.call(lambda: (_ for _ in ()).throw(RuntimeError('API fail')))
        except RuntimeError:
            pass
    assert cb.state == 'open'
    print('PASS: circuit breaker opened after 2 failures')

print('Error handling tests defined.')

การติดตามสุขภาพของกระบวนการต่อเนื่องในระบบจริง

ในระบบจริง ให้ติดตามตัวชี้วัดสุขภาพของกระบวนการต่อเนื่องเพื่อพบการเสื่อมลงก่อนที่ผู้ใช้จะสังเกตเห็น:

  • อัตราความสำเร็จของขั้นตอน: ร้อยละของการทำงานที่แต่ละขั้นตอนสำเร็จตั้งแต่ครั้งแรก
  • อัตราการเรียกใช้พรอมต์สำรอง: มีการใช้พรอมต์สำรองบ่อยเพียงใด
  • อัตราการลดระดับ: การทำงานของกระบวนการต่อเนื่องมีสัดส่วนเท่าใดที่เสร็จสมบูรณ์ในโหมดลดระดับ
  • เวลาแฝงของขั้นตอน: ติดตามเวลาแฝง p50/p95 ของแต่ละขั้นตอน — ขั้นตอนที่ช้าบ่งชี้ปัญหาด้านความซับซ้อนของพรอมต์
  • อัตราความล้มเหลวในการตรวจสอบ: อัตราที่สูงบ่งชี้ว่าพรอมต์ต้องได้รับการปรับปรุง

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

ตัวตัดวงจรในกระบวนการต่อเนื่องของพรอมต์มีจุดประสงค์อะไร

การจัดการข้อผิดพลาดในกระบวนการต่อเนื่อง — ประเด็นสำคัญ

การจัดการข้อผิดพลาดที่มีความทนทานคือสิ่งที่แยกกระบวนการต่อเนื่องต้นแบบออกจากระบบที่พร้อมใช้งานจริง:

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

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

บทเรียน “การจัดการข้อผิดพลาดในพรอมป์ตเชน” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การจัดการข้อผิดพลาดในพรอมป์ตเชน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ 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