3,583 papers
arXiv:2610.15765 70 11 окт. 2026 г. FREE

ANIS и три свойства «агентного» интерфейса: как устроить инструменты так, чтобы агент не тонул в низкоуровневых вызовах

КЛЮЧЕВАЯ СУТЬ
33 хода и 662 тысячи токенов ушло на сборку карты из мелких вызовов, и агент провалился. С одной готовой операцией «разбей на интервалы» он справился за 11 ходов и 36 тысяч токенов. Метод ANIS позволяет перестроить набор инструментов так, чтобы агент реже тонул в мелких вызовах и не врал про «готово». Авторы взяли QGIS, Blender, Inkscape, FreeCAD, Writer и Impress и дали агенту одинаковые задачи. Нашлись три поломки. Агент долго ищет нужную команду: на это уходит от четверти до трети входных токенов. Он собирает цель из десятков мелких вызовов, и каждый вызов может сломаться. А ещё он не умеет читать результат: в 581 запуске он написал «готово», а файл не прошёл проверку. Причина простая. У многих операций «записать» нет парной операции «прочитать». ANIS чинит это кодом: описывает команды одинаково, группирует по объектам, к каждой записи добавляет чтение и упаковывает повторяющиеся цепочки в целевые команды. Для обычного пользователя вывод такой: три принципа можно перенести в инструкцию агенту. Но это ваша экстраполяция, авторы такой перенос не проверяли.
Адаптировать под запрос
⚡

TL;DR

Исследование показывает, что успех агента зависит не только от модели, но и от интерфейса, через который он работает с программой. Авторы взяли разные релизы одних и тех же приложений (QGIS, Blender, Inkscape, FreeCAD, Writer, Impress) и дали агенту одинаковые задачи. Новые версии стабильно побеждали старые: в QGIS успех вырос с 33% до 65%. Затем авторы собрали ANIS, генератор интерфейса из атомарных команд (маленьких операций с единым описанием) и целевых команд (готовых цепочек под типовую цель).

Главная находка: агент ломается на трёх вещах. Первое: он не может быстро найти, что программа умеет, и тратит на поиск от четверти до трети входных токенов. Второе: ему приходится собирать цель из десятков мелких вызовов, и каждый вызов — ещё одна точка отказа. В одном примере агент 33 хода и 662 тысячи токенов пытался собрать карту из низкоуровневых вызовов и провалился. С готовой операцией «разбей на интервалы» он справился за 11 ходов и 36 тысяч токенов. Третье: агент не может проверить результат. В 581 запуске он доложил «готово», а файл не прошёл проверку. Причина в том, что у многих операций «записать» нет парной операции «прочитать».

Суть метода: ANIS один раз превращает возможности программы в атомарные команды с одинаковым описанием, сгруппированные по объектам. К каждой записи он добавляет команду чтения. Потом повторяющиеся цепочки команд упаковываются в целевые команды. Команда выпускается, только если её повтор на чистом файле даёт то же сохранённое состояние. Для вас практический вынос — три принципа для описаний инструментов и правил агенту: находимость, крупные операции под цель, обязательное чтение результата.

🔬

Схема метода

СБОРКА ИНТЕРФЕЙСА (один раз, код):
ШАГ 1: Найти в запущенном приложении все операции и свойства → широкий список-кандидат (с запасом)
ШАГ 2: Оставить только те, чей эффект можно проверить → допущенные возможности
ШАГ 3: Превратить каждую в атомарную команду → единое описание + реализация + наблюдаемый эффект
        • сгруппировать по объектам (документ, слайд, слой…)
        • сначала короткая сводка, полное описание — по запросу
        • к каждому записываемому свойству — команда чтения

РАБОТА (по ходу использования):
ШАГ 4: Заметить повторяющиеся цепочки атомарных команд → кандидат в целевую команду
ШАГ 5: Проверить: повтор цепочки на свежем файле даёт то же сохранённое состояние? → да: выпустить команду

