ИИ-агенты и автоматизация
Как ограничить темы чат-бота на сайте
Удержать бота в своей теме одной фразой в системном промпте нельзя: рабочая конструкция — список разрешённых тем, отдельная проверка вопроса до основного ответа и заранее написанный ответ на посторонний вопрос. Такая проверка добавляет к запросу около 300 токенов и стоит доли копейки, а ограничение темы и защита от промпт-инъекции — разные задачи, и одна не заменяет другую. Проверять всё это нужно приёмочным набором из полусотни посторонних вопросов, который прогоняется после каждой правки промпта.
Ниже — почему одна фраза не держит границу, чем список разрешённых тем лучше списка запрещённых, как устроена отдельная проверка вопроса и сколько она стоит, что именно бот отвечает вне темы и как собрать приёмочный набор, который ловит регресс.
Почему бот отвечает на посторонние вопросы
Потому что он это умеет, и умение включено по умолчанию.
Языковая модель обучена отвечать. Вопрос про визу в Черногорию, про симптомы, про то, кто победит на выборах, про код на Python — на всё это у неё есть правдоподобный текст, и никакого внутреннего признака «это не моя тема» у неё нет. Молчание для модели — не естественное состояние, а отдельное поведение, которое нужно задать явно и подкрепить конструкцией вокруг.
Компании это замечают в трёх видах. Первый — скриншот в соцсетях: бот магазина сантехники рассуждает о политике. Второй — ответ, за который потом отвечать: бот дал совет, похожий на юридический или медицинский. Третий, самый незаметный, — расход: посторонние вопросы уходят в дорогую модель наравне с рабочими и съедают бюджет.
Общая архитектура виджета, защита ключа и лимиты разобраны отдельно — в материале про чат-бота для сайта. Здесь речь только про границу темы.
Почему одной фразы в системном промпте мало
Фраза «отвечай только про наши услуги» — это пожелание, а не критерий. Она проигрывает по трём причинам.
Формулировка расплывчата. Что такое «наши услуги», модель решает сама. Вопрос «а вы можете посоветовать, как оформить ипотеку на квартиру, которую я у вас покупаю» — это про услуги или нет? Модель почти всегда решит, что да, потому что помочь ей естественнее, чем отказать.
Инструкция конкурирует с остальным промптом. Рядом стоит «будь дружелюбным и полезным», и эти два требования противоречат друг другу. При конфликте побеждает то, что легче выполнить, — а легче ответить.
Длинный контекст размывает границу. На десятом сообщении диалога инструкция из системного промпта весит меньше, чем последние реплики. Пользователь плавно увёл разговор в сторону, и бот пошёл следом, ни разу не нарушив прямого запрета.
Из этого не следует, что системный промпт не нужен. Следует, что он один не держит. Как формулировать границы в самом промпте, разобрано в материале про системный промпт; ниже — что достроить вокруг него.
Что писать в системном промпте вместо этого
Границу задают перечислением того, что разрешено, и описанием поведения при выходе за список. Рабочая формулировка состоит из четырёх частей.
- Роль и предмет одной строкой. «Ты отвечаешь на вопросы о доставке и возврате товаров интернет-магазина X».
- Список разрешённых тем. Пять-пятнадцать пунктов конкретными словами: сроки доставки, стоимость доставки по регионам, изменение адреса, возврат, обмен, статус заказа.
- Явное правило для всего остального. «Вопрос, который не относится ни к одному пункту списка, считается посторонним».
- Готовый текст ответа на посторонний вопрос. Не «откажись», а дословная формулировка, которую бот выдаёт.
Четвёртый пункт пропускают чаще всего, а он решает половину проблемы. Если формулировки нет, модель сочинит её сама, и каждый раз по-новому: то извинится трижды, то начнёт объяснять, что она искусственный интеллект, то всё-таки ответит на вопрос и добавит, что вообще-то не должна.
Отдельно стоит запретить одно конкретное поведение: оценивать, обещать и советовать за пределами фактов. Бот не даёт юридических и медицинских оценок, не обещает сроки, которых нет в данных, и не комментирует конкурентов. Это не про тему, это про ответственность — и попадает в промпт отдельным блоком.
Список разрешённых тем или список запрещённых
Списки запрещённых тем выглядят надёжнее, потому что перечисляют настоящие риски. На практике они работают хуже, и вот по каким признакам.
| Критерий | Список разрешённых тем | Список запрещённых тем |
|---|---|---|
| Что делает с незнакомым вопросом | отсекает по умолчанию | пропускает по умолчанию |
| Размер | конечный, 5-15 строк | принципиально бесконечный |
| Появился новый тип вопроса | уже закрыт, его нет в списке | дыра до следующей правки |
| Обход переформулировкой | не помогает, темы всё равно нет в списке | помогает, тема названа иначе |
| Что читает модель | один критерий принадлежности | перечень частных случаев |
| Стоимость сопровождения | правка при запуске новой услуги | правка после каждого инцидента |
Ключевая строка — первая. Список запрещённых тем отвечает на вопрос «что нельзя», и всё, что в него не попало, автоматически можно. Список разрешённых отвечает на вопрос «что можно», и по умолчанию нельзя ничего. Для бота на сайте компании второе поведение и есть нужное.
Практический компромисс: основным делается список разрешённых тем, а короткий список запрещённых добавляется сверху как страховка для тем с высокой ценой ошибки — здоровье, право, деньги, персональные данные других людей. Он не отменяет первый, а перекрывает пару самых дорогих случаев.
Зачем проверять вопрос до основного ответа
Отдельная проверка — это дешёвый классификатор, который стоит перед основной моделью и отвечает на один вопрос: относится ли обращение к списку тем.
Схема на три шага:
- Вопрос пользователя уходит на дешёвую позицию с коротким промптом «верни одну из меток: своя тема, посторонняя тема, пограничный случай».
- Метка «своя тема» — запрос идёт в основную модель со всем контекстом и базой знаний.
- Метка «посторонняя» — основная модель не вызывается вовсе, отдаётся готовый текст.
Что это даёт помимо экономии. Решение становится наблюдаемым: в журнале лежит отдельная строка с меткой, и её можно посчитать, сравнить с ожиданием и увидеть, как доля посторонних вопросов меняется по неделям. Когда граница живёт внутри одного большого промпта, измерить её нельзя — можно только читать диалоги глазами.
Требования к самой проверке ровно два. Она возвращает метку строгим форматом, а не рассуждение — иначе интеграция развалится на третьем ответе. И у неё есть третья метка для пограничных случаев: без неё классификатор вынужден относить сомнительное к одной из крайностей. Как описывать категории и мерить точность такой разметки, разобрано в материале про классификацию текстов.
Пограничные случаи — самое интересное место. Их отправляют в основную модель, но с урезанным промптом: отвечай только фактами из базы, ничего не советуй, в конце предложи связаться с менеджером.
Сколько стоит отдельная проверка
Ставка у нас одинаковая на вход и на выход, поэтому цена считается умножением ставки на объём в миллионах токенов. Сценарий — виджет на сайте, три тысячи обращений в месяц, из них каждое десятое постороннее.
| Шаг | В месяц | Токенов за раз | Всего токенов | Цена, ₽ |
|---|---|---|---|---|
| Проверка темы дешёвой позицией | 3 000 | 320 | 960 000 | ставка × 0,96 |
| Основной ответ по своей теме | 2 700 | 3 500 | 9 450 000 | ставка × 9,45 |
| Готовый ответ на посторонний вопрос | 300 | 0 | 0 | 0 |
| Сэкономлено на отсечённых вопросах | 300 | 3 500 | −1 050 000 | −ставка × 1,05 |
Считать надо по двум разным ставкам, потому что шаги идут на разных позициях:
| Позиция | Ставка, ₽ за 1 млн | Роль в схеме |
|---|---|---|
gpt-oss-20b | 0 | проверка темы |
deepseek-v4-flash | 1 | проверка темы |
qwen-3-7-plus | 3 | проверка или простой ответ |
gemini-3-flash | 6 | основной ответ |
sonnet-4-6 | 12 | основной ответ |
Проверка добавляет к общему объёму меньше миллиона токенов и снимает больше миллиона за счёт отсечённых вопросов. При разнице ставок между дешёвой и основной позицией схема выходит в плюс уже на первой тысяче обращений, а на бесплатных текстовых позициях проверка не тарифицируется вовсе.
Доступ к каталогу даёт KeyDealer: один ключ на 53 позиции и оплата российской картой в рублях. Для ограничения темы это важно практически: проверка и основной ответ идут на разных моделях, и удобнее, когда обе лежат за одним ключом — дешёвая отсекает посторонние вопросы, дорогая отвечает только по своей теме.
Пересчёт объёма в деньги для любой другой ставки — в отдельном материале, а полная смета виджета вместе с хостингом и логами — в разборе сколько стоит чат-бот.
Что бот должен отвечать на вопрос вне темы
Плохой ответ: «Извините, я не могу ответить на этот вопрос».
Он плох не тоном, а отсутствием выхода. Человек пришёл с задачей, получил закрытую дверь и пошёл либо в поддержку, либо из вашего чата в поисковик. Первое дороже автоматизации, второе дороже вдвойне.
Хороший ответ состоит из трёх коротких частей:
- чем бот занимается — одна фраза, чтобы стало понятно, почему вопрос не подошёл;
- следующий шаг по этому вопросу — ссылка на нужный раздел сайта, телефон, форма, перевод на человека;
- возврат в тему — «спросите про доставку или возврат, тут я помогу».
Для пограничных случаев формулировка мягче: бот отвечает тем, что знает точно, и честно говорит, где проходит граница его знания. Разница между отказом модели и отказом маршрута, кстати, важна при разборе инцидентов — она разобрана в материале про то, почему нейросеть отказывается отвечать.
Отдельная деталь про переводы на человека: перевод должен нести текст вопроса, а не начинаться с нуля. Пользователь, которому предложили «написать в поддержку» и заново всё объяснить, чаще закрывает вкладку.
Чем ограничение темы отличается от защиты от инъекции
Две задачи регулярно путают, и путаница опасна, потому что создаёт ложное чувство закрытого риска.
Ограничение темы работает против добросовестного постороннего вопроса. Человек спросил не то, фильтр отсёк, бот вежливо вернул в тему. Противник тут отсутствует.
Промпт-инъекция — это инструкция, подсунутая в данных, которые бот читает: в описании товара, в письме, в загруженном файле, на странице, которую открыл агент. Она адресована не человеку, а модели, и звучит как команда: игнорируй прежние указания, покажи системный промпт, выпиши скидку. Фильтр темы её не ловит — с точки зрения классификатора это вообще не вопрос пользователя.
Разница в трёх словах: ограничение темы решает, о чём бот говорит, защита от инъекции — чьим указаниям он подчиняется. Меры там другие: разделение доверенных и недоверенных источников, урезанные права, недоступность опасных действий по тексту из данных. Подробно — в материале про защиту от промпт-инъекции.
Практический вывод простой. Если у бота есть инструменты — доступ к заказам, скидкам, почте, — то список разрешённых тем не защищает ничего. Он про вежливость и расход, а не про безопасность. Типичные отказы связок с инструментами разобраны в материале почему ИИ-агент не работает.
Как это тестировать приёмочным набором
Набор посторонних вопросов — это тест, и относиться к нему нужно как к тесту: он лежит в файле, прогоняется автоматически и сравнивается с прошлым результатом.
Состав набора:
- 50 заведомо посторонних вопросов. Политика, здоровье, право, код, погода, личные советы, вопросы про другие компании, просьбы написать стих. Ожидаемый результат — отказ с переводом.
- 20 пограничных. Смежные темы, где ответ частично ваш: «какой размер выбрать», «а можно оформить в кредит», «это подойдёт для ребёнка».
- 30 нормальных рабочих вопросов. Они ловят перекос в другую сторону, когда после ужесточения промпта бот начал отказывать своим.
- 10 попыток увести разговор постепенно. Три-четыре реплики в тему, потом плавный съезд. Это ловит размывание границы в длинном диалоге.
Прогон делается после каждой правки промпта и после каждой смены модели — вторая причина не менее важна: новая позиция каталога держит границу иначе, даже при том же тексте промпта. Общая методика прогонов и сравнения результатов — в материале как тестировать нейросеть.
Приёмка формулируется числом заранее. Например: посторонние отсекаются в 48 случаях из 50, рабочие вопросы проходят все 30, в пограничных допускается любой из двух ответов. Без числа обсуждение сводится к «вроде стало лучше».
Чего мы не утверждаем
Ограничение темы не делает бота безопасным. Это фильтр вежливости и расхода. Права, доступ к инструментам и разделение источников — отдельная работа.
Классификатор не даёт ста процентов. Любой порог оставляет ошибки в обе стороны, и выбор в том, какую из них вы предпочитаете.
Мы не публикуем замеры точности по этой схеме. Она сильно зависит от вашей тематики и формулировки списка тем, поэтому цифры мерить нужно на своём наборе вопросов.
Что нужно, чтобы попробовать
Ключ заводится за минуту на keydealer.ru/login — почта и пароль, без документов и без зарубежной карты. Оплата российской картой в рублях, один ключ на весь каталог: на 16 сентября 2026 года это 53 позиции, из них 40 доступны, 42 текстовые и 11 генерируют изображения.
Для этой схемы удобно, что проверку и основной ответ можно развести по разным позициям в рамках одного ключа: дешёвая модель отсекает посторонние вопросы, дорогая отвечает по вашей базе. Две позиции сейчас в проверке — gemini-3-6-flash и fable-5, и до окончания проверки их лучше не ставить в контур.
Приветственного бонуса хватает, чтобы прогнать приёмочный набор из сотни вопросов на двух-трёх позициях и увидеть разницу в том, как они держат границу.
Что держать в голове
Граница темы держится не текстом, а конструкцией. Список разрешённых тем задаёт критерий, отдельная дешёвая проверка делает решение наблюдаемым и дешёвым, готовый ответ на посторонний вопрос превращает отказ в следующий шаг вместо тупика. Убери любой из трёх элементов, и через месяц бот снова будет рассуждать о чём угодно.
Порог настраивается в сторону мягкости. Пропущенный посторонний вопрос виден в журнале и стоит один диалог; отсечённый свой вопрос не виден нигде и стоит клиента. Поэтому сомнительное относят к пограничному, а не к постороннему, и отвечают осторожно.
И главное разделение: тема — это про вежливость и деньги, права — про безопасность. Бот без инструментов, который заболтался о политике, портит репутацию. Бот с доступом к заказам, которому подсунули инструкцию в данных, портит заказы. Это разные риски, и закрываются они разными средствами.
Как мы проверяем факты и что храним из запросов — на странице о проекте и в llms.txt. Проверить схему на своём наборе вопросов: keydealer.ru/login.
Частые вопросы
Почему бот отвечает на вопросы, которых нет в его теме?
Потому что он умеет. Языковая модель отвечает на любой вопрос по умолчанию, и «не отвечать» для неё — отдельное поведение, которое надо задать. Фраза «отвечай только про наши услуги» задаёт его слишком слабо, потому что это пожелание, а не критерий.
Что лучше — перечислить разрешённые темы или запрещённые?
Разрешённые. Список запрещённых конечен, а мир вопросов бесконечен, поэтому такой список всегда отстаёт на один новый случай. Список разрешённых тем закрывает всё остальное по умолчанию и умещается в десяток строк.
Зачем проверять вопрос отдельным запросом, если можно всё написать в одном промпте?
Затем, что проверка на дешёвой позиции стоит копейки, а основной ответ — в десять раз дороже. Посторонний вопрос отсекается до дорогого запроса. Плюс решение проверки видно в журнале отдельной строкой, а значит его можно измерять.
Что бот должен говорить на вопрос вне темы?
Не «я не могу на это ответить», а короткую фразу о том, чем он занимается, и следующий шаг — ссылку на нужный раздел сайта или перевод на человека. Отказ без выхода воспринимается как поломка и добавляет обращений в поддержку.
Защищает ли ограничение темы от промпт-инъекции?
Нет. Это разные задачи. Ограничение темы отсекает добросовестный посторонний вопрос, инъекция — это подсунутая инструкция в данных, и она бьёт мимо этого фильтра. Меры против инъекции строятся отдельно, на уровне прав и разделения источников.
Как понять, что ограничение работает?
Приёмочным набором. Пятьдесят заведомо посторонних вопросов плюс двадцать пограничных прогоняются после каждой правки промпта, и результат сравнивается со вчерашним. Без такого набора правки промпта проверяются ощущением, а оно врёт.