惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
A
About on SuperTechFans
IT之家
IT之家
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Blog — PlanetScale
Blog — PlanetScale
aimingoo的专栏
aimingoo的专栏
云风的 BLOG
云风的 BLOG
The GitHub Blog
The GitHub Blog
Vercel News
Vercel News
G
Google Developers Blog
J
Java Code Geeks
宝玉的分享
宝玉的分享
T
Tailwind CSS Blog
Cloudbric
Cloudbric
L
LINUX DO - 最新话题
MyScale Blog
MyScale Blog
H
Heimdal Security Blog
PCI Perspectives
PCI Perspectives
Attack and Defense Labs
Attack and Defense Labs
S
Security @ Cisco Blogs
Latest news
Latest news
I
Intezer
L
Lohrmann on Cybersecurity
C
CXSECURITY Database RSS Feed - CXSecurity.com
月光博客
月光博客
T
Threatpost
博客园 - 【当耐特】
S
Schneier on Security
P
Privacy International News Feed
G
GRAHAM CLULEY
T
Tenable Blog
AWS News Blog
AWS News Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
雷峰网
雷峰网
博客园 - Franky
Engineering at Meta
Engineering at Meta
美团技术团队
S
Secure Thoughts
T
Troy Hunt's Blog
Microsoft Security Blog
Microsoft Security Blog
SecWiki News
SecWiki News
V
Visual Studio Blog
人人都是产品经理
人人都是产品经理
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Cisco Talos Blog
Cisco Talos Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Martin Fowler
Martin Fowler
Webroot Blog
Webroot Blog
Google DeepMind News
Google DeepMind News
H
Hackread – Cybersecurity News, Data Breaches, AI and More

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
RAG-Anything: Как собрать по-настоящему мультимодальный RAG
Magnificus · 2026-05-27 · via Все публикации подряд на Хабре

Средний

8 мин

12K

Существует множество достойных 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

Как же он работает? Не является ли это тупой мешаниной всех тулзов? Давайте взглянем поближе:

Схема работы RAG-Anything изнутри

Схема работы RAG-Anything изнутри

Пайплайн обработки можно описать следующим образом: Парсинг -> Мультимодальная обработка -> Мультимодальные анализаторы -> Мультимодальный граф знаний + векторное хранилище.

  • Что происходит внутри?

    1. Парсинг документов
      Для парсинга документов используется MinerU. Он превращает медиа-контент в формат, удобный для работы LLM (markdown, json). Также сохраняется все форматирование документа (заголовки, таблички, отступы и т.д.)

    2. Мультимодальная обработка
      Фреймворк использует разные каналы для обработки контента, опираясь на его тип. Он может одновременно обрабатывать pdf, .png и просто текстовое представление благодаря использованию разных каналов обработки.

    3. Мультимодальные анализаторы
      Фреймворк использует дополнительную обработку для мультимодального контента в лице анализаторов. Среди анализаторов представлены следующие категории:

      • Анализатор визуала (интеграция OCR, структура и иерархия расположения визуальных элементов).

      • Интерпретатор структуры документа (таблички, отступы, и тд.) Парсер математических выражений (LaTeX, связь выражений с контекстом базы знаний)

      • Обработчик расширения модальности (интеграция обработки кастомных типов)

    4. Граф знаний - Помимо векторного хранилища эмбеддингов, особую роль играет граф знаний. Строится двойной граф знаний: мультимодальный и текстовый. В мультимодальный попадают ранее упомянутые таблички, формулы, картинки. Каждый такой формат, в терминологии фреймворка, обозначают как источник знаний.

Любой такой источник разделяется на отдельные базовые элементы. Они называются единицами контента. Каждая единица включает в себя две составляющие: тип формата (текст, картинка, таблица или уравнение) и само извлеченное содержимое. Чтобы не потерять смысловую целостность, это содержимое обрабатывается с обязательным учетом его исходного формата.

Если немного углубиться в технические детали структуры графа: Фреймворк 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-методы. А открытый исходный код и инструменты для легкой интеграции обеспечат простую расширяемость и масштабируемость.