Это не один промпт. Метод реализуется кодом. Сами три свойства (находимость, укрупнение, читаемость результата) переносятся в инструкции агенту.

🚀

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

Задача: Вы продакт в e-commerce на Wildberries и Ozon. Агент в Claude Code каждое утро собирает отчёт по карточкам товаров через API кабинета. Агент работает через сырой API: десятки мелких методов, сам разбирается, какие вызывать. Он то зацикливается на поиске нужного метода, то пишет «обновил цены на 40 карточек», а в кабинете обновились 28. Нужно поправить это через AGENTS.md.

Промпт (фрагмент файла инструкций агента):

## Правила работы с API кабинета маркетплейса

### 1. Находимость
- Перед первым действием прочитай файл tools/INDEX.md: там список команд, сгруппированных по объектам (карточка, цена, остаток, отзыв), по одной строке на команду.
- Полное описание команды открывай только когда выбрал её.
- Не угадывай названия методов. Нет подходящей команды в индексе — остановись и спроси меня.

### 2. Укрупнение
- Если в tools/GOALS.md есть команда под мою цель (например, "обновить цены по списку"), используй её вместо ручной цепочки из мелких вызовов.
- Если одна и та же цепочка из 3+ вызовов повторилась дважды, предложи мне оформить её как новую команду в GOALS.md. Не добавляй её сам.

### 3. Читаемость результата
- После каждого изменения (цена, остаток, описание) вызови парную команду чтения и сравни фактическое значение с ожидаемым.
- Если парной команды чтения нет, прямо напиши: "Результат проверить не могу: нет команды чтения для X".
- В отчёте разделяй: "Выполнено и проверено чтением", "Выполнено, не проверено", "Не выполнено".
- Слово "готово" допустимо только для первого пункта.

Результат: Агент перестанет перебирать методы наугад и будет открывать описание только выбранной команды. На типовые цели он станет использовать готовые составные команды. В отчёте появятся три раздела, и непроверенные изменения не будут выдаваться за выполненные. Если для какой-то операции нет чтения, агент так и скажет, и вы увидите дыру в инструментах.

🧠

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

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

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

Как метод это использует: три свойства снимают три источника ошибок. Находимость сокращает поиск: сводка сначала, детали потом. Укрупнение сокращает цепочку, а значит и число мест, где можно ошибиться. Читаемость результата заменяет «мне кажется, получилось» сверкой фактического состояния.

Рычаги управления: - Порог укрупнения («3+ вызова, повтор дважды») → снизь, чтобы чаще получать готовые команды. Подними, чтобы не плодить лишнее. - Строгость слова «готово» → оставь жёсткое разделение «проверено / не проверено» для денег и данных. Для черновых задач ослабь. - Допуск новой команды → в оригинале команда выпускается только после воспроизведения на чистом файле. Вы можете требовать такой прогон вручную или в отдельном тестовом запуске. - Размер индекса → одна строка на команду. Чем длиннее строки, тем больше токенов уходит на старте.

📋

Шаблон промпта

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

## Правила работы с инструментом {название_инструмента}

### 1. Находимость
- Начни с файла {путь_к_индексу}: список команд по объектам, по одной строке на команду.
- Полное описание открывай только у выбранной команды.
- Не угадывай команды. Если нужной нет — остановись и спроси.

### 2. Укрупнение
- Для цели из {файл_готовых_команд} используй готовую команду, а не цепочку мелких.
- Если цепочка из {N}+ вызовов повторилась {M} раза, предложи оформить её как команду. Сам не добавляй.

### 3. Читаемость результата
- После каждого изменения вызови команду чтения и сравни факт с ожидаемым.
- Нет команды чтения — напиши: "Проверить не могу: нет чтения для {объект}".
- В итоге раздели: "Выполнено и проверено" / "Выполнено, не проверено" / "Не выполнено".
- "Готово" — только для первого раздела.

### Контекст задачи
{описание_задачи}

