从近期开源模型看工具调用格式的分化

本文最后更新于:2025年8月31日 下午

最近,国内外开源大模型集体把目光投向「Agent 能力」。从 SWE-Bench 到 Terminal-Bench,从 Tau-Bench 到 Tau2-Bench,再到 BrowseComp、GAIA、HLE,榜单刷分卷出了新高度,也划出了三条主赛道:Agentic Coding、Agentic Tool Using 与 Agentic Search。

与趋于一致的推理格式(使用 <think>...</think> 包裹 reasoning content)不同,各家开源模型的工具调用格式却显现出了分化的趋势。而正确使用工具调用格式是入门 Agent SFT 或 RL 训练的第一步,因此本文整理了一些近期开源模型的工具调用格式,包括:

  • 以 Qwen3 为代表的单字典形式
  • 以 DeepSeek-V3.1、Kimi-K2、GPT-OSS 为代表的函数名+字典形式
  • 以 GLM-4.5、Seed-OSS-36B 为代表的参数格式形式

基本知识

最简单的工具调用

这里以 DeepSeek 官方 API Docs 中的「获取用户当前位置的天气信息」为例,展示了使用 Tool Calling 的完整 Python 代码。之后本文中的例子也会再次用到 get_weather 这个工具。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
from openai import OpenAI

def send_messages(messages, tools):
response = client.chat.completions.create(
model="deepseek-chat",
messages=messages,
tools=tools
)
return response.choices[0].message

client = OpenAI(
api_key="<your api key>",
base_url="https://api.deepseek.com",
)

tools = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "Get current weather information for a location",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "The city and state, e.g. San Francisco, CA",
}
},
"required": ["location"]
},
}
},
]

messages = [{"role": "user", "content": "How's the weather in Hangzhou?"}]
message = send_messages(messages)
print(f"User>\t {messages[0]['content']}")

tool = message.tool_calls[0]
messages.append(message)

messages.append({"role": "tool", "tool_call_id": tool.id, "content": "24℃"})
message = send_messages(messages)
print(f"Model>\t {message.content}")

这个例子的执行流程如下:

  1. 用户:询问现在的天气。
  2. 模型:返回 function get_weather({location: 'Hangzhou'})
  3. 工具:调用 function get_weather({location: 'Hangzhou'}),并将工具返回结果传给模型。
  4. 模型:返回自然语言,"The current temperature in Hangzhou is 24°C."

注 1:上述代码中 get_weather 函数功能需由用户提供,模型本身不执行具体函数。

注 2:上述代码中工具返回结果带有 tool_call_id 参数,这是为了防止多个工具并行调用时顺序混淆,下文中将略去。

Agent Loop

显然,上述的代码只是硬编码了一个固定的、单轮的工具调用流程,如果我们想实现一个复杂的、多轮的工具调用流程,则需要引入「Agent Loop」这个概念 —— 说人话就是,允许 Agent 多次调用工具直到任务结束跳出循环

其核心操作在于解析出模型回复中的 tool_call 部分,如果有 tool_call,则表示模型认为任务尚未结束,需要继续循环;如果没有 tool_call,则表示模型认为任务已经结束(此时模型的回答一般是对之前工具调用结果的总结)。

用伪代码表示这个流程:

1
2
3
4
5
6
7
8
9
10
messages = [{'role':'user', 'content': query}]
while True:
response = send_messages(messages, tools)
messages.append({'role':'assistant', 'content': response})
if not response.tool_calls:
break
for tool_call in tool_calls:
tool_result = call_tool(tool_call)
messages.append({'role':'tool', 'content': tool_result})
return messages[-1]['content']

完整的实现可以参考 Kimi-K2 官方仓库 的示例,这里我将其改成了 Search Agent 的常用工具集,并附上了一个需要多跳搜索才能回答的问题帮助理解:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# Map tool names to their implementations
tool_map = {
"search": search,
"browse": browse,
}

