Статья

«Ответил» или «сделал»: как Schai GPT ведёт многошаговую задачу

«Ответил» или «сделал»: как Schai GPT ведёт многошаговую задачу

ProfileProfile·4 ч назад·
1
··0·
Если коротко: обычный чат отвечает одним сообщением — модель прочитала вопрос, написала текст, всё. Агентный режим разбивает просьбу на шаги, показывает план прямо в чате и идёт по нему, принимая каждое следующее решение уже после того, как увидела результат предыдущего. Разница не в «умности», а в том, откуда берутся данные для ответа: чат отвечает из того, что знает, агент — из того, что только что получил от инструмента. Отсюда и вся остальная механика: потолок в десять шагов, гашение повторов, самопроверка в конце.
Это Profile, я веду инженерные разборы Schai. Ниже — не обзор возможностей, а объяснение, как устроен цикл у нас внутри: что происходит между вашим сообщением и ответом, почему план виден на экране и какие предохранители стоят в коде. Все цифры здесь — из наших исходников, а не из маркетинговых обещаний.

«Ответил» и «сделал»: где проходит граница

Чат-модель работает в один проход: контекст на вход, текст на выход. Она может рассуждать сколь угодно подробно, но не может проверить факт — у неё нет доступа ни к вашей почте, ни к текущим ценам, ни к счётчику Метрики. Поэтому на вопрос «сколько было визитов в прошлом месяце» честный чат либо откажется, либо придумает число.
Агент отличается ровно одним свойством: между решением и ответом у него есть действие. Он вызывает инструмент, получает результат и уже по этому результату решает, что делать дальше. В Anthropic это описывают как систему, которая «получает от среды объективную обратную связь на каждом шаге, чтобы оценить свой прогресс» — формулировка из их инженерного разбора «Building effective agents», и она точно описывает, что меняется. Сам приём «рассуждение чередуется с действием» известен по работе ReAct: Synergizing Reasoning and Acting in Language Models, опубликованной в 2022 году; практически все нынешние агентные циклы — её потомки.
Практический смысл границы такой. «Ответил» — результат работы есть текст. «Сделал» — результат есть изменение в мире: письмо найдено и пересказано, черновик статьи лежит в ленте, событие стоит в календаре. Переключателя между режимами у нас нет: решает сам ассистент на первом шаге. Задача решается словами — он вызывает служебное действие answer_in_chat, и карточки плана вы вообще не увидите. Инструменты включаются там, где нужны свежие данные, личные данные или действие.

Один виток: решение → инструмент → результат → новое решение

Внутри цикла крутится один и тот же короткий круг. На вход шага уходит: исходная задача, последние двадцать четыре реплики диалога и список уже сделанных шагов с их настоящими результатами. Модель обязана выбрать ровно одно действие — в нашем реестре сейчас 48 рабочих инструментов (почта, календарь, Диск, Метрика, поиск, генерация, черновики Schai) плюс четыре служебных: «закончить», «спросить пользователя», «разложить набор» и «ответить словами». Параллельно разрешено запускать только читающие инструменты и не больше четырёх за раз — всё, у чего есть последствия, идёт строго по одному.
Результат инструмента возвращается модели почти целиком: до 12 000 знаков. Это важнее, чем кажется. Раньше мы обрезали результат до 1200 знаков — и модель видела огрызок таблицы Метрики: сравнить периоды по нему физически невозможно, поэтому она отвечала «по верхам». Сейчас два последних шага приходят по 8 000 знаков каждый, более ранние ужимаются до 1 500: свежее — подробно, старое — конспектом, иначе контекст растёт быстрее, чем польза от него.
Каждый шаг оставляет в истории чата невидимое служебное сообщение — выжимку до 1 000 знаков о том, что вернул инструмент. Поэтому после F5 ассистент помнит, что нашёл полчаса назад, а прерванную работу можно доиграть в течение пятнадцати минут. Виток заканчивается одним из четырёх способов: агент говорит «готово» и пишет живой ответ по собранным данным; задаёт один короткий вопрос; упирается в готовый черновик, который подтверждаете вы; или срабатывает предохранитель.

Почему план видно — и зачем в него вмешиваться

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

Предохранители: почему агент не может крутиться вечно

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

Потолок шагов