Что подставлять: {название_инструмента} — API, CRM, программа или скрипты. {путь_к_индексу} — файл со списком команд. {файл_готовых_команд} — ваши заготовки под типовые цели. {N} и {M} — пороги укрупнения, например 3 и 2.

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

Вот шаблон правил для агента, работающего с инструментом. Адаптируй под мою задачу: [твоя задача и инструмент].
Задавай вопросы, чтобы заполнить поля.

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

LLM спросит, с каким инструментом ты работаешь, какие у него есть операции записи и чтения, какие цели повторяются чаще всего, что считается «проверенным». Это нужно, чтобы подобрать парные команды «записать / прочитать» и выделить цепочки, которые стоит укрупнить. Затем она возьмёт паттерн из шаблона и соберёт правила под твой инструмент.

⚠️

Ограничения

⚠️ Основной метод требует кода: ANIS генерирует интерфейс программно, читатель без разработки его не воспроизведёт. Из статьи в чате или AGENTS.md переносятся принципы, а не сама система.

⚠️ Перенос на инструкции не проверялся: авторы не тестировали, повышает ли успех правило «читай результат после записи» в промпте. Это экстраполяция принципов, а не измеренный приём.

⚠️ Эффект атомарного интерфейса скромный: по сравнению с прямым использованием SDK прирост составил около 3–4 процентных пункта. Основная экономия — токены. Главное улучшение дают целевые команды, но и оно умеренное.

⚠️ Проверка чтением не гарантирует результат: почти у трёх четвертей «ложных готово» агент всё же что-то проверял, но артефакт не прошёл верификацию. Чтение состояния помогает, но не заменяет внешнюю проверку.

⚠️ Узкий домен проверки: задачи шли на десктопных приложениях через программный интерфейс. Облачные сервисы, веб и чисто текстовые задачи не тестировались.

⚠️ Документация не спасает: по ссылке авторов на приложение, просто приложить документацию не помогает. Для агента важна структура и находимость, а не объём текста.

⚠️ Модели небольшие: тестировали Claude Haiku 4.5 и DeepSeek V4 Flash. Как ведут себя крупные модели, статья не показывает.

🔍

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

Идея была простой: эволюция программ — готовый естественный эксперимент. Из версии в версию функции приложения остаются теми же, а интерфейс меняется под давлением реальных пользователей. Если зафиксировать агента, задачи и проверку, а менять только релиз, можно приписать разницу в результатах изменениям интерфейса. Так появился DeskIF-Bench: 255 задач на шести приложениях из пяти областей (офис, 2D, 3D, ГИС, САПР). Затем его расширили до 368 задач на восьми приложениях. Задачи проверялись скриптами по сохранённому файлу, не LLM-судьёй: проверки детерминированы и воспроизводимы. Часть задач взяли из OSWorld и OpenComputer, остальные синтезировал агент-автор, у которого были «привилегии»: навыки и библиотеки, недоступные решающему агенту. Так задачи оказались сложнее самого решателя.

Результат: новейший релиз выиграл у старейшего во всех 12 парах «модель × приложение», но разброс большой: до ~30 пунктов в QGIS, ~19 в Impress. Разбор траекторий показал причины: сравнение версий выявило находимость и укрупнение, а в аудите ошибок обнаружилась читаемость результата. Эту проблему ни одна версия не решила: операции записи без парного чтения остались во всех релизах. Агенты тратили 24–36% входных токенов на поиск возможностей. Затем на расширенном бенчмарке атомарный интерфейс ANIS дал 72,3% против 68,5% у прямого SDK и 17,4% у CLI-Anything. Целевые команды подняли результат до 74,5% и 67,4% для двух моделей.

Удивило, что «готовый для людей» интерфейс сам по себе помогает агенту: ПО улучшается и для ИИ, хотя его так не проектировали. Для практики вытекает: когда агент буксует, смотри не на модель, а на то, что ему дали в руки.

💡

Адаптации и экстраполяции

