Function Calling (вызов функций) — это механизм, позволяющий языковой модели решать, какую функцию вызвать и с какими параметрами, на основе пользовательского запроса. Модель не выполняет функцию напрямую — она возвращает имя функции и аргументы в JSON, а ваш код выполняет вызов. Это основа для создания AI-агентов, чат-ботов с доступом к данным и автоматизации.
Как работает Function Calling
Процесс состоит из трёх шагов:
- Описание функций — вы передаёте модели JSON-схемы доступных функций (tools)
- Выбор модели — модель анализирует запрос пользователя и решает, нужно ли вызвать функцию
- Выполнение — ваш код получает имя функции и аргументы, вызывает реальную функцию и возвращает результат модели
Пример: пользователь спрашивает «Какая погода в Москве?». Модель понимает, что нужно вызвать функцию get_weather с аргументом city="Москва".
Полный пример на Python
Реализуем Function Calling с двумя функциями: получение погоды и курса валют.
import json
from openai import OpenAI
client = OpenAI(
base_url="https://api.modelswitch.ru/v1",
api_key="msk_ваш_ключ"
)
# Определяем доступные функции
tools = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "Получить текущую погоду в городе",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "Название города, например: Москва"
},
"units": {
"type": "string",
"enum": ["celsius", "fahrenheit"],
"description": "Единицы измерения температуры"
}
},
"required": ["city"]
}
}
},
{
"type": "function",
"function": {
"name": "get_exchange_rate",
"description": "Получить курс обмена валют",
"parameters": {
"type": "object",
"properties": {
"from_currency": {"type": "string", "description": "Исходная валюта (USD, EUR, RUB)"},
"to_currency": {"type": "string", "description": "Целевая валюта"}
},
"required": ["from_currency", "to_currency"]
}
}
}
]
# Реальные реализации функций
def get_weather(city: str, units: str = "celsius") -> str:
# В реальном проекте — вызов Weather API
return json.dumps({"city": city, "temp": 22, "units": units, "condition": "sunny"})
def get_exchange_rate(from_currency: str, to_currency: str) -> str:
# В реальном проекте — вызов API курсов валют
return json.dumps({"from": from_currency, "to": to_currency, "rate": 92.5})
# Маппинг имён функций на реализации
available_functions = {
"get_weather": get_weather,
"get_exchange_rate": get_exchange_rate,
}
# Запрос к модели
messages = [{"role": "user", "content": "Какая погода в Москве и курс доллара к рублю?"}]
response = client.chat.completions.create(
model="gpt-4o",
messages=messages,
tools=tools,
tool_choice="auto"
)
# Обработка tool_calls
message = response.choices[0].message
if message.tool_calls:
messages.append(message)
for tool_call in message.tool_calls:
fn_name = tool_call.function.name
fn_args = json.loads(tool_call.function.arguments)
result = available_functions[fn_name](**fn_args)
messages.append({
"role": "tool",
"tool_call_id": tool_call.id,
"content": result
})
# Финальный запрос с результатами функций
final = client.chat.completions.create(
model="gpt-4o",
messages=messages
)
print(final.choices[0].message.content)
Пример на TypeScript
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.modelswitch.ru/v1",
apiKey: "msk_ваш_ключ",
});
const tools: OpenAI.ChatCompletionTool[] = [
{
type: "function",
function: {
name: "search_products",
description: "Поиск товаров в каталоге по запросу",
parameters: {
type: "object",
properties: {
query: { type: "string", description: "Поисковый запрос" },
max_price: { type: "number", description: "Максимальная цена" },
},
required: ["query"],
},
},
},
];
async function searchProducts(query: string, maxPrice?: number) {
// Реальный вызов к базе данных или API
return JSON.stringify([
{ name: "Товар 1", price: 1500 },
{ name: "Товар 2", price: 2300 },
]);
}
async function chat(userMessage: string) {
const messages: OpenAI.ChatCompletionMessageParam[] = [
{ role: "user", content: userMessage },
];
const response = await client.chat.completions.create({
model: "gpt-4o",
messages,
tools,
});
const msg = response.choices[0].message;
if (msg.tool_calls) {
messages.push(msg);
for (const call of msg.tool_calls) {
const args = JSON.parse(call.function.arguments);
const result = await searchProducts(args.query, args.max_price);
messages.push({ role: "tool", tool_call_id: call.id, content: result });
}
const final = await client.chat.completions.create({
model: "gpt-4o",
messages,
});
console.log(final.choices[0].message.content);
} else {
console.log(msg.content);
}
}
chat("Найди ноутбуки дешевле 50000 рублей");
Лучшие практики Function Calling
- Точные описания — чем подробнее description у функции и параметров, тем точнее модель определит, когда вызывать функцию.
- Валидация аргументов — всегда валидируйте аргументы, которые вернула модель, перед вызовом реальной функции.
- Ограничивайте набор функций — передавайте только те tools, которые релевантны текущему контексту. 5-10 функций оптимально.
- tool_choice — используйте
"auto"для автоматического выбора,"required"для принудительного вызова, или укажите конкретную функцию. - Parallel tool calls — GPT-4o может вызвать несколько функций одновременно (как в примере с погодой и курсом). Обрабатывайте все tool_calls в цикле.
Function Calling через ModelSwitch поддерживается для GPT-4o, GPT-4o-mini, Claude 3.5 Sonnet, Gemini 2.0 Pro и других моделей. Формат tools одинаковый для всех моделей.