Claude 3.7 Sonnet の 拡張思考モード(extended thinking mode) 

# 拡張思考モード(extended thinking mode) とは

先日 Anthropic の Claude 3.7 Sonnet が対応になりました。

https://aws.amazon.com/jp/about-aws/whats-new/2025/02/anthropics-claude-3-7-sonnet-amazon-bedrock/

https://aws.amazon.com/jp/blogs/news/anthropics-claude-3-7-sonnet-the-first-hybrid-reasoning-model-is-now-available-in-amazon-bedrock/

この内容で気になったのが、拡張思考モード(extended thinking mode)です。

extended thinking mode を選択することで、通常のレスポンス(text)の前に、thinking による内部思考を行い回答する。

直ぐに回答するのではなく、もう少し考えてから回答するパターンに利用するようです。

https://docs.aws.amazon.com/ja_jp/bedrock/latest/userguide/model-parameters-anthropic-claude-37.html


# Tips

- トークンは通常の output のトークン数としてカウントされる
- thinking に費やすトークンの数は budget_tokens で指定する。最低 1024 〜、最初は大きめな数値から始める
- 1024 以内なら使う必要ない
- 拡張思考モードを使う時は、プロンプトで細かい順番を指示してしまうとバッティングするため、細かい順番を指示しないように注意する


# やってみる

## ナレッジベースのデータソースの準備

ナレッジベースのデータソースはちょっと古いですが[こちら](https://d1.awsstatic.com/International/ja_JP/Whitepapers/AWS_Well-Architected_Framework_2018_JA_final.pdf
)の AWS Well-Architected フレームワークの軽めものを用意しました。

:::note alert
最初 30 MB 程度の大きめのデータソースを準備しましたが、同期ときに次のエラーとなりうまくいかなかったため、軽めのデータソースを用意しました。

encountered error: file body text exceeds size limit of 1000000 for semantic chunking. [files: bedrock-api.pdf]. call to customer source did not succeed.

参考：https://dev.classmethod.jp/articles/amazon-bedrock-knowledge-bases-semantic-chunks/
:::

## 実装

今回は拡張思考モードの検証ですので、簡易的に準備します。

- temperature は 1 にする
- generationConfiguration 内の additionalModelRequestFields に reasoning_config で指定

```python
import streamlit as st
import boto3

st.title("Knowledge base RAGアプリケーション")
use_model = st.selectbox("使用するモデルを選択してください",("Sonnet3.7","Sonet3.5 v2"))
user_input = st.text_input("質問")
send_button = st.button("送信")

if send_button and user_input:

    if use_model == "Sonnet3.7":
        modelId = "arn:aws:bedrock:us-west-2:<AWSアカウント>:inference-profile/us.anthropic.claude-3-7-sonnet-20250219-v1:0"
    elif use_model == "Sonet3.5 v2":
        modelId = "arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-5-sonnet-20241022-v2:0"

    knowledgebase = boto3.client("bedrock-agent-runtime")
    response = knowledgebase.retrieve_and_generate(
        input={"text": user_input},
        retrieveAndGenerateConfiguration={
            "type": "KNOWLEDGE_BASE",
            "knowledgeBaseConfiguration": {
                "generationConfiguration": {
                    "promptTemplate": {
                        "textPromptTemplate": "あなたはdocumentsを参考に質問に回答します。<documents>$search_results$</documents>\ndocumentsを参考にせずに回答する場合は、「資料にありませんが、私の知識では」と言う言葉の後に、知識で回答します。"
                    },
                    "inferenceConfig": {
                        "textInferenceConfig": {
                            "maxTokens": 4000,
                            "temperature": 1,
                        }
                    },                   
                    "additionalModelRequestFields": {
                        "reasoning_config": {
                            "type": "enabled",
                            "budget_tokens": 2000
                        },
                    },
                "knowledgeBaseId": "<ナレッジベースID>",
                "modelArn": modelId,
                "retrievalConfiguration": { 
                    "vectorSearchConfiguration": { 
                        "numberOfResults": 10
                    },
                },
            },
        },
    )
    st.write(response["output"]["text"])
```

## 拡張思考モード有りの場合

データソースには、「フレームワークの 5 本の柱」が書かれています。
しかし、現在は「フレームワークの 6 本の柱」ですので、どのような回答となるか期待です。

![スクリーンショット 2025-03-12 1.17.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/d6f96b41-6625-4c5f-be76-3bad335f34c4.png)

うーん、ちょっと拡張思考モード無しの場合と比べないとわかりにくいですね。

ログを確認すると、reasoningContent 内に思考されていることが確認できるようです。

