Views
No views yet
| Filename | Quant type | File Size | Description |
|---|---|---|---|
| gemma-2-9B-it-russian-function-calling-F16.gguf | F16 | 18.5GB | Base model with float16 |
pip install -U transformers1def get_weather(city: str):
2 """
3 Функция, которая возвращает погоду в заданном городе.
4
5 Args:
6 city: Город, для которого надо узнать погоду.
7 """
8 import random
9
10 return "sunny" if random.random() > 0.5 else "rainy"
11
12
13def get_sunrise_sunset_times(city: str):
14 """
15 Функция, которая возвращает время восхода и заката для заданного города для текущей даты (дата от пользователя не требуется), в формате списка: [sunrise_time, sunset_time].
16
17 Args:
18 city: Город, в котором можно узнать время восхода и захода солнца.
19 """
20
21 return ["6:00", "18:00"]1import torch
2from transformers import AutoTokenizer, AutoModelForCausalLM
3model = AutoModelForCausalLM.from_pretrained(
4 "DiTy/gemma-2-9b-it-russian-function-calling-GGUF",
5 device_map="auto",
6 torch_dtype=torch.bfloat16, # use float16 or float32 if bfloat16 is not available to you.
7 cache_dir=PATH_TO_MODEL_DIR, # optional
8)
9tokenizer = AutoTokenizer.from_pretrained(
10 "DiTy/gemma-2-9b-it-russian-function-calling-GGUF",
11 cache_dir=PATH_TO_MODEL_DIR, # optional
12)apply_chat_template. Чтобы учесть наши написанные функции (инструменты),
нам нужно передать их в виде списка через атрибут tools, а также использовать add_prompt_generation=True.1history_messages = [
2 {"role": "system", "content": "Ты - полезный помощник, имеющий доступ к следующим функциям. Используйте их при необходимости - "},
3 {"role": "user", "content": "Привет, не мог бы ты сказать мне, во сколько в Краснодаре восходит солнце?"}
4]
5inputs = tokenizer.apply_chat_template(
6 history_messages,
7 tokenize=False,
8 add_generation_prompt=True, # adding prompt for generation
9 tools=[get_weather, get_sunrise_sunset_times], # our functions (tools)
10)
11print(inputs)inputs будет выглядеть следующим образом:<bos><start_of_turn>user
Ты - полезный помощник, имеющий доступ к следующим функциям. Используйте их при необходимости - {
"name": "get_weather",
"description": "Функция, которая возвращает погоду в заданном городе.",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "Город, для которого надо узнать погоду."
}
},
"required": [
"city"
]
}
},
{
"name": "get_sunrise_sunset_times",
"description": "Функция, которая возвращает время восхода и заката для заданного города для текущей даты (дата от пользователя не требуется), в формате списка: [sunrise_time, sunset_time].",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "Город, в котором можно узнать время восхода и захода солнца."
}
},
"required": [
"city"
]
}
}
Привет, не мог бы ты сказать мне, во сколько в Краснодаре восходит солнце?<end_of_turn>
<start_of_turn>modelapply_chat_template нет необходимости добавлять специальные токены во время токенизации.
Поэтому используем add_special_tokens=False:1terminator_ids = [
2 tokenizer.eos_token_id,
3 tokenizer.convert_tokens_to_ids("<end_of_turn>"),
4]
5prompt_ids = tokenizer.encode(inputs, add_special_tokens=False, return_tensors='pt').to(model.device)
6generated_ids = model.generate(
7 prompt_ids,
8 max_new_tokens=512,
9 eos_token_id=terminator_ids,
10 bos_token_id=tokenizer.bos_token_id,
11)
12generated_response = tokenizer.decode(generated_ids[0][prompt_ids.shape[-1]:], skip_special_tokens=False) # `skip_special_tokens=False` for debug
13print(generated_response)Вызов функции: {"name": "get_sunrise_sunset_times", "arguments": {"city": "Краснодар"}}<end_of_turn>1history_messages = [
2 {"role": "system", "content": "Ты - полезный помощник, имеющий доступ к следующим функциям. Используйте их при необходимости - "},
3 {"role": "user", "content": "Привет, не мог бы ты сказать мне, во сколько в Краснодаре восходит солнце?"},
4 {"role": "function-call", "content": '{"name": "get_sunrise_sunset_times", "arguments": {"city": "Los Angeles"}}'},
5 {"role": "function-response", "content": '{"times_list": ["6:00", "18:00"]}'}, # гипотетический ответ от нашей функции
6]
7inputs = tokenizer.apply_chat_template(
8 history_messages,
9 tokenize=False,
10 add_generation_prompt=True, # добавление запроса для генерации
11 tools=[get_weather, get_sunrise_sunset_times], # наши функции (tools)
12)
13print(inputs)inputs верны:<bos><start_of_turn>user
Ты - полезный помощник, имеющий доступ к следующим функциям. Используйте их при необходимости - {
"name": "get_weather",
"description": "Функция, которая возвращает погоду в заданном городе.",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "Город, для которого надо узнать погоду."
}
},
"required": [
"city"
]
}
},
{
"name": "get_sunrise_sunset_times",
"description": "Функция, которая возвращает время восхода и заката для заданного города для текущей даты (дата от пользователя не требуется), в формате списка: [sunrise_time, sunset_time].",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "Город, в котором можно узнать время восхода и захода солнца."
}
},
"required": [
"city"
]
}
}
Привет, не мог бы ты сказать мне, во сколько в Краснодаре восходит солнце?<end_of_turn>
<start_of_turn>model
Вызов функции: {"name": "get_sunrise_sunset_times", "arguments": {"city": "Краснодар"}}<end_of_turn>
<start_of_turn>user
Ответ от функции: {"times_list": ["6:00", "18:00"]}<end_of_turn>
<start_of_turn>model1prompt_ids = tokenizer.encode(inputs, add_special_tokens=False, return_tensors='pt').to(model.device)
2generated_ids = model.generate(
3 prompt_ids,
4 max_new_tokens=512,
5 eos_token_id=terminator_ids,
6 bos_token_id=tokenizer.bos_token_id,
7)
8generated_response = tokenizer.decode(generated_ids[0][prompt_ids.shape[-1]:], skip_special_tokens=False) # `skip_special_tokens=False` for debug
9print(generated_response)В Краснодаре солнце восходит в 6:00 утра и заходит в 18:00 вечера.<end_of_turn>pipeline1from transformers import pipeline
2generation_pipeline = pipeline(
3 "text-generation",
4 model="DiTy/gemma-2-9b-it-russian-function-calling-GGUF",
5 model_kwargs={
6 "torch_dtype": torch.bfloat16, # use float16 or float32 if bfloat16 is not supported for you.
7 "cache_dir": PATH_TO_MODEL_DIR, # OPTIONAL
8 },
9 device_map="auto",
10)
11history_messages = [
12 {"role": "system", "content": "Ты - полезный помощник, имеющий доступ к следующим функциям. Используйте их при необходимости - "},
13 {"role": "user", "content": "Привет, не мог бы ты сказать мне, во сколько в Краснодаре восходит солнце?"},
14 {"role": "function-call", "content": '{"name": "get_sunrise_sunset_times", "arguments": {"city": "Краснодар"}}'},
15 {"role": "function-response", "content": '{"times_list": ["6:00", "18:00"]}'}
16]
17inputs = generation_pipeline.tokenizer.apply_chat_template(
18 history_messages,
19 tokenize=False,
20 add_generation_prompt=True,
21 tools=[get_weather, get_sunrise_sunset_times],
22)
23terminator_ids = [
24 generation_pipeline.tokenizer.eos_token_id,
25 generation_pipeline.tokenizer.convert_tokens_to_ids("<end_of_turn>")
26]
27outputs = generation_pipeline(
28 inputs,
29 max_new_tokens=512,
30 eos_token_id=terminator_ids,
31)
32print(outputs[0]["generated_text"][len(inputs):])apply_chat_template.
Необходимо передать историю сообщений в определенном формате.1history_messages = [
2 {"role": "...", "content": "..."},
3 ...
4]system - это необязательная роль, ее содержимое всегда размещается в самом начале и перед перечислением функций, доступных модели (инструментов).
Вы всегда можете воспользоваться стандартным вариантом, который использовался во время обучения: "Ты - полезный помощник, имеющий доступ к следующим функциям. Используйте их при необходимости - "user - запрос пользователя передается через эту роль.function-call - тело вызова функции передается через эту роль.
Хотя модель обучена генерировать вызов функции в виде "Вызов функции: {...}<end_of_turn>", вы все равно должны передать только тело "{...}"
в поле "content", поскольку используя apply_chat_template, постскриптум в инструкциях добавляется автоматически.function-response - в этой роли мы должны передать ответ нашей функции в поле "content" в виде словаря '{"name_returnable_value": value}'.model - содержимое, относящееся к этой роли, считается сгенерированным текстом модели.[
{"role": "system", "content": "Ты - полезный помощник, имеющий доступ к следующим функциям. Используйте их при необходимости - "},
{"role": "user", "content": "Привет, не мог бы ты сказать мне, во сколько в Краснодаре восходит солнце?"},
{"role": "function-call", "content": '{"name": "get_sunrise_sunset_times", "arguments": {"city": "Краснодар"}}'},
{"role": "function-response", "content": '{"times_list": ["6:00", "18:00"]}'}
]<bos><start_of_turn>user
Ты - полезный помощник, имеющий доступ к следующим функциям. Используйте их при необходимости - {
"name": "get_weather",
"description": "Функция, которая возвращает погоду в заданном городе.",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "Город, для которого надо узнать погоду."
}
},
"required": [
"city"
]
}
},
{
"name": "get_sunrise_sunset_times",
"description": "Функция, которая возвращает время восхода и заката для заданного города для текущей даты (дата от пользователя не требуется), в формате списка: [sunrise_time, sunset_time].",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "Город, в котором можно узнать время восхода и захода солнца."
}
},
"required": [
"city"
]
}
}
Привет, не мог бы ты сказать мне, во сколько в Краснодаре восходит солнце?<end_of_turn>
<start_of_turn>model
Вызов функции: {"name": "get_sunrise_sunset_times", "arguments": {"city": "Краснодар"}}<end_of_turn>
<start_of_turn>user
Ответ от функции: {"times_list": ["6:00", "18:00"]}<end_of_turn>[
{"role": "system", "content": "Ты добрый помощник"},
{"role": "user", "content": "Расскажи мне о Москве"}
]<bos><start_of_turn>user
Ты добрый помощник
Расскажи мне о Москве<end_of_turn>| Model | Generation Language | Approximately Validation Loss |
|---|---|---|
| DiTy/gemma-2-27b-it-function-calling-GGUF | EN | 0.47 |
| DiTy/gemma-2-9b-it-russian-function-calling-GGUF | RU | 0.57 |
| DiTy/gemma-2-9b-it-function-calling-GGUF | EN | 0.5 |
| DiTy/gemma-2-2b-it-function-calling | EN | 0.66 |
1@article{gemma_2024,
2 title={Gemma},
3 url={https://www.kaggle.com/m/3301},
4 DOI={10.34740/KAGGLE/M/3301},
5 publisher={Kaggle},
6 author={Gemma Team},
7 year={2024}
8}