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

การจัดการข้อผิดพลาดและขีดจำกัดอัตราการเรียกใช้

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

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

เหตุใดจึงเกิดข้อผิดพลาดของ API

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

ภาพรวมประเภทข้อผิดพลาดของ OpenAI

SDK จะแจ้งข้อยกเว้นเฉพาะประเภท เช่น RateLimitError และ AuthenticationError ควรลองใหม่เฉพาะข้อผิดพลาดชั่วคราว เช่น การจำกัดอัตราหรือเครือข่ายขาดหาย ส่วนข้อผิดพลาดประเภทอื่นจะไม่หายไปเอง

การดักจับข้อผิดพลาดด้วย Try-Except

ห่อการเรียกใช้แต่ละครั้งด้วย try-except และดักจับข้อยกเว้นเฉพาะประเภท ไม่ใช่ except เปล่า วิธีนี้ช่วยให้คุณตอบสนองต่อความล้มเหลวแต่ละแบบได้อย่างเหมาะสม แทนที่จะซ่อนข้อผิดพลาดไว้ ดูวิธีการได้ในโค้ด

import openai

client = openai.OpenAI()

try:
    response = client.chat.completions.create(
        model='gpt-4o-mini',
        messages=[{'role': 'user', 'content': 'Hello!'}]
    )
    print(response.choices[0].message.content)
except openai.AuthenticationError as e:
    print('Bad API key. Check OPENAI_API_KEY environment variable.')
    raise  # do not retry
except openai.RateLimitError as e:
    print('Rate limited. Back off and retry.')
except openai.APIConnectionError as e:
    print('Network error:', e)
except openai.APIStatusError as e:
    print('Server error', e.status_code, e.message)

ทำความเข้าใจการจำกัดอัตรา

OpenAI บังคับใช้การจำกัดอัตราสองแบบพร้อมกัน ได้แก่ จำนวนคำขอต่อนาที (RPM) และจำนวนโทเคนต่อนาที (TPM) พรอมต์ขนาดใหญ่มากเพียงครั้งเดียวอาจใช้ TPM จนหมดได้ ทั้งสองกรณีจะส่งสถานะ 429 กลับมา

การหน่วงเวลาแบบทวีคูณ: กลยุทธ์การลองใหม่ที่เหมาะสม

ถูกจำกัดอัตราใช่ไหมครับ/คะ ให้รอแล้วลองใหม่ด้วยการหน่วงเวลาแบบทวีคูณ: 1 วินาที, 2 วินาที, 4 วินาที โดยเพิ่มเป็นสองเท่าทุกครั้ง เพิ่มความคลาดเคลื่อนแบบสุ่มเล็กน้อยและกำหนดจำนวนครั้งสูงสุด เพื่อไม่ให้ลูปทำงานไม่สิ้นสุด ดูโค้ดได้เลย

import time
import random
import openai

client = openai.OpenAI()

def call_with_backoff(messages, max_retries=5):
    for attempt in range(max_retries):
        try:
            return client.chat.completions.create(
                model='gpt-4o-mini',
                messages=messages
            )
        except openai.RateLimitError:
            if attempt == max_retries - 1:
                raise
            wait = (2 ** attempt) + random.uniform(0, 1)
            print(f'Rate limited. Waiting {wait:.1f}s (attempt {attempt+1})')
            time.sleep(wait)
        except (openai.APIConnectionError, openai.APIStatusError):
            if attempt == max_retries - 1:
                raise
            time.sleep(2 ** attempt)

การใช้ไลบรารี tenacity

อย่าเขียนระบบลองใหม่เอง เพราะไลบรารี tenacity จัดการเรื่องนี้ได้อย่างเป็นระเบียบ ตกแต่งฟังก์ชันของคุณด้วย @retry แล้วระบบจะจัดการการหน่วงเวลาแบบทวีคูณ ความคลาดเคลื่อนแบบสุ่ม และเงื่อนไขการลองใหม่ให้

