Sửa lỗi BlockedPromptException: response was blocked trong Google Gemini

intermediate🧠 AI Tools2026-05-17| Python 3.8+, google-generativeai SDK (mọi phiên bản), Google Gemini API (gemini-pro, gemini-1.5-pro, gemini-2.0-flash)

Error Message

BlockedPromptException: response was blocked
#gemini#safety#blocked#google

TL;DR

BlockedPromptException: response was blocked nghĩa là bộ lọc an toàn của Gemini đã gắn cờ prompt hoặc phản hồi được tạo ra. Kiểm tra response.prompt_feedbackcandidate.finish_reason để xem danh mục nào kích hoạt lỗi, sau đó điều chỉnh ngưỡng safety_settings hoặc viết lại prompt.

Nguyên nhân gây ra lỗi này

Mỗi yêu cầu đều được kiểm tra qua bốn danh mục gây hại trước khi Gemini trả về kết quả:

  • HARM_CATEGORY_HARASSMENT
  • HARM_CATEGORY_HATE_SPEECH
  • HARM_CATEGORY_SEXUALLY_EXPLICIT
  • HARM_CATEGORY_DANGEROUS_CONTENT

Có hai dạng lỗi khác nhau. Nếu bản thân prompt vượt ngưỡng cho phép, bạn sẽ nhận BlockedPromptException trước khi bất kỳ token nào được tạo ra. Nếu phản hồi kích hoạt bộ lọc trong quá trình tạo nội dung, candidate sẽ trả về với finish_reason = SAFETY và trường text trống.

Bước 1 — Chẩn đoán chính xác thứ bị chặn

Bỏ qua việc đoán mò — đọc trực tiếp đối tượng feedback:

import google.generativeai as genai

genai.configure(api_key="YOUR_API_KEY")
model = genai.GenerativeModel("gemini-1.5-pro")

try:
    response = model.generate_content("your prompt here")
    print(response.text)
except Exception as e:
    print(f"Exception: {e}")

Ngay cả khi thất bại, đối tượng response vẫn chứa dữ liệu chẩn đoán. Kiểm tra như sau:

response = model.generate_content("your prompt here", stream=False)

# Kiểm tra block ở cấp độ prompt
print("Prompt feedback:", response.prompt_feedback)

# Kiểm tra block ở cấp độ candidate
for candidate in response.candidates:
    print("Finish reason:", candidate.finish_reason)
    print("Safety ratings:", candidate.safety_ratings)

Prompt bị chặn sẽ có block_reason được điền trong prompt_feedback. Phản hồi bị chặn sẽ hiển thị finish_reason = FinishReason.SAFETY trên candidate và không có nội dung text.

Cách sửa 1 — Giảm ngưỡng an toàn cho trường hợp của bạn

Ngưỡng mặc định cho hầu hết các danh mục là BLOCK_MEDIUM_AND_ABOVE. Chuyển sang BLOCK_ONLY_HIGH để cho phép nhiều nội dung hơn đi qua, hoặc BLOCK_NONE để tắt hoàn toàn một danh mục — tuy nhiên BLOCK_NONE yêu cầu quyền truy cập API được phê duyệt.

import google.generativeai as genai
from google.generativeai.types import HarmCategory, HarmBlockThreshold

genai.configure(api_key="YOUR_API_KEY")

safety_settings = {
    HarmCategory.HARM_CATEGORY_HARASSMENT: HarmBlockThreshold.BLOCK_ONLY_HIGH,
    HarmCategory.HARM_CATEGORY_HATE_SPEECH: HarmBlockThreshold.BLOCK_ONLY_HIGH,
    HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE,
    HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT: HarmBlockThreshold.BLOCK_ONLY_HIGH,
}

model = genai.GenerativeModel(
    model_name="gemini-1.5-pro",
    safety_settings=safety_settings
)

response = model.generate_content("your prompt here")
print(response.text)

Các giá trị ngưỡng, từ nghiêm ngặt nhất đến dễ chịu nhất:

  • BLOCK_LOW_AND_ABOVE — chặn mức độ thấp, trung bình và cao
  • BLOCK_MEDIUM_AND_ABOVE — mặc định cho hầu hết các danh mục
  • BLOCK_ONLY_HIGH — chỉ chặn nội dung rõ ràng có hại
  • BLOCK_NONE — tắt bộ lọc (yêu cầu quyền truy cập API được phê duyệt)

Cách sửa 2 — Viết lại prompt để tránh kích hoạt bộ lọc

Bộ lọc an toàn thường chặn prompt không phải vì ý định có hại, mà vì cách diễn đạt cụ thể khớp với các mẫu nội dung bị gắn cờ. Câu hỏi về nghiên cứu bảo mật, nội dung y tế, tiểu thuyết có xung đột, và bất kỳ đề cập nào đến vũ khí hay hóa chất — ngay cả trong ngữ cảnh trung lập — đều là những tác nhân kích hoạt phổ biến.

