はじめに

この記事では、Anthropic Claude 3.7 Sonnetから導入された拡張思考モードをPython SDKで実装する際のコードについて紹介します。

Anthropoc Caludeとは

Anthropic Claudeは、Anthropic社が開発した高度なAI言語モデルです。
このモデルは、自然言語処理タスクにおいて高い性能を発揮し、特に会話型AIやテキスト生成、分析などの用途に適しています。

Anthropic Claudeは、AWSやGoogle Cloudなどのクラウドプラットフォームを通じて利用可能であり、さまざまな業界で活用されています。

Anthropic Claude 3.7 Sonnetとは

2025年2月にAnthropicから提供されたClaude Sonnetシリーズの最新モデルです。
3.7 Sonnetから新たに拡張思考モード(Extended Thinking mode)が導入されています。

拡張思考モードとは

Claude 3.7 Sonnetは2つのモードで動作します。

  • 標準モード:以前のClaudeモデルと同様に、内部の推論を表示せずに直接応答を提供
  • 拡張思考モード:最終的な回答を提供する前にClaudeの推論プロセスを表示

拡張思考モードを使用した場合Reasoning model(推論モデル)として動作します。

Reasoning modelは、Chain of Thought(COT)という手法を活用することで、 問題解決や質問に対して、単に答えを返すのではなく、段階的に考えながら回答を導き出すAIモデルのことです。
モデルが推論の各ステップを明確に示すことができ、問題解決の過程を理解しやすくします。


拡張思考モード使用時の注意点

  • リクエストヘッダにのanthropic-betaフィールドにoutput-128k-2025-02-19を指定する必要がある

リクエストヘッダに以下のように、output-128k-2025-02-19設定が必要です。

anthropic-beta: output-128k-2025-02-19
  • リクエストボディにthinkingパラメータを使用して、推論に使用するトークン予算(budget_tokens)を設定する

拡張思考モード使用時は回答生成とは別に、CoTによる推論でトークンが使用されるため、推論用のトークン数の予算を設定する必要があります。

"thinking": {
    "type": "enabled",
    "budget_tokens": 32000
}
  • 設定するトークン予算(budget_tokens)はmax_tokens以下に設定する必要がある

budget_tokensに設定している値がmax_tokens(出力時の最大トークン)を超過している場合は推論だけでトークン上限に達してしまうため、budget_tokensmax_tokens以下に設定する必要があります。

  • 入力プロンプトトークン + max_tokensがコンテキストウィンドウサイズを超えないようにする

Claude 3.7 Sonnet以前では、プロンプトトークンとmax_tokensの合計がモデルのコンテキストウィンドウを超えても、システムは自動的にmax_tokensを調整してコンテキスト制限内に収めていました。

しかし、Claude 3.7 Sonnetでは、入力プロンプトトークン + max_tokensがコンテキストウィンドウサイズを超える場合、システムはバリデーションエラーを返すようになっています。

Anthropic公式サイト

  • temperatureは1に設定する必要がある

拡張思考モード使用時は、temperatuteは1に設定する必要があります。
1以外が設定されていると以下のエラーが発生します。

`temperature` may only be set to 1 when thinking is enabled. 

Anthropic公式サイト

  • top_pは設定できない

拡張思考モード使用時は、top_pを使用することはできません。

`top_p` must be unset when thinking is enabled. 

Anthropic公式サイト


SDKから拡張思考モードを使ってみる

Python SDKで実装する場合、以下のようなコードになります。
拡張思考モード使用時はclient.messagesではなく、client.beta.messagesを使用します。
また、client.beta.messagesはストリーミング非対応なので、ストリーミングは使用できません。

import anthropic

client = anthropic.Anthropic()

response = client.beta.messages.create(
    model="claude-3-7-sonnet-20250219",
    max_tokens=128000,
    thinking={
        "type": "enabled",
        "budget_tokens": 32000
    },
    messages=[{
        "role": "user",
        "content": "Generate a comprehensive analysis of..."
    }],
    betas=["output-128k-2025-02-19"]
)

print(response)

レスポンスは以下のように出力されます。
拡張思考モード使用時はBetaMessageのcontent配列配下に、BetaThinkingBlockとBetaTextBlockの2つのオブジェクトが存在し、BetaThinkingBlock.thinkingに思考プロセスの内容が、BetaTextBlock.textに回答生成した内容がそれぞれ、設定されます。

BetaMessage(
    id='msg_vrtx_hogehoge',
    content=[
        BetaThinkingBlock(
            signature='xxxxx',
            thinking="-----------------思考プロセス------------------------",
            type='thinking'
        ),
        BetaTextBlock(
            citations=None,
            text="--------------------回答内容-----------------------------",
            type='text'
        )
    ],
    model='claude-3-7-sonnet-20250219',
    role='assistant',
    stop_reason='end_turn',
    stop_sequence=None,
    type='message',
    usage=BetaUsage(
        cache_creation_input_tokens=0,
        cache_read_input_tokens=0,
        input_tokens=423,
        output_tokens=177
    )
)

おわりに

この記事では、Anthropic Claudeの拡張思考モードをPython SDKから使用する場合のコードについて紹介しました。