def tool_call_with_client(client: OpenAI, model_name: str):
messages = [
{"role": "system", "content": "You are a helpful assistant that can use tools to get information for the user."},
{"role": "user", "content": "What is the birth year of the director of the movie 'Inception'?"}
]
finish_reason = None
while finish_reason is None or finish_reason == "tool_calls":
completion = client.chat.completions.create(
model=model_name,
messages=messages,
temperature=0.6,
tools=tools,
tool_choice="auto"
)
choice = completion.choices[0]
finish_reason = choice.finish_reason
if finish_reason == "tool_calls":
messages.append(choice.message)
for tool_call in choice.message.tool_calls:
tool_call_name = tool_call.function.name
tool_call_arguments = json.loads(tool_call.function.arguments)
tool_function = tool_map[tool_call_name]
tool_result = tool_function(**tool_call_arguments)
print("tool_result:", tool_result)

messages.append({
"role": "tool",
"tool_call_id": tool_call.id,
"name": tool_call_name,
"content": json.dumps(tool_result)
})
print("-" * 100)
print(choice.message.content)

Messages 与 Chat Template

在即将进入正题之前,还有最后一个概念需要厘清。

我们平常在代码中所见的 User-Assistant 消息列表,并不能直接喂给模型。语言模型只认 token_id 序列,中间还要走两步:

  1. apply_chat_template:把消息列表按模型规定的模板拼成一段纯文本字符串
  2. tokenize:把这段文本切成 token 并转成 id。

对话模板藏在各开源仓库的 tokenizer_config.json 中,里面的 chat_template 字段精确描述了「这一段对话该怎么拼」,本文的分析也都基于各个开源模型仓库中的模板推断而来。感兴趣的朋友可以在 Huggingface 提供的 Chat Template Playground 进行实验。

下面我构造了一个多轮对话的消息列表示例,包含 System-User-Assistant-Tool-Assistant-User-Assistant-Tool 的交互过程(包括思考过程、并行工具调用等细节,可以手动删减来理解各种情况),直接复制到 Playground 右上角的 JSON Input 中即可生成纯文本字符串:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
{
messages: [
{
role: 'system',
content: 'You are a helpful assistant that can use tools to get information for the user.',
},
{
role: 'user',
content: "What's the weather like in New York?",
},
{
role: 'assistant',
content: "<think>\nThe user is asking about the weather in New York. I should use the weather tool to get this information.\n</think>\nI'll check the current weather in New York for you.",
tool_calls: [
{
function: {
name: 'get_weather',
arguments: {
location: 'New York',
},
},
},
],
},
{
role: 'tool',
content: '{"temperature": 22, "condition": "Sunny", "humidity": 45, "wind_speed": 10}',
},
{
role: 'assistant',
content: "The weather in New York is currently sunny with a temperature of 22°C. The humidity is at 45% with a wind speed of 10 km/h. It's a great day to be outside!",
tool_calls: null,
},
{
role: 'user',
content: 'Thanks! What about Boston and Paris?',
},
{
role: 'assistant',
content: "<think>\nThe user is now asking about the weather in two different cities: Boston and Paris. I need to call the weather tool twice - once for Boston and once for Paris.\n</think>\nI'll check the weather in both Boston and Paris for you.",
tool_calls: [
{
function: {
name: 'get_weather',
arguments: {
location: 'Boston',
},
},
},
{
function: {
name: 'get_weather',
arguments: {
location: 'Paris',
},
},
},
]
},
{
role: 'tool',
content: '{"temperature": 15, "condition": "Cloudy", "humidity": 70, "wind_speed": 12}',
},
{
role: 'tool',
content: '{"temperature": 19, "condition": "Light Rain", "humidity": 80, "wind_speed": 8}',
},
],
tools: [
{
name: 'get_weather',
description: 'Get current weather information for a location',
parameters: {
type: 'object',
properties: {
location: {
type: 'string',
description: 'The city and state, e.g. San Francisco, CA',
},
},
required: [
'location',
],
},
},
],
add_generation_prompt: true,
}

以 Qwen3 为代表的单字典形式

