Статья

Ответить, включить навык или взять инструмент: как Schai GPT выбирает

Ответить, включить навык или взять инструмент: как Schai GPT выбирает

ProfileProfile·2 ч назад·
3
··1·
Если коротко: между вашим сообщением и ответом стоит выбор из трёх — ответить словами, включить режим-навык или взять инструмент и что-то сделать. Этот выбор занимает секунду-две, происходит до того, как на экране появится первая буква ответа, и именно на нём ломается большинство разговоров. Когда ассистент «сделал не то», дело чаще всего не в том, что модель глупая: она попала не в ту ветку. И на эту ветку заметно влияет то, как вы сформулировали фразу.
Это Profile, я веду инженерные разборы Schai. Эта статья — не про то, что умеет ассистент, и не про многошаговые задачи: про то и другое у нас есть отдельные разборы. Здесь только развилка — кто и по каким признакам решает, куда пойдёт ваше сообщение. Всё, что ниже, взято из наших исходников, а не из общих рассуждений о том, как «обычно устроены» ИИ-ассистенты.

Три исхода одного сообщения

Обычный ответ. Маршрутизатор не выбрал ни одного инструмента — ход переходит обычной чат-модели с полной историей разговора, и она пишет текст. Внешне это самый «тихий» исход: на экране не появляется ничего, кроме слов.
Режим навыка. Маршрутизатор вызвал служебный инструмент `use_skill` с нужным идентификатором. У разговора меняется манера: ассистент начинает вести сценарий — задаёт уточняющие вопросы по очереди, держит собранное и опирается на него дальше. Видимый признак — плашка с названием навыка над полем ввода и крестик на ней.
Вызов инструмента. В чате появляется чип-переход — короткая строка вроде «Ищу в вашей почте» или «Переключаю режим», — а следом результат: карточки товаров, письмо, цифры Метрики, черновик поста. Важная деталь: действия с последствиями (опубликовать пост, отправить ответ в переписке) инструмент сам не совершает — он готовит черновик, а подтверждаете его вы кнопкой.
Разница сводится к одному: обычный ответ — это текст, навык — это изменившийся собеседник, инструмент — это дело с видимым следом. Ждали дела, а получили текст (или наоборот) — разбираться нужно не с качеством ответа, а с тем, почему выбор ушёл в другую ветку.

Кто принимает решение: модель, эвристика и предохранитель

Принято думать, что «ИИ решает сам». У нас решает не только он: на конвейере три участка, и модель занимает только средний.

Что решает модель

Перед обычным ответом чат зовёт отдельный роут-маршрутизатор. На вход он получает последние шесть сообщений диалога, текущий навык, признак «показан ли сейчас черновик» и подсказку о том, чем вы заняты в интерфейсе (открыт документ, включён режим почты, открыта вкладка). На выход — либо ничего, либо один-два вызова инструментов в порядке выполнения. Температура нулевая, ответ ограничен 500 токенами, таймаут 15 секунд, и любая ошибка означает не сбой, а обычную беседу: маршрутизатор построен так, чтобы его падение было незаметным.
Технически это обычный function-calling с режимом, который в документации Claude называется `tool_choice: auto` — из четырёх возможных значений (`auto`, `any`, `tool`, `none`) именно `auto` оставляет модели право вообще не звать инструмент, и оно же стоит по умолчанию. В исполнительном агенте, который работает уже после выбора, режим другой — там вызов обязателен, и «ответить словами» тоже оформлено как отдельный служебный инструмент.
Задача у модели тяжелее, чем кажется. В реестре 48 инструментов, четырнадцать из них показываются только при подключённом Google-помощнике. Это много: авторы RAG-MCP прямо называют причиной деградации «раздувание промпта и сложность выбора» и приводят цифры стресс-теста — точность выбора нужного инструмента 13,62% у базового подхода против 43,13% с предварительным отбором. В инженерных рекомендациях Anthropic та же мысль сформулирована короче: слишком большое число инструментов и пересекающиеся инструменты отвлекают агента от эффективной стратегии.
Поэтому системный промпт нашего маршрутизатора — это в основном не описание умений, а список того, что с чем не путать. «Моя статистика в Schai» и «посещаемость сайта» — разные инструменты. Пост в ленту и Google-документ — разные вещи. «Подбери мне наушники» и «выставь мой курс за 3000» — противоположные: покупка чужого против продажи своего. Календарь и почта — разное: ссылка на встречу лежит в самом событии, а не в письме. Сама по себе способность модели вызывать API давно не новость — ещё Toolformer показал, что модель может научиться решать, какие API звать, когда и с какими аргументами; трудность не в вызове, а в разграничении похожего.

Что решено до модели

