mirror of
https://github.com/trustgraph-ai/trustgraph.git
synced 2026-07-09 13:22:10 +02:00
124 lines
14 KiB
Markdown
124 lines
14 KiB
Markdown
|
|
# Техническое задание по оптимизации производительности GraphRAG
|
|||
|
|
|
|||
|
|
## Обзор
|
|||
|
|
|
|||
|
|
Данное техническое задание описывает комплексные оптимизации производительности алгоритма GraphRAG (Graph Retrieval-Augmented Generation) в системе TrustGraph. Текущая реализация страдает от существенных проблем с производительностью, которые ограничивают масштабируемость и время отклика. Данное задание охватывает четыре основные области оптимизации:
|
|||
|
|
|
|||
|
|
1. **Оптимизация обхода графа**: Устранение неэффективных рекурсивных запросов к базе данных и реализация пакетной обработки графа.
|
|||
|
|
2. **Оптимизация разрешения меток**: Замена последовательной выборки меток параллельными/пакетными операциями.
|
|||
|
|
3. **Улучшение стратегии кэширования**: Реализация интеллектуального кэширования с вытеснением по алгоритму LRU и предварительной загрузкой.
|
|||
|
|
4. **Оптимизация запросов**: Добавление мемоизации результатов и кэширования векторов для повышения скорости отклика.
|
|||
|
|
|
|||
|
|
## Цели
|
|||
|
|
|
|||
|
|
- **Сокращение количества запросов к базе данных**: Достижение снижения общего количества запросов к базе данных на 50-80% за счет пакетной обработки и кэширования.
|
|||
|
|
- **Улучшение времени отклика**: Ускорение построения подграфа в 3-5 раза и ускорение разрешения меток в 2-3 раза.
|
|||
|
|
- **Повышение масштабируемости**: Поддержка более крупных графовых баз знаний с улучшением управления памятью.
|
|||
|
|
- **Сохранение точности**: Сохранение существующей функциональности GraphRAG и качества результатов.
|
|||
|
|
- **Обеспечение параллельности**: Улучшение возможностей параллельной обработки для множества одновременных запросов.
|
|||
|
|
- **Уменьшение занимаемой памяти**: Реализация эффективных структур данных и управления памятью.
|
|||
|
|
- **Добавление наблюдаемости**: Включение метрик производительности и возможностей мониторинга.
|
|||
|
|
- **Обеспечение надежности**: Добавление механизмов обработки ошибок и таймаутов.
|
|||
|
|
|
|||
|
|
## Описание проблемы
|
|||
|
|
|
|||
|
|
Текущая реализация GraphRAG, находящаяся в файле `trustgraph-flow/trustgraph/retrieval/graph_rag/graph_rag.py`, имеет ряд критических проблем с производительностью, которые серьезно влияют на масштабируемость системы:
|
|||
|
|
|
|||
|
|
### Текущие проблемы с производительностью
|
|||
|
|
|
|||
|
|
**1. Неэффективный обход графа (`follow_edges` function, строки 79-127)**
|
|||
|
|
- Выполняет 3 отдельных запроса к базе данных для каждой сущности на каждом уровне глубины.
|
|||
|
|
- Шаблон запроса: запросы на основе субъекта, предиката и объекта для каждой сущности.
|
|||
|
|
- Отсутствие пакетной обработки: Каждый запрос обрабатывает только одну сущность за раз.
|
|||
|
|
- Отсутствие обнаружения циклов: Может повторно посещать одни и те же узлы несколько раз.
|
|||
|
|
- Рекурсивная реализация без мемоизации приводит к экспоненциальной сложности.
|
|||
|
|
- Временная сложность: O(entities × max_path_length × triple_limit³)
|
|||
|
|
|
|||
|
|
**2. Последовательное разрешение меток (`get_labelgraph` function, строки 144-171)**
|
|||
|
|
- Обрабатывает каждый компонент тройки (субъект, предикат, объект) последовательно.
|
|||
|
|
- Каждый вызов `maybe_label` потенциально вызывает запрос к базе данных.
|
|||
|
|
- Отсутствует параллельное выполнение или пакетная обработка запросов меток.
|
|||
|
|
- Приводит до 3 × subgraph_size отдельных запросов к базе данных.
|
|||
|
|
|
|||
|
|
**3. Примитивная стратегия кэширования (`maybe_label` function, строки 62-77)**
|
|||
|
|
- Простой кэш в виде словаря без ограничений размера или TTL.
|
|||
|
|
- Отсутствие политики вытеснения из кэша приводит к неограниченному росту использования памяти.
|
|||
|
|
- Пропуски в кэше вызывают отдельные запросы к базе данных.
|
|||
|
|
- Отсутствует предварительная загрузка или интеллектуальное "прогрев" кэша.
|
|||
|
|
|
|||
|
|
**4. Субоптимальные шаблоны запросов**
|
|||
|
|
- Запросы на поиск сходства векторов сущностей не кэшируются между похожими запросами.
|
|||
|
|
- Отсутствует мемоизация результатов для повторяющихся шаблонов запросов.
|
|||
|
|
- Отсутствует оптимизация запросов для распространенных сценариев доступа.
|
|||
|
|
|
|||
|
|
**5. Критические проблемы с временем жизни объектов (`rag.py:96-102`)**
|
|||
|
|
- **Объект GraphRag пересоздается для каждого запроса**: Новый экземпляр создается для каждого запроса, что приводит к потере всех преимуществ кэширования.
|
|||
|
|
- **Объект Query имеет очень короткое время жизни**: Создается и уничтожается в рамках выполнения одного запроса (строки 201-207).
|
|||
|
|
- **Кэш меток сбрасывается для каждого запроса**: "Прогрев" кэша и накопленные знания теряются между запросами.
|
|||
|
|
- **Накладные расходы на повторное создание клиента**: Клиенты базы данных потенциально переподключаются для каждого запроса.
|
|||
|
|
- **Отсутствует оптимизация между запросами**: Невозможно воспользоваться преимуществами шаблонов запросов или совместного использования результатов.
|
|||
|
|
|
|||
|
|
### Анализ влияния на производительность
|
|||
|
|
|
|||
|
|
Текущий наихудший сценарий для типичного запроса:
|
|||
|
|
- **Извлечение сущности**: 1 запрос на поиск сходства векторов.
|
|||
|
|
- **Обход графа**: entities × max_path_length × 3 × triple_limit запросов.
|
|||
|
|
- **Разрешение меток**: subgraph_size × 3 отдельных запросов на метки.
|
|||
|
|
|
|||
|
|
Для параметров по умолчанию (50 сущностей, глубина 2, лимит 30 троек, размер подграфа 150):
|
|||
|
|
- **Минимальное количество запросов**: 1 + (50 × 2 × 3 × 30) + (150 × 3) = **9,451 запросов к базе данных**.
|
|||
|
|
- **Время отклика**: 15-30 секунд для графов умеренного размера.
|
|||
|
|
- **Использование памяти**: Неограниченный рост кэша со временем.
|
|||
|
|
- **Эффективность кэша**: 0% - кэш сбрасывается при каждом запросе.
|
|||
|
|
- **Накладные расходы на создание объектов**: Объекты GraphRag + Query создаются/уничтожаются для каждого запроса.
|
|||
|
|
|
|||
|
|
Данное техническое задание решает эти проблемы путем реализации пакетных запросов, интеллектуального кэширования и параллельной обработки. Оптимизируя шаблоны запросов и доступ к данным, TrustGraph может:
|
|||
|
|
|
|||
|
|
- Поддерживать графовые базы знаний предприятия с миллионами сущностей.
|
|||
|
|
- Обеспечивать время отклика менее 1 секунды для типичных запросов.
|
|||
|
|
- Обрабатывать сотни одновременных запросов GraphRAG.
|
|||
|
|
- Эффективно масштабироваться с ростом размера и сложности графа.
|
|||
|
|
|
|||
|
|
## Технический дизайн
|
|||
|
|
|
|||
|
|
### Архитектура
|
|||
|
|
|
|||
|
|
Оптимизация производительности GraphRAG требует следующих технических компонентов:
|
|||
|
|
|
|||
|
|
#### 1. **Архитектурная реорганизация для управления временем жизни объектов**
|
|||
|
|
- **Сделать GraphRag долгоживущим**: Перенести экземпляр GraphRag на уровень Processor для сохранения данных между запросами.
|
|||
|
|
- **Сохранить кэши**: Поддерживать кэш меток, кэш векторов и кэш результатов запросов между запросами.
|
|||
|
|
- **Оптимизировать объект Query**: Рефакторинг Query как легковесного контекста выполнения, а не контейнера данных.
|
|||
|
|
- **Сохранение подключений**: Поддерживать подключения к базе данных между запросами.
|
|||
|
|
|
|||
|
|
Модуль: `trustgraph-flow/trustgraph/retrieval/graph_rag/rag.py` (изменен)
|
|||
|
|
|
|||
|
|
#### 2. **Оптимизированный движок обхода графа**
|
|||
|
|
- Заменить рекурсивный `follow_edges` итеративным поиском в ширину.
|
|||
|
|
- Реализовать пакетную обработку сущностей на каждом уровне обхода.
|
|||
|
|
- Добавить обнаружение циклов с отслеживанием посещенных узлов.
|
|||
|
|
- Включить раннее завершение при достижении лимитов.
|
|||
|
|
|
|||
|
|
Модуль: `trustgraph-flow/trustgraph/retrieval/graph_rag/optimized_traversal.py`
|
|||
|
|
|
|||
|
|
#### 3. **Параллельная система разрешения меток**
|
|||
|
|
- Пакетная обработка запросов меток для нескольких сущностей одновременно.
|
|||
|
|
- Реализация паттернов async/await для параллельного доступа к базе данных.
|
|||
|
|
- Добавление интеллектуальной предварительной загрузки для распространенных шаблонов меток.
|
|||
|
|
- Включение стратегий "прогрева" кэша меток.
|
|||
|
|
|
|||
|
|
Модуль: `trustgraph-flow/trustgraph/retrieval/graph_rag/label_resolver.py`
|
|||
|
|
|
|||
|
|
#### 4. **Консервативный слой кэширования меток**
|
|||
|
|
- Кэш LRU с коротким TTL только для меток (5 минут) для баланса между производительностью и согласованностью.
|
|||
|
|
- Мониторинг метрик кэша и коэффициента попадания.
|
|||
|
|
- **Без кэширования векторов**: Уже кэшируются на уровне запроса, нет пользы для между запросами.
|
|||
|
|
- **Без кэширования результатов запросов**: Из-за проблем согласованности данных в графе.
|
|||
|
|
|
|||
|
|
Модуль: `trustgraph-flow/trustgraph/retrieval/graph_rag/cache_manager.py`
|
|||
|
|
|
|||
|
|
#### 5. **Фреймворк оптимизации запросов**
|
|||
|
|
- Анализ шаблонов запросов и предложения по оптимизации.
|
|||
|
|
- Координатор пакетных запросов для доступа к базе данных.
|
|||
|
|
- Пулинг подключений и управление таймаутами запросов.
|
|||
|
|
- Мониторинг производительности.
|