Think Tool とは何か — Extended Thinking との決定的な違い
Claude API を使ったエージェント開発で、ツール呼び出しの精度を劇的に向上させる手法として注目されているのが Think Tool パターン です。Anthropic のエンジニアリングチームが公開したこの手法は、エージェントが複数のツールを連続して使用する際に「立ち止まって考える」ステップを挟むことで、判断精度を大幅に改善します。
「Extended Thinking と何が違うのか?」という疑問を持つ方は多いでしょう。両者は名前こそ似ていますが、動作するタイミングが根本的に異なります。
Extended Thinking は、Claude がレスポンスを生成する前に 行われる深い推論プロセスです。thinking パラメータで有効にすると、Claude は回答を出す前に内部で思考チェーンを展開します。
Think Tool は、Claude がレスポンスを生成する途中で 使用するツールです。複数のツール呼び出しの合間に「今の状況を整理し、次に何をすべきか」を明示的に推論するステップとして機能します。
// Think Tool の定義 — シンプルながら強力
const thinkTool = {
name: "think" ,
description:
"Use this tool to think about the information you have gathered " +
"and plan your next steps. Use it when you need to analyze data, " +
"consider multiple options, or reflect on tool results before proceeding." ,
input_schema: {
type: "object" as const ,
properties: {
thought: {
type: "string" ,
description: "Your detailed reasoning and analysis" ,
},
},
required: [ "thought" ],
},
};
このツールが呼び出されても、実際にはサーバー側で何も処理を行いません。Claude が自分自身の思考をテキストとして出力し、それをコンテキストに残すことで、後続の判断に活用する仕組みです。
なぜ Think Tool が必要なのか — エージェントの判断精度の壁
複雑なエージェントワークフローでは、Claude が複数のツールを連鎖的に呼び出すことがよくあります。例えば、カスタマーサポートエージェントが「顧客情報を取得 → 注文履歴を確認 → ポリシーを参照 → 返金を実行」という一連の処理を行う場合です。
ここで問題になるのが、ツール呼び出しの連鎖が長くなるほど、各ステップでの判断精度が低下する ことです。これは人間でも同じで、複数の情報を同時に処理しながら次の行動を決めると、見落としや判断ミスが起きやすくなります。
Anthropic の検証データによると、Think Tool を導入することで以下の改善が確認されています。
航空会社カスタマーサービス : pass メトリクスが 0.370 → 0.570 に向上(54% の相対改善 )
小売カスタマーサービス : pass メトリクスが 0.783 → 0.812 に向上
特に航空会社のような複雑なポリシー判断を伴うドメインで劇的な効果が見られます。これは、Think Tool によって Claude が「この顧客は返金ポリシーのどの条件に該当するか」を明示的に推論してから行動に移せるためです。
Think Tool のサーバー側実装
Think Tool の最大の特徴は、サーバー側の処理が極めてシンプルなことです。ツールが呼び出されたら、思考内容をそのまま返すだけで完了します。
import Anthropic from "@anthropic-ai/sdk" ;
// Anthropic クライアント初期化
const client = new Anthropic ();
// エージェントループの実装
async function runAgentLoop (
userMessage : string ,
tools : Anthropic . Tool []
) : Promise < string > {
const messages : Anthropic . MessageParam [] = [
{ role: "user" , content: userMessage },
];
while ( true ) {
const response = await client.messages. create ({
model: "claude-opus-4-6" ,
max_tokens: 8096 ,
tools: tools,
messages: messages,
});
// レスポンスをメッセージ履歴に追加
messages. push ({ role: "assistant" , content: response.content });
// stop_reason が "end_turn" ならループ終了
if (response.stop_reason === "end_turn" ) {
const textBlock = response.content. find (
( block ) => block.type === "text"
);
return textBlock?.text ?? "" ;
}
// ツール呼び出しの処理
const toolResults : Anthropic . ToolResultBlockParam [] = [];
for ( const block of response.content) {
if (block.type === "tool_use" ) {
if (block.name === "think" ) {
// Think Tool: 思考をそのまま結果として返す
// サーバー側では何も処理しない
toolResults. push ({
type: "tool_result" ,
tool_use_id: block.id,
content: `Thought recorded: ${ ( block . input as { thought : string }). thought }` ,
});
} else {
// 通常のツール: 実際の処理を実行
const result = await executeExternalTool (block.name, block.input);
toolResults. push ({
type: "tool_result" ,
tool_use_id: block.id,
content: result,
});
}
}
}
// ツール結果をメッセージ履歴に追加
messages. push ({ role: "user" , content: toolResults });
}
}
重要なポイントは、Think Tool の結果をコンテキストに残すことです。Claude は次のツール呼び出しを決定する際に、過去の Think Tool の出力を参照できるため、より文脈に即した判断が可能になります。
効果的なシステムプロンプト設計
Think Tool の精度を最大化するには、システムプロンプトで Claude に「いつ、どのように think ツールを使うか」を明確に指示する点が肝心です。
const systemPrompt = `あなたはカスタマーサポートエージェントです。
## Think Tool の使用ガイドライン
以下の状況では、必ず think ツールを使用してから行動してください:
1. **ツール結果の分析時**: ツールから返されたデータを解釈する必要がある場合
2. **ポリシー判断の前**: 返金・キャンセル・例外処理などのポリシーを適用する前
3. **複数の選択肢がある場合**: 次のアクションに複数の候補がある場合
4. **矛盾する情報がある場合**: 顧客の申告とシステムデータが一致しない場合
5. **最終回答の直前**: 顧客への回答を生成する前に、全体を振り返る
## Think Tool の使い方
think ツールを呼び出す際は、以下の構造で思考を整理してください:
- 現在わかっていること
- まだ不明なこと
- 次に取るべきアクションとその理由
- リスクや注意点` ;
このように構造化された指示を与えることで、Claude は適切なタイミングで Think Tool を使用し、思考の質も向上します。
本番環境での設計パターン — 3つのアーキテクチャ
パターン1: ステートフルエージェントパターン
最も基本的なパターンです。エージェントの状態を明示的に管理し、Think Tool の出力をステートの一部として保持します。
interface AgentState {
conversationHistory : Anthropic . MessageParam [];
thinkingLog : Array <{
timestamp : number ;
thought : string ;
context : string ;
}>;
toolCallCount : number ;
maxToolCalls : number ;
}
async function statefulAgentLoop (
state : AgentState ,
tools : Anthropic . Tool []
) : Promise <{ response : string ; state : AgentState }> {
while (state.toolCallCount < state.maxToolCalls) {
const response = await client.messages. create ({
model: "claude-opus-4-6" ,
max_tokens: 8096 ,
tools: tools,
messages: state.conversationHistory,
});
state.conversationHistory. push ({
role: "assistant" ,
content: response.content,
});
if (response.stop_reason === "end_turn" ) {
const text = response.content. find (( b ) => b.type === "text" );
return { response: text?.text ?? "" , state };
}
const toolResults : Anthropic . ToolResultBlockParam [] = [];
for ( const block of response.content) {
if (block.type === "tool_use" ) {
state.toolCallCount ++ ;
if (block.name === "think" ) {
const thought = (block.input as { thought : string }).thought;
// 思考ログを記録(デバッグ・監視用)
state.thinkingLog. push ({
timestamp: Date. now (),
thought,
context: `tool_call_${ state . toolCallCount }` ,
});
toolResults. push ({
type: "tool_result" ,
tool_use_id: block.id,
content: thought,
});
} else {
const result = await executeExternalTool (block.name, block.input);
toolResults. push ({
type: "tool_result" ,
tool_use_id: block.id,
content: result,
});
}
}
}
state.conversationHistory. push ({ role: "user" , content: toolResults });
}
return { response: "ツール呼び出し上限に達しました。" , state };
}
パターン2: パイプラインゲートパターン
Think Tool の出力を分析し、特定の条件を満たさない場合はパイプラインを中断する安全設計です。
interface ThinkAnalysis {
confidence : "high" | "medium" | "low" ;
risks : string [];
shouldProceed : boolean ;
}
function analyzeThought ( thought : string ) : ThinkAnalysis {
// 思考内容からリスクや不確実性を検出
const lowConfidenceSignals = [
"確信が持てない" ,
"不明" ,
"推測" ,
"not sure" ,
"uncertain" ,
"might be" ,
];
const riskSignals = [
"返金" ,
"削除" ,
"キャンセル" ,
"refund" ,
"delete" ,
"cancel" ,
];
const hasLowConfidence = lowConfidenceSignals. some (( s ) =>
thought. toLowerCase (). includes (s)
);
const hasRisk = riskSignals. some (( s ) =>
thought. toLowerCase (). includes (s)
);
return {
confidence: hasLowConfidence ? "low" : hasRisk ? "medium" : "high" ,
risks: riskSignals. filter (( s ) =>
thought. toLowerCase (). includes (s)
),
shouldProceed: ! (hasLowConfidence && hasRisk),
};
}
このパターンにより、エージェントが自信のない状態で破壊的な操作を実行することを防げます。
パターン3: マルチエージェント Think 共有パターン
複数のエージェントが協調して動作する場合、Think Tool の出力を共有することで、エージェント間の整合性を保ちます。
class SharedThinkingContext {
private thoughts : Map < string , string []> = new Map ();
addThought ( agentId : string , thought : string ) : void {
const existing = this .thoughts. get (agentId) ?? [];
existing. push (thought);
this .thoughts. set (agentId, existing);
}
getSummary () : string {
let summary = "=== エージェント間の思考共有 === \n " ;
for ( const [ agentId , thoughts ] of this .thoughts) {
summary += ` \n [${ agentId }]: \n ` ;
thoughts. forEach (( t , i ) => {
summary += ` ${ i + 1 }. ${ t . substring ( 0 , 200 ) } \n ` ;
});
}
return summary;
}
}
Extended Thinking + Think Tool の併用戦略
Extended Thinking と Think Tool は排他的ではなく、併用することで最大の効果を発揮します。
// Extended Thinking + Think Tool の併用
const response = await client.messages. create ({
model: "claude-opus-4-6" ,
max_tokens: 16000 ,
thinking: {
type: "enabled" ,
budget_tokens: 5000 , // 初期推論に予算を割り当て
},
tools: [thinkTool, ... businessTools],
messages: messages,
});
使い分けの指針は以下の通りです。
Extended Thinking : タスク全体の計画立案、複雑な問題の初期分析に使用。レスポンス生成前の「大きな思考」
Think Tool : ツール呼び出しの合間の状況整理、中間結果の分析に使用。レスポンス生成中の「小さな思考」
例えるなら、Extended Thinking は旅行の計画を立てる段階、Think Tool は旅行中に地図を確認して次の目的地を決める段階に相当します。
パフォーマンス最適化とコスト管理
Think Tool はトークンを消費するため、コスト管理が重要です。
// Think Tool のコスト制御
function createCostAwareThinkTool ( maxThinkTokens : number = 500 ) {
return {
name: "think" ,
description:
"Use this tool to analyze the current situation and plan next steps. " +
`Keep your thinking concise (under ${ maxThinkTokens } tokens). ` +
"Focus on: what you know, what you need, and your next action." ,
input_schema: {
type: "object" as const ,
properties: {
thought: {
type: "string" ,
description: `Concise reasoning (max ~${ maxThinkTokens } tokens)` ,
},
},
required: [ "thought" ],
},
};
}
// トークン使用量の監視
interface TokenUsageTracker {
thinkTokens : number ;
toolTokens : number ;
totalTokens : number ;
}
function trackThinkToolUsage (
response : Anthropic . Message ,
tracker : TokenUsageTracker
) : void {
for ( const block of response.content) {
if (block.type === "tool_use" && block.name === "think" ) {
const thought = (block.input as { thought : string }).thought;
// 概算: 日本語1文字≒1.5トークン、英語1単語≒1.3トークン
const estimatedTokens = Math. ceil (thought. length * 1.5 );
tracker.thinkTokens += estimatedTokens;
}
}
tracker.totalTokens =
(response.usage?.input_tokens ?? 0 ) +
(response.usage?.output_tokens ?? 0 );
}
コスト最適化のベストプラクティスとして、Think Tool の使用頻度をシステムプロンプトで制御します。「すべてのツール呼び出しの前に think する」のではなく、「判断が必要な重要なステップでのみ think する」よう指示することで、品質を維持しながらコストを抑えられます。
デバッグとオブザーバビリティ
Think Tool の大きな副次的効果は、エージェントの意思決定プロセスが可視化されることです。
// Think Tool ログの構造化出力
interface ThinkLog {
id : string ;
timestamp : string ;
agentStep : number ;
thought : string ;
precedingTool : string | null ;
followingTool : string | null ;
confidence : string ;
}
function formatThinkLogs ( logs : ThinkLog []) : string {
return logs
. map (
( log ) =>
`[Step ${ log . agentStep }] ${ log . timestamp } \n ` +
` After: ${ log . precedingTool ?? "initial"} \n ` +
` Thought: ${ log . thought } \n ` +
` Then: ${ log . followingTool ?? "final_response"} \n ` +
` Confidence: ${ log . confidence }`
)
. join ( " \n --- \n " );
}
本番環境では、Think Tool のログを以下の目的で活用できます。
プロンプト改善 : Claude がどのような推論で誤った判断を下したかを分析し、システムプロンプトを改善
品質監視 : 思考の「confidence」を監視し、低信頼度が頻発する場合にアラートを発火
コンプライアンス : 金融・医療などの規制領域で、AIの意思決定根拠を記録・監査
全体を振り返って
Think Tool パターンは、エージェントワークフローにおける判断精度を劇的に向上させるシンプルかつ強力な手法です。Extended Thinking が「事前の深い思考」であるのに対し、Think Tool は「行動の合間の状況確認」として機能し、両者を組み合わせることでエージェントの信頼性を最大化できます。
特に、複数のツールを連鎖的に使用するエージェントや、ポリシー判断を伴うカスタマーサービスエージェントでは、Think Tool の導入効果が顕著です。サーバー側の実装コストはほぼゼロでありながら、Anthropic の検証では最大 54% の精度向上が確認されています。
本記事で紹介したステートフルパターン、パイプラインゲートパターン、マルチエージェント共有パターンを参考に、自身のエージェントに Think Tool を統合してみてください。Claude API のツール使用についてより深く学びたい方には「Claude API 高度なツール使用完全ガイド 」、Extended Thinking との併用戦略については「Claude API Adaptive Thinking 完全実装ガイド 」も参考になります。また、ストリーミング環境での実装については「Claude API ストリーミング・ツール使用本番運用ガイド 」で詳しく解説しています。
本記事のテーマをさらに体系的に