```json
    "output": {
        "outputContentType": "application/json",
        "outputBodyJson": {
            "output": {
                "message": {
                    "role": "assistant",
                    "content": [
                        {
                            "reasoningContent": {
                                "reasoningText": {
                                    "text": "AWS Well-Architected フレームワークの柱について、提供された資料を確認します。\n\n資料1では、「AWS Well-Architected フレームワークは、運⽤性、セキュリティ、信頼性、パフォーマンス効率、コスト最適化という5本の柱を基本としています。」と明記されています。\n\n資料2には目次があり、フレームワークの5本の柱として、運⽤上の優秀性、セキュリティ、信頼性、パフォーマンス効率、コスト最適化が挙げられています。\n\n資料3では表1でAWS Well-Architected フレームワークの柱として運⽤上の優秀性、セキュリティ、信頼性、パフォーマンス効率の説明があります（コスト最適化については切れていますが、他の資料から5本目の柱であることがわかります）。\n\n資料5には「AWS Well-Architected フレームワークの⽬的は、効率が良く、費⽤対効果が⾼く、安全で信頼のおけるクラウド対応システムを設計して運⽤するための5本柱のアーキテクチャに関するベストプラクティスを提供することです」とあります。\n\n資料9では「運⽤性、セキュリティ、信頼性、パフォーマンス効率、コスト最適化の5本の柱」と明記されています。\n\nこれらの資料から、AWS Well-Architected フレームワークは5本の柱（運⽤性/運⽤上の優秀性、セキュリティ、信頼性、パフォーマンス効率、コスト最適化）で構成されていることがわかります。質問では「6本の柱」とありますが、資料の情報では5本の柱しか確認できません。\n\nしたがって、AWS Well-Architected フレームワークは5本の柱で構成されていることを説明し、その各柱の概要を説明するのが適切だと思います。",
                                    "signature": "EqoBCkgIARABGAIiQBOouUXGc8OyN1pMQGeVqkxym++mcYKSHTojRKaxkkyS+4dr9R6fm5kBR2bNnkkTJad7NfoHBh3P9VpTUlAgVUQSDNH/KlWYHF+qsjH2BBoMw24ioL/X43jbbU36IjA3gtNx1XRS9NKXydBAgwM3mA9vq1tHMEwJ2/7Ausse+uno8uZFI0Ua8Kt68we3HLQqEAo26oBT6F4nl83jLYEoMM8="
                                }
                            }
                        },
                        {
                            "text": "資料にありますが、AWS Well-Architected フレームワークは実際には**5本の柱**で構成されています（6本ではありません）。これらの柱は以下の通りです：\n\n1. **運⽤上の優秀性（Operational Excellence）**：ビジネス価値を提供し、サポートのプロセスと⼿順を継続的に向上させるためにシステムを稼働およびモニタリングする能⼒\n\n2. **セキュリティ（Security）**：リスク評価とリスク軽減の戦略を通してビジネスに価値をもたらす、情報、システム、アセットのセキュリティ保護機能\n\n3. **信頼性（Reliability）**：インフラストラクチャやサービスの中断から復旧し、需要に適したコンピューティングリソースを動的に獲得し、誤設定や⼀時的なネットワークの問題といった中断の影響を緩和する能⼒\n\n4. **パフォーマンス効率（Performance Efficiency）**：システムの要件を満たすためにコンピューティングリソースを効率的に使⽤し、要求の変化とテクノロジーの進化に対してもその効率性を維持する能⼒\n\n5. **コスト最適化（Cost Optimization）**：無駄を削減し、リソースを効率的に使用することでシステムの費用対効果を向上させる能力\n\nこれらの5つの柱を基盤としてアーキテクチャを設計することで、安定した効率的なシステムを構築し、機能面の要件に集中できるようになります。"
                        }
                    ]
                }
            },
```

## 拡張思考モード無しの場合

拡張思考モード有りの場合と比べて差程変わらないかもしれないですね。
簡単な質問のせいなのか、もう少し数学的に複雑な質問であれば効果が得られるのかもしれません。。

![スクリーンショット 2025-03-12 1.28.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/d7620ed1-84cd-4e77-84bc-3191ec542695.png)


# レイテンシー

当たり前の話ですが、思考が入る分レイテンシーはかかることを念頭に入れておくと良いかと思います。

わかりにくいですが、01:15 が拡張思考モード有り、01:25 が拡張思考モード無しのものです
![スクリーンショット 2025-03-12 1.35.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/ba3cf42a-256b-4b1c-a528-003eb718574e.png)