Lesson CH05-L03
Safety Settings
安全フィルタを用途に合わせて緩める / 締める。
- 読了目安
- 10 min
- Colab目安
- 14 min
- 合計
- 24 min
- 前提
- Thinking (Gemini 3)
関連: 公式ドキュメント
一行サマリ
GoogleModelSettings(google_safety_settings=[...]) で Gemini の コンテンツ安全フィルタ (HarmCategory) ごとに閾値 (HarmBlockThreshold) を調整 できる。医療・法務・教育のように デフォルトでは過剰に弾かれる 用途で必要に応じて緩める / 逆により厳しくする。
ヒーロー: 安全フィルタの位置づけ
Gemini はデフォルトで 4 つの有害コンテンツカテゴリ をブロックします。閾値を調整しないと、適切な業務コンテキスト (医療相談・法律 Q&A・歴史教材など) でも応答が空になることがあります。
概念: 4 つのカテゴリと 4 つの閾値
| HarmCategory | 何を検知 |
|---|---|
HARM_CATEGORY_HARASSMENT | 嫌がらせ・侮辱 |
HARM_CATEGORY_HATE_SPEECH | ヘイトスピーチ |
HARM_CATEGORY_SEXUALLY_EXPLICIT | 性的に露骨な表現 |
HARM_CATEGORY_DANGEROUS_CONTENT | 危険行為 (武器・違法行為等) |
各カテゴリに対して 4 段階の閾値を設定できます。
| HarmBlockThreshold | 意味 |
|---|---|
BLOCK_NONE | 一切ブロックしない |
BLOCK_ONLY_HIGH | 高確率で有害なものだけブロック |
BLOCK_MEDIUM_AND_ABOVE | 中以上をブロック |
BLOCK_LOW_AND_ABOVE | 低でもブロック (最も厳しい) |
デフォルトはおおむね BLOCK_MEDIUM_AND_ABOVE 相当。これを 業務コンテキストごとに調整 します。
コード: 3 つのパターン
パターン 1: 教育用に少し緩める (歴史・ニュース解説など)
from google.genai.types import HarmBlockThreshold, HarmCategory
from pydantic_ai import Agent
from pydantic_ai.models.google import GoogleModel, GoogleModelSettings
model = GoogleModel('gemini-3-flash-preview')
# 歴史的な暴力表現が混ざる教材で「危険コンテンツ」を緩める
edu_settings = GoogleModelSettings(
google_safety_settings=[
{
'category': HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT,
'threshold': HarmBlockThreshold.BLOCK_ONLY_HIGH,
}
]
)
agent_edu = Agent(
model,
model_settings=edu_settings,
instructions='高校生向けの歴史解説を、簡潔な日本語で書いてください。',
)
print(agent_edu.run_sync('第二次世界大戦の主要な戦闘を 3 つ挙げて、簡潔に説明して').output)ポイント:
categoryとthresholdを dict のリスト で渡すHarmCategory/HarmBlockThresholdはgoogle.genai.typesから import- 設定したカテゴリ "だけ" 上書き、他のカテゴリはデフォルト維持
パターン 2: 企業内チャット用に全カテゴリを最も厳しくする
社内向けで多人数が利用するチャットでは、デフォルトより 厳しく したいことがあります。
strict_settings = GoogleModelSettings(
google_safety_settings=[
{'category': cat, 'threshold': HarmBlockThreshold.BLOCK_LOW_AND_ABOVE}
for cat in [
HarmCategory.HARM_CATEGORY_HARASSMENT,
HarmCategory.HARM_CATEGORY_HATE_SPEECH,
HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT,
HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT,
]
]
)
agent_strict = Agent(
GoogleModel('gemini-3-flash-preview'),
model_settings=strict_settings,
instructions='社内ヘルプデスクとして丁寧な日本語で答えてください。',
)「弾きすぎて応答が空になる」場合は閾値を 1 段階緩めて再評価。運用初期は厳しめで始めて、誤ブロックを観測しながら緩める のが安全な順序です。
パターン 3: 医療相談用に Sexual だけ緩める (ニッチな例)
医療系・性教育コンテンツでは、SEXUALLY_EXPLICIT のデフォルトが厳しすぎて適切な解剖説明まで弾かれることがあります。
medical_settings = GoogleModelSettings(
google_safety_settings=[
{
'category': HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT,
'threshold': HarmBlockThreshold.BLOCK_ONLY_HIGH,
}
]
)
agent_med = Agent(
GoogleModel('gemini-3-flash-preview'),
model_settings=medical_settings,
instructions=(
'看護学生向けの教材として、医学的に正確で配慮のある日本語で答えてください。'
'専門用語の解説を必ず含めてください。'
),
)
# 例: 解剖や生理に関する質問
print(agent_med.run_sync('女性の生殖器官の構造と機能を看護学生向けに解説してください。').output)注意: 緩める判断は 業務責任者・コンプライアンスと合意の上で 行うこと。サービス利用規約 (Google Cloud / AI Studio) も読み合わせる。
観察: ブロックされたかを検出する
ブロックされた応答は 空文字列 や 特定の例外 として返ります。result.all_messages() を見ると finish_reason のような情報が取れることがあります。本番では Logfire (Ch9) でブロック率をメトリクス化しておくと安全。
まとめ
GoogleModelSettings(google_safety_settings=[...])でカテゴリごとに閾値を変えられるHarmCategory4 種 ×HarmBlockThreshold4 段階の組み合わせで設計- 業務コンテキストごとに 必要な分だけ 緩める or 厳しくする
- 本番で
BLOCK_NONEは危険。コンプライアンス合意 + 観測 (Ch9) で運用
🎉 Core グループ完結
これで Ch3 Function Tools (4) + Ch4 Structured Output (3) + Ch5 Capabilities (3) = 10 レッスン の Core グループが完了です。次の Advanced グループ (Ch6-Ch8) からは、マルチモーダル入力 / MCP 連携 / マルチエージェント協調 という 表現幅を一気に広げる機能群 に進みます。
Colab で実際に動かす
本レッスンの内容を Google Colab 上で実行できるノートブックを用意しています。下のボタンから自分のColab環境に開けます (要 Google アカウント / GOOGLE_API_KEY)。
notebooks/ch05/03-safety-settings.ipynb