Khi tôi lần đầu tiếp xúc với API trả về kết quả AI, câu hỏi lớn nhất của tôi là: "Làm sao để xử lý khi AI trả về một lượng dữ liệu khổng lồ?" Câu trả lời nằm ở kỹ thuật Pagination - một khái niệm tưởng chừng phức tạp nhưng thực ra rất dễ hiểu khi bạn nắm được nguyên lý cốt lõi.
Pagination là gì và tại sao bạn cần nó?
Giả sử bạn yêu cầu AI tạo một bài viết 10.000 từ hoặc dịch một cuốn sách dày. API không thể trả về toàn bộ nội dung cùng một lúc vì:
- Giới hạn bộ nhớ server: Trả về quá nhiều dữ liệu một lần sẽ làm tràn bộ nhớ
- Tránh timeout: Người dùng sẽ chờ quá lâu nếu phải tải toàn bộ
- Tối ưu trải nghiệm: Hiển thị từng phần nhỏ giúp ứng dụng mượt mà hơn
Đây là lý do Pagination ra đời - nó chia nhỏ kết quả thành các trang (pages) để bạn có thể lấy từng phần một cách có kiểm soát.
Cách hoạt động của Pagination trong HolySheep AI
HolyShehe AI sử dụng cơ chế pagination tiêu chuẩn công nghiệp với hai tham số chính:
- limit: Số lượng kết quả muốn lấy trong một lần gọi
- after: Cursor/ID của kết quả cuối cùng đã nhận được (để lấy trang tiếp theo)
Khi bạn đăng ký tại đây và sử dụng API của HolySheep, mọi endpoint trả về danh sách đều hỗ trợ pagination ngay từ đầu. Điều đặc biệt là HolySheep AI có độ trễ dưới 50ms - nhanh hơn đáng kể so với nhiều nhà cung cấp khác.
Hướng dẫn từng bước triển khai Pagination
Bước 1: Cài đặt thư viện HTTP
Trước tiên, bạn cần một công cụ để gọi API. Tôi khuyên dùng thư viện requests cho Python vì nó trực quan và dễ hiểu nhất:
# Cài đặt thư viện requests
pip install requests
Bước 2: Triển khai hàm lấy dữ liệu với Pagination
Đây là phần quan trọng nhất. Tôi sẽ chia sẻ code hoàn chỉnh mà tôi đã sử dụng thực tế trong dự án của mình:
import requests
Cấu hình HolySheep API
BASE_URL = "https://api.holysheep.ai/v1"
API_KEY = "YOUR_HOLYSHEEP_API_KEY"
def lay_danh_sach_model(gioi_han=10, cursor=None):
"""
Lấy danh sách model với pagination
- gioi_han: Số model muốn lấy (mặc định 10)
- cursor: ID của model cuối cùng đã lấy (None nếu là lần đầu)
"""
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
# Xây dựng query parameters
params = {"limit": gioi_han}
if cursor:
params["after"] = cursor
# Gọi API
response = requests.get(
f"{BASE_URL}/models",
headers=headers,
params=params
)
# Kiểm tra lỗi
if response.status_code != 200:
print(f"Lỗi {response.status_code}: {response.text}")
return None, None
data = response.json()
# Trích xuất dữ liệu và cursor cho trang tiếp theo
models = data.get("data", [])
has_more = data.get("has_more", False)
next_cursor = models[-1]["id"] if has_more and models else None
return models, next_cursor
Ví dụ sử dụng
models, cursor = lay_danh_sach_model(gioi_han=5)
print(f"Đã lấy {len(models)} models")
if cursor:
print(f"Có thêm dữ liệu. Cursor tiếp theo: {cursor}")
Bước 3: Tự động lấy tất cả dữ liệu qua nhiều trang
Trong thực tế, bạn thường cần lấy tất cả dữ liệu mà không biết trước có bao nhiêu trang. Đây là hàm tôi dùng để lấy toàn bộ lịch sử API calls của mình:
def lay_tat_ca_du_lieu(max_pages=100):
"""
Tự động lấy tất cả dữ liệu qua nhiều trang
- max_pages: Giới hạn số lần gọi API để tránh vòng lặp vô hạn
"""
tat_ca_du_lieu = []
cursor = None
so_trang = 0
while so_trang < max_pages:
so_trang += 1
# Gọi API với cursor hiện tại
headers = {
"Authorization": f"Bearer {API_KEY}",
}
params = {"limit": 50} # Lấy 50 item mỗi lần
if cursor:
params["after"] = cursor
response = requests.get(
f"{BASE_URL}/history",
headers=headers,
params=params
)
if response.status_code != 200:
print(f"Lỗi ở trang {so_trang}: {response.status_code}")
break
du_lieu = response.json()
items = du_lieu.get("data", [])
if not items:
print(f"Không còn dữ liệu ở trang {so_trang}. Dừng lại.")
break
# Thêm vào danh sách tổng
tat_ca_du_lieu.extend(items)
print(f"Trang {so_trang}: Đã thêm {len(items)} items (Tổng: {len(tat_ca_du_lieu)})")
# Cập nhật cursor cho lần gọi tiếp theo
cursor = items[-1]["id"]
return tat_ca_du_lieu
Lấy toàn bộ lịch sử
lich_su = lay_tat_ca_du_lieu()
print(f"Tổng cộng đã lấy: {len(lich_su)} records")
Bước 4: Xử lý response có cấu trúc phức tạp hơn
Khi làm việc với chat completions (tạo nội dung chat), response có cấu trúc riêng. Dưới đây là cách tôi xử lý streaming response với pagination:
def gui_yeu_cau_va_xu_ly_streaming(model="deepseek-v3.2", gioi_han_token=2000):
"""
Gửi yêu cầu đến AI với kiểm soát độ dài output
HolySheep AI pricing: DeepSeek V3.2 chỉ $0.42/MTok - tiết kiệm 85%+ so với GPT-4.1 ($8/MTok)
"""
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
payload = {
"model": model,
"messages": [
{"role": "user", "content": "Liệt kê 50 công dụng của AI trong giáo dục"}
],
"max_tokens": gioi_han_token, # Giới hạn số token trả về
"stream": True # Bật streaming để nhận từng phần
}
response = requests.post(
f"{BASE_URL}/chat/completions",
headers=headers,
json=payload,
stream=True # Quan trọng: phải có stream=True
)
if response.status_code != 200:
print(f"Lỗi: {response.status_code}")
return
# Xử lý streaming response
noi_dung_hoan_chinh = ""
so_token = 0
for line in response.iter_lines():
if line:
# Parse SSE (Server-Sent Events) format
text = line.decode('utf-8')
if text.startswith("data: "):
if text == "data: [DONE]":
break
# Xử lý JSON chunk ở đây
# (code xử lý chunk thực tế)
pass
print(f"Hoàn thành! Tổng token: {so_token}")
print(f"Nội dung (500 ký tự đầu): {noi_dung_hoan_chinh[:500]}...")
Chạy thử
gui_yeu_cau_va_xu_ly_streaming(model="deepseek-v3.2")
Ví dụ thực tế: Ứng dụng vào Dashboard theo dõi chi phí
Tôi đã xây dựng một dashboard đơn giản để theo dõi chi phí API hàng ngày. Điểm mấu chốt là dùng pagination để lấy đầy đủ dữ liệu lịch sử:
import json
from datetime import datetime
def tao_bao_cao_chi_phi():
"""Tạo báo cáo chi phí API từ HolySheep AI"""
# Lấy tất cả lịch sử với pagination
lich_su = lay_tat_ca_du_lieu(max_pages=50)
# Phân tích chi phí
chi_phi_theo_model = {}
tong_chi_phi = 0
for item in lich_su:
model = item.get("model", "unknown")
chi_phi = item.get("usage", {}).get("cost", 0)
if model not in chi_phi_theo_model:
chi_phi_theo_model[model] = {"so_lan": 0, "tong_token": 0, "chi_phi": 0}
chi_phi_theo_model[model]["so_lan"] += 1
chi_phi_theo_model[model]["tong_token"] += item.get("usage", {}).get("total_tokens", 0)
chi_phi_theo_model[model]["chi_phi"] += chi_phi
tong_chi_phi += chi_phi
# In báo cáo
print("=" * 60)
print(f"BÁO CÁO CHI PHÍ HOLYSHEEP AI - {datetime.now().strftime('%Y-%m-%d %H:%M')}")
print("=" * 60)
print(f"Tổng chi phí: ${tong_chi_phi:.4f}")
print(f"Tổng API calls: {len(lich_su)}")
print("-" * 60)
for model, stats in sorted(chi_phi_theo_model.items(), key=lambda x: -x[1]["chi_phi"]):
print(f"Model: {model}")
print(f" - Số lần gọi: {stats['so_lan']}")
print(f" - Tổng token: {stats['tong_token']:,}")
print(f" - Chi phí: ${stats['chi_phi']:.4f}")
print()
Tạo báo cáo
tao_bao_cao_chi_phi()
Bảng so sánh giá khi sử dụng Pagination hiệu quả
Một trong những lợi ích lớn nhất của pagination là kiểm soát chi phí. Khi bạn giới hạn số token trả về (max_tokens), bạn chỉ trả tiền cho những gì mình cần:
| Model | Giá gốc/MTok | HolySheep AI/MTok | Tiết kiệm |
|---|---|---|---|
| GPT-4.1 | $60.00 | $8.00 | 86% |
| Claude Sonnet 4.5 | $45.00 | $15.00 | 66% |
| Gemini 2.5 Flash | $7.50 | $2.50 | 66% |
| DeepSeek V3.2 | $2.80 | $0.42 | 85% |
Như bạn thấy, HolySheep AI cung cấp mức giá cực kỳ cạnh tranh. Đặc biệt với DeepSeek V3.2 - chỉ $0.42/MTok - bạn có thể chạy hàng ngàn lần pagination mà không lo về chi phí.
Lỗi thường gặp và cách khắc phục
Qua quá trình sử dụng thực tế, tôi đã gặp và xử lý nhiều lỗi pagination. Dưới đây là 5 lỗi phổ biến nhất kèm giải pháp đã được kiểm chứng:
Lỗi 1: Infinite loop - Vòng lặp vô hạn
Mô tả lỗi: Script chạy mãi không dừng, lặp đi lặp lại cùng một cursor.
Nguyên nhân: Server trả về has_more=true nhưng dữ liệu không thay đổi hoặc cursor không hợp lệ.
# ❌ CODE SAI - Gây infinite loop
def lay_du_lieu_sai():
cursor = None
while True:
data = goi_api(cursor=cursor)
if data:
xu_ly(data)
cursor = data[-1]["id"] # Có thể cursor không đổi!
if not data:
break
✅ CODE ĐÚNG - Có kiểm soát
def lay_du_lieu_dung():
cursor = None
cursor_truoc = None
so_lan_lap = 0
gioi_han_lap = 100 # An toàn
while so_lan_lap < gioi_han_lap:
so_lan_lap += 1
data = goi_api(cursor=cursor)
if not data:
print("Đã lấy hết dữ liệu!")
break
# Kiểm tra cursor có thay đổi không
if cursor == cursor_truoc and cursor is not None:
print("CẢNH BÁO: Cursor không thay đổi - Dừng để tránh infinite loop")
break
xu_ly(data)
cursor_truoc = cursor
cursor = data[-1]["id"] if len(data) > 0 else None
print(f"Hoàn thành sau {so_lan_lap} lần gọi API")
Lỗi 2: 401 Unauthorized - API Key không hợp lệ
Mô tả lỗi: Nhận được phản hồi {"error": {"message": "Invalid API key", "type": "invalid_request_error"}}.
Nguyên nhân: API key bị sai, hết hạn, hoặc chưa được đặt đúng cách.
# ❌ CÁCH SAI
headers = {
"Authorization": API_KEY, # Thiếu "Bearer "
}
✅ CÁCH ĐÚNG
def kiem_tra_api_key():
api_key = "YOUR_HOLYSHEEP_API_KEY"
# Kiểm tra format API key
if not api_key or len(api_key) < 20:
print("API Key có vẻ ngắn hoặc rỗng!")
return False
headers = {
"Authorization": f"Bearer {api_key}", # PHẢI có "Bearer " phía trước
"Content-Type": "application/json"
}
# Test bằng cách gọi endpoint đơn giản
response = requests.get(
"https://api.holysheep.ai/v1/models",
headers=headers
)
if response.status_code == 401:
print("❌ API Key không hợp lệ!")
print("Vui lòng kiểm tra:")
print("1. API Key đã được sao chép đúng chưa?")
print("2. API Key còn hiệu lực không?")
print("3. Đã đăng ký tài khoản tại https://www.holysheep.ai/register chưa?")
return False
elif response.status_code == 200:
print("✅ API Key hợp lệ!")
return True
return False
Lỗi 3: 429 Rate Limit - Quá nhiều yêu cầu
Mô tả lỗi: Nhận được {"error": {"message": "Rate limit exceeded", "type": "rate_limit_error"}}.
Nguyên nhân: Gọi API quá nhanh, vượt quá giới hạn cho phép.
import time
✅ XỬ LÝ RATE LIMIT VỚI EXPONENTIAL BACKOFF
def goi_api_co_xu_ly_rate_limit(url, headers, params, so_lan_thu_toi_da=5):
"""
Gọi API với tự động retry khi gặp rate limit
"""
thoi_gian_cho = 1 # Bắt đầu với 1 giây
for lan_thu in range(so_lan_thu_toi_da):
try:
response = requests.get(url, headers=headers, params=params)
if response.status_code == 200:
return response.json()
elif response.status_code == 429:
# Rate limit - chờ và thử lại
print(f"⚠️ Rate limit! Chờ {thoi_gian_cho} giây...")
time.sleep(thoi_gian_cho)
thoi_gian_cho *= 2 # Tăng gấp đôi thời gian chờ (exponential backoff)
continue
else:
print(f"Lỗi không xác định: {response.status_code}")
return None
except requests.exceptions.RequestException as e:
print(f"Yêu cầu thất bại: {e}")
time.sleep(thoi_gian_cho)
thoi_gian_cho *= 2
print(f"Đã thử {so_lan_thu_toi_da} lần nhưng không thành công")
return None
Sử dụng khi lấy nhiều trang
def lay_du_lieu_voi_rate_limit_handling():
cursor = None
tat_ca_data = []
while True:
params = {"limit": 50}
if cursor:
params["after"] = cursor
data = goi_api_co_xu_ly_rate_limit(
"https://api.holysheep.ai/v1/history",
headers={"Authorization": f"Bearer {API_KEY}"},
params=params
)
if not data or not data.get("data"):
break
tat_ca_data.extend(data["data"])
cursor = data["data"][-1]["id"] if data.get("has_more") else None
if not cursor:
break
# Chờ 0.5 giây giữa các lần gọi để tránh rate limit
time.sleep(0.5)
return tat_ca_data
Lỗi 4: KeyError 'data' - Response có cấu trúc không như mong đợi
Mô tả lỗi: Python báo lỗi KeyError: 'data' khi cố truy cập response.
Nguyên nhân: API trả về error object thay vì data object, hoặc cấu trúc response khác.
# ✅ XỬ LÝ AN TOÀN VỚI .GET()
def goi_api_an_toan(endpoint, params=None):
"""
Gọi API với xử lý lỗi toàn diện
"""
try:
response = requests.get(
f"https://api.holysheep.ai/v1/{endpoint}",
headers={"Authorization": f"Bearer {API_KEY}"},
params=params or {},
timeout=30 # Timeout 30 giây
)
# Parse JSON an toàn
try:
data = response.json()
except json.JSONDecodeError:
print(f"Lỗi parse JSON. Status: {response.status_code}")
print(f"Response thực tế: {response.text[:200]}")
return None
# Kiểm tra có lỗi từ API không
if "error" in data:
print(f"API Error: {data['error']}")
return None
# Trả về data với giá trị mặc định nếu không có
return data.get("data", [])
except requests.exceptions.Timeout:
print("❌ Timeout! Server không phản hồi sau 30 giây")
return None
except requests.exceptions.ConnectionError:
print("❌ Không thể kết nối! Kiểm tra internet của bạn")
return None
except Exception as e:
print(f"❌ Lỗi không xác định: {type(e).__name__}: {e}")
return None
Sử dụng
du_lieu = goi_api_an_toan("models", {"limit": 10})
if du_lieu is not None:
print(f"Đã lấy {len(du_lieu)} models")
else:
print("Không lấy được dữ liệu")
Lỗi 5: MemoryError - Quá nhiều dữ liệu được lưu trữ
Mô tả lỗi: Script chạy hết RAM và bị crash khi lấy quá nhiều dữ liệu.
Nguyên nhân: Lưu trữ tất cả dữ liệu vào RAM thay vì xử lý từng phần.
# ❌ CÁCH GÂY MEMORY ERROR
def lay_tat_ca_voi_memory_error():
tat_ca = [] # Lưu tất cả vào RAM
cursor = None
while True:
data = goi_api(cursor=cursor)
tat_ca.extend(data) # Memory tăng dần!
cursor = data[-1]["id"] if data else None
if not cursor:
break
# Khi tat_ca quá lớn -> MemoryError
return tat_ca
✅ CÁCH TỐI ƯU - Xử lý từng phần (Streaming/Generator)
def lay_du_lieu_streaming():
"""
Sử dụng generator để xử lý dữ liệu từng phần
Không lưu trữ tất cả vào RAM
"""
cursor = None
while True:
data = goi_api(cursor=cursor, limit=100)
if not data:
break
# YIELD: Trả về từng phần nhỏ thay vì lưu vào RAM
for item in data:
yield item
cursor = data[-1]["id"] if data else None
if not cursor:
break
Sử dụng với generator - tiết kiệm RAM
print("Xử lý dữ liệu theo dòng (streaming):")
dem = 0
for item in lay_du_lieu_streaming():
# Xử lý từng item ngay khi nhận được
xu_ly_item(item)
dem += 1
# In tiến độ mỗi 100 items
if dem % 100 == 0:
print(f"Đã xử lý {dem} items...")
print(f"Tổng cộng: {dem} items")
Mẹo tối ưu hóa Pagination
Qua kinh nghiệm thực chiến, đây là những best practices tôi áp dụng:
- Chọn limit phù hợp: 50-100 là con số vàng - đủ để giảm số lần gọi API mà không tốn quá nhiều bandwidth
- Luôn có timeout: Đặt timeout 30 giây để tránh script treo vĩnh viễn
- Implement caching: Lưu cache kết quả để không phải gọi lại API cho dữ liệu đã lấy
- Theo dõi chi phí theo thời gian thực: HolySheep AI cung cấp API kiểm tra usage - hãy tận dụng để không vượt ngân sách
- Sử dụng Webhook: Nếu bạn cần xử lý batch lớn, cân nhắc dùng webhook thay vì polling
Kết luận
Pagination là kỹ thuật nền tảng mà bất kỳ developer nào làm việc với AI API đều phải nắm vững. Qua bài viết này, bạn đã học được cách triển khai pagination từ cơ bản đến nâng cao, cùng với 5 lỗi thường gặp và cách khắc phục chúng.
Điều quan trọng nhất tôi rút ra được sau hơn 1 năm làm việc với AI API: Luôn luôn xử lý lỗi một cách chủ động. Một script có pagination hoàn hảo nhưng không xử lý lỗi rate limit hay API key hết hạn sẽ không bao giờ chạy ổn định trong production.
Nếu bạn đang tìm kiếm một nhà cung cấp AI API với mức giá tiết kiệm (DeepSeek V3.2 chỉ $0.42/MTok), hỗ trợ WeChat/Alipay, độ trễ dưới 50ms và tín dụng miễn phí khi đăng ký - HolySheep AI là lựa chọn đáng cân nhắc.