【要約】Claude 4.6 以降 Assistant Message Prefill が廃止になったので max_tokens 超過時のリトライ処理を見直す [Qiita_Trend] | Summary by TechDistill
> Source: Qiita_Trend
Execute Primary Source
// Problem
開発者がClaudeのモデルをSonnet 4.5以前から4.6以降へ移行する際、従来の出力制御や継続生成ロジックが動作しなくなる問題に直面する。具体的には以下の課題が発生する。
- ・Assistant Message PrefillによるJSON出力の強制が、400エラー(ValidationException)により失敗する。
- ・max_tokens超過時に、中断された箇所から生成を再開させる「Continuation」処理が利用不能になる。
- ・会話の末尾をアシスタントメッセージで終わらせることができず、リクエストが拒否される。
// Approach
開発者が、Prefillに依存しない新しいメッセージ構造を採用することで、モデルの制約を回避する。具体的には、継続処理を「ユーザーメッセージによる指示」へと変換する手法をとる。
- ・メッセージ履歴をループ外で管理し、文脈を維持する構造に変更する。
- ・中断されたアシスタントの回答を、一度履歴(assistant role)として追加する。
- ・直前の出力末尾(約100文字)を引用した、継続を促すユーザーメッセージを生成する。
- ・「前置きは含めない」といった指示を加え、生成の破綻を防ぐ。
// Result
開発者が、Claude 4.6以降のモデルにおいても、エラーを回避しつつ安定した長文生成を実現できる。具体的な成果は以下の通りである。
- ・ValidationExceptionを解消し、正常なリトライ処理が可能になる。
- ・全テキストではなく末尾100文字のみを渡すことで、トークン消費を抑制できる。
- ・モデルが「新しいタスク」と誤認して無限ループに陥る現象を防止できる。
- ・Bedrock Converse APIを用いた、実用的なリトライ実装が確立される。
Senior Engineer Insight
> モデルの破壊的変更に対し、単なる「指示の変更」だけでなく「メッセージ構造の再設計」で対応している点が評価できる。特に、全テキストをプロンプトに埋め込むと、モデルが文脈を誤認して無限ループに陥るという指摘は、大規模トラフィックを扱う現場では極めて重要な知見である。スニペット(末尾100文字)を利用する設計は、精度・コスト・安定性のバランスが取れた実戦的な解といえる。エージェント開発においては、SDK側での対応状況も併せて確認すべきである。