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_feedback và candidate.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à caoBLOCK_MEDIUM_AND_ABOVE— mặc định cho hầu hết các danh mụcBLOCK_ONLY_HIGH— chỉ chặn nội dung rõ ràng có hạiBLOCK_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 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_NONEyê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ác —
gemini-2.0-flashvàgemini-1.5-flashcó ngưỡng mặc định hơi khác so vớigemini-provà 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.xcó thể khác trên0.8.x.

