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

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

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

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

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

  • Разработка сайта компании B2B ADVANCE
    Разработка сайта компании B2B ADVANCE
    1542
  • Разработка веб-приложения для компании FEEDME
    Разработка веб-приложения для компании FEEDME
    1393
  • Разработка веб-сайта для компании БЕЛФИНГРУПП
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1081
  • Разработка интернет магазина для компании FURNORO
    Разработка интернет магазина для компании FURNORO
    1368
  • Разработка логотипа компании B2B Advance
    Разработка логотипа компании B2B Advance
    815
  • Разработка веб-приложения для компании Enviok
    Разработка веб-приложения для компании Enviok
    1139