PydanticAI ビジュアルガイド

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・歴史教材など) でも応答が空になることがあります。

図を読み込み中…
図1. Safety Settings の効き目

概念: 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)

ポイント:

  • categorythresholddict のリスト で渡す
  • HarmCategory / HarmBlockThresholdgoogle.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) も読み合わせる。

図を読み込み中…
図2. 用途別の推奨設定の方向性

観察: ブロックされたかを検出する

ブロックされた応答は 空文字列特定の例外 として返ります。result.all_messages() を見ると finish_reason のような情報が取れることがあります。本番では Logfire (Ch9) でブロック率をメトリクス化しておくと安全。

まとめ

  • GoogleModelSettings(google_safety_settings=[...]) でカテゴリごとに閾値を変えられる
  • HarmCategory 4 種 × HarmBlockThreshold 4 段階の組み合わせで設計
  • 業務コンテキストごとに 必要な分だけ 緩める 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)。

Open in Colab

notebooks/ch05/03-safety-settings.ipynb