The AI / news

Python : как построить мультимодальный RAG-пайплайн для изображений и документов

Python : как построить мультимодальный RAG-пайплайн для изображений и документов
3 min de lecture

В руководстве подробно описывается создание на Python мультимодального пайплайна для генерации с извлечением (RAG), способного искать и анализировать как текст, так и изображения, извлеченные из сложных документов. Принцип ориентирован на PDF-файлы, сочетающие текст, таблицы и графики — форматы, в которых классический RAG, основанный только на тексте, работает плохо.

RAG заключается в извлечении фрагментов документа для передачи их языковой модели перед формулированием ответа. Примененный только к тексту, этот метод дает хорошие результаты. Однако сегментация, основанная исключительно на тексте, разрушает форматирование таблиц и игнорирует изображения, в результате чего система отвечает на основе неполного представления о документе. Описанный пайплайн, напротив, обрабатывает изображения как объекты, доступные для запроса наравне с текстом.

Реализация использует LangChain, библиотеку unstructured и API OpenAI. Руководство описывает четыре этапа: анализ документа, суммаризация изображений, хранение данных и запрос к системе. Пакет poppler-utils, системная зависимость, необходим для unstructured, чтобы извлекать изображения из PDF.

Разделение текста и изображений

Функция partition_pdf() из unstructured читает документ и классифицирует каждый элемент по типу: абзацы, таблицы и встроенные изображения. Изображения сохраняются в отдельную папку, а текстовые блоки группируются во фрагменты размером до 4000 символов в соответствии с заголовками. Затем цикл отделяет текстовые фрагменты от путей к изображениям.

Обычная векторная база не умеет индексировать изображения напрямую. Поэтому каждое изображение передается в GPT-4o с инструкцией «Describe this image in detail for use in a search system», чтобы получить подробное описание, которое служит заменой, доступной для запроса. В руководстве отмечается стоимость этого этапа: каждое изображение вызывает обращение к API. Для документов с большим количеством логотипов или значков предлагается фильтровать самые маленькие изображения перед обработкой.

Двухуровневое хранилище

Архитектура основана на MultiVectorRetriever, который управляет двумя пространствами хранения. Первое — векторная база Chroma — содержит текстовые фрагменты и описания изображений, преобразованные в векторы с помощью модели эмбеддингов text-embedding-3-small. Второе — хранилище документов в памяти — сохраняет исходное содержимое. Каждая запись связана со своим эквивалентом уникальным идентификатором. После выполнения поиска по описаниям система находит исходный текстовый фрагмент или файл изображения.

При запросе вопрос также векторизуется и сравнивается с проиндексированными элементами. Текстовые фрагменты передаются как есть, а найденные изображения открываются и кодируются в base64 — текстовый формат, позволяющий прикрепить их к запросу. Все это отправляется в GPT-4o, который генерирует ответ на основе обоих типов контента. В руководстве в качестве примера приводится вопрос «What does the revenue chart show for Q3?», который можно использовать как есть.

Направления развития

Автор упоминает несколько возможных улучшений: добавить этап переранжирования (re-ranking) для повышения точности поиска, сохранять базу Chroma на диск для использования в продакшене или исследовать модели типа «vision-language», такие как ColPali, которые напрямую обрабатывают страницы документов как изображения, обходясь без этапа анализа.