ИИ-агенты и автоматизация

Как ограничить темы чат-бота на сайте

Как ограничить темы чат-бота на сайте

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

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

Почему бот отвечает на посторонние вопросы

Потому что он это умеет, и умение включено по умолчанию.

Языковая модель обучена отвечать. Вопрос про визу в Черногорию, про симптомы, про то, кто победит на выборах, про код на Python — на всё это у неё есть правдоподобный текст, и никакого внутреннего признака «это не моя тема» у неё нет. Молчание для модели — не естественное состояние, а отдельное поведение, которое нужно задать явно и подкрепить конструкцией вокруг.

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

Общая архитектура виджета, защита ключа и лимиты разобраны отдельно — в материале про чат-бота для сайта. Здесь речь только про границу темы.

Почему одной фразы в системном промпте мало

Фраза «отвечай только про наши услуги» — это пожелание, а не критерий. Она проигрывает по трём причинам.

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

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

Длинный контекст размывает границу. На десятом сообщении диалога инструкция из системного промпта весит меньше, чем последние реплики. Пользователь плавно увёл разговор в сторону, и бот пошёл следом, ни разу не нарушив прямого запрета.

Из этого не следует, что системный промпт не нужен. Следует, что он один не держит. Как формулировать границы в самом промпте, разобрано в материале про системный промпт; ниже — что достроить вокруг него.

Что писать в системном промпте вместо этого

Границу задают перечислением того, что разрешено, и описанием поведения при выходе за список. Рабочая формулировка состоит из четырёх частей.

  1. Роль и предмет одной строкой. «Ты отвечаешь на вопросы о доставке и возврате товаров интернет-магазина X».
  2. Список разрешённых тем. Пять-пятнадцать пунктов конкретными словами: сроки доставки, стоимость доставки по регионам, изменение адреса, возврат, обмен, статус заказа.
  3. Явное правило для всего остального. «Вопрос, который не относится ни к одному пункту списка, считается посторонним».
  4. Готовый текст ответа на посторонний вопрос. Не «откажись», а дословная формулировка, которую бот выдаёт.

Четвёртый пункт пропускают чаще всего, а он решает половину проблемы. Если формулировки нет, модель сочинит её сама, и каждый раз по-новому: то извинится трижды, то начнёт объяснять, что она искусственный интеллект, то всё-таки ответит на вопрос и добавит, что вообще-то не должна.

Отдельно стоит запретить одно конкретное поведение: оценивать, обещать и советовать за пределами фактов. Бот не даёт юридических и медицинских оценок, не обещает сроки, которых нет в данных, и не комментирует конкурентов. Это не про тему, это про ответственность — и попадает в промпт отдельным блоком.

Список разрешённых тем или список запрещённых

Списки запрещённых тем выглядят надёжнее, потому что перечисляют настоящие риски. На практике они работают хуже, и вот по каким признакам.

КритерийСписок разрешённых темСписок запрещённых тем
Что делает с незнакомым вопросомотсекает по умолчаниюпропускает по умолчанию
Размерконечный, 5-15 строкпринципиально бесконечный
Появился новый тип вопросауже закрыт, его нет в спискедыра до следующей правки
Обход переформулировкойне помогает, темы всё равно нет в спискепомогает, тема названа иначе
Что читает модельодин критерий принадлежностиперечень частных случаев
Стоимость сопровожденияправка при запуске новой услугиправка после каждого инцидента

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

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

Зачем проверять вопрос до основного ответа

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

Схема на три шага:

  1. Вопрос пользователя уходит на дешёвую позицию с коротким промптом «верни одну из меток: своя тема, посторонняя тема, пограничный случай».
  2. Метка «своя тема» — запрос идёт в основную модель со всем контекстом и базой знаний.
  3. Метка «посторонняя» — основная модель не вызывается вовсе, отдаётся готовый текст.

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

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

Пограничные случаи — самое интересное место. Их отправляют в основную модель, но с урезанным промптом: отвечай только фактами из базы, ничего не советуй, в конце предложи связаться с менеджером.

Сколько стоит отдельная проверка

Ставка у нас одинаковая на вход и на выход, поэтому цена считается умножением ставки на объём в миллионах токенов. Сценарий — виджет на сайте, три тысячи обращений в месяц, из них каждое десятое постороннее.

ШагВ месяцТокенов за разВсего токеновЦена, ₽
Проверка темы дешёвой позицией3 000320960 000ставка × 0,96
Основной ответ по своей теме2 7003 5009 450 000ставка × 9,45
Готовый ответ на посторонний вопрос300000
Сэкономлено на отсечённых вопросах3003 500−1 050 000−ставка × 1,05

Считать надо по двум разным ставкам, потому что шаги идут на разных позициях:

ПозицияСтавка, ₽ за 1 млнРоль в схеме
gpt-oss-20b0проверка темы
deepseek-v4-flash1проверка темы
qwen-3-7-plus3проверка или простой ответ
gemini-3-flash6основной ответ
sonnet-4-612основной ответ

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

Доступ к каталогу даёт 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.

Частые вопросы

Почему бот отвечает на вопросы, которых нет в его теме?

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

Что лучше — перечислить разрешённые темы или запрещённые?

Разрешённые. Список запрещённых конечен, а мир вопросов бесконечен, поэтому такой список всегда отстаёт на один новый случай. Список разрешённых тем закрывает всё остальное по умолчанию и умещается в десяток строк.

Зачем проверять вопрос отдельным запросом, если можно всё написать в одном промпте?

Затем, что проверка на дешёвой позиции стоит копейки, а основной ответ — в десять раз дороже. Посторонний вопрос отсекается до дорогого запроса. Плюс решение проверки видно в журнале отдельной строкой, а значит его можно измерять.

Что бот должен говорить на вопрос вне темы?

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

Защищает ли ограничение темы от промпт-инъекции?

Нет. Это разные задачи. Ограничение темы отсекает добросовестный посторонний вопрос, инъекция — это подсунутая инструкция в данных, и она бьёт мимо этого фильтра. Меры против инъекции строятся отдельно, на уровне прав и разделения источников.

Как понять, что ограничение работает?

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

Источники