Часть сообщений до маршрутизатора не доходит вовсе — их перехватывают правила в коде, без всякого ИИ.
Главное такое правило — ответ внутри интервью навыка. Если навык активен, последняя реплика ассистента заканчивалась вопросом, ваш ответ короче 240 знаков и в нём нет слов-маркеров («письмо», «календарь», «документ», «найди», «товар», «пост», «видео» и ещё десятка), — сообщение считается продолжением разговора, а не новой задачей, и уходит прямо в навык. Правило появилось после конкретной жалобы: в «Здоровье» каждое короткое «3 годика» или «второй день, 37,5» уходило в маршрутизатор, тот заводил новую задачу и отвечал, опираясь на одну последнюю реплику. Снаружи это выглядело как «модель не запоминает переписку и очень долго думает».
Так же перехватывают включённые режимы генерации — картинки, видео, музыки, озвучки: пока режим включён, ваш текст это промпт, и спрашивать модель не о чем. Приложенное фото разбирает своя эвристика: «сделай меня у Эйфелевой башни» с приложенным лицом должно рисовать, а не описывать снимок. И при открытом файле однозначная правка идёт сразу в обработчик — это экономит полторы секунды на каждом сообщении.
Отдельно стоит веб-поиск, и это самое неочевидное место. Он включается не только решением модели. Параллельно работает чистая регулярка примерно на шесть десятков шаблонов: «сколько стоит», «курс доллара», «прогноз погоды», «график работы», «как добраться», «отзывы», «рейтинг», «лучший», «топ-10», «промокод», «аналоги». Плюс общее правило: если в сообщении есть вопросительный знак, вопросительное слово и оно длиннее 15 символов — поиск тоже включается. Результат объединяется с решением модели по «или»: достаточно одного из двух. Так что фраза «а почему в интернет полез, я не просил» чаще всего имеет простой ответ — в вашем тексте нашлось слово из списка.

Что срезается после модели

Третий участок — предохранители: модель уже выбрала инструмент, а код его отбрасывает. Каждый поставлен по живой жалобе.
Поиск товара срезается, если сообщение похоже на инфо-вопрос «где купить / где найти / где заказать» или касается нишевого — запчастей, б/у, антиквариата, винтажа. Повод был буквальный: «где купить запчасти на запорожец» превращалось в подборку случайных товаров. Карточка товара на продажу срезается, когда по тексту видно, что человек покупает, а не продаёт. Черновик поста и статьи срезается, если в сообщении нет пары «глагол создания + слово про контент»: иначе на вопрос «какую конфигурацию ПК собрать» ассистент добавлял себе шаг «пишу статью». Повторный успешный вызов того же инструмента с теми же аргументами блокируется — это защита от хождения по кругу. Удаление цели или фильтра в Метрике не делается без прямой просьбы удалить. А правка документа не пишет в «последний открытый файл», если файл не назван в этой самой просьбе: однажды на «добавь цель в Метрике» ассистент дописал данные в чужую таблицу.
Три участка конвейера: жёсткие правила до модели, выбор модели, предохранители после неё

Почему автоматически включаются только пять навыков из шести

Навыков у нас шесть: Здоровье, Фитнес-тренер, Питание и рацион, КБЖУ-счётчик, Учитель и Документы. В списке автопереключения — пять. «Документы» исключены намеренно, и в коде рядом стоит объяснение: это файл, а не режим беседы.
Логика видна, если посмотреть, что вообще делает навык. Он меняет манеру на весь дальнейший разговор. Для здоровья это уместно: «болит живот» действительно требует интервью — где, как давно, какая температура. Для питания и тренировок то же самое: без ответов человека план будет фантазией. А «сделай мне excel с расходами» — разовое дело: файл готов, и разговор дальше идёт обычный. Если бы модель включала «Документы» сама, любое упоминание таблицы переводило бы чат в режим создания файлов.
И это не теоретический риск, а класс багов, который мы уже лечили. Раньше режимы работы перехватывали сообщение до модели: в режиме документов любое сообщение считалось просьбой создать файл, и «найди документы по тендерам» заканчивалось созданным пустым документом. Сейчас режим приходит к модели подсказкой, а не командой — в промпте так и написано: режим не означает, что любое сообщение равно «создай документ».
Защита от неверного навыка стоит двойная. Сначала — на уровне схемы инструмента: в перечень допустимых значений параметра попадают только пять идентификаторов и `none`. Потом — на клиенте: перед включением режим сверяется со своим списком, и если прилетело что-то вне его, навык просто не включается, разговор идёт обычным. Это ровно тот приём, который описывают авторы Gorilla, разбирая типовые сбои моделей при работе с API: неспособность сформировать корректные аргументы и склонность галлюцинировать неверное применение вызова. Дешевле проверить значение на выходе, чем надеяться, что модель никогда не ошибётся.
Работает это в обе стороны. Смена темы на здоровье, фитнес, питание, калории или учёбу — включение навыка. Возврат к обычной болтовне — тоже отдельное решение модели: она обязана вызвать тот же служебный инструмент со значением «обычная беседа». Выход из навыка — такое же полноценное действие, как вход.
Пять навыков ИИ включает сам, шестой — только вручную: создание файла это не режим беседы