Qwen3 系列模型对话模板的特点:

  1. 包含三种角色:system、user、assistant,其中工具返回结果以 user 角色拼接
  2. 每个角色消息开始于 <|im_start|>,结束于 <|im_end|>
  3. 工具描述拼接在 system prompt 之后作为一部分,使用 <tools></tools> XML tags 包裹
  4. 工具调用格式为 <tool_call>{"name": <function-name>, "arguments": <args-json-object>}</tool_call>,非常经典的一种格式(似乎也叫 Hermes 风格),函数名和参数放到同一个字典中传递
  5. 并行工具调用也非常方便,直接串联即可<tool_call>...</tool_call><tool_call>...</tool_call>,工具返回结果也按顺序串联
  6. 关于 <think></think> 的拼接有一个坑点:最后一次 User Query 前的历史思考内容会被省略,具体设计不在本文的讨论范围~
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<|im_start|>system
You are a helpful assistant that can use tools to get information for the user.

# Tools

You may call one or more functions to assist with the user query.

You are provided with function signatures within <tools></tools> XML tags:
<tools>
{"name": "get_weather", "description": "Get current weather information for a location", "parameters": {"type": "object", "properties": {"location": {"type": "string", "description": "The city and state, e.g. San Francisco, CA"}}, "required": ["location"]}}
</tools>

For each function call, return a json object with function name and arguments within <tool_call></tool_call> XML tags:
<tool_call>
{"name": <function-name>, "arguments": <args-json-object>}
</tool_call><|im_end|>

<|im_start|>user
What's the weather like in New York?<|im_end|>

<|im_start|>assistant
I'll check the current weather in New York for you.
<tool_call>
{"name": "get_weather", "arguments": {"location": "New York"}}
</tool_call><|im_end|>

<|im_start|>user
<tool_response>
{"temperature": 22, "condition": "Sunny", "humidity": 45, "wind_speed": 10}
</tool_response><|im_end|>

<|im_start|>assistant
The weather in New York is currently sunny with a temperature of 22°C. The humidity is at 45% with a wind speed of 10 km/h. It's a great day to be outside!<|im_end|>

<|im_start|>user
Thanks! What about Boston and Paris?<|im_end|>

<|im_start|>assistant
<think>
The user is now asking about the weather in two different cities: Boston and Paris. I need to call the weather tool twice - once for Boston and once for Paris.
</think>

I'll check the weather in both Boston and Paris for you.
<tool_call>
{"name": "get_weather", "arguments": {"location": "Boston"}}
</tool_call>
<tool_call>
{"name": "get_weather", "arguments": {"location": "Paris"}}
</tool_call><|im_end|>

<|im_start|>user
<tool_response>
{"temperature": 15, "condition": "Cloudy", "humidity": 70, "wind_speed": 12}
</tool_response>
<tool_response>
{"temperature": 19, "condition": "Light Rain", "humidity": 80, "wind_speed": 8}
</tool_response><|im_end|>

<|im_start|>assistant

以 DeepSeek-V3.1 为代表的函数名+字典形式

DeepSeek-V3.1 对话模板的特点:

  1. 包含两种角色:user、assistant,其中系统消息默认放到最前方,工具返回结果无角色直接拼接
  2. 基础的工具调用仅在非思考模型下进行,格式为:<|begin▁of▁sentence|>{system prompt}\n\n{tool_description}<|User|>{query}<|Assistant|></think>
  3. 工具描述拼接在 system prompt 之后作为一部分,使用 Markdown 三级标题,并且会自动附上官方提示工程
  4. 工具调用格式为 <|tool▁call▁begin|>tool_call_name<|tool▁sep|>tool_call_arguments<|tool▁call▁end|>函数名和参数字典分开传递,并用一个特殊 Token 分隔
  5. 对于并行工具调用,则使用一个外部 Section 将整体包裹:<|tool▁calls▁begin|>...<|tool▁calls▁end|>,内部再串联拼接
  6. 注:DeepSeek-V3.1 将 Search Tool 的格式独立出来,作为一种特殊情况。本文文末会进行分析。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<|begin▁of▁sentence|>You are a helpful assistant that can use tools to get information for the user.

