mirror of
				https://github.com/ggml-org/llama.cpp.git
				synced 2025-10-29 08:41:22 +00:00 
			
		
		
		
	Add Gemma chat template (#5665)
* add gemma chat template * gemma: only apply system_prompt on non-model message
This commit is contained in:
		
							
								
								
									
										22
									
								
								llama.cpp
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								llama.cpp
									
									
									
									
									
								
							| @@ -12782,6 +12782,28 @@ static int32_t llama_chat_apply_template_internal( | |||||||
|         if (add_ass) { |         if (add_ass) { | ||||||
|             ss << "<s>assistant\n"; |             ss << "<s>assistant\n"; | ||||||
|         } |         } | ||||||
|  |     } else if (tmpl.find("<start_of_turn>") != std::string::npos) { | ||||||
|  |         // google/gemma-7b-it | ||||||
|  |         std::string system_prompt = ""; | ||||||
|  |         for (auto message : chat) { | ||||||
|  |             std::string role(message->role); | ||||||
|  |             if (role == "system") { | ||||||
|  |                 // there is no system message for gemma, but we will merge it with user prompt, so nothing is broken | ||||||
|  |                 system_prompt = trim(message->content); | ||||||
|  |                 continue; | ||||||
|  |             } | ||||||
|  |             // in gemma, "assistant" is "model" | ||||||
|  |             role = role == "assistant" ? "model" : message->role; | ||||||
|  |             ss << "<start_of_turn>" << role << "\n"; | ||||||
|  |             if (!system_prompt.empty() && role != "model") { | ||||||
|  |                 ss << system_prompt << "\n\n"; | ||||||
|  |                 system_prompt = ""; | ||||||
|  |             } | ||||||
|  |             ss << trim(message->content) << "<end_of_turn>\n"; | ||||||
|  |         } | ||||||
|  |         if (add_ass) { | ||||||
|  |             ss << "<start_of_turn>model\n"; | ||||||
|  |         } | ||||||
|     } else { |     } else { | ||||||
|         // template not supported |         // template not supported | ||||||
|         return -1; |         return -1; | ||||||
|   | |||||||
| @@ -29,6 +29,8 @@ int main(void) { | |||||||
|         "{{ bos_token }}{% if messages[0]['role'] == 'system' %}{% set loop_messages = messages[1:] %}{% set system_message = messages[0]['content'] %}{% elif true == true and not '<<SYS>>' in messages[0]['content'] %}{% set loop_messages = messages %}{% set system_message = 'Vous êtes Vigogne, un assistant IA créé par Zaion Lab. Vous suivez extrêmement bien les instructions. Aidez autant que vous le pouvez.' %}{% else %}{% set loop_messages = messages %}{% set system_message = false %}{% endif %}{% for message in loop_messages %}{% if (message['role'] == 'user') != (loop.index0 % 2 == 0) %}{{ raise_exception('Conversation roles must alternate user/assistant/user/assistant/...') }}{% endif %}{% if loop.index0 == 0 and system_message != false %}{% set content = '<<SYS>>\\\\n' + system_message + '\\\\n<</SYS>>\\\\n\\\\n' + message['content'] %}{% else %}{% set content = message['content'] %}{% endif %}{% if message['role'] == 'user' %}{{ '[INST] ' + content.strip() + ' [/INST]' }}{% elif message['role'] == 'system' %}{{ '<<SYS>>\\\\n' + content.strip() + '\\\\n<</SYS>>\\\\n\\\\n' }}{% elif message['role'] == 'assistant' %}{{ ' '  + content.strip() + ' ' + eos_token }}{% endif %}{% endfor %}", |         "{{ bos_token }}{% if messages[0]['role'] == 'system' %}{% set loop_messages = messages[1:] %}{% set system_message = messages[0]['content'] %}{% elif true == true and not '<<SYS>>' in messages[0]['content'] %}{% set loop_messages = messages %}{% set system_message = 'Vous êtes Vigogne, un assistant IA créé par Zaion Lab. Vous suivez extrêmement bien les instructions. Aidez autant que vous le pouvez.' %}{% else %}{% set loop_messages = messages %}{% set system_message = false %}{% endif %}{% for message in loop_messages %}{% if (message['role'] == 'user') != (loop.index0 % 2 == 0) %}{{ raise_exception('Conversation roles must alternate user/assistant/user/assistant/...') }}{% endif %}{% if loop.index0 == 0 and system_message != false %}{% set content = '<<SYS>>\\\\n' + system_message + '\\\\n<</SYS>>\\\\n\\\\n' + message['content'] %}{% else %}{% set content = message['content'] %}{% endif %}{% if message['role'] == 'user' %}{{ '[INST] ' + content.strip() + ' [/INST]' }}{% elif message['role'] == 'system' %}{{ '<<SYS>>\\\\n' + content.strip() + '\\\\n<</SYS>>\\\\n\\\\n' }}{% elif message['role'] == 'assistant' %}{{ ' '  + content.strip() + ' ' + eos_token }}{% endif %}{% endfor %}", | ||||||
|         // mlabonne/AlphaMonarch-7B |         // mlabonne/AlphaMonarch-7B | ||||||
|         "{% for message in messages %}{{bos_token + message['role'] + '\\n' + message['content'] + eos_token + '\\n'}}{% endfor %}{% if add_generation_prompt %}{{ bos_token + 'assistant\\n' }}{% endif %}", |         "{% for message in messages %}{{bos_token + message['role'] + '\\n' + message['content'] + eos_token + '\\n'}}{% endfor %}{% if add_generation_prompt %}{{ bos_token + 'assistant\\n' }}{% endif %}", | ||||||
|  |         // google/gemma-7b-it | ||||||
|  |         "{% if messages[0]['role'] == 'system' %}{{ raise_exception('System role not supported') }}{% endif %}{% for message in messages %}{% if (message['role'] == 'user') != (loop.index0 % 2 == 0) %}{{ raise_exception('Conversation roles must alternate user/assistant/user/assistant/...') }}{% endif %}{% if (message['role'] == 'assistant') %}{% set role = 'model' %}{% else %}{% set role = message['role'] %}{% endif %}{{ '<start_of_turn>' + role + '\\n' + message['content'] | trim + '<end_of_turn>\\n' }}{% endfor %}{% if add_generation_prompt %}{{'<start_of_turn>model\\n'}}{% endif %}", | ||||||
|     }; |     }; | ||||||
|     std::vector<std::string> expected_output = { |     std::vector<std::string> expected_output = { | ||||||
|         // teknium/OpenHermes-2.5-Mistral-7B |         // teknium/OpenHermes-2.5-Mistral-7B | ||||||
| @@ -41,6 +43,8 @@ int main(void) { | |||||||
|         "[INST] <<SYS>>\nYou are a helpful assistant\n<</SYS>>\n\nHello [/INST] Hi there </s>[INST] Who are you [/INST] I am an assistant </s>[INST] Another question [/INST]", |         "[INST] <<SYS>>\nYou are a helpful assistant\n<</SYS>>\n\nHello [/INST] Hi there </s>[INST] Who are you [/INST] I am an assistant </s>[INST] Another question [/INST]", | ||||||
|         // mlabonne/AlphaMonarch-7B |         // mlabonne/AlphaMonarch-7B | ||||||
|         "system\nYou are a helpful assistant</s>\n<s>user\nHello</s>\n<s>assistant\nHi there</s>\n<s>user\nWho are you</s>\n<s>assistant\n   I am an assistant   </s>\n<s>user\nAnother question</s>\n<s>assistant\n", |         "system\nYou are a helpful assistant</s>\n<s>user\nHello</s>\n<s>assistant\nHi there</s>\n<s>user\nWho are you</s>\n<s>assistant\n   I am an assistant   </s>\n<s>user\nAnother question</s>\n<s>assistant\n", | ||||||
|  |         // google/gemma-7b-it | ||||||
|  |         "<start_of_turn>user\nYou are a helpful assistant\n\nHello<end_of_turn>\n<start_of_turn>model\nHi there<end_of_turn>\n<start_of_turn>user\nWho are you<end_of_turn>\n<start_of_turn>model\nI am an assistant<end_of_turn>\n<start_of_turn>user\nAnother question<end_of_turn>\n<start_of_turn>model\n", | ||||||
|     }; |     }; | ||||||
|     std::vector<char> formatted_chat(1024); |     std::vector<char> formatted_chat(1024); | ||||||
|     int32_t res; |     int32_t res; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Xuan Son Nguyen
					Xuan Son Nguyen