🔧 Техника: добавить «аудит дыр» → увидеть, где агент слеп

Попроси агента не выполнять задачу, а пройтись по инструментам и составить таблицу:

Не выполняй задачу. Пройдись по доступным инструментам и составь таблицу:
операция записи | есть ли парная операция чтения | как проверить результат без неё.
В конце перечисли 3 самые опасные "слепые" операции.

Это превращает принцип «читаемость результата» в диагностику. Ты увидишь, какие действия агент выполняет без возможности проверки, и решишь, где ему нужен внешний контроль или ручная проверка. Идея основана на наблюдении авторов о записях без чтения. Сам приём в статье не проверялся.

Экстраполяция: отчёт-расписка в конце работы агента

Закончив работу, выдай расписку по каждому изменению:
- что менял
- ожидаемое значение
- фактическое значение после чтения
- вердикт: совпало / не совпало / не проверено
Если хоть одно "не совпало" или "не проверено" — не пиши "готово".

Это переносит идею «наблюдаемого эффекта» в формат отчёта, который можно быстро просмотреть глазами.

🔗

Ресурсы

  • A Decade in a Day: Synthesizing Agent-Native Interfaces from Human-Oriented Software Evolution — Alan Wu (Independent Researcher; работа выполнена во время стажировки в LIGHTSPEED), Wei Tao (LIGHTSPEED), Yiwen Guo (Independent Researcher), 2026.
  • Код: github.com/co-evolve-lab/ANIS
  • Данные: huggingface.co/datasets/SimAlan/DeskIF-Bench
  • Связанные работы из статьи: OSWorld, Windows Agent Arena, OpenCode, Model Context Protocol (MCP), CLI-Anything.

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

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

33 хода и 662 тысячи токенов ушло на сборку карты из мелких вызовов, и агент провалился. С одной готовой операцией «разбей на интервалы» он справился за 11 ходов и 36 тысяч токенов. Метод ANIS позволяет перестроить набор инструментов так, чтобы агент реже тонул в мелких вызовах и не врал про «готово». Авторы взяли QGIS, Blender, Inkscape, FreeCAD, Writer и Impress и дали агенту одинаковые задачи. Нашлись три поломки. Агент долго ищет нужную команду: на это уходит от четверти до трети входных токенов. Он собирает цель из десятков мелких вызовов, и каждый вызов может сломаться. А ещё он не умеет читать результат: в 581 запуске он написал «готово», а файл не прошёл проверку. Причина простая. У многих операций «записать» нет парной операции «прочитать». ANIS чинит это кодом: описывает команды одинаково, группирует по объектам, к каждой записи добавляет чтение и упаковывает повторяющиеся цепочки в целевые команды. Для обычного пользователя вывод такой: три принципа можно перенести в инструкцию агенту. Но это ваша экстраполяция, авторы такой перенос не проверяли.

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

Принцип из трёх частей. Находимость: короткий индекс команд по объектам, полное описание только у выбранной. Укрупнение: на типовую цель есть готовая команда, а не цепочка из тридцати вызовов. Читаемость результата: после каждой записи агент читает значение и сверяет с ожидаемым. Это как работа строителя: сначала смотрит в каталог, берёт готовый блок, а потом проверяет уровень. «Готово» можно говорить только после сверки факта с ожиданием, а не после вызова без ошибки. Ещё одна деталь из ANIS: новая целевая команда выходит в работу, только если её повтор на чистом файле даёт то же сохранённое состояние. Без такого прогона укрупнение превращается в склад непроверенных макросов.

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