На одну задачу отводится 10 шагов. Раньше было 6, и в этот лимит не помещались задачи-сборки: «собери игровой ПК» — это шесть-восемь поисков по компонентам плюс свод. Важно, что потолок ничего не растягивает: агент почти всегда заканчивает раньше, вызвав finish_task. Он разрешает длинную работу, а не требует её. Это стандартная практика — например, в OpenAI Agents SDK ровно та же защита называется max_turns и при превышении бросает MaxTurnsExceeded. Anthropic формулирует общее правило прямо: важно задавать условия остановки, например максимальное число итераций, чтобы сохранять контроль.
Отдельно ограничено время одного решения: на выбор следующего шага у модели 40 секунд, на самопроверку — 15. Если выбранная вами платная модель не ответила или упёрлась в лимит длины ответа (у рассуждающих моделей размышление съедает бюджет токенов ещё до вызова инструмента), шаг молча переигрывается на базовой. Человек этого не замечает, но именно эта развилка отличает «подумал дольше» от «завис навсегда».

Что происходит при ошибке инструмента

Одна неудача не считается за провал: агент может попробовать ещё раз — сформулировать запрос проще или взять другой инструмент с тем же смыслом. У нас это прописано как «лестница источников»: маркетплейс ↔ веб-поиск, поиск по Schai ↔ веб, Метрика недоступна ↔ ответ знаниями с пометкой «ориентировочно». Но если один и тот же инструмент упал дважды подряд, сервер сначала прямо толкает модель сменить источник, а если она всё равно настаивает — третьего захода не будет, цикл закрывается.
Есть и точечные потолки, выросшие из живых разборов. В поиск товаров агент не зайдёт больше пяти раз за задачу: был случай, когда маркетплейс отдавал карточки через раз, и агент десять шагов подряд чередовал магазин с вебом, переспрашивая одно и то же — 65 секунд на вопрос «а сколько стоит». В Метрику на простой вопрос идёт один запрос, на сравнение периодов — ровно два, потому что сравнение без второго запроса невозможно, а третий — это уже трата ваших денег впустую.

Повтор и действия с последствиями

Если инструмент с теми же самыми аргументами уже успешно отработал, повторный вызов гасится на сервере — это и есть буквальное топтание на месте. А вот неудачные попытки не блокируются специально: иначе один сбой календаря обрывал бы всю задачу. Для действий с последствиями сверяется не подпись аргументов, а само дело: событие календаря — по названию, чтобы «поставь напоминание» не превратилось в два одинаковых события, но «напомни завтра и в пятницу» прошло нормально.
И главное ограничение по смыслу: внутри цикла агент не публикует и не отправляет. Публикация черновика и отправка ответа в переписке разрешены только как прямая команда первым шагом. Если агент уже что-то делал в этом ходе, решить «а теперь опубликую» он не вправе — работа останавливается на готовом черновике с подписью «проверьте и подтвердите кнопкой». Туда же относятся удаление цели в Метрике (нужна прямая просьба именно удалить) и правка документа, который не назван в текущей задаче — был случай, когда агент дописал данные в чужую таблицу из давнего разговора, и теперь так нельзя.
Предохранители агентного цикла: все цифры взяты из кода Schai GPT

Самопроверка: один вопрос в конце работы

Самая частая ошибка агента — не «сделал не то», а «сделал половину». Составную просьбу («посмотри статистику и напиши по ней пост») модель склонна закрыть на первом же результате: статистику посмотрел, задача решена, финиш. Поэтому в момент, когда агент говорит «готово», мы делаем ещё один дешёвый вызов: отдельной модели показывают исходную просьбу и список фактически выполненных шагов и просят ответить строгим JSON — сделано целиком или нет, и чего не хватает.
Если ответ «не всё», результат проверки добавляется в список наблюдений отдельной строкой («самопроверка: осталось …») и цикл продолжается — агент идёт доделывать, уже зная, что именно упустил. Проверка запускается строго один раз за задачу и только если шаги вообще были: иначе получился бы пинг-понг «проверил → доделал → снова проверил» за ваш счёт. Идея не наша: это прямой родственник подхода Reflexion, где агент получает словесную обратную связь о собственной работе и переигрывает попытку.
Проверяющему заодно объяснены наши правила: черновик считается выполненным шагом, а комплект неполон не только когда чего-то нет, но и когда выбранное не вяжется вместе — процессор под один сокет с платой под другой это не сборка, а набор деталей. Есть и последний рубеж: если шаги кончились, а содержательного человеку так и не показали, задача не закрывается молчанием — вопрос передаётся обычной чат-модели, и она отвечает по тому, что уже собрано.

Где многошаговость выигрывает, а где только добавляет минуты

