Sửa lỗi OpenAI BadRequestError: The response was filtered by Content Moderation

intermediate🧠 AI Tools2026-05-17| Python 3.8+, openai SDK >=1.0.0, mọi hệ điều hành (Linux/macOS/Windows)

Error Message

BadRequestError: The response was filtered
#openai#kiểm-duyệt#bộ-lọc-nội-dung

Lỗi Gì Đang Xảy Ra

Giữa chừng một API call, ứng dụng của bạn bị crash với thông báo:

openai.BadRequestError: Error code: 400 - {'error': {'message': 'The response was filtered due to the prompt triggering Azure OpenAI\'s content management policy. Please modify your prompt and retry.', 'type': 'content_filter', 'param': 'prompt', 'code': 'content_filter'}}

Trên OpenAI API tiêu chuẩn thì ngắn gọn hơn:

openai.BadRequestError: The response was filtered

Dù theo cách nào, lớp kiểm duyệt nội dung đã chặn request của bạn. Nó đã chặn prompt đầu vào hoặc output được tạo ra — trước khi đến được code của bạn. Đây là lỗi 400, không phải 500. Server không bị lỗi; nó cố ý từ chối.

Tại Sao Điều Này Xảy Ra

Mọi prompt và completion đều đi qua pipeline kiểm duyệt của OpenAI. Hệ thống chấm điểm nội dung theo các danh mục như hate speech, tự làm hại bản thân, nội dung tình dục và bạo lực. Điểm số từ 0.0 đến 1.0 — vượt ngưỡng ở bất kỳ danh mục nào, bạn sẽ nhận được lỗi này thay vì completion.

Các nguyên nhân phổ biến:

  • Từ khóa nhạy cảm trong ngữ cảnh kỹ thuật hoặc học thuật (nghiên cứu bảo mật, thảo luận y tế)
  • Input thô từ người dùng được đưa thẳng vào prompt mà không qua bất kỳ bước lọc nào
  • Viết sáng tạo liên quan đến bạo lực, lạm dụng hoặc chủ đề người lớn
  • Các tình huống y tế hoặc pháp lý mô tả các tình huống liên quan đến gây hại
  • Prompt bảo mật — hỏi về CVE, mẫu khai thác hoặc chi tiết lỗ hổng bảo mật
  • Output của chính model bị lọc — prompt của bạn sạch, nhưng completion thì không

Trường hợp cuối thường khiến mọi người bất ngờ. Bạn không thể luôn dự đoán model sẽ tạo ra gì, vì vậy ngay cả một prompt có vẻ an toàn cũng có thể tạo ra output bị lọc.

Bước 1 — Xác Định Phần Nào Bị Lọc

Trước khi viết lại bất cứ điều gì, hãy xác nhận vấn đề là input của bạn hay output của model. Chạy prompt của bạn qua Moderation API trực tiếp:

import openai

client = openai.OpenAI()

response = client.moderations.create(
    input="Your prompt text here"
)

result = response.results[0]
print("Flagged:", result.flagged)
print("Categories:", result.categories)
print("Scores:", result.category_scores)

Nếu result.flaggedTrue, input của bạn là vấn đề. Dict result.categories cho biết chính xác điều gì đã kích hoạt — chẳng hạn như violence: True hoặc sexual/minors: True. Các điểm số cho thấy các danh mục khác gần ngưỡng đến mức nào, điều này hữu ích khi một prompt thất bại không liên tục.

Nếu flaggedFalse nhưng bạn vẫn gặp lỗi, output đang bị lọc. Chuyển sang kiểm tra finish_reason (Bước 4).

Bước 2 — Viết Lại Prompt

Diễn đạt lại thường là đủ. Một số cách hiệu quả:

  • Thay các từ mang cảm xúc mạnh bằng các từ tương đương mang tính lâm sàng. "How to hurt X" → "What are the risks associated with X".
  • Thêm ngữ cảnh làm rõ mục đích: "for a security audit", "in a fictional context", "for a medical training dataset".
  • Tách các prompt dài. Một câu bị gắn cờ nằm trong một prompt 500 từ vẫn sẽ làm hỏng toàn bộ request.
  • Lọc input người dùng trước khi đưa vào API. Đừng tin tưởng vào những gì người dùng gửi cho bạn.
# Không an toàn — input người dùng đưa thẳng vào prompt
prompt = f"User asked: {user_input}\nAnswer:"

# An toàn — kiểm tra trước, sau đó mới tạo prompt
moderation_check = client.moderations.create(input=user_input)
if moderation_check.results[0].flagged:
    raise ValueError("User input contains flagged content.")

prompt = f"User asked: {user_input}\nAnswer:"

Bước 3 — Xử Lý Lỗi Một Cách Khéo Léo Trong Code

Đừng để content filter làm crash toàn bộ ứng dụng. Bắt BadRequestError và trả về thông báo có ý nghĩa cho người dùng:

import openai

client = openai.OpenAI()

try:
    response = client.chat.completions.create(
        model="gpt-4o",
        messages=[
            {"role": "user", "content": user_message}
        ]
    )
    answer = response.choices[0].message.content
except openai.BadRequestError as e:
    if "content_filter" in str(e) or "response was filtered" in str(e).lower():
        answer = "Sorry, I can't respond to that request due to content policy."
    else:
        raise  # BadRequestError khác — đừng bỏ qua

Phần else: raise rất quan trọng. Không phải mọi BadRequestError đều là content filter — tên model không hợp lệ, tin nhắn sai định dạng và tràn giới hạn token đều ném ra cùng loại exception.

Bước 4 — Kiểm Tra finish_reason Trên Các Response Thành Công

Có một biến thể tinh tế hơn: API trả về HTTP 200, nhưng output bị lọc giữa chừng khi đang tạo. Trong trường hợp này finish_reasoncontent_filter thay vì stop, và message.content có thể là None hoặc bị cắt ngắn.

response = client.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": prompt}]
)

choice = response.choices[0]
if choice.finish_reason == "content_filter":
    print("Output bị lọc — nội dung có thể không đầy đủ hoặc là None")
    print("Content:", choice.message.content)  # Có thể là None hoặc bị cắt ngắn
else:
    print(choice.message.content)

Luôn kiểm tra finish_reason trong môi trường production. Đọc message.content một cách mù quáng khi nó là None sẽ ném ra AttributeError ở sâu hơn trong code, điều này khó truy vết hơn lỗi filter ban đầu.

Bước 5 — Cách Khắc Phục Đặc Thù Cho Azure OpenAI

Azure OpenAI cung cấp cho bạn nhiều quyền kiểm soát hơn. Độ nghiêm ngặt của content filter có thể cấu hình theo từng deployment — bạn có thể yêu cầu điều chỉnh ngưỡng cho các danh mục cụ thể thông qua Azure portal.

Điều hướng đến Azure OpenAI → Your Resource → Content Filters và tạo một profile filter tùy chỉnh. Ví dụ, một dịch vụ kiểm duyệt game có thể cần lọc bạo lực ít nghiêm ngặt hơn. Microsoft phê duyệt những trường hợp này theo từng ca cụ thể.

Một điều nữa đặc thù với Azure: tên deployment sai có thể tạo ra các lỗi trông giống như vấn đề content filter. Kiểm tra lại cho chắc:

client = openai.AzureOpenAI(
    azure_endpoint="https://your-resource.openai.azure.com/",
    api_key="your-api-key",
    api_version="2024-02-01"
)

response = client.chat.completions.create(
    model="your-deployment-name",  # Phải khớp chính xác với tên Azure deployment của bạn
    messages=[{"role": "user", "content": prompt}]
)

Xác Nhận Đã Sửa Xong

Hai bước kiểm tra trước khi kết luận xong:

import openai

client = openai.OpenAI()

# 1. Xác nhận prompt đã sạch
mod = client.moderations.create(input=your_new_prompt)
print("Still flagged:", mod.results[0].flagged)  # Phải là False

# 2. Chạy completion thực tế
try:
    res = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[{"role": "user", "content": your_new_prompt}]
    )
    print("finish_reason:", res.choices[0].finish_reason)  # Phải là 'stop'
    print("Response:", res.choices[0].message.content)
except openai.BadRequestError as e:
    print("Still getting error:", e)

flagged: Falsefinish_reason: stop — đó là trạng thái sạch bạn cần đạt được.

Mẹo

  • Không bao giờ đưa thẳng input thô của người dùng vào prompt. Luôn kiểm tra trước bằng Moderation API, đặc biệt trong các ứng dụng xử lý nội dung do người dùng tạo ra.
  • Moderation API miễn phí khi gọi. Sử dụng nó như một cổng kiểm tra trước mỗi completion trong các quy trình có rủi ro cao — chi phí độ trễ không đáng kể so với một request thất bại.
  • System prompt cũng có thể kích hoạt bộ lọc. Một system message hướng dẫn model đóng vai một nhân vật có hại sẽ bị bắt giống như các tin nhắn người dùng.
  • gpt-3.5-turbogpt-4o không có độ nhạy giống hệt nhau. Một prompt thất bại trên model này đôi khi hoạt động trên model kia — đáng thử nếu bạn có sự linh hoạt.
  • Các trường hợp sử dụng nhạy cảm hợp lệ (giáo dục y tế, nghiên cứu bảo mật, phân tích pháp lý) có thể xin ngoại lệ chính sách sử dụng thông qua cổng hỗ trợ của OpenAI. Hãy ghi lại rõ ràng trường hợp sử dụng của bạn khi gửi.

Related Error Notes