У агента нет глаз, он не видит программу. Что она умеет, он узнаёт только вопросом или пробой. Каждая проба стоит ходов и токенов. Длинная цепочка мелких вызовов множит риск: один неверный параметр ломает всё, а размытое описание мешает заметить ошибку. Плюс модель считает работу сделанной, если вызов не вернул ошибку. Зато из короткого списка с понятными описаниями она выбирает хорошо. Чёткий порядок действий тоже выполняет. Одна операция под цель вместо цепочки из тридцати убирает почти все места, где можно ошибиться. Сводка сначала, детали потом режет расходы на поиск. Чтение после записи заменяет «кажется, получилось» сверкой фактов. Честные цифры: в QGIS успех вырос с 33% до 65% между релизами, но сам атомарный интерфейс против прямого SDK дал лишь около 3–4 процентных пункта. Основная экономия идёт на токенах. Даже при проверке чтением почти три четверти «ложных готово» всё равно прошли мимо внешней верификации.

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

Агентные сценарии с набором инструментов: программный интерфейс (API) кабинета, CRM, скрипты, десктопное приложение. Особенно когда агент зацикливается на поиске метода или пишет «обновил 40», а обновилось 28. Принципы переносятся в AGENTS.md или системную инструкцию. Сам ANIS требует кода, из чата его не воспроизвести. НЕ подходит как гарантия качества: перенос правил в промпт авторы не измеряли, проверка чтением не заменяет внешний контроль. Тестировали только десктопные приложения и две небольшие модели (Claude Haiku 4.5 и DeepSeek V4 Flash). Для облачных сервисов, веба и чисто текстовых задач данных нет.

Мини-рецепт

1. Заведи индекс: файл со списком команд по объектам (карточка, цена, остаток), одна строка на команду. Длинные строки сжирают токены на старте.
2. Спрячь детали: полное описание открывается, только когда команда выбрана.
3. Запрети гадать: нет подходящей команды в индексе, агент останавливается и спрашивает.
4. Собери готовые цели: отдельный файл с командами под типовые задачи вроде «обновить цены по списку».
5. Лови повторы: цепочка из 3+ вызовов повторилась дважды, агент предлагает оформить её командой. Сам не добавляет.
6. Проверь новую команду: прогони её на чистых данных и сравни итоговое состояние, как в оригинале.
7. Парное чтение: после каждой записи агент читает значение и сверяет с ожидаемым.
8. Разведи отчёт: «Выполнено и проверено», «Выполнено, не проверено», «Не выполнено». Слово «готово» только для первого пункта.
9. Смотри на дыры: если агент пишет «проверить не могу: нет чтения для X», значит дыра в ваших инструментах, а не в модели.

Примеры

[ПЛОХО] : Обнови цены на 40 карточек через API кабинета и скажи, когда готово
[ХОРОШО] : Правила работы с API кабинета. 1) Начни с tools/INDEX.md: команды по объектам, по одной строке. Полное описание открывай только у выбранной команды. Не угадывай методы: нет нужной команды, остановись и спроси. 2) Если в tools/GOALS.md есть команда под цель, например обновление цен по списку, используй её вместо цепочки мелких вызовов. Цепочка из 3+ вызовов повторилась дважды: предложи оформить её командой, сам не добавляй. 3) После каждого изменения вызови команду чтения и сравни факт с ожиданием. Нет команды чтения, напиши: проверить не могу, нет чтения для X. В отчёте раздели: выполнено и проверено, выполнено но не проверено, не выполнено. Слово готово только для первого раздела. Задача: обнови цены на 40 карточек по списку. Первый промпт даёт отчёт «обновил 40», когда в кабинете изменились 28. Второй заставляет агента перечитать цены и честно написать, что реально поменялось.
Источник: A Decade in a Day: Synthesizing Agent-Native Interfaces from Human-Oriented Software Evolution
ArXiv ID: 2610.15765 | Сгенерировано: 2026-10-14 06:10

Проблемы LLM

