Существует множество достойных RAG-фреймворков, проверенных на многочисленных бенчмарках, так что точность работы системы в современных реалиях - не такая большая проблема. Однако, для любого, кто сталкивался с прикладной интеграцией RAG в рабочие пайплайны, не секрет, что рано или поздно сталкиваешься с постобработкой многочисленных форматов. Комбинируешь OCR, парсеры, ридеры…
RAG-Anything устраняет ненужные телодвижения.
С помощью RAG-Anything возможно обрабатывать подавляющее большинство ходовых форматов файлов. В этой статье мы разберем механизм работы фреймворка и на примере посмотрим, как он работает с изображениями.
Чем обеспечена мультимодальность?
Значительная часть известных RAG-фреймворков рассчитана на работу, прежде всего, с текстовыми данными. Но и ежу понятно, что чаще всего мы используем сложные по своей структуре документы а-ля pdf-файл с картинками, таблицами, графиками, форматированным текстом, и все это сочетается в одном файле.
Согласитесь, что для использования RAG-подхода в небольшом проекте создание классов для обработки каждого нужного формата, а также OCR и NER кажется избыточным.
RAG-Anything, разработанный командой Гонконгского университета (HKU), решает эту проблему кардинально. В основе своей использует LightRAG.
Все доступные для обработки форматы в RAG-Anything
PDF, DOC, DOCX, PPT, PPTX, XLS, XLSX, TXT, MD, HTML, JPG, JPEG, PNG, BMP, TIFF, GIF, WEBP
Как же он работает? Не является ли это тупой мешаниной всех тулзов? Давайте взглянем поближе:

