xu-song commited on
Commit
e584a13
·
1 Parent(s): d3ba21b
doc/chat-template/DeepSeek-R1/chat_template.jinja ADDED
@@ -0,0 +1 @@
 
 
1
+ {% if not add_generation_prompt is defined %}{% set add_generation_prompt = false %}{% endif %}{% set ns = namespace(is_first=false, is_tool=false, is_output_first=true, system_prompt='', is_first_sp=true) %}{%- for message in messages %}{%- if message['role'] == 'system' %}{%- if ns.is_first_sp %}{% set ns.system_prompt = ns.system_prompt + message['content'] %}{% set ns.is_first_sp = false %}{%- else %}{% set ns.system_prompt = ns.system_prompt + '\n\n' + message['content'] %}{%- endif %}{%- endif %}{%- endfor %}{{ bos_token }}{{ ns.system_prompt }}{%- for message in messages %}{%- if message['role'] == 'user' %}{%- set ns.is_tool = false -%}{{'<|User|>' + message['content']}}{%- endif %}{%- if message['role'] == 'assistant' and 'tool_calls' in message %}{%- set ns.is_tool = false -%}{%- for tool in message['tool_calls'] %}{%- if not ns.is_first %}{%- if message['content'] is none %}{{'<|Assistant|><|tool▁calls▁begin|><|tool▁call▁begin|>' + tool['type'] + '<|tool▁sep|>' + tool['function']['name'] + '\n' + '```json' + '\n' + tool['function']['arguments'] + '\n' + '```' + '<|tool▁call▁end|>'}}{%- else %}{{'<|Assistant|>' + message['content'] + '<|tool▁calls▁begin|><|tool▁call▁begin|>' + tool['type'] + '<|tool▁sep|>' + tool['function']['name'] + '\n' + '```json' + '\n' + tool['function']['arguments'] + '\n' + '```' + '<|tool▁call▁end|>'}}{%- endif %}{%- set ns.is_first = true -%}{%- else %}{{'\n' + '<|tool▁call▁begin|>' + tool['type'] + '<|tool▁sep|>' + tool['function']['name'] + '\n' + '```json' + '\n' + tool['function']['arguments'] + '\n' + '```' + '<|tool▁call▁end|>'}}{%- endif %}{%- endfor %}{{'<|tool▁calls▁end|><|end▁of▁sentence|>'}}{%- endif %}{%- if message['role'] == 'assistant' and 'tool_calls' not in message %}{%- if ns.is_tool %}{{'<|tool▁outputs▁end|>' + message['content'] + '<|end▁of▁sentence|>'}}{%- set ns.is_tool = false -%}{%- else %}{% set content = message['content'] %}{% if '</think>' in content %}{% set content = content.split('</think>')[-1] %}{% endif %}{{'<|Assistant|>' + content + '<|end▁of▁sentence|>'}}{%- endif %}{%- endif %}{%- if message['role'] == 'tool' %}{%- set ns.is_tool = true -%}{%- if ns.is_output_first %}{{'<|tool▁outputs▁begin|><|tool▁output▁begin|>' + message['content'] + '<|tool▁output▁end|>'}}{%- set ns.is_output_first = false %}{%- else %}{{'<|tool▁output▁begin|>' + message['content'] + '<|tool▁output▁end|>'}}{%- endif %}{%- endif %}{%- endfor -%}{% if ns.is_tool %}{{'<|tool▁outputs▁end|>'}}{% endif %}{% if add_generation_prompt and not ns.is_tool %}{{'<|Assistant|><think>\n'}}{% endif %}
doc/chat-template/export_chat_template.py CHANGED
@@ -15,6 +15,8 @@ MODEL_PATH = "NousResearch/Hermes-3-Llama-3.1-405B" # messages里不支持tool_
15
  # MODEL_PATH = "mistralai/Ministral-8B-Instruct-2410" # 支持 tools, 支持tool_calls(必须要有id), 格式非主流
16
  MODEL_PATH = "deepseek-ai/DeepSeek-R1"
17
  # MODEL_PATH = "deepseek-ai/DeepSeek-R1-0528"
 
 
18
  tokenizer = AutoTokenizer.from_pretrained(MODEL_PATH)
19
  chat_template = tokenizer.chat_template
20
 
 
15
  # MODEL_PATH = "mistralai/Ministral-8B-Instruct-2410" # 支持 tools, 支持tool_calls(必须要有id), 格式非主流
16
  MODEL_PATH = "deepseek-ai/DeepSeek-R1"
17
  # MODEL_PATH = "deepseek-ai/DeepSeek-R1-0528"
18
+ MODEL_PATH = "google/gemma-3-27b-it"
19
+
20
  tokenizer = AutoTokenizer.from_pretrained(MODEL_PATH)
21
  chat_template = tokenizer.chat_template
22
 
