Что происходит, когда посетитель пишет «изучи это»
Написать запрос должно давать то же, что и выбрать его в меню. Списком ключевых слов это не решается — в семи языках он всегда дырявый; спрашивать модель на каждом сообщении медленно и дорого. Что мы измерили, почему маршрутизатор состоит из двух шагов и почему одна и та же фраза уходит по другому пути, когда открыт документ.
+ рядом с полем ввода — это меню возможностей: изучить глубже, написать документ,
позвать человека. Почти никто его не открывает. Люди просто пишут запрос: «изучи это»,
«查查看», «もっと深く調べて». Если написанный запрос делает не то же самое, что выбранный в
меню, меню превращается в украшение.
Поэтому платформа маршрутизирует написанные сообщения к тем же возможностям. Эта страница — о том, как именно, потому что оба очевидных решения не работают, а их провалы стоит знать заранее, если вы делаете что-то похожее.
Почему проигрывает список ключевых слов
Список триггерных фраз должен быть правильным в каждом поддерживаемом языке — и должен пережить то, как люди пишут на самом деле:
изучи это пж— сокращение, которого в списке нет.- «研究一下呗» — формулировка, которую никто не додумался добавить.
копни поглубже вот в это— ни одного слова из списка.
Добавлять фразы можно бесконечно. Нельзя одно — закончить. Каждый новый язык умножает список, а промахи молчаливы: человек написал запрос, получил обычный ответ и никак не узнает, что существовала функция, которая решила бы задачу.
Почему проигрывает и «спрашивать модель на каждом сообщении»
Второй очевидный подход — спрашивать маленькую модель «этот человек вызывает возможность?» на каждом сообщении — точен достаточно, но ставит вызов модели перед каждым сообщением, включая подавляющее большинство обычных вопросов. Это задержка, которую посетитель чувствует, и деньги, которые вы платите там, где ответ и так был очевиден.
Два шага: дешёвый фильтр, потом вердикт
Маршрутизатор — это фильтр на эмбеддингах и вердикт модели.
Шаг первый — эмбеддинги. У каждой возможности есть несколько опорных фраз; есть и общий набор контрпримеров — обычных реплик, которые по смыслу лежат рядом с триггерами. Сообщение сравнивается и с теми, и с другими. Эмбеддинги многоязычные, поэтому один набор опор покрывает все семь языков: «深挖一下» и «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,00 | 110 | 60 | 9 |
| 0,45 | 100 | 60 | 7 |
| 0,55 | 88 | 60 | 5 |
| 0,60 | 77 | 59 | 4 |
| 0,70 | 71 | 59 | 3 |
0,55 — последняя строка, где ещё не потерян ни один настоящий запрос. Выше каждое убранное ложное срабатывание стоит одного настоящего запроса, а выборка слишком мала, чтобы разница в один-два что-то значила: полноту на шум мы не меняем.
Одна фраза, два смысла
«Добавь раздел про бразильский путь».
Если документа нет — это просьба что-то написать. Если справа открыт документ — это просьба изменить его. Те же слова, другой ответ, и ошибка тут дороже, чем кажется: посетитель, работавший над отчётом, попросил добавить раздел — и получил второй, отдельный документ.
Первым исправлением было правило: пока открыт документ, никогда не маршрутизировать в написать документ. Ошибку это остановило и сломало другое: тот, кому действительно нужен был второй документ, больше не мог его попросить. Второе правило (в запросе на график обязано буквально присутствовать слово «график») было той же формы и с той же ценой: оно не узнавало «покажи эти числа по-другому».
Правила поверх правил — признак того, что решает не тот компонент. Теперь контекст уходит в сам шаг вердикта: модели сообщают, что документ открыт, и дают ещё один вариант — править открытый документ, который не маршрутизирует никуда, потому что инструменты правки документа и так доступны на этом ходу, и именно они должны этим заниматься. Обе исходные ошибки остаются исправленными, и оба настоящих запроса снова работают.
Одна асимметрия сделана намеренно: если модель недоступна и маршрутизатор вынужден откатиться к догадке эмбеддинга, планка при открытом документе поднимается. Ошибка там захватывает весь ход — человек, обсуждающий 21-дневное окно проверки, получает «я не могу нарисовать график 21-дневного окна проверки», — тогда как та же ошибка в обычном разговоре даёт максимум один лишний график.
Что это значит для вашего агента
- Написанным запросом можно вызвать только те возможности, которые есть в меню вашего агента. Если глубокое исследование не включено, посетитель получит обычный ответ, а не функцию, которую вы не покупали.
- Триггерные фразы писать не нужно. Никакого списка ключевых слов на арендатора — ни на одном языке.
- Запрос, которому нужна тема, но темы в нём нет, возвращается как заполненное поле ввода, а не как догадка. Тот, кто написал «изучи это» без явной темы, увидит тему подставленной в поле, где сможет её поправить перед отправкой: цена неверной догадки падает с потерянной минуты до правки в два слова.