claude 3.7 扩展思考(extended thinking)api使用方法

当扩展思维开启时,Claude 会创建思考内容块,并在其中输出其内部推理。Claude 在制定最终响应之前会整合来自此推理的见解。

在api调用中,添加这个参数启用思考:

thinking: {

type: "enabled",

budget_tokens: 16000

},

budget_tokens用于指定最多可以思考的token数量,越多可以对复杂问题进行更彻底的分析,最终的质量会更好,但是模型并不完全会用完所有的budget_tokens,例如一个简单问题,它只需要简短的分析就可以清楚了,并不需要反复。

要注意的是,budget_tokens要小于max_tokens。

思考的内容块是这个样子:

{

"content": [

{

"type": "thinking",

"thinking": "To approach this, let's think about what we know about prime numbers...",

"signature": "zbbJhbGciOiJFU8zI1NiIsImtakcjsu38219c0.eyJoYXNoIjoiYWJjMTIzIiwiaWFxxxjoxNjE0NTM0NTY3fQ...."

},

{

"type": "text",

"text": "Yes, there are infinitely many prime numbers such that..."

}

]

}

可以看到除了思考内容还有一个签名,这是为了验证思考内容是由claude生成的。

除了正常的思考块,还有一些是加密的思考块,redacted_thinking,估计主要就是有一些高智能的推理链条不想公开,怕被其它模型拿去训练,或者推理链条政治不正确等因素,redacted_thinking长这样:

{

"type": "redacted_thinking",

"data": "EmwKAhgBEgy3va3pzix/LafPsn4aDFIT2Xlxh0L5L8rLVyIwxtE3rAFBa8cr3qpP..."

},

在多轮次对话中,只有与最后一条消息位置的工具使用会话或助手轮次相关的思考块对 Claude 可见,并作为输入标记计费;与早期助手消息关联的思考块在采样期间对 Claude 不可见,并且不会作为输入标记计费。

也就是说,如果开启了工具调用,消息记录中,并且存在工具调用,那么回传工具执行结果的时候,必须把最后的思考内容块带回去,例如:

{

"role": "user",

"content": "成都天气如何?"

},

{

"role": "assistant",

"content": [

{

"type": "thinking",

"thinking": "This user is asking about the weather in Chengdu. I can use the get_weather function to fetch this information.\n\nI need to provide a location parameter to the function. In this case, the location is \"成都\" (Chengdu).\n\nLet me call the get_weather function with the appropriate parameter.",

"signature": "EuYBCkQYAiJAxl/9X9WpK7KARInmunUsKuQevgHA/dhoVRVCxmAeFziwWG7uBzCADXLEX47qadXYU9FFuFNHFIh3FRlZeWrHDRIMGpb3b7809lCizoejGgxaTx2AYBF7xP7mCqwiMC8Bsm3eo2BGPkbA3LICiG9+71AwKzKXMy4+lZT7inouv6mWVHewpKpwCY5TDXI3lSpQTz945CJXBho2xPM+TYTw2uD/axzCzeUTJ2wbKhnGRqPR3QOmRGyEnU7O5x/6b17MA9nUWsxNzrRgbBJTTGaafPDwIbeI1x+XI8h43T8lf/8="

},

{

"type": "text",

"text": "我可以帮您查询成都的天气信息。"

},

{

"type": "tool_use",

"id": "toolu_01Vy5XTVkVEEC2nfhtME2ev8",

"name": "get_weather",

"input": {

"content": "成都"

}

}

]

},

{

"role": "user",

"content": [

{

"type": "tool_result",

"tool_use_id": "toolu_01Vy5XTVkVEEC2nfhtME2ev8",

"content": "15度"

}

]

}

如果不传,那么就会报错:

messages.1.content.0.type: Expected `thinking` or `redacted_thinking`, but found `text`. When `thinking` is enabled, a final `assistant` message must start with a thinking block (preceeding the lastmost set of `tool_use` and `tool_result` blocks). We recommend you include thinking blocks from previous turns. To avoid this requirement, disable `thinking`. Please consult our documentation at https://docs.anthropic.com/en/docs/build-with-claude/extended-thinking

redacted_thinking 也要传回去。

普通模式下并不需要回传思考内容,例如:

{

"role": "user",

"content": [

{

"type": "text",

"text": "你好"

}

]

},

{

"role": "assistant",

"content": [

// {

// "type": "thinking",

// "thinking": "The user has asked \"你好吗?\" which is Chinese for \"How are you?\" or \"How are you doing?\". This is a simple greeting in Chinese. I should respond appropriately in Chinese since the user has initiated the conversation in Chinese.",

// "signature": "EuYBCkQYAiJA0NlQk5nHmVcLmVUWRBiP8SJfCkm0kZ3U12cbu/sO3DF6ZZpXFlw9ea3fQdOwr0QMeqjKiuZF/qZwhsAVf5vmQRIMpb2uZHJBvHGNCGlqGgx/d01nLhk3j1N3WJAiML9iSpIfD2IUv1JwSWKk7MbPguYj3w/qiiKG9xJvBMxzV1pjJAVLh6jtqixHZ3a9FSpQ2qohk9RlehKMOFSpSmWFV6JSdNbeavb2PfMBh6ST7UfaFGPhxbsTnmvHhaLmIRl6jwImNiatMSo4l/VtvE7uWvVZPGFr2DHyHk8f3Uy0F+s="

// },

{

"type": "text",

"text": "你好!我很好,谢谢关心。我是一个AI助手,随时准备帮助你。今天有什么我可以协助你的吗?"

}

]

},

{

"role": "user",

"content": "你思考了什么"

},

上个示例中,携带了工具,但是没有触发调用,所以并不需要回传思考内容块,如果传,也不会报错,claude的api会自动过滤。

流式的响应中,普通思考块的content_block以thinking类型开始,然后思考的内容放在

type为thinking_delta的thinking的字段中,思考结束后,会传一个signature字段。但是,加密的思考块有点麻烦,每一次加密都会是一个content_block的开始和结束,所以会分布在多个content_block的data中,处理方式和普通思考内容不同,需要累加起来。当然,接口本身也不会返回签名,本身已经加密了。

一些注意点:

budget_tokens最低为1024,max_tokens大于21333时,需要流式传输。

还有一个重要的亮点就是,claude的上下文是200k,单次可以最高输出128k token,这可以让模型输出几十页的文章或者超长的代码,目前是测试功能,可以通过传递 output-128k-2025-02-19 的 anthropic-beta 标头来启用此功能。