Как мы улучшали качество поиска с помощью графа знаний и что из этого вышло

Как мы улучшали качество поиска с помощью графа знаний и что из этого вышло

В Сбере мы работаем над улучшением поиска в экосистеме, включая ИИ-помощника ГигаЧат и Сбербанк Онлайн. Основа поиска — векторные и гибридные системы, но у них есть ограничения. Мы решили проверить, поможет ли граф знаний повысить качество ответов.

Почему векторный поиск не всегда работает

Векторный поиск превращает текст в вектор — точку в многомерном пространстве. Похожие тексты оказываются рядом, и система находит ближайшие к запросу. Но есть три ключевые проблемы:

  • Один вектор — один смысл. Документ сжимается в один вектор, и все его смыслы усредняются. При большом объёме данных (от 500 тыс. документов) векторы «сливаются», теряя нюансы.
  • Семантическое сходство ≠ релевантность. Поиск возвращает похожий текст, но не обязательно ответ. Для аналитических запросов (например, «Почему X привело к Y?») это критично.
  • Нет памяти о связях. Векторный поиск не видит, что одна и та же сущность упоминается в разных документах. Многошаговые вопросы (например, «Кто руководил компанией, которую приобрела организация, финансирующая X?») он не решает.

Граф знаний помогает решить эти проблемы: хранит сущности и связи явно, позволяет делать направленный обход и возвращает структурно точный контекст.

Первый подход: граф из готового дампа

Мы начали с публичного графа знаний Yago — 120 млн фактов, построенных на основе Wikidata. Выбрали его из-за строгой схемы типов и готовой структуры. Данные загрузили в Apache Jena Fuseki, создали API на Go и подключили ИИ-агента.

Агент работает в пять этапов:

  1. Выделение сущностей — LLM извлекает из запроса именованные сущности.
  2. API Router — подставляет сущность в SPARQL- или Cypher-шаблон.
  3. Выполнение запроса — графовая база возвращает узлы и связи.
  4. Ранжирование — результаты сортируются по весу узлов и рёбер.
  5. Суммаризация — LLM формирует финальный ответ.

Выбор графовой базы данных

У нас было два сценария:

  • RAG — нужна скорость и целостность данных.
  • Хранилище — большой объём, масштабируемость.

Для RAG рассмотрели FalkorDB и Memgraph, для хранилища — NebulaGraph и JanusGraph. Но начали с Apache Jena Fuseki — она быстро загрузила дамп Yago, но не справлялась с тяжёлыми аналитическими запросами.

Эксперименты и первые результаты

Мы провели 13 экспериментов и 184 замера на бенчмарке ruSimpleQA (4326 вопросов). Граф подключали как дополнительный источник: его ответы объединялись с векторным поиском и передавались реранкеру.

Пробовали:

  • Расширить граф через API IMDB.
  • Ранжировать сущности по количеству связей.
  • Ограничить количество возвращаемых узлов.
  • Поиск на глубину 3 с контролем ветвления.
  • Поиск в ширину (1–2 хопа).
  • Готовые Cypher-шаблоны.
  • Векторный поиск по эмбеддингам узлов.
  • Графовые алгоритмы (например, поиск пути между сущностями).

Итоги первого подхода

Прирост составил всего +3 п. п. на изолированном агенте. В связке с векторным поиском улучшения не вышли за пределы статистической погрешности.

Почему не сработало:

  • Векторный поиск по графу работал плохо из-за скудных описаний.
  • Yago слишком универсален — тематическая специфика теряется.
  • Каждый шаг в цепочке агента накапливает ошибки.

исходный запрос → выделение сущности → получение результатов из баз → агрегирование ответов из нескольких источников → суммаризация → ответ → оценка llm-as-a-judge

Второй подход: LightRAG на собственных документах

Мы сменили стратегию: вместо универсального графа построили граф из своих документов. Выбрали LightRAG — легковесный RAG-фреймворк с двухуровневым поиском.

Как работает LightRAG

LightRAG решает три главные проблемы векторного поиска:

  • чанки слишком маленькие и теряют контекст;
  • чанки разрозненны — из разных документов;
  • LLM не всегда связывает куски воедино.

LightRAG выделяет сущности и связи, сохраняя контекст между чанками, и делает дедупликацию.

Режимы запроса

  • Только локальные связи.
  • Глобальный обзор по тематическим связям.
  • Комбинация local + global (по умолчанию).
  • Простой векторный поиск.
  • Гибридный + наивный с переранжированием.
  • Прямой запрос к LLM без RAG.

Как выполняется запрос (гибридный режим)

  • Из запроса выделяются high-level (широкие темы) и low-level (конкретные сущности) ключевые слова.
  • Векторный поиск: high-level ищет по вектору связей, low-level — по вектору узлов + один хоп по связям.
  • Извлекаются свойства узлов и связей.
  • Сортировка по rank (степень узла) и weight (сила связи).
  • Достаются исходные чанки.
  • LLM суммаризирует и формирует ответ.

Индексация: как строится граф

  1. Извлечение сущностей и связей — LLM выделяет узлы и рёбра.
  2. Профилирование — каждая сущность и связь описывается как пара ключ–значение.
  3. Векторизация — значения преобразуются в эмбеддинги.
  4. Хранение — граф и векторы сохраняются вместе, можно добавлять данные без полной переиндексации.

Описание(description) формируется у каждой сущности и связи с помощью LLM на основе чанков, из которых они были выделены. Главная сложность — качество входных данных: очистка, размер чанка и пересечение. Мусор на входе с высокой вероятностью даст мусор на выходе.

Преимущества перед GraphRAG

LightRAG в 30–40 раз дешевле на этапе индексации при сопоставимом качестве. Вместо обхода всего графа он строит релевантный подграф, что снижает нагрузку.

Результаты

Мы проиндексировали корпус документов, на которые векторный поиск не отвечал, и запустили LightRAG на тестовом стенде. Решение дало верные ответы на 74% таких вопросов, что принесло +12 п. п. к точности на полном бенчмарке.

Инфраструктурный вывод: ApeRAG

Развёртывание LightRAG требовало четырёх подов: графовая база, векторная база, MongoDB, API-сервер. Это неудобно. Мы нашли ApeRAG — DevOps-оптимизированная версия LightRAG, позволяющая использовать уже развёрнутые базы. Это значительно упрощает эксплуатацию.

Следующий шаг

Планируем запустить LightRAG на большем объёме данных и проверить гипотезу на production-трафике. Сейчас главный вызов — ускорение построения графа. На H100 с моделями Qwen3-30B и BAAI/bge-m3 индексация идёт со скоростью до 200 документов в час. Этого недостаточно — оптимизация стала приоритетом.

Три главных урока

  1. Консультируйтесь с экспертами. Глубокие знания по графам и GraphRAG сэкономили нам минимум несколько недель.
  2. Не гонитесь за красивыми числами. Большой граф впечатляет, но не всегда даёт прирост. Важно использовать реалистичную методику оценки.
  3. Качество данных важнее архитектуры. Граф — усилитель. Хорошие данные дают хороший граф, мусор — мусор. Инвестиции в очистку окупаются быстрее, чем эксперименты с архитектурой.
Читать оригинал