Ngăn chặn lỗi 429: Cách xử lý Rate Limit của OpenAI API

intermediate🧠 AI Tools2026-05-17

Thông báo lỗi

Nó thường xảy ra ngay khi bạn đã sẵn sàng triển khai. Nhật ký (logs) của bạn đột nhiên tràn ngập lỗi này:

openai.RateLimitError: Error code: 429 - {'error': {'message': 'Rate limit reached for requests', 'type': 'requests', 'param': None, 'code': 'rate_limit_exceeded'}}

OpenAI cũng có thể chỉ định xem bạn có đạt đến giới hạn cho Tokens Per Minute (TPM), Requests Per Minute (RPM), hoặc Requests Per Day (RPD) hay không. Ví dụ: một tài khoản Tier 1 gọi GPT-4o bị giới hạn ở mức 30.000 TPM và 500 RPM.

Tại sao lỗi này lại xuất hiện bất thình lình

Nếu mã của bạn hoạt động bình thường vào ngày hôm qua nhưng lại thất bại vào hôm nay, một trong ba vấn đề sau có thể là nguyên nhân:

  • Hạn chế về Tier: Bạn đang ở mức sử dụng thấp (như Tier 1) và lưu lượng truy cập của bạn tăng đột biến.
  • Ví hết tiền: Số dư trả trước của bạn đã chạm mức $0.00. OpenAI thường trả về lỗi 429 thay vì 402 (Payment Required) khi điều này xảy ra.
  • Xử lý đồng thời không kiểm soát: Bạn đã khởi chạy quá nhiều luồng (threads) song song hoặc tác vụ bất đồng bộ (async tasks). Điều này làm chạm giới hạn RPM ngay lập tức.

Các bước khắc phục chi tiết

1. Kiểm tra hóa đơn và Tier sử dụng

Trước khi viết lại bất kỳ dòng mã nào, hãy truy cập OpenAI Billing Dashboard. Bạn cần xác minh hai điều:

  • Số dư tín dụng: Đảm bảo bạn có ít nhất $5.00 trong tài khoản. Nếu số dư trống, API sẽ ngừng hoạt động ngay lập tức.
  • Tier sử dụng: Xem xét các giới hạn của bạn. Các tài khoản Tier 1 có hạn ngạch rất chặt chẽ. Để nâng lên Tier 2, bạn thường cần nạp ít nhất $50 và chờ 7 ngày. Việc nâng cấp Tier là tự động nhưng có thể mất tới 48 giờ để hệ thống cập nhật.

2. Sử dụng cơ chế thử lại (Retries) và Backoff tích hợp sẵn

Cách đáng tin cậy nhất để xử lý lỗi 429 là sử dụng exponential backoff (thử lại với thời gian chờ tăng dần). Điều này có nghĩa là ứng dụng của bạn sẽ đợi một lát trước khi thử lại, sau đó đợi lâu hơn nếu vẫn thất bại.

Python OpenAI SDK (v1.0+) tự động xử lý một số lần thử lại, nhưng bạn nên tăng giới hạn này cho môi trường production:

from openai import OpenAI

# Tăng max_retries từ mặc định (2) lên 5
client = OpenAI(
    max_retries=5, 
    api_key="your_api_key_here"
)

try:
    response = client.chat.completions.create(
        model="gpt-4o",
        messages=[{"role": "user", "content": "Summarize this report."}]
    )
except Exception as e:
    print(f"API failed after 5 attempts: {e}")

Nếu bạn cần kiểm soát nhiều hơn, hãy sử dụng thư viện backoff. Nó rất tuyệt vời cho các logic tùy chỉnh:

import backoff
import openai

@backoff.on_exception(backoff.expo, openai.RateLimitError)
def call_with_backoff(**kwargs):
    return client.chat.completions.create(**kwargs)

# Tự động thử lại sau 1s, 2s, 4s, 8s...

3. Tối ưu hóa việc tiêu thụ Token

Đôi khi bạn không chạm giới hạn số lượng request, mà là giới hạn token. Các prompt lớn hoặc cài đặt max_tokens cao sẽ làm cạn kiệt hạn ngạch của bạn rất nhanh.

  • Siết chặt max_tokens: Đừng đặt mức 4.000 nếu bạn chỉ mong đợi câu trả lời dài một đoạn văn.
  • Đếm cục bộ: Sử dụng tiktoken để kiểm tra kích thước prompt trước khi gửi. Nếu prompt quá lớn, hãy cắt bớt hoặc bỏ qua request đó để tiết kiệm hạn ngạch cho các tác vụ khác.
  • Xếp hàng các tác vụ: Nếu bạn đang xử lý 1.000 dòng dữ liệu, đừng dùng vòng lặp for đơn giản. Hãy sử dụng hàng đợi tác vụ như Celery hoặc BullMQ để điều tiết tốc độ ở mức 5 request mỗi giây.

4. Điều tiết tập trung cho các nhóm (Teams)

Nếu bạn có năm máy chủ khác nhau sử dụng cùng một API key, chúng sẽ xung đột với nhau. Bạn cần một bộ đếm dùng chung, thường được hỗ trợ bởi Redis, để kiểm soát mọi thứ.

import time
import redis

# Bộ kiểm soát đơn giản dựa trên Redis
r = redis.Redis(host='localhost', port=6379)

def rate_limited_request():
    while r.get("openai_lock"):
        time.sleep(0.2) # Đợi cho đến khi khóa được giải phóng
    
    r.setex("openai_lock", 1, "locked") # Chặn các yêu cầu khác trong 1 giây
    return call_openai_api()

Cách xác minh việc khắc phục

Đừng chỉ hy vọng nó hoạt động. Hãy kiểm tra khả năng xử lý lỗi của bạn bằng cách cố tình kích hoạt giới hạn:

  • Chạy một script gửi 20 request cùng lúc.
  • Theo dõi nhật ký (logs). Bạn sẽ thấy logic backoff tạm dừng việc thực thi thay vì làm ứng dụng bị sập.
  • Kiểm tra Usage Dashboard. Các request thành công hiển thị dưới dạng thanh màu xanh lá cây, trong khi lỗi 429 xuất hiện màu đỏ.

Mẹo bảo trì

  • Theo dõi Header: OpenAI gửi x-ratelimit-remaining-requests trong mỗi phản hồi. Hãy log các giá trị này để xem bạn đã tiến gần đến giới hạn như thế nào.
  • Tách biệt môi trường: Không bao giờ sử dụng API key của môi trường production để thử nghiệm. Một script phát triển (dev) bị lỗi có thể làm cạn kiệt hạn ngạch và làm sập trang web đang hoạt động của bạn.
  • Chuyển sang Batch API: Nếu bạn không cần câu trả lời ngay lập tức, hãy sử dụng Batch API. Nó rẻ hơn 50% và có giới hạn cao hơn nhiều, mặc dù có thể mất tới 24 giờ để hoàn thành.

Related Error Notes