Как это устроено

Что происходит, когда посетитель пишет «изучи это»

Написать запрос должно давать то же, что и выбрать его в меню. Списком ключевых слов это не решается — в семи языках он всегда дырявый; спрашивать модель на каждом сообщении медленно и дорого. Что мы измерили, почему маршрутизатор состоит из двух шагов и почему одна и та же фраза уходит по другому пути, когда открыт документ.

+ рядом с полем ввода — это меню возможностей: изучить глубже, написать документ, позвать человека. Почти никто его не открывает. Люди просто пишут запрос: «изучи это», «查查看», «もっと深く調べて». Если написанный запрос делает не то же самое, что выбранный в меню, меню превращается в украшение.

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

Почему проигрывает список ключевых слов

Список триггерных фраз должен быть правильным в каждом поддерживаемом языке — и должен пережить то, как люди пишут на самом деле:

  • изучи это пж — сокращение, которого в списке нет.
  • «研究一下呗» — формулировка, которую никто не додумался добавить.
  • копни поглубже вот в это — ни одного слова из списка.

Добавлять фразы можно бесконечно. Нельзя одно — закончить. Каждый новый язык умножает список, а промахи молчаливы: человек написал запрос, получил обычный ответ и никак не узнает, что существовала функция, которая решила бы задачу.

Почему проигрывает и «спрашивать модель на каждом сообщении»

Второй очевидный подход — спрашивать маленькую модель «этот человек вызывает возможность?» на каждом сообщении — точен достаточно, но ставит вызов модели перед каждым сообщением, включая подавляющее большинство обычных вопросов. Это задержка, которую посетитель чувствует, и деньги, которые вы платите там, где ответ и так был очевиден.

Два шага: дешёвый фильтр, потом вердикт

Маршрутизатор — это фильтр на эмбеддингах и вердикт модели.

Шаг первый — эмбеддинги. У каждой возможности есть несколько опорных фраз; есть и общий набор контрпримеров — обычных реплик, которые по смыслу лежат рядом с триггерами. Сообщение сравнивается и с теми, и с другими. Эмбеддинги многоязычные, поэтому один набор опор покрывает все семь языков: «深挖一下» и «research it» попадают в одну область пространства. Если ничто не близко, маршрутизатор останавливается здесь, и модель не вызывается вообще.

Шаг второй — модель. Если это похоже на нажатие кнопки, маленькая модель выбирает одну возможность из кандидатов — или отвечает ничего.

Порядок важен, и он противоположен тому, что мы попробовали сначала. Эмбеддинги хорошо отвечают на вопрос «похожа ли фраза на запрос» и плохо — на «человек хочет воспользоваться функцией или спрашивает про неё»: How does your deep research feature work? неотличим от настоящего триггера. А вот это различение модель делает хорошо. Поэтому дешёвый шаг фильтрует, а точный решает.

Зачем нужны контрпримеры

Одних опорных фраз не хватает, чтобы отделить tell me more от dig deeper — по смыслу они действительно рядом. Разделяет их то, что tell me more лежит в наборе контрпримеров: ближайшим соседом оказывается обычная реплика, а не триггер. Две категории пришлось добавить уже после того, как они дали сбой на тестах:

КатегорияПримерЧто ломалось без неё
Короткие уточненияа в Токио?Уходило в глубокое исследование
Вопрос про незнакомый терминчто такое ANVISAЧиталось как «иди и найди это»
Длинные вопросы по той же теме«我这个产品在当地属于哪一类»Начинал писать документ, которого никто не просил
«Причеши то, что сказал»«把刚才说的整理一下发我邮箱»Читалось как «напиши новый документ»

Третья — самая показательная. Опоры для написать документ обязаны быть длинными фразами (короткие плохо совпадают с длинными запросами), а любая длинная фраза неизбежно тянет за собой тематику агента. И тогда длинный вопрос по той же теме карабкается вверх по сходству: один такой мы измерили на 0,711 — выше, чем фразы, которые действительно просили документ.

Цифры

Замер на 110 независимо написанных примерах (60 должны срабатывать, 50 — нет), семь языков, формулировки намеренно не совпадают с опорными:

МаршрутизаторПравильно
Только эмбеддинги84,5 %
Фильтр на эмбеддингах + вердикт модели95,5 %

Порог фильтра не выбирали на вкус — каждое значение прогнали по тем же примерам:

ПорогВызовов моделиНайдено настоящих запросов (из 60)Ложных срабатываний (из 50)
0,00110609
0,45100607
0,5588605
0,6077594
0,7071593

0,55 — последняя строка, где ещё не потерян ни один настоящий запрос. Выше каждое убранное ложное срабатывание стоит одного настоящего запроса, а выборка слишком мала, чтобы разница в один-два что-то значила: полноту на шум мы не меняем.

Одна фраза, два смысла

«Добавь раздел про бразильский путь».

Если документа нет — это просьба что-то написать. Если справа открыт документ — это просьба изменить его. Те же слова, другой ответ, и ошибка тут дороже, чем кажется: посетитель, работавший над отчётом, попросил добавить раздел — и получил второй, отдельный документ.

Первым исправлением было правило: пока открыт документ, никогда не маршрутизировать в написать документ. Ошибку это остановило и сломало другое: тот, кому действительно нужен был второй документ, больше не мог его попросить. Второе правило (в запросе на график обязано буквально присутствовать слово «график») было той же формы и с той же ценой: оно не узнавало «покажи эти числа по-другому».

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

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

Что это значит для вашего агента

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