3,583 papers
arXiv:2509.11626 77 15 сент. 2025 г. FREE

ACE Framework: как правильно описывать инструменты для LLM-агентов

КЛЮЧЕВАЯ СУТЬ
LLM-агенты в каждом четвёртом случае неправильно формируют вызов API-инструментов. Видят параметр dryRun — не понимают что туда писать. Встречают вложенную схему — путаются в структуре. ACE Framework решает проблему через обогащение метаданных — автоматически добавляет к техническим описаниям API понятные расшифровки параметров и примеры реальных значений. Примеры работают как few-shot демонстрация: модель видит dryRun: 'All' в примере и копирует формат вместо того чтобы гадать. Результат: ошибки вызова API сокращаются на 25%.
Адаптировать под запрос

TL;DR

ACE (Automated Creation and Enrichment) — фреймворк для превращения корпоративных API в понятные инструменты для LLM-агентов. Система автоматически обогащает техническую документацию: генерирует человекопонятные описания методов, расшифровывает параметры, добавляет примеры значений. Плюс динамически отбирает топ-k релевантных инструментов из большого каталога через семантический поиск.

Главная находка: LLM в 25% случаев неправильно формирует входные данные для вызова API-инструментов. Причины — скудные описания, непонятные названия параметров, отсутствие примеров. Модель видит dryRun и не понимает что это значит и какие значения допустимы. Или встречает вложенную JSON-схему и путается в структуре. Без контекста LLM додумывает и ошибается.

Суть решения: Обогащённые метаданные — детальное описание каждого параметра плюс примеры реальных значений. Примеры работают как few-shot демонстрация — LLM видит dryRun: 'All' в примере и понимает формат. Для сложных схем — упрощённые представления структуры. Результат: точность формирования входных данных растёт на четверть.

📌

Схема работы

Фреймворк состоит из трёх компонентов:

ОБОГАЩЕНИЕ (выполняется один раз):

1. Парсинг OpenAPI спецификации
2. Генерация описаний методов (из HTTP method, operation ID, параметров)
3. Генерация описаний параметров (из названий, типов, constraints)
4. Генерация примеров параметров (валидные значения для few-shot)

СОЗДАНИЕ ИНСТРУМЕНТОВ (выполняется один раз):

1. Создание Python-функции с декоратором @tool
2. Добавление обогащённого docstring
3. Формирование HTTP-запроса из аргументов

SHORTLISTING (при каждом запросе):

1. Эмбеддинг запроса пользователя
2. Эмбеддинги описаний всех инструментов
3. Semantic search → top-k похожих
4. Загрузка только отобранных инструментов в агента
🚀

Пример применения принципа

Задача: Настроить бота-помощника для HR-отдела, который помогает сотрудникам выбрать нужную процедуру.

Промпт без обогащения:

Выбери подходящую процедуру:

1. Оформление отпуска
2. Больничный лист
3. Согласование командировки

Моя ситуация: Еду на конференцию в Питер на 3 дня

Промпт с обогащением (по принципам ACE):

Выбери подходящую процедуру и заполни нужные поля:

**Процедура 1: Оформление отпуска**
Назначение: Ежегодный, учебный или отпуск за свой счёт
Входные данные:
- ФИО сотрудника (строка)
- Даты начала и конца (формат ДД.ММ.ГГГГ)
- Тип отпуска (ежегодный/учебный/за свой счёт)
Пример: "Петров Иван Сергеевич, 01.06.2026-14.06.2026, ежегодный"
Результат: Заявка в 1С, автоматическое уведомление руководителю

**Процедура 2: Оформление больничного**
Назначение: Регистрация листка нетрудоспособности
Входные данные:
- ФИО сотрудника (строка)
- Номер больничного листа (12-значный)
- Даты болезни (формат ДД.ММ.ГГГГ)
Пример: "Сидорова Мария, 123456789012, 15.01.2026-20.01.2026"
Результат: Начисление по больничному в следующей зарплате

**Процедура 3: Согласование командировки**
Назначение: Служебная поездка в другой город с оплатой расходов
Входные данные:
- ФИО сотрудника (строка)
- Город назначения (строка)
- Даты (формат ДД.ММ.ГГГГ)
- Цель поездки (совещание/конференция/переговоры/обучение)
- Бюджет на транспорт (число в рублях)
- Бюджет на проживание (число в рублях, если >1 дня)
Пример: "Козлов Дмитрий, Санкт-Петербург, 10.02.2026-12.02.2026, 
конференция, 15000, 8000"
Результат: Цепочка согласований (руководитель → бухгалтерия), 
бронь билетов и гостиницы через корпоративный сервис

---

Моя ситуация: Еду на конференцию в Питер на 3 дня

Результат:

