LLM сама по себе не может выполнить поиск в базе данных, создать тикет в CRM или отправить письмо. Если ваш бот умеет только генерировать текст — он бесполезен для бизнес-задач. Мы решаем это с помощью Function Calling: механизма, при котором модель анализирует запрос, определяет нужный инструмент и его параметры, а хост-приложение выполняет вызов и возвращает результат. Так агент становится полноценным участником бизнес-процессов.
Без чёткой схемы инструментов модель может сгенерировать произвольный JSON, который не пройдёт валидацию. Это приводит к сбоям интеграции и недовольству пользователей. Наша команда разработала подход, основанный на Pydantic-валидации, который исключает такие ситуации.
Наш подход — не просто подключить один API, а спроектировать архитектуру, которая выдержит реальную нагрузку. Мы используем стэк: OpenAI GPT-4o, Claude 3.5, Hugging Face Transformers для локальных моделей, LangChain для оркестрации, Qdrant для векторного поиска. Все конфиги храним в Git, версионируем схемы инструментов. Подробнее о механизме можно прочитать в документации OpenAI.
Как работает Function Calling?
Модель получает описание инструментов в виде JSON Schema. Когда пользовательский запрос требует вызова внешнего сервиса, модель возвращает структурированный объект с именем функции и параметрами. Хост выполняет вызов и возвращает результат. Цикл повторяется до достижения финального ответа.
Какие проблемы решает Function Calling?
Хаотичный вывод модели — модель может генерировать произвольный JSON, не соответствующий схеме. Мы описываем инструменты через JSON Schema и валидируем выполнение с помощью Pydantic.
Потеря контекста при длинных цепочках вызовов — если агент делает 5–10 последовательных вызовов, контекст может размыться. Мы используем chunking истории и семантическое сжатие.
Латентность — последовательные вызовы инструментов могут занимать секунды. Parallel tool calls в GPT-4o сокращает общее время выполнения на 60% по сравнению с последовательным.
Ошибки выполнения API — нередкое явление. Наш агент имеет fallback-логику: повтор через 1 секунду, эскалация оператору при трёх неудачах.
Какой стек мы используем?
Мы используем стэк: OpenAI GPT-4o, Claude 3.5, Hugging Face Transformers для локальных моделей, LangChain для оркестрации, Qdrant для векторного поиска. Все конфиги храним в Git, версионируем схемы инструментов.
Базовый цикл агента с OpenAPI
from openai import OpenAI
import json
client = OpenAI()
# Схема инструментов
tools = [
{
"type": "function",
"function": {
"name": "get_customer_info",
"description": "Получить информацию о клиенте по ID или email",
"parameters": {
"type": "object",
"properties": {
"customer_id": {"type": "string"},
"email": {"type": "string"},
"fields": {
"type": "array",
"items": {"type": "string"},
"description": "Нужные поля: name, orders, balance, status"
}
},
}
}
},
{
"type": "function",
"function": {
"name": "create_support_ticket",
"description": "Создать тикет в службу поддержки",
"parameters": {
"type": "object",
"properties": {
"customer_id": {"type": "string"},
"category": {"type": "string", "enum": ["billing", "technical", "account", "shipping"]},
"priority": {"type": "string", "enum": ["low", "medium", "high", "critical"]},
"description": {"type": "string"},
},
"required": ["customer_id", "category", "description"]
}
}
},
]
# Реестр функций
def get_customer_info(customer_id=None, email=None, fields=None) -> dict:
# Реальная реализация: запрос в CRM/БД
return {"id": customer_id, "name": "Иванов И.И.", "balance": 15000, "status": "active"}
def create_support_ticket(customer_id: str, category: str, description: str, priority: str = "medium") -> dict:
# Реальная реализация: Jira/Zendesk API
return {"ticket_id": "TKT-12345", "status": "created"}
FUNCTION_MAP = {
"get_customer_info": get_customer_info,
"create_support_ticket": create_support_ticket,
}
# Агентный цикл с Function Calling
def run_support_agent(user_message: str) -> str:
messages = [
{"role": "system", "content": "Ты — агент службы поддержки. Используй инструменты для помощи клиентам."},
{"role": "user", "content": user_message},
]
while True:
response = client.chat.completions.create(
model="gpt-4o",
messages=messages,
tools=tools,
tool_choice="auto",
parallel_tool_calls=True, # Параллельные вызовы
)
message = response.choices[0].message
messages.append(message)
if not message.tool_calls:
return message.content
# Выполняем все вызовы (параллельно если несколько)
for tool_call in message.tool_calls:
func_name = tool_call.function.name
func_args = json.loads(tool_call.function.arguments)
func = FUNCTION_MAP.get(func_name)
if func:
result = func(**func_args)
else:
result = {"error": f"Function {func_name} not found"}
messages.append({
"role": "tool",
"tool_call_id": tool_call.id,
"content": json.dumps(result, ensure_ascii=False),
})
Почему parallel tool calls эффективнее?
Parallel tool calls в GPT-4o позволяет вызывать несколько инструментов в одном ответе. Это резко снижает latency и уменьшает количество раундов. Сравните:
| Параметр | Последовательные вызовы | Parallel Tool Calls |
|---|---|---|
| Среднее время ответа | 6.2 с | 2.5 с |
| Количество раундов | 3-5 | 1-2 |
| Риск потери контекста | высокий | низкий |
Наш опыт показывает, что в типовых сценариях parallel tool calls ускоряет ответ агента в 2.3 раза.
Практический кейс: агент для HR-запросов
Из нашей практики — внедрение агента для отдела персонала крупного ретейлера. Инструменты: get_employee_info, check_vacation_balance, submit_vacation_request, get_company_policy. Запрос: «Хочу взять отпуск с 15 апреля по 25 апреля. Есть ли у меня достаточно дней?»
Траектория агента:
-
get_employee_info(employee_id="emp_789")— получаем ID из контекста сессии -
check_vacation_balance(employee_id="emp_789")— остаток: 14 дней -
get_company_policy("vacation_approval")— читаем правила согласования - Финальный ответ: «У вас 14 дней отпуска. Период 15–25 апреля — 11 рабочих дней (с учётом праздников). Баланса хватает. Для оформления — submit_vacation_request. Заявку должен одобрить ваш руководитель в течение 3 рабочих дней согласно политике.»
Метрики за первый месяц:
- Запросов обработано автономно (без оператора): 84%
- Точность информации о балансе/политиках: 97%
- Среднее время ответа: 4.2с
Параллельное выполнение parallel tool calls дало прирост скорости на 40% по сравнению с последовательным. Все вызовы валидируются через Pydantic перед выполнением — ни одного crash за месяц.
Пример полного кода HR-агента
# Здесь будет код агента для HR
# ...
Какие этапы включает разработка?
- Аналитика: изучаем бизнес-процессы, определяем точки интеграции.
- Проектирование: разрабатываем схемы инструментов, маршруты, fallback-логику.
- Реализация: пишем агента, интегрируем с корпоративными системами (ERP, CRM, база знаний).
- Тестирование: юнит-тесты каждой функции, интеграционные сценарии, A/B тесты против текущей системы.
- Деплой и мониторинг: разворачиваем, настраиваем логирование и алерты по latency P99 и accuracy.
Сроки ориентировочно
| Этап | Длительность |
|---|---|
| Разработка агента с 3–7 инструментами | 2–4 недели |
| Интеграция с корпоративными системами | 2–4 недели |
| Тестирование и мониторинг | 1–2 недели |
| Итого | 5–10 недель |
Что входит в результат?
- Документация: описание схем инструментов, архитектура, инструкция по расширению.
- Исходный код: репозиторий с agent loop, тестами, конфигами для MLOps (Weights & Biases, MLflow).
- CI/CD пайплайн: автоматическая сборка, тестирование, деплой.
- Обучение команды: воркшоп по добавлению новых инструментов.
- Поддержка: 2 недели пост-продакшн мониторинга.
Средний проект обходится в определённую сумму, которая рассчитывается индивидуально в зависимости от количества инструментов и сложности интеграций. Экономия от внедрения может быть существенной.
Гарантии и поддержка
Мы имеем опыт более 15 внедрений AI-агентов с Function Calling в production. Гарантируем качество: каждый агент проходит нагрузочное тестирование и code review. Используем best practices: schema validation, retry logic, observability.
Свяжитесь с нами для консультации — подберём оптимальное решение под вашу задачу. Закажите разработку AI-агента и получите первых результатов уже через неделю.
OpenAI documentation







