Проблема LLM: знания, галлюцинации и контекст
Этот урок объясняет, какие фундаментальные ограничения LLM делают RAG необходимым.
LLM (большая языковая модель) — модель, обученная предсказывать следующий токен по огромному корпусу текста. Она знает только то, что встретила во время обучения.
Четыре стены, в которые упирается чистая LLM
Языковые модели поражают тем, как складно говорят. Но как только нужно ответить про конкретный факт из вашей компании или про вчерашнюю новость, всплывают четыре проблемы.
1. Устаревшие знания (knowledge cutoff)
Модель видела данные до определённой даты — это её cutoff. Всё, что появилось после, для неё не существует. Спросите про релиз, вышедший на прошлой неделе, и модель либо честно скажет, что не знает, либо начнёт фантазировать.
2. Галлюцинации
Модель не хранит факты как база данных — она моделирует вероятности слов. Когда фактов не хватает, она всё равно генерирует правдоподобный текст. Так появляются выдуманные API, несуществующие цитаты и ложные номера статей закона. Текст звучит уверенно, но он неверен.
3. Нет доступа к приватным данным
Внутренняя документация, тикеты поддержки, ваши PDF, база знаний компании — ничего этого в обучающем корпусе не было. Модель в принципе не может знать содержимое ваших файлов.
4. Лимит контекста
У модели есть контекстное окно — сколько токенов она может прочитать за раз. Даже если окно большое, засунуть туда всю корпоративную вики нельзя: это дорого, медленно и качество падает. Нужен способ подавать только релевантное.
Почему «просто дообучить» — не всегда ответ
Кажется логичным: дообучим модель на наших данных. Но дообучение дорогое, требует данных и времени, и оно плохо подходит для фактов, которые часто меняются. Каждое обновление прайса или регламента — новый цикл дообучения. К сравнению вернёмся в отдельном уроке.
Маленькая иллюстрация галлюцинации
Представим «модель», которая просто продолжает фразу по шаблону, не сверяясь с фактами. Она всегда выдаёт уверенный ответ — даже когда данных нет.
facts = {"столица Франции": "Париж"}
def confident_model(question):
# «модель» всегда отвечает уверенно, даже если не знает
if question in facts:
return facts[question]
return "Точно знаю: это Лион" # выдумка, поданная уверенно
for q in ["столица Франции", "столица Австралии"]:
print(q, "->", confident_model(q))Вывод:
столица Франции -> Париж столица Австралии -> Точно знаю: это Лион
Второй ответ — галлюцинация: уверенно и неправильно (столица Австралии — Канберра). Реальные LLM сложнее, но механизм тот же: при нехватке знаний модель не молчит, а достраивает правдоподобное. RAG борется ровно с этим — даёт модели реальный источник под рукой.
Итог
- Чистая LLM ограничена: cutoff, галлюцинации, нет приватных данных, лимит контекста.
- Галлюцинация — не баг, а следствие того, что модель генерирует вероятный текст, а не сверяется с фактами.
- Дообучение дорого и плохо подходит для быстро меняющихся фактов.