doc/chat-template/gemma-3-27b-it/chat_template.jinja ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {{ bos_token }}
2
+ {%- if messages[0]['role'] == 'system' -%}
3
+ {%- if messages[0]['content'] is string -%}
4
+ {%- set first_user_prefix = messages[0]['content'] + '
5
+
6
+ ' -%}
7
+ {%- else -%}
8
+ {%- set first_user_prefix = messages[0]['content'][0]['text'] + '
9
+
10
+ ' -%}
11
+ {%- endif -%}
12
+ {%- set loop_messages = messages[1:] -%}
13
+ {%- else -%}
14
+ {%- set first_user_prefix = "" -%}
15
+ {%- set loop_messages = messages -%}
16
+ {%- endif -%}
17
+ {%- for message in loop_messages -%}
18
+ {%- if (message['role'] == 'user') != (loop.index0 % 2 == 0) -%}
19
+ {{ raise_exception("Conversation roles must alternate user/assistant/user/assistant/...") }}
20
+ {%- endif -%}
21
+ {%- if (message['role'] == 'assistant') -%}
22
+ {%- set role = "model" -%}
23
+ {%- else -%}
24
+ {%- set role = message['role'] -%}
25
+ {%- endif -%}
26
+ {{ '<start_of_turn>' + role + '
27
+ ' + (first_user_prefix if loop.first else "") }}
28
+ {%- if message['content'] is string -%}
29
+ {{ message['content'] | trim }}
30
+ {%- elif message['content'] is iterable -%}
31
+ {%- for item in message['content'] -%}
32
+ {%- if item['type'] == 'image' -%}
33
+ {{ '<start_of_image>' }}
34
+ {%- elif item['type'] == 'text' -%}
35
+ {{ item['text'] | trim }}
36
+ {%- endif -%}
37
+ {%- endfor -%}
38
+ {%- else -%}
39
+ {{ raise_exception("Invalid content type") }}
40
+ {%- endif -%}
41
+ {{ '<end_of_turn>
42
+ ' }}
43
+ {%- endfor -%}
44
+ {%- if add_generation_prompt -%}
45
+ {{'<start_of_turn>model
46
+ '}}
47
+ {%- endif -%}
doc/chat-template/tool_demo.py CHANGED
@@ -23,6 +23,9 @@ from transformers.utils import get_json_schema
23
  MODEL_PATH = "Qwen/Qwen3-235B-A22B-Instruct-2507"
24
  # MODEL_PATH = "mistralai/Mistral-7B-Instruct-v0.1" # messages里不支持tool_calls,不支持 role=tool,不支持 tools
25
  # MODEL_PATH = "mistralai/Ministral-8B-Instruct-2410" # 支持 tools, 支持tool_calls(必须要有id), 格式非主流
 
 
 
26
  tokenizer = AutoTokenizer.from_pretrained(MODEL_PATH)
27
 
28
  # First, define a tool
@@ -41,8 +44,8 @@ def get_current_temperature(location: str) -> float:
41
  messages = [
42
  {"role": "system", "content": "You are a bot that responds to weather queries."},
43
  {"role": "user", "content": "Hey, what's the temperature in Paris right now?"},
44
- {"role": "assitant", "content": "test1"},
45
- {"role": "user", "content": "test2"},
46
  ]
47
 
48
  # step1:
@@ -59,6 +62,7 @@ print(json.dumps(json_schema, ensure_ascii=False, indent=2))
59
  # step2: 调用 LLM,以下是LLM的返回
60
  tool_call = {"name": "get_current_temperature", "arguments": {"location": "Paris, France"}}
61
  messages.append({"role": "assistant", "tool_calls": [{"type": "function", "function": tool_call}]})
 
62
  # messages.append({"role": "assistant", "tool_calls": [{"id": "123456789", "type": "function", "function": tool_call}]}) # Ministral-8B-Instruct-2410 仍然报错
63
 
64
  # step3: 调用tool,以下是 tool 的返回
 
23
  MODEL_PATH = "Qwen/Qwen3-235B-A22B-Instruct-2507"
24
  # MODEL_PATH = "mistralai/Mistral-7B-Instruct-v0.1" # messages里不支持tool_calls,不支持 role=tool,不支持 tools
25
  # MODEL_PATH = "mistralai/Ministral-8B-Instruct-2410" # 支持 tools, 支持tool_calls(必须要有id), 格式非主流
26
+ # MODEL_PATH = "deepseek-ai/DeepSeek-R1" # 不支持tools,tool_calls也有问题
27
+ # MODEL_PATH = "google/gemma-3-27b-it" # 不支持任何tool
28
+ MODEL_PATH = "moonshotai/Kimi-K2-Instruct"
29
  tokenizer = AutoTokenizer.from_pretrained(MODEL_PATH)
30
 
31
  # First, define a tool
 
44
  messages = [
45
  {"role": "system", "content": "You are a bot that responds to weather queries."},
46
  {"role": "user", "content": "Hey, what's the temperature in Paris right now?"},
47
+ # {"role": "assitant", "content": "test1"},
48
+ # {"role": "user", "content": "test2"},
49
  ]
50
 
51
  # step1:
 
62
  # step2: 调用 LLM,以下是LLM的返回
63
  tool_call = {"name": "get_current_temperature", "arguments": {"location": "Paris, France"}}
64
  messages.append({"role": "assistant", "tool_calls": [{"type": "function", "function": tool_call}]})
65
+ # messages.append({"role": "assistant", "tool_calls": [{"type": "function", "function": tool_call}], "content": ""})
66
  # messages.append({"role": "assistant", "tool_calls": [{"id": "123456789", "type": "function", "function": tool_call}]}) # Ministral-8B-Instruct-2410 仍然报错
67
 
68
  # step3: 调用tool,以下是 tool 的返回
doc/chat-template/tools_and_llm_response.md CHANGED
@@ -241,3 +241,6 @@ Hey, what's the temperature in Paris right now?<|im_end|>
241
  - **tools在prompt中的位置**: 拼接到原始`system`的结尾。
242
  - **出参**: 返回的`respone` 要求是 `<tool_call>` 包裹的json
243
  `return a json object with function name and arguments within <tool_call></tool_call> XML tags:\n<tool_call>\n{"name": <function-name>, "arguments": <args-json-object>}\n</tool_call>`
 
 
 
 
241
  - **tools在prompt中的位置**: 拼接到原始`system`的结尾。
242
  - **出参**: 返回的`respone` 要求是 `<tool_call>` 包裹的json
243
  `return a json object with function name and arguments within <tool_call></tool_call> XML tags:\n<tool_call>\n{"name": <function-name>, "arguments": <args-json-object>}\n</tool_call>`
244
+
245
+
246
+ ##