Разработка AI-агента с Function Calling (Tool Use)

LLM сама по себе не может выполнить поиск в базе данных, создать тикет в CRM или отправить письмо. Если ваш бот умеет только генерировать текст — он бесполезен для бизнес-задач. Мы решаем это с помощью Function Calling: механизма, при котором модель анализирует запрос, определяет нужный инструмент и

Направления AI-разработки

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1440
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1301
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    997
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1264
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    712
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    1002

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 апреля. Есть ли у меня достаточно дней?»

Траектория агента:

  1. get_employee_info(employee_id="emp_789") — получаем ID из контекста сессии
  2. check_vacation_balance(employee_id="emp_789") — остаток: 14 дней
  3. get_company_policy("vacation_approval") — читаем правила согласования
  4. Финальный ответ: «У вас 14 дней отпуска. Период 15–25 апреля — 11 рабочих дней (с учётом праздников). Баланса хватает. Для оформления — submit_vacation_request. Заявку должен одобрить ваш руководитель в течение 3 рабочих дней согласно политике.»

Метрики за первый месяц:

  • Запросов обработано автономно (без оператора): 84%
  • Точность информации о балансе/политиках: 97%
  • Среднее время ответа: 4.2с

Параллельное выполнение parallel tool calls дало прирост скорости на 40% по сравнению с последовательным. Все вызовы валидируются через Pydantic перед выполнением — ни одного crash за месяц.

Пример полного кода HR-агента
# Здесь будет код агента для HR # ... 

Какие этапы включает разработка?

  1. Аналитика: изучаем бизнес-процессы, определяем точки интеграции.
  2. Проектирование: разрабатываем схемы инструментов, маршруты, fallback-логику.
  3. Реализация: пишем агента, интегрируем с корпоративными системами (ERP, CRM, база знаний).
  4. Тестирование: юнит-тесты каждой функции, интеграционные сценарии, A/B тесты против текущей системы.
  5. Деплой и мониторинг: разворачиваем, настраиваем логирование и алерты по 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