Пайплайн обработки можно описать следующим образом: Парсинг -> Мультимодальная обработка -> Мультимодальные анализаторы -> Мультимодальный граф знаний + векторное хранилище.
-
Что происходит внутри?
Парсинг документов
Для парсинга документов используется MinerU. Он превращает медиа-контент в формат, удобный для работы LLM (markdown, json). Также сохраняется все форматирование документа (заголовки, таблички, отступы и т.д.)Мультимодальная обработка
Фреймворк использует разные каналы для обработки контента, опираясь на его тип. Он может одновременно обрабатывать pdf, .png и просто текстовое представление благодаря использованию разных каналов обработки.-
Мультимодальные анализаторы
Фреймворк использует дополнительную обработку для мультимодального контента в лице анализаторов. Среди анализаторов представлены следующие категории:Анализатор визуала (интеграция OCR, структура и иерархия расположения визуальных элементов).
Интерпретатор структуры документа (таблички, отступы, и тд.) Парсер математических выражений (LaTeX, связь выражений с контекстом базы знаний)
Обработчик расширения модальности (интеграция обработки кастомных типов)
Граф знаний - Помимо векторного хранилища эмбеддингов, особую роль играет граф знаний. Строится двойной граф знаний: мультимодальный и текстовый. В мультимодальный попадают ранее упомянутые таблички, формулы, картинки. Каждый такой формат, в терминологии фреймворка, обозначают как источник знаний.
Любой такой источник разделяется на отдельные базовые элементы. Они называются единицами контента. Каждая единица включает в себя две составляющие: тип формата (текст, картинка, таблица или уравнение) и само извлеченное содержимое. Чтобы не потерять смысловую целостность, это содержимое обрабатывается с обязательным учетом его исходного формата.
Если немного углубиться в технические детали структуры графа: Фреймворк RAG-Anything задействует большие мультимодальные языковые модели (да, очень желательно использовать мультимодальные LLM, если хотите на полную насладиться мощью фреймворка). С их помощью для каждой единицы контента генерируются два дополнительных текстовых представления:
Первое — это подробное описание, чанка, в котором находится сущность.
Второе — это описание сущности, содержащее ключевые атрибуты, такие как имя сущности, тип и описание для построения графа. Процесс генерации учитывает контекст. Это гарантирует, что представления точно отражают роль каждой единицы в более широкой структуре документа.
Опираясь на эти текстовые представления, RAG-Anything строит структуру графа, используя нетекстовые единицы в качестве опорных точек. Для каждой нетекстовой единицы процедура извлечения графа обрабатывает её описание для выявления сущностей и связей:(тут немного душно, но это важно)
1) Текстовый граф знаний: Для чанков текстовой модальности мы строим традиционный текстовый граф знаний, следуя устоявшимся методологиям, аналогичным LightRAG (на основе которого, собственно говоря, и базируется RAG-Anything) и GraphRAG (разработка микро-мягких).
Процесс извлечения работает непосредственно с текстовым содержимым, используя методы распознавания именованных сущностей и извлечения связей для выявления сущностей и их семантических отношений. Учитывая богатую семантическую информацию, присущую текстовому контенту, интеграция мультимодального контекста для этого компонента не требуется. Полученный текстовый граф знаний фиксирует явные знания и семантические связи, присутствующие в текстовых частях документов, дополняя возможности кросс-модальной привязки мультимодального графа.2) Выравнивание сущностей и слияние графов. Для создания единого представления знаний мы объединяем мультимодальный граф знаний и текстовый граф знаний через выравнивание сущностей.
Что это такое, собственно говоря? Данный процесс использует имена сущностей в качестве основных ключей сопоставления для выявления семантически эквивалентных сущностей в обеих структурах графов. Интеграция консолидирует их представления, создавая всеобъемлющий граф знаний.
Этот граф фиксирует как мультимодальные контекстные отношения, так и текстовые семантические связи. Объединенный граф обеспечивает целостный взгляд на коллекцию документов. Это позволяет эффективно осуществлять поиск, используя визуально-текстовые ассоциации из мультимодального графа и выявленные связи текстовых знаний из текстового графа.3) Генерация эмбеддингов. Для поиска на основе сходства мы строим всеобъемлющую embedding table(базу эмбеддингов), которая охватывает все компоненты, сгенерированные в процессе индексации.
Мы создаем эмбеддинги для всех сущностей графа, связей и атомарных чанков контента среди модальностей, используя соответствующий энкодер. Это создает единое пространство встраиваний, где каждый компонент( сущности, связи, чанки) отображается в его соответствующем эмбеддинге.
Установка и запуск
Перейдем непосредственно к установке. Фреймворк устанавливается через pip:
pip install raganything
Для работы с изображениями нужны дополнительные зависимости (ставятся автоматически):
pip install pillow opencv-python
Теперь задаём ключи API и создаём объект RAG-Anything. В примере используется OpenAI, но вы можете подставить любой совместимый эндпоинт.
import asyncio from raganything import RagAnything API_KEY = "your_openai_api_key" BASE_URL = "https://api.openai.com/v1" async def main(): rag = RagAnything( api_key=API_KEY, base_url=BASE_URL, output_dir="./output", parser="mineru", # мультимодальный парсер ) print("RAG-Anything готов к работе")
Индексация документов
Самый простой способ загрузить файлы – использовать пакетную обработку. Передайте список словарей с путями к документам и идентификаторами.
docs = [ {"file_path": "docs/report1.pdf", "doc_id": "report1"}, {"file_path": "docs/report2.pdf", "doc_id": "report2"}, {"file_path": "docs/report3.pdf", "doc_id": "report3"}, ] await rag.process_documents_in_batch(docs) print("Пакетная обработка завершена!")
Под капотом каждый PDF разбирается на страницы. Затем извлекаются текстовые абзацы, таблицы, изображения.
Картинки и таблицы описываются с помощью LLM, текст эмбеддится.
Все элементы сохраняются в единый индекс в папке output_dir.
Если вы перезапустите индексацию с теми же файлами, повторной отправки в LLM не будет. Результаты кешируются по хешу содержимого, что весьма удобно.
Мультимодальный запрос
После индексации можно задавать вопросы, и RAG-Anything сам найдёт нужный контекст.
result = await rag.aquery( "Какие ключевые выводы и показатели производительности упоминаются в исследовании?", mode="hybrid", ) print("Результат запроса:", result)
Ответ содержит:
текст сгенерированного ответа,
список использованных фрагментов (с типом: текст, таблица, изображение),
ссылки на оригинальные файлы и страницы.
Таким образом, запрос "покажи график роста продаж" вернёт текстовое описание и изображение графика(если оно было в документе).
Примеры обработки
Хочу отдельно отметить, насколько легко RAG-Anything интегрирует изображения. Специальный обработчик ImageModalProcessor берёт картинку, отправляет её в мультимодальную LLM и получает описание, которое сразу же индексируется. Никаких дополнительных скриптов для OCR или обрезки.
Пример обработки одного изображения:
from raganything.processors.modalprocessors import ImageModalProcessor from raganything.utils import openai_complete_if_cache import base64 async def process_image(): rag = RagAnything(api_key=API_KEY, base_url=BASE_URL, output_dir="./output") with open("docs/images/experiment_result.png", "rb") as f: img_b64 = base64.b64encode(f.read()).decode() image_processor = ImageModalProcessor( lightrag=rag, modal_caption_func=lambda prompt, system_prompt=None, history_messages=[], image_data=None, **kwargs: openai_complete_if_cache( model="gpt-4o-mini", prompt=prompt, system_prompt=system_prompt, history_messages=history_messages, api_key=API_KEY, base_url=BASE_URL, **kwargs, ) ) modal_content = { "img_path": "docs/images/experiment_result.png", "image_caption": ["Рисунок 1: Результаты эксперимента"], "image_footnote": ["Данные собраны в 2024 году"] } description, entity_info = await image_processor.process_multimodal_content( modal_content=modal_content, content_type="image", file_path="docs/experiment_paper.pdf", entity_name="Experiment Result Figure" ) print("Описание изображения:", description) print("Метаданные:", entity_info)
Если у вас уже есть готовый список изображений, можно добавить их напрямую в базу знаний через insert_content_list:
images_to_insert = [ { "type": "image", "img_path": "docs/images/figure1.png", "image_caption": ["График роста продаж"], "image_footnote": ["Данные за 2023 год"], "page_idx": 2, }, { "type": "image", "img_path": "docs/images/figure2.png", "image_caption": ["Архитектура модели"], "image_footnote": ["Схема на основе ResNet"], "page_idx": 4, }, ] await rag.insert_content_list( content_list=images_to_insert, file_path="docs/marketing_report.pdf", doc_id="marketing_report" ) print("Изображения успешно вставлены в Knowledge‑Base.")
Что возвращают основные функции?
process_documents_in_batch – после завершения вы получаете логи обработки и готовый индекс в папке output_dir.
aquery – возвращает словарь с полями:
answer– текст ответа, сгенерированный LLM;context– список фрагментов (тип, текст, путь к файлу, страница, релевантность);images– ссылки на изображения, если они использовались в ответе.
Благодаря этому вы сразу видите не только ответ, но и на каких данных он основан. Что может быть очень полезно для оценки качества и точности работы системы, а также если вам важна достоверность найденного системой контекста.
Если понадобится удалить документ, используйте rag.delete_docs(doc_indices=[0,2]). Индекс обновится без полной перестройки.
Пример обработки файлов Microsoft office
import asyncio from pathlib import Path from raganything import RagAnything API_KEY = "YOUR_OPENAI_API_KEY" BASE_URL = "https://api.openai.com/v1" OUTPUT_DIR = "./output" async def process_office_docs(): rag = RagAnything( api_key=API_KEY, base_url=BASE_URL, output_dir=OUTPUT_DIR, parser="mineru", #используем MinerU ) office_files = [ {"file_path": "docs/report1.docx", "doc_id": "docx-1"}, {"file_path": "docs/data.xlsx", "doc_id": "xlsx-1"}, {"file_path": "docs/presentation.pptx", "doc_id": "pptx-1"}, ] #пакетная обработка await rag.process_documents_in_batch(office_files) print("Office documents processed and indexed!") if __name__ == "__main__": asyncio.run(process_office_docs())
В репозитории предусмотрен модуль enhanced_markdown с классом EnhancedMarkdownConverter. Он умеет конвертировать Markdown → PDF, поддерживает несколько бэкендов (WeasyPrint, Pandoc), CSS‑стилизацию, подсветку синтаксиса и даже embedding изображений.
from raganything.enhanced_markdown import EnhancedMarkdownConverter, MarkdownConfig config = MarkdownConfig( page_size="A4", margin="1in", include_toc=True, syntax_highlighting=True, backend="weasyprint", #можно поставить "pandoc" ) converter = EnhancedMarkdownConverter(config) input_path = "docs/your_article.md" output_path = "output/your_article.pdf" success = converter.convert_file_to_pdf( input_path=input_path, output_path=output_path, method="weasyprint" #совпадает с backend ) print(f"Конвертация {'удалась' if success else 'не удалась'} – {output_path}")
Заключение
RAG-Anything – это спасение для всех, кто хочет получить лучшие подходы особо не запариваясь. Он легко интегрируется с вашими пайплайнами, основан на легковесном LightRAG, а также заменяет описание и создание собственных пайплайнов обработки документов.
Просто указываете креды моделей и вызываете api-методы. А открытый исходный код и инструменты для легкой интеграции обеспечат простую расширяемость и масштабируемость.
Комментарии (4)

daniel30
27.05.2026 14:28Хороший обзор, спасибо. Для продакшена, на мой взгляд, самый важный момент здесь не столько сама мультимодальность, сколько трассировка ответа до исходного фрагмента.
Когда в индекс попадают таблицы, формулы и изображения, легко получить красивый ответ, но трудно понять, где именно модель ошиблась: на этапе парсинга PDF, при описании картинки через мультимодальную LLM или уже при объединении текстового и мультимодального графов. Было бы интересно увидеть отдельный пример оценки качества: например, как сравнивать ответы до и после добавления графа знаний, и какие метрики использовать для табличных данных и формул.
Kirillch143
Rag anything больше не поддерживается, полностью интегрирован с lightrag
gasurkg87
Вроде как всё ещё поддерживается. Гитхаб по крайней мере живой
Kirillch143
В последнем релизе lightrag: All RagAnything’s multimodal processing capabilities are merged into LightRAG; ( RagAnything will no longer receive core feature updates or maintenance going forward)