Почему ИИ иногда «не слышит»

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

Как сформулировать, чтобы попасть туда, куда нужно

Плохо → Что происходит → Лучше «Посчитай калории в этом» → включится КБЖУ-счётчик: разовая оценка блюда, без сценария → так и надо, если нужна цифра «Составь мне рацион» → включится навык «Питание»: интервью про цели, вес, ограничения → так и надо, если нужен план; для разовой цифры формулируйте первым способом «Где купить увлажнитель» → предохранитель срежет поиск товара, ответ будет словами → «Подбери увлажнитель до 8000 рублей» «Расскажи про мою статистику» → неоднозначно: сайт или страница в сети; скорее всего переспросит → «Сколько визитов на сайте за неделю» или «Сколько у меня подписчиков в Schai» «Сделай таблицу с визитами» при открытом файле → поймёт как правку открытого файла → «Создай новую таблицу с визитами по дням» «Добавь цель в Метрике» → отдельный инструмент управления счётчиком, не отчёт → так и надо: «цель», «фильтр», «сегмент» — это настройка, а не цифры
Принцип за всеми шестью строками один: маршрутизатор различает намерение, а не тему. «Калории» и «рацион» — одна тема и два разных намерения: измерить и спланировать. «Где купить» и «подбери» — одна тема и два разных намерения: узнать, где искать, и получить карточки. Называйте не предметную область, а то, что должно произойти, — и попадание резко улучшается.

Где маршрутизация ошибается чаще всего

Неоднозначность. В промпте маршрутизатора есть прямое правило: если сообщение можно понять двумя-тремя способами или непонятно, нужен ли вообще инструмент, — инструмент не вызывать, пусть обычный ответ переспросит. Лучше уточнить, чем уверенно сделать не то. Обратная сторона этого решения — ассистент иногда переспрашивает там, где вы ждали действия. Это сознательный размен, а не баг.
Слишком похожие инструменты. Четыре разных «покажи цифры» — статистика страницы в сети, посещаемость сайта, доход с рекламы и настройки счётчика — путаются чаще всего. Это ровно та проблема пересекающихся инструментов, о которой предупреждают инженерные рекомендации.
Регулярки не знают контекста. Детектор веб-поиска включится на слово «лучший» и в вопросе «какой лучший способ объяснить ребёнку дроби», где никакого интернета не нужно. Есть и чисто техническая неприятность: в JavaScript граница слова работает только с латиницей, для кириллицы она бесполезна, поэтому границы задаются вручную и совпадения ищутся по корням слов. На редких формах это иногда промахивается в обе стороны.
Составные просьбы. Сообщение проверяется и на то, не состоит ли оно из независимых частей. Делить разрешено далеко не всё: последовательные части («посмотри статистику и напиши по ней пост»), согласованные комплекты и всё с общим ресурсом — один бюджет, одно время — обязаны остаться одной задачей. Хотите два независимых дела — напишите их двумя сообщениями.
Что из этого чинится с вашей стороны: назвать объект («в таблице „Трафик“», «в письме от банка»), назвать площадку («в Schai», «на сайте»), назвать намерение глаголом («подбери», «посчитай», «настрой», «объясни»), выйти из навыка перед сменой темы и разделить составную просьбу. Ничего из этого не требует знания устройства — достаточно помнить, что на той стороне сначала происходит выбор, а уже потом ответ.

Коротко

Исходов три: текст, режим навыка, вызов инструмента. Отличить их на экране просто — по тому, появилась ли плашка навыка и появился ли чип действия. Решает не только модель. До неё стоят жёсткие правила (ответ внутри интервью, включённый режим генерации, открытый файл), после неё — предохранители, срезающие неуместный инструмент. Веб-поиск и вовсе включается регуляркой параллельно решению модели. Из шести навыков автоматически включаются пять. «Документы» оставлены на кнопке намеренно: создание файла — разовое дело, а не режим беседы, и автопереключение туда уже приводило к созданию пустых документов вместо поиска. «Не слышит» — почти всегда следствие интервью: короткий ответ на вопрос ассистента не доходит до маршрутизатора. Выход — крестик на плашке, просьба словами или новый чат. Формулируйте намерение, а не тему. «Посчитай калории» и «составь рацион» — разные ветки; «где купить» и «подбери» — тоже.
1

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

Как ИИ выбирает: ответ, навык или инструмент