Какие инструменты (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_stockcreate_ordersend_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. Мониторинг и логирование
Для каждого вызова инструмента нужно логировать:
Это помогает выявлять аномалии (например, агент внезапно начал вызывать 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— эскалация
Шаги:
- Настройте Telegram-бота с помощью python-telegram-bot.
- Используйте OpenAI API с function calling.
- Смоделируйте локальную БД (SQLite) с расписанием.
- Напишите 4-5 функций с JSON schema.
- Оберните в промпт системное сообщение: «Ты — агент салона красоты. Помогаешь клиентам записаться, отменить запись, получить информацию. Если не можешь — передай человеку».
- Протестируйте на сценариях: запись на завтра, отмена за час до, запрос на услуги, которых нет.
Ожидаемый результат Рабочий бот, который может обработать 5 типовых запросов. Вы увидите, как LLM выбирает инструменты, как реагировать на ошибки (нет свободных слотов), и сможете добавить логирование и эскалацию.
10. Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 44 | Как спроектировать мультиагентную систему |
| 45 | Выбор фреймворка для AI-агентов |
| 47 | Оценка качества работы агента |
| 50 | Безопасность и ограничения инструментов |
| 52 | Паттерны построения цепочек вызовов |
| 43 | Что такое AI-агент и его компоненты |
11. Навигация
- Предыдущий: 45
- Следующий: 47
- Индекс: 00. Индекс разборов
Навигация
- Предыдущий: 45
- Следующий: 47
- Индекс: 00. Индекс разборов