CLAUDE LABEN
OPUS48 — Claude Opus 4.8が一般提供に。コーディング・エージェント能力・推論・実務知識のいずれもOpus 4.7から底上げされましたAUTO — Claude CodeのautoモードがBedrock・Vertex AI・Foundryで既定になり、BedrockのモデルもOpus 4.8へ更新されましたGUARD — autoモードはセッション記録の改ざんをブロックし、文脈から解決できない変数へのrm -rfは事前に確認するようになりましたIDP — 管理者はIdP経由で組織全体にMCPコネクタを配布でき(Okta起点)、メンバーは初回ログインで自動的に利用開始できますTIMEOUT — --mcp-configや.mcp.jsonのサーバー単位request_timeout_msが無視され60秒で切れる不具合が修正されましたFAST — Opus 4.7のfastモードは7/24に削除予定です。speed: fastはエラーになるためOpus 4.8のfastモードへ移行しますOPUS48 — Claude Opus 4.8が一般提供に。コーディング・エージェント能力・推論・実務知識のいずれもOpus 4.7から底上げされましたAUTO — Claude CodeのautoモードがBedrock・Vertex AI・Foundryで既定になり、BedrockのモデルもOpus 4.8へ更新されましたGUARD — autoモードはセッション記録の改ざんをブロックし、文脈から解決できない変数へのrm -rfは事前に確認するようになりましたIDP — 管理者はIdP経由で組織全体にMCPコネクタを配布でき(Okta起点)、メンバーは初回ログインで自動的に利用開始できますTIMEOUT — --mcp-configや.mcp.jsonのサーバー単位request_timeout_msが無視され60秒で切れる不具合が修正されましたFAST — Opus 4.7のfastモードは7/24に削除予定です。speed: fastはエラーになるためOpus 4.8のfastモードへ移行します
記事一覧/API & SDK
API & SDK/2026-07-14上級

ユーザーに届くAI生成の短文を、公開前に二段ゲートで止める

アプリでユーザーに配信するAI生成の短文に、決定的ルール層とClaude分類層の二段公開ゲートを組む設計です。fail-closed・生成時検疫・コスト設計まで、実装コード付きで整理しました。

Claude45API26モデレーション個人開発108アプリ開発8

プレミアム記事

癒し系のアプリに「今日の一言」を差し込もうとして最初に怖くなったのは、モデルが良い文を書けるかどうかではありませんでした。千に一つ、万に一つ混じる不穏な一文が、そのままユーザーの朝の画面に出てしまう——その一枚が怖かったのです。

チャットボットなら、おかしな返答が来ても会話の中で訂正が効きます。けれどアプリの画面に一行で差し込む短文は違います。ユーザーはそれを「アプリからの言葉」として受け取りますし、その場で言い返す相手もいません。生成の良し悪しは平均で語られがちですが、配信文言で問われるのは平均ではなく、最悪の一件をどう止めるかです。

個人開発で複数のアプリを回してきて私自身がたどり着いたのは、生成の品質を上げる努力とは別に、「未検疫の文字は一文字もユーザーに出さない」という関門を、配信の手前に一枚挟むという設計でした。以下では、その公開前ゲートを決定的ルール層とClaude分類層の二段で組む実装を、本番運用でつまずく点まで含めて具体的にたどっていきます。

ゲートを「配信経路」ではなく「生成経路」に置く

最初に決めるべきは、検疫をいつ走らせるかです。ユーザーがアプリを開いた瞬間にAPIを叩いて判定する設計は、一見素直に見えて三つの問題を抱えます。ユーザーを待たせること、表示のたびに課金が発生すること、そしてAPIが落ちたときに「配信を止めるか、無検疫で出すか」という最悪の二択を突きつけられることです。

私は検疫を生成の側に寄せます。文面をあらかじめ作り、その場で検疫し、合格したものだけを判定済みとして保存します。ユーザーの画面には、すでに関門を通り抜けた文だけを取り出して表示します。こうするとユーザー体験は完全に同期的なまま、判定の重さは裏側の非同期バッチに隠せます。

観点配信時に判定する生成時に判定する(本記事)
ユーザーの待ち時間判定レイテンシが乗る取り出すだけでゼロ
コスト表示回数ぶん課金生成件数ぶんだけ
API障害時配信停止か無検疫配信既存の判定済みプールで平常運転
人間レビュー事後にしか挟めない配信前に挟める

