Генерация аргументов
В этом разделе вы найдете примеры генерации аргументов для пользовательских функций в различных режимах, а также узнаете, как работает генерация аргументов в потоковом режиме и как вернуть в модель результат работы функции.
Пользовательские функции — это функции, реализованные в вашем приложении или стороннем сервисе.
Модели GigaChat могут генерировать аргументы для таких функций на основе их описания, полученного в массиве functions
, в запросе POST /chat/completions.
Используйте полученные аргументы для вызова функции, а результаты ее работы возвращайте в модель в сообщении с ролью function
.
Модели умеют генерировать аргументы автоматически, в зависимости от промпта, или принудительно. Подробнее — в разделе Режимы работы с функциями.
Рекомендации по описанию пользовательских функций и примеры — в разделе Описание пользовательских функций.
Быстрый старт
Чтобы модель сгенерировала аргументы для вашей функции, просто передайте ее описание в массиве functions
вместе с подходящим промптом:
- cURL
- Python
- JS/TS
curl --location 'https://gigachat.devices.sberbank.ru/api/v1/chat/completions' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer <токен_доступа>' \
--data '{
"model": "GigaChat-2-Pro",
"messages": [
{
"role": "user",
"content": "Погода в Манжероке на десять дней"
}
],
"functions": [
{
"name": "weather_forecast",
"description": "Возвращает температуру на заданный период",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "Местоположение, например, название города"
},
"format": {
"type": "string",
"enum": [
"celsius",
"fahrenheit"
],
"description": "Единицы измерения температуры"
},
"num_days": {
"type": "integer",
"description": "Период, для которого нужно вернуть"
}
},
"required": [
"location",
"num_days"
]
},
"few_shot_examples": [
{
"request": "Какая погода в Москве в ближайшие три дня",
"params": {
"location": "Moscow, Russia",
"format": "celsius",
"num_days": "3"
}
}
],
"return_parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "Местоположение, например, название города"
},
"temperature": {
"type": "integer",
"description": "Температура для заданного местоположения"
},
"forecast": {
"type": "array",
"items": {
"type": "string"
},
"description": "Описание погодных условий"
},
"error": {
"type": "string",
"description": "Возвращается при возникновении ошибки. Содержит описание ошибки"
}
}
}
}
]
}'
Генерация аргументов с помощью SDK:
from gigachat import GigaChat
from gigachat.models import Chat, Function, Messages, MessagesRole, FunctionParameters
from gigachat.models.few_shot_example import FewShotExample
giga = GigaChat(
credentials="<ключ_авторизации>",
)
weather_forecast_function=Function(
name="weather_forecast",
description="Возвращает температуру на заданный период",
parameters=FunctionParameters(
type="object",
properties={"location": {"type": "string", "description": "Местоположение, например, название города"}, "format": {"type": "string", "enum": ["celsius", "fahrenheit"], "description": "Единицы измерения температуры"}, "num_days": {"type": "integer", "description": "Период, для которого нужно вернуть"}},
required=["location","format"],
few_shot_examples=[FewShotExample(
request="Какая погода в Москве в ближайшие три дня",
params={"location": "Moscow, Russia", "format": "celsius", "num_days": "3"}
)],
return_parameters=[{ "type": "object", "properties": {"location": {"type": "string", "description": "Местоположение, например, название города"}, "temperature": {"type": "integer", "description": "Температура для заданного местоположения"}, "forecast": {"type": "array", "items": {"type": "string"}, "description": "Описание погодных условий"}, "error": {"type": "string", "description": "Возвращается при возникновении ошибки. Содержит описание ошибки"}}}]
)
)
payload = Chat(
messages=[Messages(role=MessagesRole.USER, content="погода в Манжероке на десять дней")],
functions=[weather_forecast_function]
)
response = giga.chat(payload)
print(response)
Генерация аргументов с помощью партнерского пакета langchain-gigachat:
from langchain_gigachat.chat_models import GigaChat
from langchain_core.prompts import ChatPromptTemplate
llm = GigaChat(
credentials="<ключ_авторизации>",
verify_ssl_certs=False
)
weather_forecast = {
"name": "weather_forecast",
"description": "Возвращает температуру на заданный период",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "Местоположение, например, название города"
},
"format": {
"type": "string",
"enum": [
"celsius",
"fahrenheit"
],
"description": "Единицы измерения температуры"
},
"num_days": {
"type": "integer",
"description": "Период, для которого нужно вернуть"
}
},
"required": [
"location",
"format"
]
},
"few_shot_examples": [
{
"request": "Какая погода в Москве в ближайшие три дня",
"params": {
"location": "Moscow, Russia",
"format": "celsius",
"num_days": "3"
}
}
],
"return_parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "Местоположение, например, название города"
},
"temperature": {
"type": "integer",
"description": "Температура для з аданного местоположения"
},
"forecast": {
"type": "array",
"items": {
"type": "string"
},
"description": "Описание погодных условий"
},
"error": {
"type": "string",
"description": "Возвращается при возникновении ошибки. Содержит описание ошибки"
}
}
}
}
# Метод `bind_tools(tools=[], tool_choice="auto")` сообщает модели, что нужно использовать встроенные функции.
llm = llm.bind_tools(tools=[weather_forecast])
# Промпт для создания изображения
prompt = ChatPromptTemplate.from_messages(
[
("user", """{topic}"""),
]
)
custom_functions_chain = prompt | llm
response = custom_functions_chain.invoke({"topic": "Погода в Манжероке на три дня"})
print(response)
Генерация аргументов с помощью SDK:
import { GigaChat } from 'gigachat';
const giga = new GigaChat({
credentials: '<ключ_авторизации>',
});
const weatherForecast = {
name: "weather_forecast",
description: "Возвращает температуру на заданный период",
parameters: {
type: "object",
properties: {
location: {
type: "string",
description: "Местоположение, например, название города"
},
format: {
type: "string",
enum: [
"celsius",
"fahrenheit"
],
description: "Единицы измерения температуры"
},
num_days: {
type: "integer",
description: "Период, для которого нужно вернуть"
}
},
required: [
"location",
"num_days"
]
},
few_shot_examples: [
{
request: "Какая погода в Москве в ближайшие три дня",
params: {
location: "Moscow, Russia",
format: "celsius",
num_days: "3"
}
}
],
return_parameters: {
type: "object",
properties: {
location: {
type: "string",
description: "Местоположение, например, название города"
},
temperature: {
type: "integer",
description: "Температура для заданного местоположения"
},
forecast: {
type: "array",
items: {
type: "string"
},
description: "Описание погодных условий"
},
error: {
type: "string",
description: "Возвращается при возникновении ошибки. Содержит описание ошибки"
}
}
}
}
const resp = await giga.chat({
messages: [
{
role: "user",
content: "Погода в Манжероке на три дня",
},
],
functions: [
weatherForecast
]
});
console.log(resp.choices[0]?.message);
Автоматический режим
В этом режиме модель анализирует полученные сообщения (массив messages
) и сама решает, нужно генерировать аргументы или нет.
Для работы в автоматическом режиме достаточно передать в сообщение массив functions
с описанием функций.
Чтобы модели могли обращаться к встроенным функциям при работе с пользовательскими, яв но активируйте автоматический режим и укажите необходимые функции в массиве functions
.
- cURL
- Python
- JS/TS
curl --location 'https://gigachat.devices.sberbank.ru/api/v1/chat/completions' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer <токен_доступа>' \
--data '{
"model": "GigaChat-2-Pro",
"messages": [
{
"role": "user",
"content": "Нарисуй горы"
}
],
"function_call": "auto",
"functions": [
{
"name": "text2image"
},
{
"name": "weather_forecast",
"description": "Возвращает температуру на заданный период",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "Местоположение, например, название города"
},
"format": {
"type": "string",
"enum": [
"celsius",
"fahrenheit"
],
"description": "Единицы измерения температуры"
},
"num_days": {
"type": "integer",
"description": "Период, для которого нужно вернуть"
}
},
"required": [
"location",
"format"
]
},
"few_shot_examples": [
{
"request": "Какая погода в Москве в ближайшие три дня",
"params": {
"location": "Moscow, Russia",
"format": "celsius",
"num_days": "3"
}
}
],
"return_parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "Местоположение, например, название города"
},
"temperature": {
"type": "integer",
"description": "Температура для заданного местоположения"
},
"forecast": {
"type": "array",
"items": {
"type": "string"
},
"description": "Описание погодных условий"
},
"error": {
"type": "string",
"description": "Возвращается при возникновении ошибки. Содержит описание ошибки"
}
}
}
}
]
}'
Совместное использование функций с помощью SDK:
from gigachat import GigaChat
from gigachat.models import Chat, Function, Messages, MessagesRole, FunctionParameters
from gigachat.models.few_shot_example import FewShotExample
giga = GigaChat(credentials="<ключ_авторизации>", verify_ssl_certs=False)
weather_forecast_function=Function(
name="weather_forecast",
description="Возвращает температуру на заданный период",
parameters=FunctionParameters(
type="object",
properties={"location": {"type": "string", "description": "Местоположение, например, название города"}, "format": {"type": "string", "enum": ["celsius", "fahrenheit"], "description": "Единицы измерения температуры"}, "num_days": {"type": "integer", "description": "Период, для которого нужно вернуть"}},
required=["location","format"],
few_shot_examples=[FewShotExample(
request="Какая погода в Москве в ближайшие три дня",
params={"location": "Moscow, Russia", "format": "celsius", "num_days": "3"}
)],
return_parameters=[{ "type": "object", "properties": {"location": {"type": "string", "description": "Местоположение, например, название города"}, "temperature": {"type": "integer", "description": "Температура для заданного местоположения"}, "forecast": {"type": "array", "items": {"type": "string"}, "description": "Описание погодных условий"}, "error": {"type": "string", "description": "Возвращается при возникновении ошибки. Содержит описание ошибки"}}}]
)
)
payload = Chat(
messages=[Messages(role=MessagesRole.USER, content="Нарисуй горы")],
function_call="auto",
functions=[
Function(name="text2image"),
weather_forecast_function
]
)
response = giga.chat(payload)
print (response)
Совместное использование функций с помощью партнерского пакета langchain-gigachat:
from langchain_gigachat.chat_models import GigaChat
from langchain_core.prompts import ChatPromptTemplate
llm = GigaChat(
credentials="<ключ_авторизации>",
verify_ssl_certs=False
)
tools = [
{
"name": "text2image",
},
{
"name": "weather_forecast",
"description": "Возвращает температуру на заданный период",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "Местоположение, например, название города"
},
"format": {
"type": "string",
"enum": [
"celsius",
"fahrenheit"
],
"description": "Единицы измерения температуры"
},
"num_days": {
"type": "integer",
"description": "