Нейросети вроде ChatGPT, DeepSeek или GigaChat можно научить взаимодействовать с окружающим миром: менять файлы на вашем диске, вызывать сторонние API или выполнять иные задачи в живом окружении.
Это делается довольно просто, и у большинства нейросетей применяется один и тот же подход: как у ChatGPT или DeepSeek, так и у GigaChat. Все они умеют работать с функциями.
Что такое функции
Если мы посмотрим на API любой нейросети, то функции там будут выглядеть непривычно. Вот пример функции из документации GigaChat:
{
"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"
]
}
}Функция — обычный JSON.
Какой код эта функция выполнит?
Здесь всё просто. Никакой))
До тех пор, пока мы сами его не напишем. Поэтому придётся по-старинке объявить где-то у себя в коде обычную функцию с названием weather_forecast, как в поле name в объекте выше.
Принимаемые параметры тоже делаем такими же, как в описании. И реализацию этой функции тоже пишем сами.
Как нейросеть сможет её вызвать?
Нам нужно сообщить модели о том, что у неё есть такая возможность. Для этого передаём описание этой функции в запросе API нейросети, прямо вместе с вашим текстом.
Вот пример тела запроса с функцией в GigaChat API:
{
"model": "GigaChat",
"messages": [
{
"role": "user",
"content": "Погода в Москве на три дня"
}
],
"function_call": "auto",
"functions": [
// Добавляем все свои функции вот сюда
],
}У ChatGPT это работает похожим образом, даже названия полей местами совпадают.
Что происходит дальше?
Модель распознает ваше сообщение и самостоятельно примет решение о том, нужно ли ей вызывать какую-то из функций, которые мы ей передали. Решение будет приниматься на основании вашего сообщения и текстовых описаний того, что функция делает и какие параметры принимает.
Если нейросеть посчитает, что функцию вызвать нужно, она вернёт в ответе название этой функции и параметры, которые нужны для её вызова. А нам остаётся сделать условный:
const { function_call } = response.message
// проверяем, что в ответе от нейросети есть признак вызова нашей функции
if (function_call.name === "weather_forecast") {
// вызываем функцию, которую сами же и написали
weather_forecast(function_call.arguments)
}
Всё. Естественно, вместо прогноза погоды функция может быть любой.
Мой бот, например, присылает мне в телегу логи с сервера, если я достаточно вежливо его об этом попрошу)
А в Python у библиотеки LangChain есть специальный декоратор tool, который упрощает создание функций.
Если внутрь функции с этим декоратором добавить описание в docstring, то библиотека сразу сформирует нужную структуру, готовую для того, чтобы передать её в нейросеть.