С базовым описанием LLM может выбрать процедуру правильно, но не поймёт какие поля заполнять и в каком формате. С обогащённым описанием LLM:

  1. Точно выберет Процедуру 3
  2. Сформирует корректный запрос с нужными полями
  3. Использует правильный формат дат
  4. Укажет правильный тип цели ("конференция")
  5. Запросит недостающие данные (бюджеты) вместо того чтобы их выдумать
🧠

Почему это работает

Слабость LLM: Модель плохо работает с недоопределёнными структурами. Видит название параметра propagationPolicy — не понимает что туда писать. Встречает вложенную схему — путается в уровнях вложенности. Додумывает, ошибается.

Сильная сторона LLM: Модель отлично работает с примерами (few-shot learning). Показал один пример — схватила паттерн. Для формирования структурированных данных примеры работают как шаблон.

Механика метода:

  • Описания снимают неоднозначность — модель понимает ЧТО делает параметр
  • Constraints (допустимые значения) — модель видит границы
  • Примеры — модель копирует формат и подставляет свои значения

Рычаги управления:

  • Уровень детализации описаний — для простых задач достаточно краткого, для сложных нужно подробное
  • Количество примеров — один пример для базового случая, несколько для разных сценариев
  • Баланс краткость/детальность — краткое описание для выбора инструмента, детальное для корректного вызова
📌

Шаблон для описания набора опций/процедур

Выбери подходящую {действие/процедуру/опцию} и заполни нужные поля:

**{Название 1}**
Назначение: {Когда использовать, одним предложением}
Входные данные:
- {параметр_1} ({тип данных}, {constraint если есть})
- {параметр_2} ({тип данных}, {constraint если есть})
Пример: "{значение_1}, {значение_2}"
Результат: {Что получит пользователь}

**{Название 2}**
Назначение: {Когда использовать}
Входные данные:
- {параметр_1} ({тип}, {constraint})
- {параметр_2} ({тип}, {constraint})
Пример: "{значение_1}, {значение_2}"
Результат: {Что получит}

---

Моя ситуация: {описание задачи пользователя}

Что подставлять:

  • {действие} — что выбираем: процедуру, сервис, тип анализа
  • {Название} — понятное название опции
  • {Назначение} — когда эту опцию использовать
  • {параметр} — какие данные нужны
  • {тип} — строка, число, дата, список
  • {constraint} — ограничения: формат, допустимые значения, диапазон
  • {Пример} — реальные значения для корректного заполнения
  • {Результат} — что произойдёт после выбора

🚀 Быстрый старт — вставь в чат:

Помоги настроить описания для бота. У меня есть {количество} 
процедур/опций/действий: {перечисли их}. 

Создай для каждой структурированное описание по этому шаблону:

[вставить шаблон выше]

LLM спросит про входные параметры, примеры значений, ограничения и результаты — потому что это критично для корректной работы выбора и заполнения. Она возьмёт паттерн из шаблона и адаптирует под твои процедуры.

⚠️

Ограничения

⚠️ Эффект зависит от размера модели: Маленькие модели (8B параметров) путаются при избыточной детализации — слишком много текста сбивает с толку. Средние (70B) показывают наилучший результат с полным обогащением. Большие (405B) иногда чрезмерно обобщают — видят пример с числом, но всё равно форматируют как строку.

⚠️ Не для всех задач: Обогащение помогает когда нужно выбрать из списка и заполнить структуру. Для свободного диалога или креатива избыточная структуризация ограничивает.

⚠️ Trade-off длина промпта: Детальные описания съедают токены. Для большого набора опций (50+) нужен механизм фильтрации — иначе не влезет в контекст.

🔍

Как исследовали

Команда взяла два корпоративных API: Salesloft (42 метода, маркетинг и продажи) и Kubernetes (86 методов, управление контейнерами). Для каждого API сгенерировали реалистичные пользовательские запросы — всего около 300 задач.

Создали четыре варианта документации:

  1. No Enrich — оригинал как есть
  2. Enrich-1 — только описание метода
  3. Enrich-2 — описание метода + описания параметров
  4. Enrich-3 — всё из Enrich-2 + примеры параметров

Прогнали через три модели разного размера: Granite-8B (маленькая), Llama-70B (средняя), Llama-405B (большая). Измеряли:

  • Выбрал ли агент правильный инструмент (selection accuracy)
  • Сколько ошибок в параметрах — неправильный тип, пропущенные или выдуманные поля

Неожиданный результат: Большая модель (405B) НЕ всегда лучше с обогащённой документацией. Она начинает упрощать все типы до строк — видит {"count": 5} в примере, но генерирует {"count": "5"} как строку. Средняя модель (70B) показала наилучший баланс — использует детали правильно.