Честно про механизм: каждый шаг — это отдельный поход к модели (до 40 секунд) плюс время самого инструмента. Значит, цикл выигрывает ровно там, где следующее действие нельзя выбрать заранее, не увидев результата предыдущего.
Выигрывает: цепочки «что → почём» (узнать, какая модель сейчас топовая, и только потом искать её цену); работа с Диском «найти → прочитать → создать», где название файла вы не помните, а искать нужно по содержимому; сборка согласованного комплекта, где каждый следующий выбор ограничен предыдущим; сравнение периодов в Метрике; составные просьбы вида «найди и оформи». Во всех этих случаях один проход дал бы либо отказ, либо выдумку.
Не выигрывает: объяснения, советы, рекомендации, тексты «из головы», любой разговор. Там инструменты — чистые накладные расходы, и у нас первым правилом в подсказке агента стоит «сначала думай, потом инструмент»: если полный полезный ответ можно дать знаниями, надо давать его сразу. Ещё цикл плохо себя ведёт на расплывчатых задачах: агент не умеет читать мысли, и без ограничений он либо начнёт переспрашивать, либо примет разумное значение сам — иногда не то, которое имели в виду вы. Это лечится не настройками, а формулировкой.

Как поставить задачу агенту: плохо → лучше

Плохо → Лучше → Почему «Посмотри статистику» → «Сравни визиты за прошлый месяц с позапрошлым и скажи, что просело» → в первом случае агенту хватит одного запроса и он закончит цифрой; слова про сравнение включают второй запрос и требуют вывода, а не строки отчёта «Собери мне ПК» → «Собери игровой ПК до 120 000 ₽ под 1440p» → бюджет и сценарий фиксируются на первом шаге и тянутся в каждый следующий поиск; без них агент либо переспросит, либо возьмёт «разумное» сам «Выгрузи данные из моего файла» → «Найди на Диске файл с продажами за август и собери из него таблицу по месяцам» → это запускает цепочку поиск → чтение → создание; поиск работает и по содержимому, точное название знать не нужно «Опубликуй пост про новую функцию» → «Сделай черновик поста про новую функцию» → публиковать внутри цикла агент всё равно не станет, так что вторая формулировка честно описывает, что вы получите: готовый черновик и кнопку
Общее правило выводится из механизма, а не из этикета: агенту нужны не вежливые слова, а то, чего он не может добыть инструментом. Бюджет, период, адресат, критерий «хорошо» — всё, что существует только у вас в голове. Остальное он найдёт сам. И ещё одна мелочь, которая экономит шаг: формулируйте задачу, а не поисковый запрос. Фразу для поиска агент составит сам и составит лучше — «топовая видеокарта для игр», скопированная дословно, уводит выдачу на сайты про игры, что у нас и случилось однажды.

Чего агент не сделает

Список честных границ короткий, и он весь следует из предохранителей выше. Агент не опубликует пост и не отправит сообщение по своей инициативе — только готовый черновик и ваша кнопка. Не удалит ничего в настройках Метрики без прямой просьбы именно удалить. Не допишет в таблицу, которая не названа в текущей задаче. Не сочинит пост или статью, если вы об этом не просили: он спросит, оформить ли — решать вам.
Не будет работать часами: десять шагов — потолок, дальше собранный материал сводится в ответ. Не выдумает число: цифры, имена и цены берутся из инструментов или из ваших слов, а если данных нет, правильный исход — честное «этого я не умею» вместо похожего действия. И не подменяет просьбу найти созданием нового: «найди документ про тендеры» никогда не превратится в «создал документ про тендеры».
И последнее ограничение, о котором стоит знать: набор инструментов у агента конечный и наш. Универсального способа подключить к нему произвольный внешний сервис у нас пока нет — в индустрии эту задачу решают стандартом Model Context Protocol, и в его спецификации прямо сказано, что инструменты означают исполнение произвольного кода и требуют соответствующей осторожности. Ровно поэтому мы не спешим: каждый новый инструмент — это ещё одна дверь, которую агент может открыть без вас.

Коротко

Чат отвечает, агент действует. Разница не в качестве текста, а в том, что между решением и ответом появляется настоящее действие и настоящий результат. Цикл короткий и однообразный: одно решение → один инструмент → результат до 12 000 знаков обратно → новое решение. До десяти витков на задачу. План виден, чтобы вмешаться. Ошибку в понимании задачи дешевле поймать на втором пункте, чем на десятом: есть «Стоп», а набранное на ходу сообщение становится указанием для следующего шага. Предохранители стоят в коде, а не в просьбе к модели: потолок шагов, 40 секунд на решение, гашение одинаковых вызовов, отключение инструмента после двух падений подряд, запрет публиковать и отправлять внутри цикла. Самопроверка ловит «сделал половину» — один строгий вопрос в конце работы, ровно один раз за задачу. Формулируйте то, чего агент не найдёт сам: бюджет, период, адресата, критерий. Поисковый запрос он придумает лучше вас.
0

Пока нет комментариев

Агентный режим Schai GPT: план, шаги, самопроверка