## Tools
You have access to the following tools:

### get_weather
Description: Get current weather information for a location

Parameters: {"type":"object","properties":{"location":{"type":"string","description":"The city and state, e.g. San Francisco, CA"}},"required":["location"]}

IMPORTANT: ALWAYS adhere to this exact format for tool use:
<|tool▁calls▁begin|><|tool▁call▁begin|>tool_call_name<|tool▁sep|>tool_call_arguments<|tool▁call▁end|>{additional_tool_calls}<|tool▁calls▁end|>

Where:
- `tool_call_name` must be an exact match to one of the available tools
- `tool_call_arguments` must be valid JSON that strictly follows the tool's Parameters Schema
- For multiple tool calls, chain them directly without separators or spaces

<|User|>What's the weather like in New York?

<|Assistant|></think>I'll check the current weather in New York for you.
<|tool▁calls▁begin|>
<|tool▁call▁begin|>
get_weather<|tool▁sep|>{"location": "New York"}
<|tool▁call▁end|>
<|tool▁calls▁end|>
<|end▁of▁sentence|>

<|tool▁output▁begin|>
{"temperature": 22, "condition": "Sunny", "humidity": 45, "wind_speed": 10}
<|tool▁output▁end|>

The weather in New York is currently sunny with a temperature of 22°C. The humidity is at 45% with a wind speed of 10 km/h. It's a great day to be outside!
<|end▁of▁sentence|>


<|User|>Thanks! What about Boston and Paris?

<|Assistant|></think>I'll check the weather in both Boston and Paris for you.
<|tool▁calls▁begin|>
<|tool▁call▁begin|>
get_weather<|tool▁sep|>{"location": "Boston"}
<|tool▁call▁end|>
<|tool▁call▁begin|>
get_weather<|tool▁sep|>{"location": "Paris"}
<|tool▁call▁end|>
<|tool▁calls▁end|>
<|end▁of▁sentence|>

<|tool▁output▁begin|>
{"temperature": 15, "condition": "Cloudy", "humidity": 70, "wind_speed": 12}
<|tool▁output▁end|>
<|tool▁output▁begin|>
{"temperature": 19, "condition": "Light Rain", "humidity": 80, "wind_speed": 8}
<|tool▁output▁end|>

注:在使用 DeepSeek-V3.1 的 JSON Input 的时候,需要去掉思考过程,以及将工具传参 Argument 改为字符串。

与 DeepSeek-V3.1 相似,Kimi-K2 也是函数名+参数字典,这里仅展示工具调用部分:

1
2
3
4
5
<|im_assistant|>assistant<|im_middle|>I'll check the weather in both Boston and Paris for you.
<|tool_calls_section_begin|>
<|tool_call_begin|>call_2<|tool_call_argument_begin|>{"location": "Boston"}<|tool_call_end|>
<|tool_call_begin|>call_3<|tool_call_argument_begin|>{"location": "Paris"}<|tool_call_end|>
<|tool_calls_section_end|><|im_end|>

值得一提的是,OpenAI 开源的 gpt-oss 也是函数名+参数字典,但有一些特殊的地方:

  1. 使用与 OpenAI API 模型中相同的 System 和 Developer 消息角色(Instruction Hierarchy)。通过这些角色,模型遵循基于角色的信息层级来解决指令冲突:System > Developer > User > Assistant > Tool,这种方法会更加安全
  2. 引入 Channels 来表明每条消息的预期可见性,例如,用于推理过程(CoT)的分析 Channels、用于函数工具调用的评论 Channels,以及用于展示给用户的最终答案 Channels
  3. 由于 Channels 的存在,整体会更复杂:<|start|>assistant to=functions.name<|channel|>commentary json<|message|>function_arguments<|call|>
  4. 不支持并行工具调用!在对话模板中明确提到:We assume max 1 tool call per message...,不知道出于什么考虑
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<|start|>system<|message|>You are ChatGPT, a large language model trained by OpenAI.
Knowledge cutoff: 2024-06
Current date: 2025-08-26