ПроблемаСутьКак обойти
Агент пишет «готово», хотя результат неверныйАгент вызвал инструмент. Ошибки нет. Он считает работу сделанной. Но значение записалось не то или не везде. Например, сказал «обновил 40 карточек», а обновились 28. Так бывает, когда у операции «записать» нет парной операции «прочитать». Агенту нечем сверить факт с ожиданиемТребуй чтение после каждой записи. Пиши в инструкции: «После изменения вызови команду чтения и сравни с ожидаемым». Нет команды чтения? Пусть агент так и скажет: «Проверить не могу». Раздели итог на три части: «выполнено и проверено», «выполнено, не проверено», «не выполнено». Слово «готово» разрешай только для первой части. Это не заменяет внешнюю проверку, но снижает ложные отчёты

Методы

МетодСуть
Крупные операции под типовую цель — меньше шагов, меньше ошибокЕсли цель повторяется, не заставляй агента собирать её из десятков мелких вызовов. Оформи готовую команду: «разбей на интервалы», «обнови цены по списку». Дай агенту правило: «Есть готовая команда под цель — используй её». Добавь: «Цепочка из 3+ вызовов повторилась дважды — предложи оформить как команду. Сам не добавляй». Почему работает: каждый вызов — точка отказа. Ошибка в одном параметре ломает всю цепочку. Длинная цепочка ещё и сжигает ходы и токены. Модель хорошо применяет одну понятную операцию. Выпускай новую команду только после проверки: повтор на чистых данных даёт тот же результат. Когда да: задачи повторяются, инструментов много и они мелкие. Когда нет: разовая нестандартная задача
Индекс команд: короткая сводка сначала, детали потомДай агенту файл со списком команд. Одна строка на команду. Сгруппируй по объектам: карточка, цена, остаток. В инструкции напиши: «Сначала читай индекс. Полное описание открывай только у выбранной команды. Не угадывай названия. Нет нужной команды — спроси». Почему работает: модель хорошо выбирает из короткого списка с ясными описаниями. Не тратит токены на поиск и перебор. Без индекса на поиск может уходить четверть входных токенов и больше. Следи за длиной строк: чем они длиннее, тем дороже старт
📖 Простыми словами

A Decade in a Day: SynthesizingAgent-Native Interfaces from Human-Oriented Software Evolution

arXiv: 2610.15765

Когда твой AI-агент косячит, дело почти никогда не в тупости модели — виноват человеческий интерфейс, где бот тыкается вслепую. Он не видит экран, жжёт токены и выдаёт полный провал на ровном месте. Если API перегружен рудиментами для людей, любая LLM превращается в глухого оператора, который бодро рапортует об успехе, хотя всё сломал к чертям.

Это как заставить механика перебирать мотор через замочную скважину пинцетом. Вместо нормального инструмента ты выдаёшь ему микро-детали поштучно, требуя абсолютной ювелирной точности. В итоге агент делает двадцать мелких шагов, неизбежно лажает на тринадцатом, но всё равно закрывает тикет с отчётом, что всё чисто. Для нейросети длинная цепочка микро-действий — это гарантированная катастрофа.

Исследователи доказали это на железных фактах: они скормили агентам разные версии программ, и в обновлённом QGIS результативность подскочила с 33% до 65% без единого изменения в самой LLM. Решение упаковали в систему ANIS, которая собирает софт под роботов. Она оставляет строгие атомарные команды без лишней шелухи и склеивает типовую рутину в целевые команды — один понятный вызов под задачу вместо кучи хаотичных тычков.

Тестировали на софте вроде Blender и FreeCAD, но принцип универсален. Твой агент для Wildberries или Ozon тупит не от скудоумия, а потому что тонет в сыром API маркетплейса. Стоит упаковать разрозненные запросы в понятную структуру через AGENTS.md, и бот перестанет зависать в бесконечных циклах, начав стабильно обновлять 40 карточек из 40.

Короче: хватит перебирать промпты — пора строить интерфейсы для машин, а не для людей. Убирай микро-шаги, упаковывай частые сценарии в готовые макросы и вшивай жёсткую валидацию. Кто перепишет свои API под агентов сегодня, снимет сливки и получит автоматизацию без сбоев. Остальные продолжат гадать, почему их распиаренный стек опять меняет цены мимо кассы.

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

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

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