Здравствуйте. Несколько лет глубоко погружён в тему корпоративных RAG-систем. В последнее время, как от коллег, так и от заказчика часто слышу, что векторный поиск это слабое место и вчерашний день, и что нас спасут только графовые системы. Нашел несколько постов и видео на эту тему. Захотелось попробовать. В статье делюсь своими впечатлениями, рефлексирую и рассказываю как воспроизвести эксперименты.
Почему Ollama? Выделение вычислительных ресурсов на RAG в проекте – отдельная больная тема. Мне нужно было понять нижнюю планку. Если коротко, кое-как работает даже на 4b моделях.
Причём здесь киберпанк? Очень нравится этот жанр, а ещё я люблю использовать для проверки RAG/LLM штук знакомые тексты. Для экспериментов с Microsoft GraphRAG я выбрал рассказ “Johnny Mnemonic” Уильяма Гибсона, для начала на английском.
Проектная директория с результатами на GitHub.
Граф знаний для начала
Этот граф построен при помощи Gephi и Лейден-плагина по сущностям и связям, которые извлёк из текста GraphRAG. Вся необходимая информация находится в файле graph.graphml в папке output. А подробная инструкция по визуализации здесь. Впечатляет. Думаю, чтобы построить такой граф нужно несколько дней плотной работы аналитика.
Нетрудно заметить, что сущности объединяются только при буквальном совпадении. Не склеились в кластер Molly Millions и Molly, Lo Tek и Lo Teks, Ralfi Face и Ralfi. Но это сообщества, построенные в Gephi алгоритмом Лейдена. GraphRAG определил совсем другие, тематические кластеры, и на них можно посмотреть в файле community_reports.parquet, он тоже в папке output. Вот три высокоранговых сообщества из пятнадцати для примера (описание подрезал):
Community: Yakuza, Sons of the Neon Chrysanthemum, and Ono-Sendai
Description: The community centers around the Yakuza, a powerful multinational criminal organization with extensive operations and conflicts. Key relationships include its conflict with the Sons of the Neon Chrysanthemum, its industrial espionage against Ono-Sendai…
Community: Johnny, Ralfi Face, and Related Entities
Description: The community centers around Johnny, a central figure entangled in conflicts with Ralfi Face, the Yakuza, and Molly Millions…
Community: Molly Millions, Ralfi, and the Drome
Description: The community is centered around Molly Millions, a key figure in the Drome, and Ralfi, an individual involved in illicit activities. Molly Millions is connected to various entities, including Ralfi, Lewis, the Magnetic Dog Sisters, and the Drome itself…
На мой взгляд выглядит интересно.
Задаём вопросы
Если немного подправить промпты local_search_system_prompt.txt и global_search_reduce_system_prompt.txt в папке prompts, что я и сделал, получать ответы можно будет на русском языке, главное, чтобы LLM и эмбеддинг это поддерживали. Формулировать вопросы лучше на английском, иначе ответ будет менее точным, всё-таки граф и описание его элементов по прежнему на английском.
Глобальный поиск генерирует ответы, просматривая описания сообществ в режиме MapReduce. Этот метод часто дает хорошие ответы на вопросы, требующие понимания всего набора данных.
Обратите внимание на цифры в тексте ответа. Это ссылки на элементы графа, точнее это human_readable_id, он есть во всех parquet-файлах в папке output. Открыть можно при помощи pandas например.
Пример:
graphrag query "What are the top cyberpunk elements in this story?"
Начало ответа: Основные элементы киберпанка в повествовании
1. Интеграция технологий и биологии
В повествовании доминируют элементы продвинутых кибернетических улучшений и нейротехнологий, которые подчеркивают синтез технологий с человеческим телом. Например, использование нейропертурбатора Льюисом и протезированного большого пальца Якудзы демонстрируют, как технологии проникают в тело и влияют на контроль и взаимодействие с окружающей средой. Такие элементы являются ярким проявлением киберпанковской темы, где границы между органическим и синтетическим размываются [Data: Reports (5, 7, 12, 2, +more)].
Продолжение
2. Дистопические городские ландшафты
Повествование описывает дистопические городские пространства, такие как Найттаун и Дром, которые символизируют разруху, беззаконие и подпольные сети преступности. Эти локации отражают киберпанковскую концепцию социального распада и маргинализации, где технологии и корпоративная власть доминируют, но общественные структуры разрушаются. Дром, в частности, изображён как центр, где пересекаются бизнес-операции, незаконные действия и расследования полиции, что подчёркивает сочетание высоких технологий с преступными подтекстами [Data: Reports (1, 8, 2, +more)].
3. Корпоративная конкуренция и нелегальные сделки
Элементы корпоративной разведки и нелегальных технологических сделок, таких как транзакция с микроволновым оборудованием между Арийской регги-группой и программой Якудзы, подчёркивают тему корпоративного контроля и высокоставок конфликтов. Эти действия показывают, как технологии становятся инструментом власти и борьбы за ресурсы, что является ключевым аспектом киберпанка, где корпорации и преступные группировки конкурируют за влияние [Data: Reports (0, 12, 2, +more)].
4. Противопоставление низкой и высокой технологиям
Символика низкой технологии, связанная с LO TEK и их использованием продуктов, таких как фильтры Yiheyuan, контрастирует с продвинутыми кибернетическими улучшениями. Это подчёркивает киберпанковскую тему технологического неравенства, где доступ к продвинутым технологиям ограничен, а маргинализированные группы вынуждены использовать устаревшие средства. Такое противопоставление подчёркивает социальные и экономические разрывы, характерные для киберпанка [Data: Reports (9, 2, +more)].
5. Киберорганические существа и технические навыки
Персонажи, такие как Джонс — кибердельфин с военным прошлым, и Молли Миллионы с её боевыми навыками в использовании контрольных модулей, демонстрируют синтез органического и синтетического. Эти элементы отражают киберпанковскую идею, где технологии не только заменяют, но и трансформируют человеческие способности, создавая новые формы существования. Такие персонажи становятся метафорами борьбы за контроль над технологиями в условиях морального упадка [Data: Reports (11, 7, 2, +more)].
6. Темы идентичности и анонимности
Использование алиби, таких как “Эдвард Бакс” и “Быстрый Эдвард Бакс” Джонни, и программы Якудзы, подчёркивают киберпанковскую тему раздробленной идентичности и цифровых персонажей. Эти элементы показывают, как технологии позволяют скрывать истинное “я”, создавая мультифакетные личности, что является ключевым аспектом киберпанка, где личность и цифровые тени сталкиваются [Data: Reports (1, 12, 2, +more)].
7. Насилие и конфликты власти
Жестокие столкновения, такие как повреждение Льюиса Молли Миллионс с помощью контрольного модуля и смерть Ральфи, связанные с Якудзой, подчёркивают киберпанковскую атмосферу высокого риска и борьбы за власть. Эти действия отражают реалии, где технологии и преступные сети создают среду, где насилие и угрозы — неотъемлемая часть повседневной жизни [Data: Reports (5, 7, 2, +more)].
8. Пустынные и сюрреалистические пространства
Пространства, такие как FUNLAND и Торговый центр, описанные как сочетание разрухи и функциональных операций, подчёркивают киберпанковскую идею противопоставления технологического прогресса социальному коллапсу. Эти локации символизируют упадок, но при этом сохраняют элементы функциональности, что создает атмосферу, где технологии и мораль несовместимы [Data: Reports (8, 11, 2, +more)].
Итог
Эти элементы вместе формируют киберпанковскую вселенную, где технологии и преступность, дистопия и инновации, анонимность и идентичность, а также высокий уровень насилия и конфликтов создают уникальную атмосферу. Все ключевые темы подкреплены данными из аналитических отчётов, что подтверждает их значимость в контексте повествования.
Screenshot
Локальный поиск генерирует ответы, комбинируя релевантные данные из графа знаний с фрагментами текста исходных документов. Этот метод подходит для вопросов, требующих понимания конкретных взаимосвязей. Пример:
graphrag query "Who is JONES and what are his main relationships?" -m local
Начало ответа: Jones — персонаж, описанный как кибернетический дельфин с продвинутыми сенсорными способностями, связанный с объектом “Funland”, который представляет собой заброшенную зоопарк и цирковые аттракционы. Его основные функции включают управление резервуаром с пресной водой и сотрудничество с “Кальмой”, которая читает следы. Jones играет ключевую роль в операциях по извлечению данных, особенно в сотрудничестве с Molly и Johnny, где его уникальная физиология позволяет получить доступ к данным с чипа Johnny [Data: Entities (28, 33); Relationships (44, 51, +more)].
Продолжение
Основные связи Jones включают:
1. С Molly Millions: Участие в операции по извлечению данных из чипа Johnny, демонстрируя его технические способности [Data: Entities (33); Relationships (44, 51, +more)].
2. С Johnny: Взаимодействие в рамках операции по извлечению данных, где Jones использует свои сенсоры для доступа к информации [Data: Entities (33); Relationships (44, 51, +more)].
3. С “Squid” (Суперпроводящие квантовые интерферометры): Использование устройства “Squid” для чтения следов, что связано с военными технологиями, применяемыми НАВАЛЬНОЙ силой в прошлом [Data: Entities (19); Relationships (25, +more)].
4. С Yakuza: Косвенная связь через обеспокоенность Якудзы тем, что “Squid” могут извлечь следы их программы из ума Johnny [Data: Relationships (25); Entities (19)].
Jones также ассоциируется с “Funland”, где он функционирует как оператор, управляя оборудованием и взаимодействуя с другими персонажами. Однако описание его роли в “Funland” содержит противоречия: он описывается как оператор, так и как заключённый, что указывает на неопределённость его статуса [Data: Entities (28)].
Его присутствие в “Funland” и связь с “Squid” подчёркивают его значение как персонажа, находящегося на грани между технологией, искусством и опасностью, что делает его важной фигурой в сетях, связанных с конфликтами между Якудзой, Molly и другими участниками [Data: Entities (28, 33); Relationships (25, 44, +more)].
Screenshot
Заметим, что в реальной системе потребуется агент, который должен будет определять по тексту и, возможно, истории запросов, какой тип поиска использовать.
В GraphRAG есть ещё два варианта поиска — BASIC и DRIFT. Базовый вариант это обычный векторный поиск по чанкам документов, такую штуку иметь полезно как минимум для сравнения. А вот DRIFT Search выглядит как киллер-фича, отдаленно напоминающая Query expansion в RAG-системах. Будете экспериментировать, примите во внимание что это очень долго.
Ответ в DRIFT режиме на тот же вопрос про Джонса (на английском)
Jones is a cyborg dolphin with advanced neural interfaces, specifically a Squid (a superconducting quantum interference detector), which allows him to extract and interpret data stored in neural implants. He plays a pivotal role in retrieving sensitive information, such as the Yakuza’s stolen program embedded in Johnny’s brain, and is a key collaborator in the protagonist’s underground operations [Data: Sources (3, 4, 6, 7, 8)].
His main relationships include:
1. Molly Millions: A symbiotic partnership where Molly leverages Jones’s technical expertise for their business ventures in the Drome, while Jones relies on Molly’s street-smart navigation of Nighttown’s underworld. Their dynamic evolves from transactional cooperation to mutual trust, with Jones’s data retrieval capabilities becoming essential to their survival [Data: Sources (3, 6, 7, 8)].
2. The Protagonist (Johnny): Jones retrieves critical data from Johnny’s neural implants, enabling Johnny to access insights about clients and navigate threats from the Yakuza. This relationship is framed as mutually beneficial, with Johnny relying on Jones’s skills to operate effectively in their criminal ecosystem [Data: Sources (3, 4, 6, 8)].
3. The Yakuza: While not directly allied, Jones’s data extraction work indirectly targets the Yakuza’s interests, as they seek to control or exploit the same information. This creates a tension where Jones’s actions challenge the Yakuza’s dominance in the information economy [Data: Sources (1, 6)].
4. The Lo Teks: Jones is part of this marginalized subculture in Nighttown, which thrives in the lawless, technologically chaotic environment. His presence in Funland, a decaying space housing both carnival attractions and illicit activities, underscores his role as a liminal figure between human and machine, and between marginalization and technological power [Data: Sources (3, 5, 7)].
Jones’s military past as a Navy asset, detailed in multiple sources, further shapes his interactions, as his conditioning and reliance on drugs to manage cybernetic impulses complicate his relationships [Data: Sources (3, 6, 7, 8)]. His existence critiques themes of surveillance, data exploitation, and societal exclusion in a dystopian, information-driven world.
Результат не слишком впечатлил. За сорок минут «размышлений» получилось похоже на локальный поиск. Или я задал слишком простой вопрос, или нужна модель размером побольше.
И ещё вопрос, а что делать с этими результатами в реальном проекте? Либо ориентация на работу эксперта, либо нужно пропустить через ещё один запрос к LLM с учетом истории, а заодно раскрыть и обработать human_readable_id.
Про модели
Я поэкспериментировал с несколькими локальными LLM. Mistarl:7b, который был в найденных мной примерах, не умеет в глобальный поиск. Это из-за проблем со структурированным выводом. Map-запрос предполагает json output и падает примерно всегда.
Gemma3:4b и Gemma3:12b дают похожий результат с немного корявыми формулировками и граф получается значительно проще, хотя основные сущности не теряются. Но Джонс там человек, а не дельфин.
Qwen3:14b меня вполне устроил. Все примеры в этой статье сделаны на нём. А в качестве эмбеддинга я использовал user-bge-m3 от deepvk. Модель, прямо скажем, хороша для русского языка, и на английском умеет.
Как попробовать?
Инструкция
A. Клонируйте мой репозитарий с проектной папкой. Переименуйте env.example в .env
B. Создайте и активируйте python-окружение, у меня – conda
conda create --name jm_project python==3.11
conda activate jm_project
C. Установите GraphRAG
pip install graphrag
Обязательно проверьте версию LiteLLM, которая ставится вместе с graphrag. Должна быть не выше 1.82.6. Старшие версии скомпрометированы!
D. Установите необходимые пакеты для embedding_proxy. Зачем это нужно расскажу в разделе «Проблемы». Установите torch с cuda или без, на cpu работать будет. Здесь варианты установки для конкретной платформы. Далее установите оставшиеся пакеты.
pip install -r requirements.txt
E. В отдельной консоли активируйте окружение и запустите прокси
python embedding_proxy.py --port 11435
F. В settings.yaml проверьте корректность путей к LLM и embedding. Они в секциях completion_models и embedding_models соответственно. Параметр – api_base.
G. В отдельной консоли загрузите LLM в Ollama
ollama pull qwen3:14b
H. Остановите Ollama, и установите для неё переменные окружения
OLLAMA_HOST=0.0.0.0:11434 (если она на другой машине)
OLLAMA_CONTEXT_LENGTH=13000 (по умолчанию – 4k, это мало, будут обрезаться промпты)
I. Запустите Ollama командой ollama serve
Если хотите попробовать свои тексты или перестроить индексы:
-
удалите мой текст и поместите свои в папку input
-
удалите папки cache, logs и output
-
запустите ollama и embedding_proxy
-
запустите пайплайн командой graphrag index
Для ориентира по времени: пайплайн на 38k текста (Johnny Mnemonic) на машине с 16GB GPU, не самой новой, выполняется чуть более часа.
Проблемы
GraphRAG использует LiteLLM в качестве прокси для LLM-провайдеров. Ollama поддерживается, но периодически в неё отправляется запрос на параметры модели с некорректной ссылкой вида api/generation/api/show. Это вызывает ошибку 404, к счастью, она не влияет на пайплайн, поэтому можно не обращать внимания.
Внимание! Версии LiteLLM 1.82.7 и 1.82.8 скомпрометированы, вот и здесь.
Запросы к LLM в GraphRAG поступают из очереди, если время ожидания запроса будет около 10 минут, клиент отваливается. Параметр request_timeout был в старых версиях GraphRAG, сейчас не срабатывает. Видимо нужно углубиться в код где-то вокруг вызовов LiteLLM, именно у неё таймаут в 600 секунд установлен для openai по умолчанию.
Хуже дело обстоит с эмбеддингом. Модели типа bge-m3 в Ollama иногда выдают ошибку сериализации. Это связано с некорректной обработкой Inf и NaN в json. Я видел ишью в GitHub на эту тему и вроде даже поправили ещё в январе 2026, но в версии 0.18.2, которой я пользуюсь, проблема сохраняется. Из-за этого я решил использовать эмбеддинг прокси. Взял код из этого проекта, убрал вызов Ollama и вместо него добавил langchain HF embedding. Согласен, что криво, зато можно использовать любые эмбеддинги из HuggingFace. Если нужна другая модель – в CLI добавьте ключ model, user-bge-m3 там по умолчанию. Например:
python embedding_proxy.py --port 11435 --model BAAI/bge-m3
Если захотите всё-таки настроить эмбеддинг через Ollama, запускайте как отдельный процесс или даже на другой машине. Эмбеддинг используется в самом конце пайплайна, иногда падает, если работает вместе с LLM, и это очень обидно.
Важное про настройки
settings.yaml создаётся среди прочих файлов командой graphrag init и его нужно отредактировать:
1. в секциях модели и эмбеддинга указать провайдера, модель и добавить ключ api_base с соответствующим URL.
2. в секции vector_store указать размер вектора для всех операций пайплайна. Там по умолчанию 3072, если у вас эмбеддинг с другим размером, пайплайн упадёт с ошибкой. Для bge-m3 – 1024.
3. в секции snapshots нужно указать graphml: true если хотите потом сделать визуализацию.
Плюсы-минусы
Если забыть, что внутри тоже есть векторный поиск, и сравнить с QA-системой на чистом векторе, субъективно графовая система выигрывает по релевантности. Но она не выглядит как замена вектору в RAG, скорее как специальное решение для специальных задач, где есть семантически сложные тексты и где не нужен мгновенный ответ.
Тем не менее вещь безусловно заманчивая. У вас есть фреймворк, который не только выделит сущности и связи, но также определит сообщества и сгенерирует описание для всех элементов. Главный минус – ресурсоёмкость. За время, которое уходит на обработку небольшого документа можно построить векторную базу на несколько тысяч таких текстов.
Ещё один минус – примитивный чанкинг, он по длине в токенах или предложениях с перекрытием. Если переделать на семантический или маркдаун-сплиттер, качество ответов должно вырасти. Да и векторное хранилище я бы поменял.
Плюсы: есть api, в официальном репозитарии есть даже тестовое приложение на streamlit, можно поиграться и сделать MVP. А ещё есть генератор потенциально возможных вопросов, это значит, что можно собрать свой бенчмарк и даже закешировать ответы для быстрого поиска, хотя я не приветствую кеширование в RAG.
Генерацию ответов честно не попробовал. Смущает, что ноутбук опубликован с большим количеством ошибок, где что-то не найдено. Возможно попробую. И ещё хочется переделать промпты и сделать граф на русском языке. Если получится, напишу апдейт.
Злоупотребление GraphRAG может вызвать графовую зависимость. Шутка. Берегите себя!
Автор: khmelkoff