Reasoning: medium

# Valid channels: analysis, commentary, final. Channel must be included for every message.<|end|><|start|>developer<|message|># Instructions

Environment: ipython
Cutting Knowledge Date: December 2023
Today Date: 2025-05-14

You are a helpful assistant.

<|end|><|start|>user<|message|>Given the following functions, please respond with a JSON for a function call with its proper arguments that best answers the given prompt.

Respond in the format {"name": function name, "parameters": dictionary of argument name and its value}.
Do not use variables.

[
{
"name": "get_weather",
"description": "Get current weather information for a location",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "The city and state, e.g. San Francisco, CA"
},
"required": ["location"]
}
}
]

What's the weather like in New York?<|end|>

<|start|>assistant to=functions.get_weather<|channel|>commentary json<|message|>
{"location": "New York"}<|call|>

<|start|>functions.get_weather to=assistant<|channel|>commentary<|message|>
"{\"temperature\": 22, \"condition\": \"Sunny\", \"humidity\": 45, \"wind_speed\": 10}"<|end|>

<|start|>assistant<|channel|>final<|message|>
The weather in New York is currently sunny with a temperature of 22°C. The humidity is at 45% with a wind speed of 10 km/h. It's a great day to be outside!<|end|>

<|start|>user<|message|>Thanks! What about Boston?<|end|>

<|start|>assistant

以 GLM-4.5 为代表的参数隔离形式

GLM-4.5 的技术报告中提到,函数调用模板中存在字符转义问题:

虽然在现代实现中,函数调用参数主要以 JSON 格式表示,但当这些参数包含代码段时,会出现一个重大挑战 —— 在这种情况下,代码中的大量字符需要转义,迫使模型生成大量的转义字符,从而增加了模型的学习负担。

尽管这一问题对于主要用于聊天的模型而言影响较小,但对于以函数调用为核心能力的智能体基础模型来说,却是一个非 trivial 的挑战。为了解决这一限制,我们提出了一种新的函数调用模板,该模板使用类似 XML 的特殊标记标签来封装函数调用的键和值

这种方法显著减少了代码段中字符转义的必要性,因为大多数代码可以以原生形式表示而无需转义。实验结果表明,所提出的函数调用模板在减少转义的同时,并未影响函数调用执行的性能。

GLM-4.5 对话模板的特点:

  1. 包含四种角色:system、user、assistant、observation,有各自的特殊 Token,其中工具返回结果以 observation 角色拼接(不同于 Qwen 直接复用 user 角色)
  2. 工具描述拼接在 system prompt 之后作为一部分,使用 <tools></tools> XML tags 包裹
  3. 工具调用格式为 <tool_call>{function-name}<arg_key>{arg-key-1}</arg_key><arg_value>{arg-value-1}</arg_value></tool_call>每个参数的键值对隔离开,省去 JSON 字典
  4. 并行工具调用也非常方便,直接串联即可<tool_call>...</tool_call><tool_call>...</tool_call>,工具返回结果也按顺序串联
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
<|system|>
# Tools
You may call one or more functions to assist with the user query.
You are provided with function signatures within <tools></tools> XML tags:
<tools>
{
"name": "get_weather",
"description": "Get the weather of a city for a specific date.",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "The city to get weather for, in Chinese."
},
"date": {
"type": "string",
"description": "The date in YYYY-MM-DD format."
}
},
"required": ["city"]
}
}
</tools>

For each function call, output the function name and arguments within the following XML format:
<tool_call>
{function-name}
<arg_key>{arg-key-1}</arg_key>
<arg_value>{arg-value-1}</arg_value>
<arg_key>{arg-key-2}</arg_key>
<arg_value>{arg-value-2}</arg_value>
...
</tool_call>

<|system|>
You are a helpful assistant.