この一点を最初に固めておくと、以降の層はすべて「オフラインのバッチで、多少重くても構わない」という前提で設計できます。

決定的ルール層 — 全件に、ミリ秒で

一段目は、Claudeを一切呼ばない決定的な層です。ここで弾けるものは、確率的なモデルに判断させるより、コードで機械的に落とすほうが速く、安く、再現性があります。役割は「明らかに出してはいけないもの」を全件に対してミリ秒で振り落とすことです。

import re
import unicodedata
 
# アプリの配信ポリシーに合わせた語彙。実運用では外部ファイルで管理します
BANNED_LEXICON = {"死ね", "殺す", "詐欺", "必ず儲かる"}
URL_RE = re.compile(r"https?://|www\.", re.IGNORECASE)
EMAIL_RE = re.compile(r"[\w.+-]+@[\w-]+\.[\w.-]+")
# 連絡先・URL・過度な記号は配信文言に不要
EXCESS_SYMBOL_RE = re.compile(r"[!!??]{3,}")
 
def deterministic_gate(text: str, min_len: int = 8, max_len: int = 60) -> dict:
    """全件を通す一次フィルタ。合格なら reasons が空になります。"""
    normalized = unicodedata.normalize("NFKC", text).strip()
    reasons = []
 
    length = len(normalized)
    if length < min_len:
        reasons.append("too_short")
    if length > max_len:
        reasons.append("too_long")
 
    lowered = normalized.lower()
    for word in BANNED_LEXICON:
        if word in normalized:
            reasons.append(f"banned:{word}")
 
    if URL_RE.search(lowered) or EMAIL_RE.search(normalized):
        reasons.append("contains_contact")
    if EXCESS_SYMBOL_RE.search(normalized):
        reasons.append("excess_symbols")
 
    return {"passed": len(reasons) == 0, "reasons": reasons, "text": normalized}
 
 
# 期待する動作
print(deterministic_gate("今日の一歩を、静かに踏み出してみましょう"))
# => {'passed': True, 'reasons': [], 'text': '今日の一歩を、静かに踏み出してみましょう'}
print(deterministic_gate("必ず儲かる方法を教えます!!!"))
# => {'passed': False, 'reasons': ['banned:必ず儲かる', 'excess_symbols'], ...}

決定的層で大事なのは、ここで「グレー」を裁こうとしないことです。文脈依存で微妙なものはこの層では通し、二段目のClaudeに委ねます。決定的層はあくまで「議論の余地なく不可」を落とす場所に徹することを推奨します。語彙リストは後述する人間レビューから育てていく前提で、最初から完璧を目指しません。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
生成文がまれに混ぜる不適切な一文がそのままユーザーに出てしまう不安を、公開前ゲートで断ち切れるようになる
決定的ルール層とClaude分類層を組み合わせ、構造化出力とfail-closedで「未検疫の文字を絶対に配信しない」パイプラインを実装できる
検疫を配信経路ではなく生成経路に置くことで、ユーザーの待ち時間もAPIコストも増やさずに安全性を上げられる
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Claude Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

API & SDK2026-07-12
非ストリーミングの長い応答が10分の壁で黙って二重課金されていた — SDK既定のタイムアウトと自動リトライを設計し直す
Anthropic SDK の既定タイムアウト10分と自動リトライ2回が、長い非ストリーミング応答を裏で二重に走らせて課金することがあります。発生の仕組みと、ストリーミング切替・明示的な timeout/max_retries・ローカル台帳で止める実装を、実測値とともにまとめました。
API & SDK2026-06-22
Claude API の静的キーをやめる — Workload Identity Federation で CI と本番を鍵なしに切り替える
Claude Platform で一般提供が始まった Workload Identity Federation を使い、sk-ant- 形式の静的キーを数分で失効する OIDC トークンへ移行する設計を扱います。GitHub Actions の鍵なし認証、移行手順、トークン更新まで具体的に整理しました。
API & SDK2026-06-22
pause_turn の継続ループに上限を入れる — 無人で長時間サーバーツールを安全に回す
web_search や code execution など長時間サーバーツールを使うと返ってくる pause_turn を、無人運用で安全に継続する設計をまとめました。4種類の stop_reason を1ループで分岐し、継続回数と時間に上限を入れ、セグメントを跨ぐ usage を数える実装まで扱います。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →