Галлюцинации нейросетей: почему модель выдумывает и как это уменьшить

Полностью убрать выдуманные факты нельзя, но можно сделать их редкими и заметными. Разбираем причины и пять мер с рабочим кодом на Python.

5 мин · · разработка · модели

Галлюцинации нейросети — это уверенные, гладко написанные утверждения, которые не соответствуют действительности: несуществующая функция библиотеки, выдуманная цитата, неверная дата. Главная неприятность в тоне: ошибка звучит так же убедительно, как правда. Полностью избавиться от этого нельзя, но частоту можно снизить, а оставшиеся случаи сделать заметными для проверки. Ниже причины и пять практических мер с кодом. Цены даны на 18 октября 2026.

Почему модель выдумывает

Языковая модель продолжает текст так, чтобы он выглядел правдоподобно. Она не «ищет в базе», и у неё нет встроенного чувства «этого я не знаю». Отсюда типичные причины:

  • Нет данных в запросе. Спросили про ваш внутренний регламент или договор, которых модель не видела. Вместо отказа она строит ответ из общих закономерностей.
  • Редкие и точные факты. Номера, даты, имена, цитаты, ссылки, названия методов в узкой библиотеке. Чем уже тема, тем выше риск.
  • Ложная предпосылка в вопросе. «Почему функция X в библиотеке Y возвращает список?», хотя такой функции нет. Модель склонна принять вопрос как данность.
  • Устаревшие знания. Модель обучена до определённой даты и не знает о более поздних изменениях.
  • Очень длинный или неряшливый контекст. Нужный факт утонул среди прочего, и модель могла его не использовать. Проверить это можно, положив контрольный факт в разные места длинного текста.

Риск ниже там, где модель работает с текстом, который вы ей дали: перефразировать, сократить, преобразовать формат. Но и тут возможны искажения чисел, поэтому проверки нужны всегда.

Мера 1. Дайте источник в запрос

Самая действенная защита — не спрашивать «по памяти». Вставьте в запрос фрагменты документа и потребуйте отвечать только по ним. Так устроен подход RAG. Если вы искали, что такое RAG, объясняем простыми словами: перед вопросом программа находит в вашей базе несколько подходящих фрагментов и подставляет их в запрос, а модель формулирует ответ по этим фрагментам. Минимальная схема описана в статье RAG-пайплайн своими руками.

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

Мера 2. Разрешите сказать «не знаю»

Если в инструкции нет явного выхода, модель выберет ответ, даже слабо обоснованный. Прямо пропишите: «Если в источниках нет ответа, верни null». Именно так, структурой, а не фразой «постарайся не ошибаться». Хорошая привычка в промпт-инжиниринге для LLM (о системной части запроса см. статью Как писать системные промпты): описывать не только что делать, но и что делать, когда сделать нечего.

Мера 3. Требуйте цитату

Попросите модель вернуть не только ответ, но и дословную цитату из источника, на которую он опирается. Цитату можно проверить кодом: она либо есть в источнике, либо нет. Это превращает расплывчатое «доверяю» в проверяемое условие.

Мера 4. Проверяйте кодом, а не взглядом

Код ниже собирает все три меры: источники в запросе, право на отказ и цитата с автоматической проверкой. Понадобится pip install openai:

bash
import json
from openai import OpenAI

client = OpenAI(base_url="https://api.zukko.pro/v1", api_key="fetch_ваш_ключ")

SOURCES = {
    "s1": "Возврат денег выполняется в течение 5 рабочих дней после подтверждения недоставки.",
    "s2": "Доставка по городу занимает от одного до трёх рабочих дней.",
}

SYSTEM = """Отвечай только по источникам. Ничего не добавляй из своих знаний.
Верни только JSON: {"answer": "...", "source": "s1", "quote": "дословная цитата из источника"}.
Если в источниках нет ответа, верни {"answer": null, "source": null, "quote": null}."""

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

Мера 5. Второй проход и контрольные вопросы

Если цена ошибки высока, добавьте второй вызов: отдайте другой модели источники и ответ и попросите перечислить утверждения, которых нет в источниках. Это дороже, но ловит то, что пропустила проверка цитаты. Рассчитаем на примере: первый вызов — 1600 токенов входа (три фрагмента по 500 токенов и вопрос) и 200 выхода; проверка — 1500 токенов входа и 100 выхода. Это допущения. Цены gpt-6.1-sol на 18 октября 2026: 0.27 вход, 1.32 выход за 1M.

  • Основной вызов: 1600 × 0.27 / 1M + 200 × 1.32 / 1M = 0.000432 + 0.000264 = $0.000696.
  • Проверка: 1500 × 0.27 / 1M + 100 × 1.32 / 1M = 0.000405 + 0.000132 = $0.000537.
  • Вместе: $0.001233, около 0,12 цента за вопрос, или $1.23 за 1000 вопросов.

Проверка кодом из предыдущей меры стоит ноль токенов. Актуальные цены — GET https://api.zukko.pro/v1/models.

Чтобы измерять прогресс, составьте набор из 20–30 вопросов, часть которых намеренно без ответа в источниках («ловушки»), и считайте две доли: сколько правильных ответов и сколько раз модель честно отказалась там, где отказ был нужен. Менять промпт и модель нужно, глядя на эти числа, а не на ощущения. Как собрать такой прогон, показывает статья Как тестировать промпты.

Все поля запроса из примера, включая messages и роли, разобраны в справке по Chat Completions. Ключ для экспериментов выдаётся в кабинете, а баланс из России пополняется через СБП (плюс 8,5% комиссии платёжной страницы), картой MasterCard или криптовалютой.

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

Можно ли полностью убрать галлюцинации?

Нет. Можно снизить частоту и сделать ошибки заметными: источники в запросе, право на отказ, цитаты и автоматические проверки. Для критичных решений нужен человек.

Влияет ли выбор модели на галлюцинации?

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

Что такое RAG и поможет ли он?

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

Как понять, что модель выдумала ссылку или цитату?

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

zukko

Платите в 25×
меньше

за Claude Code & ChatGPT

Один ключ fetch_* и base URL api.zukko.pro — в Cursor, Claude Code, Codex и любом SDK.