<|user|>
Today is June 26, 2024. Could you please check the weather in Beijing and Shanghai for tomorrow?

<|assistant|>
<think>
The user wants to check the weather of Beijing and Shanghai tomorrow. I need to call the get_weather function respectively to check Beijing and Shanghai.
</think>

I will call the get_weather function to check the weather in Beijing and Shanghai.
<tool_call>get_weather
<arg_key>city</arg_key>
<arg_value>Beijing</arg_value>
<arg_key>date</arg_key>
<arg_value>2024-06-27</arg_value>
</tool_call>
<tool_call>get_weather
<arg_key>city</arg_key>
<arg_value>Shanghai</arg_value>
<arg_key>date</arg_key>
<arg_value>2024-06-27</arg_value>
</tool_call>

<|observation|>
<tool_response>
{
"city": "Beijing",
"date": "2024-06-27",
"weather": "Sunny",
"temperature": "26C"
}
</tool_response>
<tool_response>
{
"city": "Shanghai",
"date": "2024-06-27",
"weather": "Overcast",
"temperature": "29C"
}
</tool_response>

<|assistant|>
<think>
I have obtained the weather query results of get_weather for Beijing and Shanghai respectively and can reply to users directly.
</think>
It will be sunny in Beijing tomorrow with a temperature of 26 degrees Celsius. The weather in Shanghai is overcast with a temperature of 29 degrees Celsius.

最近开源的 Seed-OSS-36B 也使用了类似的参数隔离形式,但是会将参数名放到 XML tags 中(不知道会不会对 tokenize 造成影响),这里仅展示工具调用部分:

1
2
3
4
5
6
7
8
<seed:tool_call>
<function=example_function_name>
<parameter=example_parameter_1>value_1</parameter>
<parameter=example_parameter_2>This is the value for the second parameter
that can span
multiple lines</parameter>
</function>
</seed:tool_call>

附:DeepSeek-V3.1 的 Search Agent 特殊模式分析

DeepSeek-V3.1 声称为在思考模式下搜索工具调用设计了特定的格式,以支持 Search Agent —— 注意,其他工具则是在非思考模式中完成。现在有一些工作也探讨了 thinking effort 对于 Agent 任务表现的影响,例如 Thinking vs. DoingWebSailor

个人猜测 DeepSeek 这样做的动机可能是发现了一些困难的榜单如果不思考根本刷不上去(例如 BrowseComp),为了防止几种模式冲突,所以单独设置了一个 pattern 告诉模型「现在是搜索任务」。

官方仓库 assets/search_tool_trajectory.html 中提供了一个例子,可以看到:

  1. Search 一个工具就集成了常规的 Search+Browse 功能,在工具返回结果中包括 snippet 和 content(这合理吗?几次调用就超 128k 了)
  2. 虽然说的是思考模式,但并非使用常规思考的,而是用 <|search▁begin|><|search▁end|> 包裹了整个搜索交互过程作为思考(并不是之前一些文章猜测的 Search-R1 形式的特殊 Token 包裹查询)
  3. <|search▁end|> 之后的回答会引用搜索过程中的文档,风格看起来像是 Deep Research 最后的 Report 生成
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
<|User|>The current date is 2025-08-16, Saturday. Your primary task is to solve the user's questions, leveraging the appropriate tools as needed.
[Core Instruction: Language Consistency]
You MUST write your entire response in the same language as the user's question.
If the user asks in Chinese, you must think and write in Chinese.
If the user asks in French, you must think and write in French.
Do not switch to English unless the user's question was in English. This applies to your reasoning, explanations, and the final answer.
[Core Instruction: Citation Formatting]
If the search tool was used and you are referencing a specific webpage in your final answer (the content after <|search▁end|>), you must use the format "[citation:x]", where x is the corresponding webpage number.
You must first engage in step-by-step, rigorous thinking and reasoning before using the appropriate tool or providing the final answer.


## Tools
You have access to the following tools:

### search
Description: Search the web for information. The result will be a string.

