ChatGPTから返事が来ない?原因はcontent_filterだった話【OpenAI APIの落とし穴】
ChatGPTから返事が来ない?原因は content_filter
だった話【OpenAI APIの落とし穴】
ある日、自作のアプリで ChatGPT(OpenAI API) を使っていたところ、ユーザーが送信してもAIからの返答が返ってこないという現象に直面しました。
サーバーエラーか、ネットワークの問題かと思って調査した結果… 原因はまさかの finish_reason: "content_filter"
。この記事では、実際に起きた状況とその解決方法を共有します。
症状:レスポンスが空
APIのレスポンスログを確認したところ、以下のようなJSONが返っていました:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
{ "choices": [ { "message": { "role": "assistant", "content": "" }, "finish_reason": "content_filter" } ], "usage": { "completion_tokens": 0 } } |
つまり、返答がフィルターでブロックされて「空文字」として返ってきていたというわけです。
なぜブロックされたのか?
OpenAIのコンテンツフィルターは、以下のような条件で出力を遮断します:
- 攻撃的またはセンシティブな内容と誤認される表現
- ユーザーの入力や履歴に伏字・スラング・引用などが含まれている
- 過去の長い履歴に、引っかかる単語が紛れている
私のケースでは、会話履歴の中に古い発言がそのまま残っており、それが原因だったようです。
対策:フィルター検知→フォールバック
OpenAI APIでは、finish_reason
や content
をチェックして、ブロックされたかどうかを判定できます。
以下はサンプルコードです(実際のアプリとは異なるサンプル用の変数名で記述しています):
1 2 3 4 5 6 7 8 9 |
const response = openAiResult.choices?.[0]; const reason = response?.finish_reason ?? ""; const text = response?.message?.content?.trim() ?? ""; if (reason === "content_filter" || text.length === 0) { // フォールバックメッセージを返す return "安全フィルターにより応答できませんでした"; } |
こうすることで、ユーザーに「返事がない」まま待たせるのではなく、状況を明確に伝えることができます。
予防策:事前チェックで未然に防ぐ
再発を防ぐには、OpenAIの Moderation API
を使って、プロンプトや履歴を送信前にチェックする方法もあります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
async function isFlaggedByModeration(input: string): Promise<boolean>; { const res = await fetch("https://api.openai.com/v1/moderations", { method: "POST", headers: { "Content-Type": "application/json", Authorization: `Bearer YOUR_API_KEY`, }, body: JSON.stringify({ model: "text-moderation-latest", input, }), }); const json = await res.json(); return json.results?.[0]?.flagged === true; } |
これを使えば、フィルターに引っかかる前に「危険そうな入力」をユーザーに修正してもらうことができます。
まとめ
- OpenAI APIで返事がないとき、
content_filter
によるブロックの可能性がある finish_reason
とcontent
をチェックして適切にフォールバック- Moderation APIを使えば事前チェックも可能
- ユーザー体験を損なわないよう、意味のある代替テキストを返すのが重要
もしあなたも「ChatGPTの返事が来ない…」と悩んでいるなら、一度 finish_reason
を確認してみてください。
この記事が誰かのデバッグ時間を1時間でも短縮できますように。
ディスカッション
コメント一覧
まだ、コメントがありません