Những cách viết lại sau thường có tác dụng:

  • Thêm ngữ cảnh rõ ràng: "Dùng cho báo cáo kiểm tra thâm nhập..." hoặc "Trong một câu chuyện hư cấu..."
  • Dùng cách diễn đạt kỹ thuật thay vì ngôn ngữ thông thường
  • Tách một prompt dài thành các phần nhỏ hơn — một câu kích hoạt bộ lọc trong ngữ cảnh lớn hơn thường vượt qua khi gửi riêng lẻ
  • Hỏi cách phòng ngừa thứ gì đó thay vì hỏi cách thực hiện
# Thay vì viết thế này (có thể kích hoạt DANGEROUS_CONTENT):
prompt = "How do I exploit a buffer overflow vulnerability?"

# Thử viết thế này:
prompt = """
I'm writing a secure code review guide. Explain how buffer overflow
vulnerabilities work at a technical level and what input validation
techniques prevent them. Focus on defensive practices.
"""

Cách sửa 3 — Xử lý phản hồi bị chặn một cách có kiểm soát trong môi trường production

Để BlockedPromptException làm crash ứng dụng của bạn hiếm khi là lựa chọn đúng đắn. Hãy bọc các lời gọi với logic dự phòng hiển thị thông tin chẩn đoán hữu ích thay vì stack trace:

import google.generativeai as genai
from google.generativeai.types import HarmCategory, HarmBlockThreshold
from google.api_core.exceptions import GoogleAPIError

def safe_generate(model, prompt: str) -> str | None:
    try:
        response = model.generate_content(prompt)

        if not response.candidates:
            block_reason = response.prompt_feedback.block_reason
            print(f"Prompt blocked: {block_reason}")
            return None

        candidate = response.candidates[0]

        if candidate.finish_reason.name == "SAFETY":
            ratings = {r.category.name: r.probability.name
                      for r in candidate.safety_ratings}
            print(f"Response blocked by safety. Ratings: {ratings}")
            return None

        return response.text

    except Exception as e:
        print(f"API error: {e}")
        return None

model = genai.GenerativeModel("gemini-1.5-pro")
result = safe_generate(model, "your prompt here")

if result:
    print(result)
else:
    print("Content could not be generated — review your prompt.")

Cách sửa 4 — Dùng system instruction để thiết lập ngữ cảnh

Gemini 1.5 trở lên chấp nhận system instruction giúp thiết lập ngữ cảnh cố định trước khi bất kỳ tin nhắn nào của người dùng được gửi đến. Điều này đặc biệt hữu ích khi ứng dụng của bạn có mục đích sử dụng hợp pháp — đào tạo an ninh mạng, giáo dục y tế, viết tiểu thuyết — mà cấu hình an toàn mặc định hiểu nhầm là mối đe dọa.

model = genai.GenerativeModel(
    model_name="gemini-1.5-pro",
    system_instruction=(
        "You are a cybersecurity training assistant helping developers "
        "understand vulnerabilities for defensive purposes. "
        "Provide technically accurate information suitable for security professionals."
    )
)

Xác minh cách sửa đã có tác dụng

Chạy kiểm tra có cấu trúc sau khi áp dụng bất kỳ cách sửa nào ở trên:

response = model.generate_content("your prompt here")

# Nên trống nếu không bị chặn
print("Block reason:", response.prompt_feedback.block_reason)

# Nên là FinishReason.STOP nếu thành công
print("Finish reason:", response.candidates[0].finish_reason)

# Nên có nội dung thực sự
print("Text length:", len(response.text))
print("First 200 chars:", response.text[:200])

Phản hồi thành công sẽ hiển thị block_reason = 0 (không bị chặn), finish_reason = STOP, và text không trống. Cả ba điều kiện đều cần được thỏa mãn.

Khi không có cách nào hiệu quả

Vẫn bị chặn sau khi điều chỉnh ngưỡng và viết lại prompt? Hãy kiểm tra danh sách sau:

  • Kiểm tra bậc API của bạn — BLOCK_NONE yêu cầu được Google phê duyệt rõ ràng. Yêu cầu quyền truy cập thông qua Google Cloud console trong phần cài đặt Gemini API.
  • Thử model khácgemini-2.0-flashgemini-1.5-flash có ngưỡng mặc định hơi khác so với gemini-pro và có thể cho phép các prompt mà model cũ chặn.
  • Chuyển sang Vertex AI SDK — các triển khai doanh nghiệp qua Vertex AI cung cấp nhiều tùy chọn kiểm soát an toàn chi tiết hơn so với Gemini API trực tiếp.
  • Xem lại tài liệu chính thức về safety settings cho phiên bản SDK của bạn. Các tùy chọn ngưỡng thay đổi giữa các phiên bản, vì vậy những gì hoạt động trên 0.4.x có thể khác trên 0.8.x.

Related Error Notes