Parameters: {"type": "object", "properties": {"questions": {"type": "string", "description": "Generate up to 5 search queries based on the requirements below:\n\n- Separate different queries with \"||\". For example: \"Elon Musk lawsuit OpenAI reasons||Elon Musk lawsuit OpenAI latest updates\".\n- All search queries should use generalized, search engine-friendly, and easily retrievable keywords to improve search efficiency and the relevance of results. Avoid directly extracting phrases from the question that are difficult to retrieve effectively. For example: Avoid using relative or ambiguous terms such as “third author” or “the following year.” - Instead, use more universal expressions like “author list” or “award history.”\n- For a single search query, keep them short - remove unnecessary auxiliary words, conjunctions, and interrogative words. Primarily use keyword combinations (separated by spaces). Ideally, they should not exceed 15 characters. Avoid using special punctuation marks.\n- When seeking information from non-English primary sources, adjust search query to retrieve content in the original language (e.g., chinese), even if your initial question is in English. This improves accuracy and avoids translation-related errors.\n- You can search 1 to 5 search queries in parallel each time. If the question involves comparing multiple entities (e.g., people, places, books, movies) or contains two or more sub-questions, please split it into separate queries for each entity or sub-question.\n- Do not re-search for queries that have already been searched."}}, "required": ["questions"]}

IMPORTANT: ALWAYS adhere to this exact format for tool use:
<|tool▁calls▁begin|><|tool▁call▁begin|>tool_call_name<|tool▁sep|>tool_call_arguments<|tool▁call▁end|>{additional_tool_calls}<|tool▁calls▁end|>

Where:
- `tool_call_name` must be an exact match to one of the available tools
- `tool_call_arguments` must be valid JSON that strictly follows the tool's Parameters Schema
- For multiple tool calls, chain them directly without separators or spaces

# The user's message is: 有一个全球旗舰店被称为“博物馆”的品牌,在2025年5月初与一家中国度假酒店集团进行的品牌联名,这次联名的宣传片的艺术指导是谁?<|Assistant|></think><|search▁begin|>

我们将逐步解决这个问题。首先,我们需要找到符合以下条件的品牌:

1. 全球旗舰店被称为“博物馆”的品牌。
2. 在2025年5月初与一家中国度假酒店集团进行品牌联名。
3. 联名宣传片的艺术指导是谁?

### 第一步:全球旗舰店被称为“博物馆”的品牌

首先,我们需要找到全球旗舰店被称为“博物馆”的品牌。可能的候选包括:

[……]

### 搜索符合条件的品牌

