Cách khắc phục lỗi 'Prompt is Too Long' của Claude API

intermediate🧠 AI Tools2026-05-17| Môi trường Python hoặc Node.js sử dụng Anthropic SDK (v0.18.0+) hoặc gọi trực tiếp REST API đến các mô hình Claude 3/3.5.

Error Message

prompt is too long: X tokens > 200000 maximum
#claude#anthropic#context-length#token

Hiểu về Giới hạn Ngữ cảnh (Context Limit)Chạm tới giới hạn ngữ cảnh mang lại cảm giác như thể bạn vừa đâm vào một bức tường gạch. Vừa mới đây ứng dụng của bạn còn đang tóm tắt một mã nguồn, thì ngay sau đó, Anthropic trả về lỗi 400. Claude 3.5 Sonnet và Opus hỗ trợ cửa sổ ngữ cảnh (context window) khổng lồ lên tới 200.000 token, nhưng bạn có thể làm cạn kiệt con số này nhanh hơn bạn tưởng. Để tham khảo, một tệp văn bản 1MB hoặc một tệp PDF 500 trang có thể dễ dàng tiêu tốn từ 200k đến 250k token sau khi được xử lý.

Thông báo lỗi cụ thể xuất hiện trong nhật ký (logs) của bạn sẽ trông như thế này:

prompt is too long: 215432 tokens > 200000 maximum

Đây là lỗi 400 Bad Request. API từ chối yêu cầu vì payload—bao gồm system prompt, lịch sử tin nhắn và đầu vào mới của người dùng—vượt quá khả năng kiến trúc của mô hình. Không giống như giới hạn tốc độ (rate limits), việc thử lại sẽ không có tác dụng. Bạn phải giảm kích thước đầu vào trước khi yêu cầu có thể thành công.

Quy trình Gỡ lỗi (Debugging)Việc khắc phục bắt đầu bằng việc xác định điều gì đang làm phình to yêu cầu của bạn. Các nhà phát triển thường nhầm lẫn giữa số lượng ký tự và số lượng token, nhưng chúng không giống nhau. Trong hệ sinh thái Anthropic, 1.000 token thường tương đương với khoảng 750 từ. Tuy nhiên, các đoạn mã (code snippets) và văn bản không phải tiếng Anh thường dày đặc hơn và tiêu tốn token nhanh hơn.

1. Kiểm tra Đối tượng MessageHãy bắt đầu bằng cách ghi lại độ dài của mảng messages. Nếu bạn đang xây dựng một chatbot, có thể bạn đang thêm mọi tương tác vào mảng mà không có chiến lược dọn dẹp. Sau vài chục lượt trò chuyện, lịch sử đó sẽ lớn dần cho đến khi cuối cùng làm hỏng tích hợp của bạn.

2. Đếm Token trước khi gửiAnthropic cung cấp một phương thức phía máy khách (client-side) để tính toán token. Hãy sử dụng phương thức này để bắt lỗi cục bộ và tránh một cuộc gọi API bị lỗi nhưng vẫn mất phí. Dưới đây là cách triển khai trong Python:

import anthropic

client = anthropic.Anthropic(api_key="your_api_key")

# Payload tin nhắn của bạn
messages = [
    {"role": "user", "content": "Here is a very long document..."}
]

# Kiểm tra số lượng trước khi gọi API
response = client.messages.count_tokens(
    model="claude-3-5-sonnet-20240620",
    messages=messages
)

print(f"Token count: {response.input_tokens}")

if response.input_tokens > 200000:
    print("Warning: This prompt will fail!")

Các Giải pháp Hiệu quả để Khắc phục Lỗi### Giải pháp 1: Sử dụng Cửa sổ trượt (Sliding Window - FIFO)Giải pháp hiệu quả nhất cho các ứng dụng hội thoại là "cửa sổ trượt". Thay vì gửi toàn bộ lịch sử, bạn chỉ bao gồm 10 hoặc 15 tin nhắn gần nhất. Điều này giúp kích thước prompt của bạn có thể dự đoán được và ngăn chặn việc phình to dần theo thời gian.

def get_limited_history(full_history, max_messages=10):
    # Chỉ giữ lại N tin nhắn gần nhất
    if len(full_history) > max_messages:
        return full_history[-max_messages:]
    return full_history

Giải pháp 2: Cắt bớt các Tài liệu lớnKhi xử lý các tài liệu đồ sộ, bạn cần một chiến lược cắt bớt (truncation). Nếu một tệp nhật ký là 300.000 token, bạn có thể chỉ gửi 100.000 token gần nhất. Ngoài ra, hãy chia tài liệu thành các đoạn nhỏ hơn. Yêu cầu Claude tóm tắt riêng từng phần, sau đó kết hợp các bản tóm tắt đó để phân tích cuối cùng.

Giải pháp 3: Triển khai RAG (Retrieval-Augmented Generation)Nếu tập dữ liệu của bạn liên tục vượt quá 200.000 token, hãy ngừng gửi dữ liệu thô trong prompt. Thay vào đó, hãy sử dụng một cơ sở dữ liệu vector như Pinecone hoặc Chroma. Cách tiếp cận này hoạt động theo ba bước:

  • Chuyển đổi tài liệu của bạn thành các bản nhúng toán học (embeddings).- Tìm kiếm trong cơ sở dữ liệu các đoạn trích liên quan nhất dựa trên câu hỏi cụ thể của người dùng.- Chỉ chuyển những đoạn trích đó (thường là 2.000–5.000 token) cho Claude.### Giải pháp 4: Tóm tắt Đệ quyĐừng chỉ xóa các tin nhắn cũ; hãy tóm tắt chúng. Khi cuộc hội thoại của bạn đạt tới 150.000 token, hãy kích hoạt một tác vụ nền. Yêu cầu Claude "Tóm tắt các quyết định và sự kiện chính từ cuộc hội thoại này." Sau đó, bạn thay thế lịch sử cồng kềnh bằng bản tóm tắt duy nhất đó, giải phóng không gian đáng kể cho các lượt trò chuyện tiếp theo.

Xác minh và Giám sátBao bọc các cuộc gọi API của bạn trong một trình xử lý lỗi mạnh mẽ để đảm bảo giải pháp của bạn hoạt động. Chạy thử nghiệm với một payload mà bạn biết là hơi vượt quá giới hạn. Điều này cho phép bạn xác minh rằng logic cắt bớt hoặc RAG của bạn xử lý việc tràn dữ liệu một cách mượt mà mà không làm hỏng ứng dụng.

try:
    response = client.messages.create(
        model="claude-3-5-sonnet-20240620",
        max_tokens=1024,
        messages=my_processed_messages
    )
    print("Success!")
except anthropic.BadRequestError as e:
    if "prompt is too long" in str(e):
        print(f"Logic failed: {e}")
        # Kích hoạt cắt bớt khẩn cấp hoặc thông báo cho người dùng

Những Điểm chính Cần lưu ý- Token không phải là ký tự: Một prompt 1.000 token tương đương khoảng 750 từ, nhưng mã nguồn thường dày đặc hơn nhiều.- Quản lý trạng thái: Đừng bao giờ thêm tin nhắn vào mảng một cách mù quáng trong môi trường thực tế (production). Luôn sử dụng chiến lược dọn dẹp hoặc cắt bớt.- Tiết kiệm chi phí: Giảm kích thước prompt không chỉ khắc phục lỗi. Nó còn cắt giảm chi phí API của bạn, đặc biệt là khi sử dụng các mô hình cao cấp như Claude 3 Opus.- Kiểm tra thông số mô hình: Mặc dù Claude 3.5 Sonnet hỗ trợ 200k token, các mô hình trong tương lai hoặc các phiên bản khác có thể có các giới hạn khác nhau.

Related Error Notes