from tenacity import retry, wait_random_exponential, stop_after_attempt
import openai

client = openai.OpenAI()

@retry(
    wait=wait_random_exponential(min=1, max=60),
    stop=stop_after_attempt(6)
)
def completion_with_backoff(**kwargs):
    return client.chat.completions.create(**kwargs)

response = completion_with_backoff(
    model='gpt-4o-mini',
    messages=[{'role': 'user', 'content': 'Tell me a joke.'}]
)
print(response.choices[0].message.content)

การกำหนดค่า Timeout

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

import openai

# Set a default timeout for all requests from this client
client = openai.OpenAI(timeout=30.0)

# Or override per request
try:
    response = client.chat.completions.create(
        model='gpt-4o-mini',
        messages=[{'role': 'user', 'content': 'Summarize the French Revolution.'}],
        timeout=60.0
    )
except openai.APITimeoutError:
    print('Request timed out. Try a shorter prompt or increase timeout.')

การจัดการข้อผิดพลาดด้านการยืนยันตัวตน

AuthenticationError (401) หมายความว่าคีย์ของคุณไม่ถูกต้อง หมดอายุ หรือถูกเพิกถอน การลองใหม่จะไม่ช่วยอะไร ควรบันทึกข้อผิดพลาด แจ้งเตือน และหยุดการทำงานทันที แทนที่จะใช้โควตาการลองใหม่จนหมด

import os
import openai

api_key = os.environ.get('OPENAI_API_KEY')
if not api_key:
    raise EnvironmentError(
        'OPENAI_API_KEY not set. Export it before running.'
    )

client = openai.OpenAI(api_key=api_key)

try:
    response = client.chat.completions.create(
        model='gpt-4o-mini',
        messages=[{'role': 'user', 'content': 'Hello'}]
    )
except openai.AuthenticationError:
    # Do NOT retry - the key itself is invalid
    raise RuntimeError('Invalid API key. Check OPENAI_API_KEY.')

โควตากับการจำกัดอัตรา

ทั้งสองอย่างอาจดูเหมือน RateLimitError แต่แตกต่างกัน: การจำกัดอัตราคือการจำกัดต่อนาทีซึ่งจะรีเซ็ตเอง ส่วนข้อจำกัดโควตาคือเพดานค่าใช้จ่ายที่ต้องเติมเครดิตเพิ่มเติม

การบันทึกข้อผิดพลาดเพื่อแก้ไขปัญหา

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

import logging
import openai

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

client = openai.OpenAI()

def safe_completion(model, messages):
    try:
        response = client.chat.completions.create(
            model=model, messages=messages
        )
        return response
    except openai.RateLimitError as e:
        logger.warning(
            'Rate limit hit',
            extra={'model': model, 'error': str(e)}
        )
        raise
    except openai.APIStatusError as e:
        logger.error(
            'API server error',
            extra={
                'status_code': e.status_code,
                'request_id': e.request_id,
                'model': model
            }
        )
        raise

การจัดการข้อผิดพลาดในแอปจริง

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

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

ทดสอบความเข้าใจแนวคิดวิศวกรรม AI จากบทเรียนนี้

ทบทวนบทเรียน

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

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

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

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

คุณจะเรียนรู้อะไรในบทเรียน “การจัดการข้อผิดพลาดและขีดจำกัดอัตราการเรียกใช้”

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

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

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

บทเรียน “การจัดการข้อผิดพลาดและขีดจำกัดอัตราการเรียกใช้” ใช้เวลานานแค่ไหน

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

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

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

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

  1. การตั้งค่าสภาพแวดล้อม Python
  2. ปลายทางการเติมข้อความสนทนา
  3. ควบคุมพฤติกรรมของโมเดลด้วยพารามิเตอร์
  4. การจัดการข้อผิดพลาดและขีดจำกัดอัตราการเรียกใช้
← กลับไปที่ AI Engineering Academy