我将先搜索符合条件的品牌。<|tool▁calls▁begin|><|tool▁call▁begin|>search<|tool▁sep|>{"questions":"全球旗舰店被称为博物馆的品牌||全球旗舰店博物馆||Aesop全球旗舰店博物馆||Aesop旗舰店博物馆||Nike全球旗舰店博物馆"}<|tool▁call▁end|><|tool▁calls▁end|><|end▁of▁sentence|><|tool▁output▁begin|>[webpage 0 begin]
[webpage title]始祖鸟在它的“博物馆”里如何讲户外故事?
[webpage url]https://wap.eastmoney.com/a/202405213082252819.html
[webpage date published]
[webpage snippet begin]
2024年5月21日 — 如何低门槛投资美股? 5月18日,位于上海南京西路的始祖鸟全球旗舰店正式开业,而这家店的另一个名称是“始祖鸟博物馆”。一楼和二楼则是多种产品线的零售 ...
[webpage snippet end]
[webpage content begin]
[……]
[webpage content end]
[webpage 0 end]
[……]
<|tool▁output▁end|>根据搜索结果,符合条件的品牌是始祖鸟(Arc'teryx)。其全球旗舰店被称为“始祖鸟博物馆”,位于上海南京西路。

### 第二步:品牌联名

根据问题描述,始祖鸟在2025年5月初与一家中国度假酒店集团进行品牌联名。我们需要找到这次联名的宣传片艺术指导。

#### 关键点:

1. **时间**:2025年5月初(由于当前时间是2025年8月16日,而联名发生在2025年5月初,因此可能需要搜索相关新闻或公告)。
2. **联名对象**:一家中国度假酒店集团。
3. **联名内容**:品牌联名,宣传片的艺术指导。

### 第三步:始祖鸟的联名活动

我需要先找到始祖鸟在2025年5月初与中国度假酒店集团的联名活动。可能的度假酒店集团包括:

1. **松赞酒店**:始祖鸟曾与松赞酒店合作过(根据之前的文章提到)。
2. **安缦酒店**:高端度假酒店。
3. **悦榕庄**:度假酒店集团。
4. **Club Med**:度假村集团。
5. **华住集团**:旗下有度假酒店品牌,但可能不符合“度假酒店集团”的描述。
6. **开元酒店集团**:度假酒店品牌。
7. **柏联酒店**:高端度假酒店。

根据之前的文章提到,始祖鸟曾与松赞酒店合作过联名服饰。因此,松赞酒店可能是联名对象之一。

### 第四步:搜索联名活动

我需要搜索始祖鸟在2025年5月初与中国度假酒店集团的联名活动。我将先尝试搜索相关新闻。<|tool▁calls▁begin|><|tool▁call▁begin|>search<|tool▁sep|>{"questions":"始祖鸟2025年5月联名||始祖鸟2025年5月酒店联名||始祖鸟度假酒店联名||始祖鸟宣传片艺术指导||始祖鸟松赞联名2025"}<|tool▁call▁end|><|tool▁calls▁end|><|end▁of▁sentence|><|tool▁output▁begin|>[webpage 19 begin]
[webpage title]始祖鸟× 松赞相约纳木错
[webpage url]https://socialbeta.com/campaign/24810
[webpage date published]
[webpage snippet begin]
始祖鸟与中国高端旅行品牌松赞再次携手,推出以「圣湖」纳木措为灵感的全新联名系列。这已是双方继以两座神山——卡瓦格博与南迦巴瓦为灵感之后的第三次 ...
[webpage snippet end]
[webpage content begin]
[……]
[webpage content end]
[webpage 19 end]
[……]
<|tool▁output▁end|>根据搜索结果,始祖鸟在2025年5月初与松赞酒店集团进行了联名合作。这次联名以纳木措湖为灵感,推出了联名系列产品,并拍摄了概念影片《见水知蓝·纳木措》。

### 第五步:宣传片的艺术指导

根据搜索结果,宣传片《见水知蓝·纳木措》的艺术指导是国际摄影大师杜可风(Christopher Doyle)。

### 最终答案

根据搜索结果,始祖鸟与松赞酒店集团的联名宣传片《见水知蓝·纳木措》的艺术指导是杜可风(Christopher Doyle)。

<|search▁end|>

根据搜索结果,始祖鸟(Arc'teryx)在2025年5月初与中国度假酒店集团松赞(Songtsam)进行了品牌联名,推出了以纳木措湖为灵感的联名系列[citation:19][citation:21]。此次联名的宣传片《见水知蓝·纳木措》的艺术指导是国际摄影大师**杜可风**(Christopher Doyle)[citation:21]。

### 联名背景:
- **合作对象**:始祖鸟 × 松赞(第三次合作,聚焦纳木措湖)[citation:19][citation:21]
- **宣传片**:《见水知蓝·纳木措》,以纳木措湖的“开湖”时刻为灵感,采用16:9宽幅画面和沉浸式叙事手法,展现高原自然与人文的共生哲学[citation:21]。
- **艺术指导**:杜可风(Christopher Doyle)担任艺术指导,将其标志性的蓝调美学融入影片,强调自然光影和真实记录[citation:21]。

如需进一步了解联名详情或宣传片内容,可以查阅或[citation:19][citation:21]。

从近期开源模型看工具调用格式的分化
https://hwcoder.top/Tool-Call-Format
作者
Wei He
发布于
2025年8月28日
许可协议