RAG (Retrieval Augmented Generation) – поисковая дополненная генерация, использующая дополнительную базу данных как дополнение к большой языковой модели (LLM) для повышения точности ответов, устранения галлюцинаций и увеличения производительности.
Современные LLM (ChatGPT, Claude AI и т.п.) имеют ряд недостатков:
Статичность набора данных, которую невозможно устранить;
Отсутствие данных по конкретным предметным областям;
Закрытость данных и отсутствие контроля за источниками информации;
Неэффективность и дороговизна в создании и внедрении.
Использования таких LLM в бизнес-приложениях неэффективно для выполнения контекстно-зависимых задач, требующих точности ответов и актуальности информации.
Для устранения такого рода проблем используется RAG – генерация с расширенным поиском. В этом случае LLM получает актуальные и зависящие от контекста данные из внешней базы данных, и модель может использовать их при генерации. Результат – повышение производительности и точности ответов GenAI.
RAG предоставляет дополнительный контекст и фактическую информацию для генерации обоснованного ответа, при необходимости обозначая источники информации из используемой базы знаний.
Примеры RAG: SGE, Bard, Perplexity AI. Эти модели используют данные из поискового индекса.
RAG позволяет добавить к используемой языковой модели ещё один источник данных, из которого LLM может извлечь недостающую информацию. Работает это как обычная поисковая система: вы задаёте какой-то корпус данных, модель индексирует их, а когда потребуется – извлекает нужные данные, опираясь либо на ключевые слова (tf-idf), либо на контекст (дистрибутивная семантика, которую ошибочно называют “LSI”).
Большая языковая модель – это студент с хорошо подвешенным языком, которому нужно сдать экзамен по теме, которую он не знает. RAG выступает в качестве шпаргалки, благодаря которой экзаменаторам ещё сложнее понять, что студент не знает тему абсолютно.
Основные стадии процесса генерации с расширенным поиском:
Входной кодировщик кодирует входной запрос в серию векторных вложений (эмбеддингов) для последующих операций.
Нейронный ретривер извлекает наиболее релевантные документы из внешней базы знаний на основе входного запроса, используя либо ключевые слова, либо контекст. Во время извлечения к подсказке добавляются только наиболее релевантные фрагменты документов или графы знаний.
Выходной генератор выводит текст на основе закодированного входного запроса и извлеченных документов. Этот компонент обычно является основополагающим LLM, таким как ChatGPT или Llama2.
Используя RAG с доступной готовой LLM, можно избежать затрат на обучение модели, получение, очистку и маркировку данных. Точная настройка (fine tuning) LLM на новых данных отличается теми же проблемами, что и обучение модели с нуля. Кроме того, современные модели уже не поддерживают тонкую настройку, поскольку она считается устаревшим методом улучшения результатов LLM.
Загруженная информация преобразуется в эмбеддинги. Эмбеддинги анализируются с помощью контекстных функций в векторной базе. На базе контекстного окна формируется ответ. Если запрос не связан с загруженной информацией, ответ формируется через LLM.
“Наивной” реализации шаблона RAG редко бывает достаточно для удовлетворения требований производственного уровня. Это связано с несколькими причинами:
Неоднозначность вопроса. Иногда пользователи задают вопросы, которые не имеют четкого определения и могут привести к нерелевантному поиску.
Низкая точность поиска: не все полученные документы могут иметь одинаковое отношение к рассматриваемому вопросу.
Ограниченные знания: база знаний может не включать информацию, которую ищет пользователь.
Ограничения производительности контекстного окна. Попытка «избыточного извлечения» может повлиять на емкость контекстного окна или иным образом создать контекстное окно, которое будет слишком большим, чтобы вернуть результат за разумный промежуток времени.
Как подготовить данные для RAG
Исходите из того, что данные в этом случае используются не для обучения модели, а для поиска по ключевым словам или контексту. Поэтому ваш датасет должен содержать минимум необходимых данных, совершщенно исчерпывающе отвечающих на заданные запросы.
Отберите заданные документы в форматах, с которыми может работать модель. Обычно речь идёт о txt, pdf, csv, html.
По возможности удалите всю избыточную информацию из данных.
Настройте модель вложений (эмбеддингов) и хранилище векторов. В ряде случаев это уже подразумевается используемой системой.
Загрузите данные в векторную базу, разделяя их на мелкие фрагменты (чанки). Размер чанка определяется опытным путем: маленькие фрагменты обеспечивают большую точность, большие – лучшее понимание контекста.
Хорошая практика – использовать для чанков идентификаторы в метаданных для дальнейшего использования и упрощения поиска чанка в БД.
Методы подготовки чанков для RAG
Цель фрагментирования – добиться возможности извлекать те фрагменты информации, которые более связаны с заданным вопросом, и включать в подсказку LLM только важную часть документа, а не весь текст.
Для управления фрагментированием используются два основных параметра:
[chunk_size] – определяет размер фрагментов текста
[chunk_overlap] – определяет размер перекрывающих фрагментов
Посимвольное фрагментирование
Самый простой вариант, когда текст делится на чанки на основе заданного количества символов. Слова и предложения в этом случае могут быть разбиты в самых неожиданных местах.
Несмотря на это, метод можно признать хорошей отправной точкой на пути к более продвинутым методам.
По умолчанию метод создаёт фрагменты на основе пустого символа [”], использование которого в качестве разделителя позволяет избежать обрезки слов посередине.
Рекурсивное разделение символов
Более продвинутая методика в сравнении с фрагментированием по символам. В этом случае текст разделяется на фрагменты до тех пор, пока не будет выполгнено заданное условие, например, не достигнут минимальный размер фрагмента.
Этот метод гарантирует, что фрагментирование будет соотвтствовать структуре текста и сохранит больше смысла.
Благодаря адаптивности, рекурсивное фрагментирование подходит для текстов с самой разной структурой.
Разделение на специфические чанки
Специфические чанки – фрагменты документа, основанные на его внутренней структуре. Вместо того, чтобы задавать количество символов или рекурсию, используют логические разделы документа, например, абзацы.
Метод сохраняет первоначальную структуру контента и сохраняет связность текста. Метод работает с документами, использующими разметку (Markdown), HTML-документами и т.п.
Фрагментирование на основе токенов
LLM в конвейере RAG имеет лимит токенов, за пределы которого нельзя выходить. При фрагментировании текста на чанки нужно подсчитывать количество токенов. Рекомендуется использовать тот же токенизатор, что используется в LLM.
Для этой цели доступны также и сплиттеры.
Семантическое фрагментирование
В этом случае чанки создаются с учетом их связей в тексте. Каждый чанк выступает как осмысленный завершенный фрагмент. Такой подход обеспечивает целостность информации во время поиска и получение точного и контекстуально релевантного результата.
Семантическое фрагментирование подразумевает эмбеддинги для каждого предложения в документе, сравнение сходства всех предложений друг с другом и группировку их с наиболее похожими вложениями.
Акцент в этом случае делается на значении и контексте, и результаты поиска отличаются высокой точностью. Однако метод требует больше усилий и ресурсов, работает заметно медленнее более простых методов.
Фрагментирование с помощью агента
Метод имитирует человеческий подход к разделению текста на фрагменты. В этом случае обычно рассматривается верхняя часть документа. Дальнейший просмотр определяет, связан ли текст всё ещё с первым фрагментом или начат другой, новый.
Метод считается новым, требующим много ресурсов, доступной версии в паблике ещё нет.
RAG — это наиболее экономичный, простой в реализации и наименее рискованный путь к повышению производительности приложений GenAI. В рамках SEO RAG может использоваться как для генерации более качественного контента, так и как инструмент для семантического аудита сайта. В этом случае вы можете оценить семантическую полноту, возможности машиночитаемости, соответствие контента пользовательским поисковым намерениям, используя сайт как базу данных для RAG.