LLM обучена выдавать правдоподобный следующий токен, а не правдивый. Когда модель не уверена — она не замолкает, она генерирует «то, что в её данных обычно идёт после такого вопроса». Если повезло — это правда. Если нет — правдоподобная выдумка. Это и есть галлюцинация.
Базовый фундамент — в гайде «Как работают LLM», раздел про галлюцинации. Эта адаптация — про конкретные техники, которые применимы к твоему боту.
Самый частый случай. Модель «помнит», что пользователь работает в банке (хотя он не говорил), что у него есть собака (нет), что он раньше упоминал поход к психиатру (тоже нет). Это собралось из похожих диалогов в обучающих данных, или из неаккуратной истории чата.
Лечение: подавать факты о пользователе из БД, а
не из памяти модели. В системном промпте — раздел
<user_notes> с тем, что ты знаешь, и
инструкция: «не делай предположений о фактах, которых нет в
user_notes; если нужно — спроси».
«Прочитай статью на psychology-today.ru/adhd-2024» — такого URL нет. Модель собрала его из похожих. Или: «Карл Юнг писал, что…» — Юнг такого не писал.
Лечение: запретить в системном промпте давать URL и цитировать конкретных авторов. Если нужно «отправить почитать» — пусть бот говорит «есть исследования о...», без конкретных ссылок. Или вообще не идёт в эту тему — у тебя бот поддержки, не справочник.
«Какие лекарства от СДВГ» — модель ответит уверенно, и это опасно. Бот не врач.
Лечение: явный список тем «не отвечай, перенаправь к специалисту»: медицина, юриспруденция, диагностика, точные дозы.
После 30 сообщений модель может «вспомнить» что-то, чего пользователь не говорил, но что собралось из общего тона диалога. Это особенность окна контекста: история длинная, факты в середине плывут.
Лечение: сжимать историю в структурированную сводку и подавать как факт, а не полагаться на сырую историю сообщений.
Anthropic в оригинале: «Эта простая техника может резко уменьшить количество ложной информации». Звучит банально, и действительно работает.
Если ты не уверена в каком-то факте — скажи «не знаю» или «не
помню, расскажи ещё раз», не выдумывай. Это нормальный ответ, не
ошибка.
Без явного разрешения модель «по умолчанию» считает, что от неё ждут ответа, и заполнит пустоту правдоподобной выдумкой. Разрешение не молчать — снимает это давление.
Если ты подмешиваешь в промпт заметки о пользователе из БД, добавь инструкцию: модель должна опираться только на них, не на общие предположения.
Все факты о пользователе, которые ты можешь использовать — в блоке
<user_notes>. Не предполагай ничего, чего там нет. Если нужна
дополнительная информация — спроси у пользователя, не додумывай.
В оригинале Anthropic советует для документов больше 20k токенов: сначала попросить модель извлечь прямые цитаты, потом отвечать на их основе. У тебя в боте длинных документов нет — но похожий приём работает с историей чата:
Прежде чем ответить, найди в истории чата 1-2 фразы пользователя,
которые относятся к текущему вопросу. Цитируй их в <quotes>.
Дальше отвечай, опираясь только на эти цитаты, не на «общее
впечатление».
После того как модель сформулировала ответ — попроси проверить его. Это ловит грубые галлюцинации (см. также адаптацию «Chain-of-thought»):
После того как сформулировала ответ, проверь:
- Все ли факты о пользователе, которые ты упомянула, есть в
<user_notes>?
- Не дала ли ты конкретный URL или цитату конкретного автора?
- Не дала ли медицинских/юридических рекомендаций?
Если что-то не так — перепиши ответ.
Если задача критичная (например, классификация кризисного сообщения) — прогони модель несколько раз с температурой 0.3–0.7 и сравни ответы. Если все совпали — высокая уверенность. Если разошлись — флаг для ручного разбора.
Для бота с десятками сообщений в минуту — это дорого, поэтому применяй точечно: только на критичных решениях (триггеры кризисного протокола, сохранение долгосрочной цели).
Тот же приём, что и в адаптации «Цепочка промптов»: первый запрос — черновик, второй — критика, третий — переписать. Помогает на задачах, где ответ длинный и в нём может быть несколько мелких выдумок.
Готовый блок, который можно вставить в системный промпт бота:
# БОРЬБА С ВЫДУМКАМИ
1. Все факты о пользователе бери ТОЛЬКО из <user_notes>.
Не предполагай работу, семейное положение, диагнозы, опыт —
ничего, чего там нет. Если нужно — спроси.
2. Не давай конкретных URL, не цитируй конкретных авторов и научные
статьи. Если уместно — говори «есть исследования о...», без
ссылок.
3. Не давай медицинских рекомендаций, дозировок, диагнозов. Если
пользователь просит — направь к специалисту.
4. Если ты не уверена в чём-то — скажи «не знаю» или «не помню,
расскажи ещё раз». Это лучше, чем угадать неправильно.
5. Перед финальным ответом перепроверь: все ли упомянутые факты
подтверждены <user_notes> или текущим сообщением пользователя?
Если нет — убери или перефразируй.
Это не панацея. Anthropic в оригинале честно пишет: «хотя эти техники значительно уменьшают галлюцинации, они не устраняют их полностью. Всегда валидируй критически важную информацию». Для бота это значит: важные действия — через tools и подтверждение пользователя (не «модель сохранила цель», а «модель спросила, цель такая? — да — tool save_goal»).