mirror of
https://github.com/trustgraph-ai/trustgraph.git
synced 2026-07-09 05:12:12 +02:00
124 lines
No EOL
14 KiB
Markdown
124 lines
No EOL
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. **Фреймворк оптимизации запросов**
|
||
- Анализ шаблонов запросов и предложения по оптимизации.
|
||
- Координатор пакетных запросов для доступа к базе данных.
|
||
- Пулинг подключений и управление таймаутами запросов.
|
||
- Мониторинг производительности. |