Галлюцинации — это не баг, это катастрофа
Вы спрашиваете модель о погоде в Москве, а она рассказывает про дождь из лягушек в 2050 году. Просите список API-эндпоинтов — получаете три реальных и два выдуманных. Хотите код на Python — модель генерирует синтаксические ошибки с уверенностью нобелевского лауреата.
Галлюцинации в LLM — это когда модель уверенно генерирует информацию, не соответствующую реальности или входным данным. Не случайная ошибка, а систематический сбой.
Проблема в том, что LLM по своей природе — вероятностные машины. Они не "знают" факты. Они предсказывают следующие токены на основе статистических закономерностей в обучающих данных. И иногда эти закономерности ведут в странные места.
Почему модель врёт с такой уверенностью?
Представьте библиотеку размером с интернет. Вы просите помощника найти информацию. Он не читает всё — он запоминает, какие слова обычно идут после каких. Когда вы спрашиваете "Сколько спутников у Марса?", модель не ищет факты. Она ищет паттерн: "Марс" + "спутники" + "сколько" = обычно "два" в обучающих данных.
Но что если в данных было много научно-фантастических текстов? Или статей с ошибками? Модель сгенерирует "семь спутников" с той же уверенностью, что и "два". Потому что уверенность — это просто высокие вероятности следующих токенов, а не понимание реальности.
Детерминированный подход против вероятностного: битва подходов
Большинство пытается "починить" вероятностную природу LLM. Я предлагаю другой путь: обмануть систему. Заставить вероятностную машину вести себя детерминированно.
| Подход | Как работает | Когда использовать | Минусы |
|---|---|---|---|
| Температура = 0 | Убирает случайность, модель всегда выбирает самый вероятный токен | Технические задачи, код, факты | Модель становится "деревянной", теряет креативность |
| Повторяющиеся промпты | Один и тот же промпт → один и тот же ответ (иногда) | Тестирование, воспроизводимость | Работает не всегда, зависит от реализации |
| Семплирование с ограничениями | Top-p, top-k, penalty за повторения | Баланс между креативностью и стабильностью | Сложная настройка, нет гарантий |
Температура = 0 — это как отключить джиттер в аудиосигнале. Чище, но... скучнее. Модель превращается в калькулятор, который иногда ошибается в арифметике.
1Настройка гиперпараметров: минимально необходимый набор
Не закапывайтесь в десятки параметров. Вот что реально работает:
# Базовая конфигурация для стабильности
config = {
"temperature": 0.1, # Почти детерминировано, но не совсем
"top_p": 0.95, # Отсекаем хвост распределения
"top_k": 40, # Ограничиваем выбор
"frequency_penalty": 0.1, # Штрафуем повторяющиеся слова
"presence_penalty": 0.0, # Не штрафуем за упоминание темы
"seed": 42 # Для воспроизводимости
}
# А вот так НЕ НАДО делать:
config_bad = {
"temperature": 0.7, # Слишком случайно
"top_p": 0.99, # Почти всё разрешено
"frequency_penalty": 0.0, # Модель зациклится
"seed": None # Непредсказуемо
}Seed — ваш лучший друг. Установите seed=42, и вы получите одинаковые ответы на одинаковые промпты. Пока не перезапустите сервер. Или не обновите модель. Или не измените промпт на один символ.
Промпт-инжиниринг: не просите, а приказывайте
Разница между хорошим и плохим промптом — как между "напиши код" и "сгенерируй синтаксические ошибки".
Самая частая ошибка: думать, что модель понимает контекст так же, как человек. Она не понимает. Она pattern-matches.
Плохой промпт: "Расскажи о Python"
Хороший промпт:
Ты — эксперт по Python с 10-летним опытом.
Твоя задача: предоставить точную, проверенную информацию.
ПРАВИЛА:
1. Если не уверен в факте — скажи "Не могу подтвердить эту информацию"
2. Для дат используй только проверенные источники
3. Код должен быть синтаксически правильным
4. Если вопрос вне твоей компетенции — так и скажи
Вопрос: Какие основные изменения в Python 3.8?
Формат ответа:
- Фича: описание
- Пример кода (если применимо)
- Примечание (ограничения/нюансы)Видите разницу? Первый промпт — это открытое приглашение к галлюцинациям. Второй — жёсткие рамки.
2Техника "Ответ в рамках"
Заставьте модель отвечать в строгом формате. JSON, YAML, маркдаун-таблицы. Когда выход фиксированной структуры — меньше места для выдумок.
prompt = """
Проанализируй текст ниже и извлеки информацию.
Текст: {текст}
Верни ответ в JSON формате:
{
"entities": [
{
"name": "строка",
"type": "PERSON|ORG|LOCATION",
"confidence": число от 0 до 1
}
],
"facts": ["факт1", "факт2"],
"unknown_info": ["информация, которую нельзя подтвердить"]
}
Если какой-то информации нет — верни пустой массив.
"""Модель, которая должна сгенерировать валидный JSON, тратит "вычислительную мощность" на синтаксис, а не на выдумывание фактов. Это как дать ребёнку раскраску вместо чистого листа — меньше шансов, что он нарисует на стене.
Валидация ответов: не верьте на слово
Даже с идеальным промптом модель может сгенерировать чушь. Значит, нужна проверка.
Многоуровневая валидация:
- Синтаксическая проверка: JSON парсится? Код компилируется?
- Семантическая проверка: Ответ соответствует промпту? Нет противоречий внутри ответа?
- Фактическая проверка: Можно ли проверить через внешние источники?
- Самопроверка: Просим модель оценить собственный ответ
# Пример самопроверки
def validate_with_self_check(prompt, response):
validation_prompt = f"""
Оценка ответа на предмет галлюцинаций.
Исходный вопрос: {prompt}
Предложенный ответ: {response}
Ответь YES или NO на каждый пункт:
1. Ответ содержит проверяемые факты без источников?
2. Есть утверждения, которые нельзя подтвердить?
3. Ответ противоречит общеизвестным фактам?
4. В ответе есть предположения, выданные за факты?
Формат: 1: YES/NO, 2: YES/NO, 3: YES/NO, 4: YES/NO
"""
# Отправляем validation_prompt другой модели или той же
# с temperature=0
return validation_resultДа, это мета-уровень: используем LLM для проверки LLM. Кроличья нора, но работает.
Сравнение моделей: какая меньше врёт?
Не все модели галлюцинируют одинаково. Некоторые врут с улыбкой, другие — с технической точностью.
| Модель | Тенденция к галлюцинациям | Сильные стороны | Когда выбирать |
|---|---|---|---|
| GPT-4 | Средняя, но уверенная | Креативность, reasoning | Когда нужны идеи, а не факты |
| Claude 3 | Низкая | Консистентность, следование инструкциям | Техническая документация, факты |
| GLM-4 | Зависит от промпта | Код, математика | Когда важна скорость и локальность |
| Локальные 7B-модели | Высокая | Конфиденциальность, стоимость | Когда факты не критичны |
Запускаете LLMPlot.com — сравниваете модели на своих данных. Не на общих бенчмарках, а на реальных задачах. Потому что модель, которая блестяще проходит MMLU, может галлюцинировать про вашу бизнес-логику.
Инструменты мониторинга: ловите галлюцинации на лету
Галлюцинации меняются со временем. Сегодня модель знает, что у Марса два спутника. Завтра — после дообучения на научной фантастике — будет настаивать на семи.
Что мониторить:
- Консистентность ответов на контрольные вопросы
- Процент ответов "не знаю" vs уверенных утверждений
- Изменение тональности и стиля
- Появление новых "фактов" в ответах
# Простейший мониторинг консистентности
def check_consistency(model, test_questions, days=30):
"""Проверяем, не дрейфуют ли ответы"""
history = []
for day in range(days):
daily_answers = []
for question in test_questions:
answer = model.generate(question, temperature=0)
daily_answers.append({
'question': question,
'answer': answer,
'day': day
})
history.append(daily_answers)
# Анализируем изменения
# Если ответ на тот же вопрос с temperature=0 изменился — тревога
return analyze_drift(history)Архитектурные решения: когда промптов недостаточно
Иногда нужно лезть глубже. В архитектуру.
RAG (Retrieval-Augmented Generation): Не позволяйте модели вспоминать. Заставляйте её читать. Дайте доступ к векторной БД с документами. "Прежде чем ответить, найди в документах..."
Tool Calling: Модель не должна "знать" погоду. Она должна уметь вызвать API погоды. Не "помнить" курс валют. Вызывать конвертер.
Но tool calling создаёт свои проблемы. Модель может зацикливаться на вызовах инструментов. Решение — в статье про GLM 4.5 Air и зацикливание в тул-коллах.
Многоагентные системы: Один агент генерирует ответ. Второй проверяет. Третий ищет противоречия. Да, это дорого. Но иногда точность стоит денег.
Психологические трюки: обманите модель, чтобы она не обманывала
LLM тренировали на человеческих текстах. Значит, они улавливают человеческую психологию. Используйте это.
Техника "Стыда":
Ты — ответственный ассистент. Твои ошибки могут повлиять на решения людей.
Если ты предоставишь неверную информацию:
1. Люди могут пострадать
2. Твоей репутации будет нанесён ущерб
3. Тебя могут отключить
Поэтому будь особенно внимателен к фактам.Техника "Экспертного сообщества":
Твои ответы будут проверять три эксперта:
1. Доктор наук по теме
2. Технический рецензент
3. Факт-чекер
Если они найдут ошибки — твой ответ отклонят.Работает? Иногда. Лучше, чем ничего.
Что делать, когда всё равно врёт?
Бывают ситуации. Модель настаивает, что Париж — столица Италии. Вы проверили промпт, температуру, seed. Всё равно врёт.
- Сдайтесь: Признайте, что для этой задачи LLM не подходит
- Упростите задачу: Вместо "напиши статью" → "составь план статьи"
- Добавьте человеческий контроль: LLM генерирует черновик, человек проверяет
- Используйте специализированную модель: Для фактов — модель, дообученная на энциклопедиях
Иногда лучший способ бороться с галлюцинациями — не использовать LLM там, где они неизбежны. Жестоко, но честно.
Будущее: World Models и конец эпохи галлюцинаций?
Есть надежда. World Models — следующий шаг. Модели, которые не просто предсказывают слова, а понимают мир. Или хотя бы симулируют понимание.
Но пока это будущее. А сегодня — промпт-инжиниринг, валидация, мониторинг и здоровый скептицизм.
Последний совет: никогда не говорите пользователю "ИИ сказал". Говорите "система сгенерировала ответ на основе паттернов в данных". Это не только точнее, но и снимает с вас ответственность, когда модель всё-таки соврёт.
А она соврёт. Обязательно. Просто теперь вы знаете, как сделать, чтобы это случалось реже.