Улучшение RAG с помощью графов знаний
Знакомство с RAG и связанными с ним проблемами
Генерация с дополненной выборкой (RAG) — это метод, который соединяет внешние источники данных для улучшения вывода больших языковых моделей (LLM). Этот метод идеально подходит для LLM для доступа к частным или специфичным для предметной области данным и решения проблем, связанных с галлюцинациями. Поэтому RAG широко используется для поддержки многих приложений GenAI, таких как чат-боты AI и системы рекомендаций.
Базовый RAG обычно объединяет векторную базу данных и LLM, где векторная база данных хранит и извлекает контекстную информацию для пользовательских запросов, а LLM генерирует ответы на основе извлеченного контекста. Этот подход хорошо работает во многих случаях, однако он испытывает трудности со сложными задачами, такими как многоадресное рассуждение или ответы на вопросы, требующие соединения разрозненных фрагментов информации.
Например, вопрос «Какое имя было дано сыну человека, который победил узурпатора Аллектуса?»
Для ответа на этот вопрос базовый RAG обычно выполняет следующие шаги:
- Определяет человека: определяет, кто победил Аллектуса.
- Определяет сына человека: ищет информацию о семье этого человека, в частности о его сыне.
- Ищет имя: определяет имя сына.
Проблема обычно возникает на первом этапе, поскольку базовый RAG извлекает текст на основе семантического сходства, а не напрямую отвечает на сложные запросы, где конкретные детали могут не быть упомянуты в наборе данных. Это ограничение затрудняет поиск точной необходимой информации, часто требуя дорогостоящих и непрактичных решений, таких как ручное создание пар вопросов и ответов для частых запросов.
Что такое GraphRAG и как он работает?
В отличие от базового RAG, который использует векторную базу данных для извлечения семантически похожего текста, GraphRAG улучшает RAG, включая графы знаний (KG). Графы знаний — это структуры данных, которые хранят и связывают данные на основе их отношений.
Конвейер GraphRAG обычно состоит из двух основных процессов: индексации и обработки запросов.
Индексация
Процесс индексации состоит из четырех основных этапов:
- Сегментация текстовых единиц: весь входной корпус делится на несколько текстовых единиц (текстовых фрагментов). Эти фрагменты являются наименьшими анализируемыми единицами и могут быть абзацами, предложениями или другими логическими единицами. Сегментируя длинные документы на более мелкие фрагменты, мы можем извлекать и сохранять более подробную информацию об этих входных данных.
- Извлечение сущностей, связей и утверждений: GraphRAG использует LLM для идентификации и извлечения всех сущностей (имен людей, мест, организаций и т. д.), связей между ними и ключевых утверждений, выраженных в тексте из каждой текстовой единицы. Мы будем использовать эту извлеченную информацию для построения начального графа знаний.
- Иерархическая кластеризация: GraphRAG использует алгоритм Лейдена для выполнения иерархической кластеризации на начальных графах знаний. Лейден — это алгоритм обнаружения сообществ, который может эффективно обнаруживать структуры сообществ в графе. Сущности в каждом кластере назначаются разным сообществам для более глубокого анализа. Примечание: сообщество — это группа узлов в графе, которые плотно связаны друг с другом, но слабо связаны с другими плотными группами в сети.
- Генерация сводки сообщества: GraphRAG генерирует сводки для каждого сообщества и его участников, используя подход «снизу вверх». Эти сводки включают основные сущности в сообществе, их отношения и ключевые утверждения. Этот шаг дает обзор всего набора данных и предоставляет полезную контекстную информацию для последующих запросов.
Обработка запросов
GraphRAG имеет два различных рабочих процесса обработки запросов, адаптированных для разных запросов.
- Глобальный поиск для рассуждений о целостных вопросах, связанных со всем корпусом данных, путем использования сводок сообщества.
- Локальный поиск для рассуждений о конкретных сущностях путем распространения на их соседей и связанных с этим концепциях.
Этот рабочий процесс глобального поиска включает следующие фазы.
- История запросов и диалогов пользователей: система принимает историю запросов и разговоров пользователей в качестве начальных входных данных.
- Пакеты отчетов о сообществах: в качестве контекстных данных система использует отчеты о сообществах узлов, сгенерированных LLM из указанного уровня иерархии сообщества. Эти отчеты сообщества перемешиваются и делятся на несколько пакетов (Пакет 1, Пакет 2… Пакет N).
- RIR (Оцененные промежуточные ответы): Каждый пакет отчетов сообщества далее делится на текстовые фрагменты предопределенного размера. Каждый текстовый фрагмент используется для генерации промежуточного ответа. Ответ содержит список информационных фрагментов, называемых пунктами. Каждый пункт имеет числовую оценку, указывающую ее важность. Эти сгенерированные промежуточные ответы являются Оцененными промежуточными ответами (Ответ 1, Ответ 2… Ответ N).
- Ранжирование и фильтрация: система ранжирует и фильтрует эти промежуточные ответы, выбирая наиболее важные пункты. Выбранные важные пункты формируют Агрегированные промежуточные ответы.
- Окончательный ответ: Агрегированные промежуточные ответы используются в качестве контекста для генерации окончательного ответа.
Когда пользователи задают вопросы о конкретных сущностях (например, имена людей, места, организации и т. д.), мы рекомендуем использовать процесс локального поиска. Этот процесс включает следующие шаги:
- Запрос пользователя: Сначала система получает запрос пользователя, который может быть простым вопросом или более сложным запросом.
- Поиск похожих сущностей: система идентифицирует набор сущностей из графа знаний, которые семантически связаны с пользовательским вводом. Эти сущности служат точками входа в граф знаний. На этом этапе для проведения поиска по схожести текста используется векторная база данных, например, Milvus.
- Сопоставление сущности и текстовых единиц: извлеченные текстовые единицы сопоставляются с соответствующими сущностями, удаляя исходную текстовую информацию.
- Извлечение сущностей и связей: на этом этапе извлекается конкретная информация о сущностях и их соответствующих связях.
- Сопоставление сущностей с ковариатами: на этом этапе сущности сопоставляются с их ковариатами, которые могут включать статистические данные или другие соответствующие атрибуты.
- Сопоставление сущностей с отчетами о сообществах: отчеты сообщества интегрируются в результаты поиска, включая некоторую глобальную информацию.
- Использование истории диалогов: система использует историю диалогов, чтобы лучше понять намерение и контекст пользователя.
- Генерация ответа: система конструирует и отвечает на запрос пользователя на основе отфильтрованных и отсортированных данных, которые были сгенерированы на предыдущих этапах.
Сравнение базового RAG и GraphRAG по качеству выходных данных
Чтобы продемонстрировать эффективность GraphRAG, его создатели сравнили качество выходных данных базового RAG и GraphRAG в своем блоге. Для иллюстрации я приведу простой пример.
Используемый набор данных
Для своих экспериментов создатели GraphRAG использовали набор данных «Информация о насильственных инцидентах из новостных статей» (VIINA).
Примечание: этот набор данных содержит деликатные темы. Он был выбран исключительно из-за своей сложности и наличия различных мнений и частичной информации.
Обзор эксперимента
Базовому RAG и GraphRAG задавали один и тот же вопрос, который для составления ответа требует агрегации информации по всему набору данных.
Вопрос: Каковы 5 основных тем в наборе данных?
Ответы показаны на изображении ниже. Результаты базового RAG не имели отношения к военной тематике, поскольку векторный поиск давал несвязанный текст, что приводило к неточной оценке. Напротив, GraphRAG предоставил четкий и релевантный ответ, определив основные темы и вспомогательные детали. Результаты были согласованы с набором данных со ссылками на исходный материал.
Дальнейшие эксперименты, приведенные в статье «От локального к глобальному: подход Graph RAG к резюмированию, ориентированному на запросы», показали, что GraphRAG значительно улучшает многоадресное рассуждение и сложное резюмирование информации. Исследование показало, что GraphRAG превосходит базовый RAG как по полноте, так и по разнообразию:
- Полнота: степень, в которой ответ охватывает все аспекты вопроса.
- Разнообразие: разнообразие и богатство точек зрения и идей, которые содержатся в ответе.
Для получения более подробной информации об этих экспериментах мы рекомендуем вам прочитать оригинальную статью GraphRAG.
Как реализовать GraphRAG с векторной базой данных Milvus
GraphRAG расширяет приложения RAG с помощью графов знаний, а также использует векторную базу данных для извлечения соответствующих сущностей. В этом разделе показано, как реализовать GraphRAG, создать индекс GraphRAG и запросить его с помощью векторной базы данных Milvus.
Предварительные условия
Перед запуском кода убедитесь, что вы установили следующие зависимости:
Примечание: мы установили GraphRAG из форк репозитория, поскольку на момент написания статьи функция хранения Milvus все еще ожидает официального слияния.
Начнем с рабочего процесса индексации.
Подготовка данных
Загрузите из Project Gutenberg небольшой текстовый файл примерно с тысячей строк и используйте его для индексации GraphRAG.
Этот набор данных посвящен истории Леонардо да Винчи. Мы используем GraphRAG для построения графического индекса всех связей, касающихся да Винчи, и векторной базой данных Milvus для поиска соответствующих знаний для ответа на вопросы.
Инициализация рабочей области
Теперь давайте используем GraphRAG для индексации текстового файла. Чтобы инициализировать рабочую область, сначала запустим команду graphrag.index --init.
Настройка файла env и параметров
Вы найдете файл .env в корневом каталоге индекса. Чтобы использовать его, добавьте свой ключ API OpenAI в файл .env.
Важные примечания:
- В этом примере мы будем использовать модели OpenAI, поэтому убедитесь, что у вас есть готовый ключ API.
- Индексация GraphRAG требует больших затрат, поскольку она обрабатывает весь текстовый корпус с помощью LLM. Чтобы сэкономить деньги, попробуйте сократить текстовый файл до меньшего размера.
Запуск конвейера индексации
Процесс индексации займет некоторое время. После завершения в папке ./graphrag_index/output/<timestamp>/ появится новая директория с артефактами, содержащими серию файлов в формате Parquet.
Обработка запросов с помощью векторной базы данных Milvus
На этапе выполнения запросов мы используем Milvus для хранения эмбеддингов описаний сущностей, необходимых для локального поиска в GraphRAG. Этот подход объединяет структурированные данные из графа знаний с неструктурированными данными из входных документов, что позволяет дополнить контекст LLM релевантной информацией о сущностях и обеспечить более точные ответы.
Загрузка данных из процесса индексации
В процессе индексации будет сгенерировано несколько файлов parquet. Мы загружаем их в память и сохраняем информацию об описании сущностей в векторной базе данных Milvus.
Чтение сущностей:
Количество сущностей: 651
Чтение связей
Количество связей: 290
Чтение отчетов сообщества
Записи отчетов: 45
Чтение текстовых единиц
Записи текстовых единиц: 51
Создание локальной поисковой системы
Мы подготовили необходимые данные для локальной поисковой системы. Теперь мы можем создать с их помощью экземпляр LocalSearch, LLM и модель эмбеддингов.
Создание запроса
Результаты GraphRAG конкретны, с четко обозначенными цитируемыми источниками данных.
Генерация вопросов
GraphRAG также может генерировать вопросы на основе исторических запросов, что полезно для создания рекомендуемых вопросов в диалоге чат-бота. Этот метод объединяет структурированные данные из графа знаний с неструктурированными данными из входных документов для создания потенциальных вопросов, связанных с определенными сущностями.
Генерация вопросов на основе истории.
Вы можете удалить корень индекса, если хотите удалить индекс, чтобы освободить место.
Резюме
В этой статье мы изучили GraphRAG, инновационный метод, который улучшает технологию RAG за счет интеграции графов знаний. GraphRAG идеально подходит для решения сложных задач, таких как многошаговое рассуждение и ответы на комплексные вопросы, требующие связывания разрозненных фрагментов информации.
В сочетании с векторной базой данных Milvus, GraphRAG может эффективно анализировать сложные семантические связи в больших наборах данных, предоставляя более точные и глубокие результаты. Эта мощная комбинация делает GraphRAG незаменимым инструментом для различных практических приложений в области генеративного ИИ, предоставляя надежное решение для понимания и обработки сложной информации.
Понравилась статья? Еще больше информации на тему данных, AI, ML, LLM вы можете найти в моем Telegram канале.
- Как подготовиться к сбору данных, чтобы не провалиться в процессе?
- Какие данные нужны для обучения LLM?
- В чем специфика работы с GenAI проектами? И какие бенчмарки сравнения LLM есть на российском рынке?
Обо всем этом читайте в “Роман с данными”