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

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

LLM сама по собі не може виконати пошук у базі даних, створити тікет у CRM або надіслати листа. Якщо ваш бот вміє тільки генерувати текст — він непотрібний для бізнес-завдань. Ми вирішуємо це за допомогою Function Calling (tool use): механізму, при якому модель аналізує запит, визначає потрібний інструмент та його параметри, а хост-застосунок виконує виклик і повертає результат. Таким чином, інтеграція LLM з інструментами стає можливою. Так агент стає повноцінним учасником бізнес-процесів.

Без чіткої схеми інструментів модель може згенерувати довільний JSON, який не пройде валідацію. Це призводить до збоїв інтеграції та невдоволення користувачів. Наша команда розробила підхід, заснований на Pydantic-валідації викликів функцій, який виключає такі ситуації. Використання Pydantic валідації зменшує кількість помилок на 90% порівняно з невалідованими викликами.

Наш підхід — не просто підключити один API, а спроектувати архітектуру, яка витримає реальне навантаження. Ми використовуємо стек: OpenAI GPT-4o, Claude 3.5, Hugging Face Transformers для локальних моделей, LangChain для оркестрації, Qdrant для векторного пошуку. Всі конфіги зберігаємо в Git, версіонуємо схеми інструментів. Докладніше про механізм можна прочитати в документації OpenAI. OpenAI function calling дозволяє моделі викликати інструменти, а Anthropic tool use реалізовано в Claude 3.

Як працює 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, версіонуємо схеми інструментів. MLOps агентів забезпечує безперебійну роботу. Ми також використовуємо fine-tuning для інструментів, щоб покращити точність.

Базовий цикл агента з 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,000, що окупається за 3-6 місяців за рахунок автоматизації. Економія від впровадження може становити до 50% витрат на підтримку.

Гарантії та підтримка

Ми маємо досвід понад 5 років в AI та реалізували 15+ проектів з Function Calling. Гарантуємо якість: кожен агент проходить навантажувальне тестування та code review. Використовуємо best practices: schema validation, retry logic, observability.

Оцінимо ваш проект — напишіть нам. Замовте розробку AI-агента під ключ та отримайте перших результатів вже через тиждень.

OpenAI documentation

Напрямки AI-розробки

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1542
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1394
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1369
  • Розробка логотипу компанії B2B Advance
    Розробка логотипу компанії B2B Advance
    816
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1141