Второе открытие: Для shortlisting (выбор топ-k инструментов) обогащение критично при малых k. При топ-3 точность выросла на 10% по сравнению с базовым описанием. При топ-20 разница исчезла — релевантные инструменты попадают в выборку и так.

Практический инсайт: Если у тебя большой набор опций (20+), начни с краткого обогащения для фильтрации, затем дай детальное только для финалистов. Это экономит токены и улучшает точность.

Также протестировали на реальном продукте — IBM Watsonx Orchestrate. 46 инструментов, 600 запросов. Обогащение подняло точность вызова на 27% по сравнению с минимальной документацией и сравнялось с ручной разметкой разработчиков.

🔗

Ресурсы

Automated Creation and Enrichment Framework for Improved Invocation of Enterprise APIs as Tools

Авторы: Prerna Agarwal, Himanshu Gupta, Soujanya Soni, Rohith Vallam, Renuka Sindhgatta, Sameep Mehta

Организация: IBM Research, India


📋 Дайджест исследования

Ключевая суть

LLM-агенты в каждом четвёртом случае неправильно формируют вызов API-инструментов. Видят параметр dryRun — не понимают что туда писать. Встречают вложенную схему — путаются в структуре. ACE Framework решает проблему через обогащение метаданных — автоматически добавляет к техническим описаниям API понятные расшифровки параметров и примеры реальных значений. Примеры работают как few-shot демонстрация: модель видит dryRun: 'All' в примере и копирует формат вместо того чтобы гадать. Результат: ошибки вызова API сокращаются на 25%.

Принцип работы

Слабость LLM — структуры без примеров и описаний. Видит название параметра без контекста — додумывает и ошибается. Сильная сторона — few-shot learning (обучение на примерах). Обогащение заполняет пробелы: описания снимают неоднозначность, ограничения показывают границы, примеры дают шаблон. Модель перестаёт гадать и начинает копировать проверенный паттерн.

Почему работает

Механика простая: few-shot learning через примеры значений. Модель видит "Козлов Дмитрий, Санкт-Петербург, 10.02.2026-12.02.2026, конференция, 15000, 8000" — схватывает формат даты, порядок полей, тип значений. Один пример заменяет страницу технической документации — вместо чтения про формат ISO 8601 модель просто копирует ДД.ММ.ГГГГ. Результат особенно заметен для средних моделей (70B параметров) — они лучше всех работают с полным обогащением. Маленькие модели (8B) путаются в избыточных деталях, большие (405B) иногда чрезмерно обобщают.

Когда применять

Корпоративные чат-боты с интеграциями → конкретно для задач где LLM нужно выбрать правильный API-метод и заполнить структуру вызова, особенно когда API имеет 10+ методов с похожими названиями или сложные вложенные параметры. НЕ подходит для свободного диалога или креативных задач — избыточная структуризация ограничивает. Для больших каталогов (50+ инструментов) нужен механизм фильтрации — иначе описания не влезут в контекст.

Мини-рецепт

1. Для каждого параметра добавь: понятное описание (что делает), тип данных (строка/число/дата), ограничения (формат, допустимые значения, диапазон)
2. Создай пример вызова: реальные значения для всех обязательных параметров — модель скопирует формат и подставит свои данные
3. Опционально — семантический поиск: если инструментов 50+, создай эмбеддинги описаний и отбирай top-5 релевантных для каждого запроса пользователя

Примеры

[ПЛОХО] : Выбери процедуру: 1) Отпуск 2) Больничный 3) Командировка. Моя ситуация: еду на конференцию в Питер на 3 дня
[ХОРОШО] : Процедура 3: Согласование командировки Назначение: Служебная поездка с оплатой расходов Входные данные: - ФИО сотрудника (строка) - Город назначения (строка) - Даты (формат ДД.ММ.ГГГГ) - Цель поездки (совещание/конференция/переговоры/обучение) - Бюджет на транспорт (число в рублях) - Бюджет на проживание (число в рублях, если >1 дня) Пример: "Козлов Дмитрий, Санкт-Петербург, 10.02.2026-12.02.2026, конференция, 15000, 8000" Результат: Цепочка согласований (руководитель → бухгалтерия), бронь билетов через корпоративный сервис Моя ситуация: еду на конференцию в Питер на 3 дня
Источник: Automated Creation and Enrichment Framework for Improved Invocation of Enterprise APIs as Tools
ArXiv ID: 2509.11626 | Сгенерировано: 2026-01-12 02:26

Работа с исследованием

Адаптируйте исследование под ваши задачи или создайте готовый промпт на основе техник из исследования.

0 / 2000
~0.5-2 N-токенов ~10-30с
~0.3-1 N-токенов ~5-15с