mirror of
				https://github.com/ggml-org/llama.cpp.git
				synced 2025-10-31 08:51:55 +00:00 
			
		
		
		
	llama-chat : Add Yandex instruct model template support (#12621)
* add yandex template * update yandex chat template * fix tests * adjust chat template * fix style * fix tool macro in template * add clarify comment --------- Co-authored-by: Sergei Vorobev <serv01@yandex-team.ru> Co-authored-by: Xuan-Son Nguyen <thichthat@gmail.com>
This commit is contained in:
		| @@ -59,6 +59,7 @@ static const std::map<std::string, llm_chat_template> LLM_CHAT_TEMPLATES = { | |||||||
|     { "granite",           LLM_CHAT_TEMPLATE_GRANITE           }, |     { "granite",           LLM_CHAT_TEMPLATE_GRANITE           }, | ||||||
|     { "gigachat",          LLM_CHAT_TEMPLATE_GIGACHAT          }, |     { "gigachat",          LLM_CHAT_TEMPLATE_GIGACHAT          }, | ||||||
|     { "megrez",            LLM_CHAT_TEMPLATE_MEGREZ            }, |     { "megrez",            LLM_CHAT_TEMPLATE_MEGREZ            }, | ||||||
|  |     { "yandex",            LLM_CHAT_TEMPLATE_YANDEX            }, | ||||||
| }; | }; | ||||||
|  |  | ||||||
| llm_chat_template llm_chat_template_from_str(const std::string & name) { | llm_chat_template llm_chat_template_from_str(const std::string & name) { | ||||||
| @@ -168,6 +169,8 @@ llm_chat_template llm_chat_detect_template(const std::string & tmpl) { | |||||||
|         return LLM_CHAT_TEMPLATE_GIGACHAT; |         return LLM_CHAT_TEMPLATE_GIGACHAT; | ||||||
|     } else if (tmpl_contains("<|role_start|>")) { |     } else if (tmpl_contains("<|role_start|>")) { | ||||||
|         return LLM_CHAT_TEMPLATE_MEGREZ; |         return LLM_CHAT_TEMPLATE_MEGREZ; | ||||||
|  |     } else if (tmpl_contains(" Ассистент:")) { | ||||||
|  |         return LLM_CHAT_TEMPLATE_YANDEX; | ||||||
|     } |     } | ||||||
|     return LLM_CHAT_TEMPLATE_UNKNOWN; |     return LLM_CHAT_TEMPLATE_UNKNOWN; | ||||||
| } | } | ||||||
| @@ -567,6 +570,24 @@ int32_t llm_chat_apply_template( | |||||||
|         if (add_ass) { |         if (add_ass) { | ||||||
|             ss << "<|role_start|>assistant<|role_end|>"; |             ss << "<|role_start|>assistant<|role_end|>"; | ||||||
|         } |         } | ||||||
|  |     } else if (tmpl == LLM_CHAT_TEMPLATE_YANDEX) { | ||||||
|  |         // Yandex template ("\n\n" is defined as EOT token) | ||||||
|  |  | ||||||
|  |         ss << "<s>"; | ||||||
|  |  | ||||||
|  |         for (size_t i = 0; i < chat.size(); i++) { | ||||||
|  |             std::string role(chat[i]->role); | ||||||
|  |             if (role == "user") { | ||||||
|  |                 ss << " Пользователь: " << chat[i]->content << "\n\n"; | ||||||
|  |             } else if (role == "assistant") { | ||||||
|  |                 ss << " Ассистент: " << chat[i]->content << "\n\n"; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // Add generation prompt if needed | ||||||
|  |         if (add_ass) { | ||||||
|  |             ss << " Ассистент:[SEP]"; | ||||||
|  |         } | ||||||
|     } else { |     } else { | ||||||
|         // template not supported |         // template not supported | ||||||
|         return -1; |         return -1; | ||||||
| @@ -585,4 +606,3 @@ int32_t llama_chat_builtin_templates(const char ** output, size_t len) { | |||||||
|     } |     } | ||||||
|     return (int32_t) LLM_CHAT_TEMPLATES.size(); |     return (int32_t) LLM_CHAT_TEMPLATES.size(); | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -38,6 +38,7 @@ enum llm_chat_template { | |||||||
|     LLM_CHAT_TEMPLATE_GRANITE, |     LLM_CHAT_TEMPLATE_GRANITE, | ||||||
|     LLM_CHAT_TEMPLATE_GIGACHAT, |     LLM_CHAT_TEMPLATE_GIGACHAT, | ||||||
|     LLM_CHAT_TEMPLATE_MEGREZ, |     LLM_CHAT_TEMPLATE_MEGREZ, | ||||||
|  |     LLM_CHAT_TEMPLATE_YANDEX, | ||||||
|     LLM_CHAT_TEMPLATE_UNKNOWN, |     LLM_CHAT_TEMPLATE_UNKNOWN, | ||||||
| }; | }; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -270,6 +270,14 @@ int main(void) { | |||||||
|             /* .bos_token= */ "", |             /* .bos_token= */ "", | ||||||
|             /* .eos_token= */ "", |             /* .eos_token= */ "", | ||||||
|         }, |         }, | ||||||
|  |         { | ||||||
|  |             /* .name= */ "yandex/YandexGPT-5-Lite-8B-instruct", | ||||||
|  |             /* .template_str= */ "<s>{%- set names = {'assistant': ' Ассистент:', 'user': ' Пользователь:'} %}\n{%- set tools_prefix = 'Тебе доступны следующие функции:' %}\n{%- macro __render_tool(tool) %}\n    {%- set name = tool.function.name %}\n    {%- set description = tool.function.description|default('') %}\n    {%- set parameters = tool.function.parameters|tojson %}\n    {{- '\\n' }}function {{ '{' }}'name':'{{ name }}',\n    {%- if tool.function.description %}'description':'{{ description }}',{% endif %}\n'parameters':{{ parameters }}\n    {{- '}' }}\n{%- endmacro %}\n{%- macro __render_tools(tools) %}\n    {{- tools_prefix }}\n    {%- for tool in tools %}\n        {{- __render_tool(tool) }}\n    {%- endfor %}\n    {{- '\\n\\n' }}\n{%- endmacro %}\n{%- macro __render_tool_message(message) %}\n    {{- '\\n\\nРезультат вызова' }} {{ message.name }}: {{ message.content }} {{ '\\n\\n' }}\n{%- endmacro %}\n{%- if tools -%}\n    {{- __render_tools(tools) }}\n{%- endif -%}\n{%- macro __render_user_message(message) %}\n{{ names.user }} {{ message.content + '\\n\\n' }}\n{%- endmacro %}\n{%- macro __render_assistant_message(message) %}\n    {{- names.assistant }}\n    {%- set call = message['function_call'] %}\n    {%- if call %}\n        {{- '\\n[TOOL_CALL_START]' }}{{ call.name }}{{ '\\n' }}{{ call.arguments|tojson }}\n    {%- else %}\n        {{- ' ' + message.content + '\\n\\n' }}\n    {%- endif %}\n{%- endmacro %}\n{%- if not add_generation_prompt is defined %}\n{%- set add_generation_prompt = false %}\n{%- endif %}\n{%- for message in messages %}\n    {%- if message['role'] == 'user' %}\n        {{- __render_user_message(message) }}\n    {%- endif %}\n    {%- if message.role == 'assistant' and not loop.last %}\n        {{- __render_assistant_message(message) }}\n    {%- endif %}\n    {%- if message.role == 'tool' %}\n        {{- __render_tool_message(message) }}\n    {%- endif %}\n    {%- if loop.last %}\n        {{- ' Ассистент:[SEP]' }}\n    {%- endif %}\n{%- endfor %}\n", | ||||||
|  |             /* .expected_output= */ "<s> Пользователь: Hello\n\n Ассистент: Hi there\n\n Пользователь: Who are you\n\n Ассистент:    I am an assistant   \n\n Пользователь: Another question\n\n Ассистент:[SEP]", | ||||||
|  |             /* .expected_output_jinja= */ "<s> Пользователь: You are a helpful assistant\nHello\n\n Ассистент: Hi there\n\n Пользователь: Who are you\n\n Ассистент:    I am an assistant   \n\n Пользователь: Another question\n\n Ассистент:[SEP]", | ||||||
|  |             /* .bos_token= */ "", | ||||||
|  |             /* .eos_token= */ "", | ||||||
|  |         }, | ||||||
|     }; |     }; | ||||||
|     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
	 Sergei Vorobyov
					Sergei Vorobyov