Какие инструменты (tools/functions) дать агенту для автоматизации бизнес-задач? (ваш кейс!)

Краткий тезис

selection learning|Выбор инструментов для AI-агента — это не просто техническое решение, а проектирование бизнес-логики. Агенту нужно дать набор функций (tools), которые покрывают ключевые операции бизнес-процесса: поиск данных, коммуникации, создание записей, проверки статусов. Оптимальный набор строится по принципу наименьшей привилегии и single responsibility: каждая функция делает одно атомарное действие. В качестве кейса разберём агента поддержки интернет-магазина — это классический пример, где нужно умело сочетать операции с CRM, складом, платежами и почтой.


1. Терминология: что такое инструменты агента

AI-агент — программа, которая с помощью LLM (Large Language Model) может планировать шаги и вызывать внешние функции (tools/functions). Инструменты — это программные интерфейсы, через которые агент взаимодействует с внешним миром (API, базы данных, сервисы). Каждый инструмент — это, как правило, функция с описанием в формате JSON Schema (OpenAPI), которое LLM использует для выбора и заполнения параметров.

Расшифровка терминов:

  • Tool (инструмент) — атомарная операция, которую агент может вызвать. Например, send_email(to, subject, body).
  • Function calling (вызов функций) — способ, при котором LLM не генерирует текст, а возвращает структурированный запрос на вызов инструмента.
  • Business task — задача, связанная с поддержкой клиентов, продажами, обработкой заказов, взаимодействием с CRM и т.д.

2. Принципы выбора инструментов для бизнес-задач

Прежде чем приводить конкретный набор, важно понимать, как вообще принимать решение о том, какие инструменты дать агенту. Есть несколько ключевых принципов:

2.1 Single Responsibility Principle (SRP)

Каждая функция должна выполнять одно логическое действие. Если функция делает слишком много (например, process_order — и проверяет склад, и отправляет email, и создаёт тикет), LLM сложнее её применить. Лучше разбить на атомарные шаги:

  • check_stock
  • create_order
  • send_email

2.2 Принцип наименьшей привилегии

Агент не должен иметь доступ к избыточным операциям, особенно опасным. Например, функция delete_customer вряд ли нужна в агенте поддержки — достаточно deactivate_account.

2.3 Покрытие типовых сценариев (80/20)

80% запросов обрабатываются 20% инструментов. Нужно определить частые бизнес-задачи и обеспечить их минимальным набором. Редкие, сложные задачи лучше передавать человеку (human handoff).

2.4 Чёткий контракт и обработка ошибок

Каждый инструмент должен возвращать предсказуемый ответ. Агент должен уметь реагировать на ошибки (например, товара нет на складе — предложить альтернативу).


3. Кейс: агент поддержки интернет-магазина (ваш кейс)

Представим интернет-магазин с типовыми запросами: «Где мой заказ?», «Хочу вернуть товар», «Изменить адрес доставки», «Что-то не так с оплатой». Агент должен работать круглосуточно и решать до 70% вопросов без участия человека. Сценарий: клиент пишет в чат, LLM определяет интент и вызывает нужные функции.

Основные требования бизнеса

  • Быстрое получение статуса заказа.
  • Возможность уточнить адрес и время доставки.
  • Обработка возвратов (проверка срока, создание заявки).
  • Коммуникация с клиентом (отправка email с подтверждением).
  • Эскалация сложных случаев человеку.

4. Конкретный набор инструментов (таблица)

Ниже — расширенный перечень, который покрывает все основные сценарии. Каждый инструмент — это функция с конкретным назначением.

Инструмент (функция)Что делаетПример вызова LLMБезопасность / Ограничения
get_order_status(order_id)Получает статус заказа из БДget_order_status(order_id="ORD-12345")Только чтение; не даёт менять
change_delivery_address(order_id, new_address)Меняет адрес доставки (если заказ ещё не отправлен)change_delivery_address(order_id="ORD-12345", new_address="ул. Ленина, 10")Только для заказов в статусе «обработка»
check_stock(product_sku)Проверяет остаток товара на складеcheck_stock(product_sku="ABC-001")Только чтение; возвращает количество
create_refund_request(order_id, reason)Создаёт заявку на возврат в системеcreate_refund_request(order_id="ORD-12345", reason="не подошел размер")Возврат разрешён только для заказов младше 14 дней
send_email(to, subject, body)Отправляет email клиенту через SMTP-сервисsend_email(to="customer@example.com", subject="Ваш возврат принят", body="...")Ограничение: не более 5 писем в час на клиента
create_support_ticket(customer_id, issue_type, description)Создаёт тикет в CRM (например, AmoCRM) для эскалацииcreate_support_ticket(customer_id=1234, issue_type="problem_with_payment", description="...")Только на чтение и создание; без удаления тикетов
update_order_status(order_id, status)Меняет статус заказа (например, на «отменён»)update_order_status(order_id="ORD-12345", status="cancelled")Только для менеджеров; требует подтверждения
classify_intent(text)Классифицирует запрос клиента по категорииclassify_intent(text="Где мой заказ?")"order_status"Используется внутри; не показывается клиенту
get_delivery_schedule(zip_code)Возвращает доступные интервалы доставки для индексаget_delivery_schedule(zip_code="101000")Только чтение
resolve_with_human(customer_id, reason)Передаёт диалог оператору с контекстомresolve_with_human(customer_id=1234, reason="не могу отменить заказ")Триггерит создание задачи для человека

