Проблема «галлюцинаций» и решение через RAG

У современных больших языковых моделей (LLM) есть три существенных ограничения. Во-первых, они не знают о данных, которых не было в их обучающей выборке, например, о ваших личных файлах. Во-вторых, они не владеют информацией о событиях, произошедших после даты завершения их обучения. В-третьих, если модель не находит точного ответа, она склонна генерировать правдоподобный, но фактически неверный текст — это называют галлюцинациями.

Существует два способа дать модели новые знания. Первый — это fine-tuning (дообучение), когда веса модели изменяются с помощью градиентного спуска. Второй — это RAG (Retrieval-Augmented Generation). В этом случае веса модели не меняются, а используется механизм in-context learning: релевантные фрагменты текста подставляются прямо в промпт, и модель связывает вопрос с этим контекстом.

Подготовка данных: нарезка текста на чанки

У моделей есть жесткий лимит на объем входных данных из-за сложности вычислений. Чтобы передать большой документ, его нужно разбить на части — чанки. Существует несколько способов это сделать. Fixed chunking — это простая нарезка по фиксированному количеству символов с небольшим перекрытием (overlap), чтобы не потерять смысл на стыках. Recursive chunking — более умный метод: текст сначала делится по абзацам, затем по предложениям и так далее, пока фрагменты не станут нужного размера.

Также выделяют семантический метод (по смыслу) и структурированный (по заголовкам и секциям). Однако первые два метода требуют дополнительных вычислительных ресурсов. При рекурсивном делении важно не дойти до уровня отдельных слов, так как они не несут полезной информации для поиска, поэтому мелкие обрывки текста принято склеивать обратно до целевого размера.

Векторный поиск и эмбеддинги

Чтобы найти нужный фрагмент, текст превращают в эмбеддинги — векторы фиксированной размерности. Чем ближе векторы двух текстов друг к другу в этом пространстве, тем больше они похожи по смыслу. Для поиска часто используют Bi-encoder: он независимо кодирует запрос и документ, а затем сравнивает их с помощью косинусного сходства. Это быстрый способ найти кандидатов в огромной базе данных.

Для хранения таких векторов используется векторное хранилище (Vector Store). Оно позволяет быстро находить наиболее подходящие фрагменты, используя математические операции над матрицами, что обеспечивает высокую производительность даже при наличии тысяч документов.

Уточнение результатов: механизм реранкинга

Хотя Bi-encoder работает быстро, он может ошибаться, так как кодирует запрос и документ по отдельности. Чтобы повысить точность, применяют реранкинг — повторную сортировку отобранных кандидатов. Для этого используется Cross-encoder. В отличие от первого метода, он подает запрос и документ как единую последовательность, позволяя модели напрямую сопоставлять слова друг с другом.

Использовать Cross-encoder для всей базы данных невозможно: это слишком ресурсозатратно, так как для каждого документа из базы пришлось бы запускать отдельный полный цикл вычислений. Поэтому стандартный подход подразумевает двухэтапную схему: быстрый поиск через Bi-encoder и точное уточнение (реранкинг) только для нескольких лучших кандидатов.

Что это значит

RAG позволяет использовать возможности языковых моделей для работы с актуальными и приватными данными без необходимости их дообучения, обеспечивая точность за счет предоставления модели контекста в момент запроса.