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