Почему именно такой набор Он покрывает 90% стандартных запросов: статус, изменение адреса, возврат, эскалация. При этом агент не может удалять клиентов менять цены или выполнять другие опасные действия.


5. Реализация инструментов: описание функций (JSON Schema)

Чтобы LLM могла корректно вызывать функции, каждый инструмент описывается в формате, поддерживаемом OpenAI Function Calling или Anthropic Tool Use. Ниже — пример описания одного из инструментов:

tools = [
    {
        "type": "function",
        "function": {
            "name": "get_order_status",
            "description": "Получить статус заказа по его номеру. Вызывать, когда клиент спрашивает 'где мой заказ' или просит проверить статус.",
            "parameters": {
                "type": "object",
                "properties": {
                    "order_id": {
                        "type": "string",
                        "description": "Номер заказа в формате ORD-XXXXX (например, ORD-12345)"
                    }
                },
                "required": ["order_id"],
                "additionalProperties": False
            }
        }
    },
    {
        "type": "function",
        "function": {
            "name": "create_refund_request",
            "description": "Создать заявку на возврат товара. Вызывать, только если клиент просит оформить возврат и товар соответствует условиям возврата (не прошло 14 дней с доставки).",
            "parameters": {
                "type": "object",
                "properties": {
                    "order_id": {"type": "string"},
                    "reason": {"type": "string", "description": "Причина возврата, указанная клиентом"}
                },
                "required": ["order_id", "reason"],
                "additionalProperties": False
            }
        }
    }
    # ... остальные инструменты
]

Важные детали

  • description — очень точное описание, чтобы LLM не путала, когда вызывать. Например, в get_order_status добавлено «когда клиент спрашивает 'где мой заказ'».
  • required — обязательные параметры.
  • additionalProperties: False — защита от лишних полей.

6. Обработка ошибок и безопасность

Даже если агент правильно выбирает инструмент, надо предусмотреть краевые случаи. Каждая функция должна возвращать структурированный ответ: {"success": True, "data": {...}} или {"success": False, "error": "reason"}. Внутри функции нужно:

  • Проверять права например, функция change_delivery_address должна проверять, что заказ ещё не отправлен. Если нет — возвращать ошибку.
  • Лимитировать количество вызовов агенту можно ограничить число вызовов дорогих API (например, send_email не может отправлять более 5 писем за диалог).
  • Хендлить исключения если внешний сервис недоступен, функция должна возвращать понятную ошибку, чтобы агент мог извиниться или предложить альтернативу.

Пример обработки в Python:

def get_order_status(order_id: str) -> dict:
    try:
        order = database.fetch_one("SELECT status FROM orders WHERE id=?", (order_id,))
        if order is None:
            return {"success": False, "error": "Заказ с таким номером не найден"}
        return {"success": True, "data": {"status": order["status"]}}
    except DatabaseError as e:
        return {"success": False, "error": "Техническая ошибка, попробуйте позже"}

В промпте агента нужно объяснить, как реагировать на ошибки: «Если функция вернула success: False и error — сообщи клиенту понятным языком и предложи альтернативу или передай оператору».


7. Человек в цикле (human-in-the-loop)

Некоторые действия должны требовать подтверждения человека. Например, change_delivery_address для дорогих заказов может отправлять уведомление менеджеру. Или create_refund_request для суммы > 10 000 руб. — создавать тикет в CRM без автоматического возврата.

Варианты реализации

  • Тихий эскалатор агент выполняет действие, но параллельно создаёт задачу для человека на проверку.
  • Жёсткий эскалатор функция возвращает {"success": False, "error": "Требуется подтверждение оператора"} и агент передаёт диалог человеку через resolve_with_human.

8. Мониторинг и логирование

Для каждого вызова инструмента нужно логировать:

  • время вызова, имя функции, входные параметры
  • успешность, ответ, latency
  • user id и session id

Это помогает выявлять аномалии (например, агент внезапно начал вызывать update_order_status без причины) и улучшать описание инструментов. Метрики: количество вызовов на сессию, доля успешных, среднее время ответа.


9. Пет-проект для закрепления

Задача разработать простого агента для автоматизации записи клиентов в салон красоты (Telegram-бот + AI).

Инструменты

  • get_available_slots(date, master) — свободные слоты
  • book_appointment(client_name, phone, slot_id) — бронирование
  • cancel_appointment(appointment_id) — отмена записи
  • send_sms(client_phone, message) — напоминание за 2 часа
  • get_client_history(phone) — история визитов
  • resolve_with_human — эскалация

Шаги:

  1. Настройте Telegram-бота с помощью python-telegram-bot.
  2. Используйте OpenAI API с function calling.
  3. Смоделируйте локальную БД (SQLite) с расписанием.
  4. Напишите 4-5 функций с JSON schema.
  5. Оберните в промпт системное сообщение: «Ты — агент салона красоты. Помогаешь клиентам записаться, отменить запись, получить информацию. Если не можешь — передай человеку».
  6. Протестируйте на сценариях: запись на завтра, отмена за час до, запрос на услуги, которых нет.

Ожидаемый результат Рабочий бот, который может обработать 5 типовых запросов. Вы увидите, как LLM выбирает инструменты, как реагировать на ошибки (нет свободных слотов), и сможете добавить логирование и эскалацию.


10. Связь с другими вопросами

ВопросТема
44Как спроектировать мультиагентную систему
45Выбор фреймворка для AI-агентов
47Оценка качества работы агента
50Безопасность и ограничения инструментов
52Паттерны построения цепочек вызовов
43Что такое AI-агент и его компоненты

11. Навигация


Навигация