3 ключевых шаблона для построения мультимодального RAG: подробное руководство
Большие языковые модели (LLM) высоко ценятся за свою универсальность, поскольку мы можем использовать их во множестве AI-приложений, таких как персонализированные чат-боты, суммаризация документов, ответы на вопросы по документам, классификация документов и многое другое.
Однако одна из ключевых проблем при использовании LLM — риск галлюцинаций. Галлюцинация означает явление, при котором LLM выдают весьма убедительные, но не соответствующие действительности ответы на наши запросы. Выявлять галлюцинации LLM довольно сложно, особенно если мы задаем им вопросы по темам, с которыми не очень хорошо знакомы.
Среди многих других методов Retrieval Augmented Generation (RAG) — это подход, который может помочь нам снизить риск галлюцинаций LLM. В ранних реализациях RAG чаще использовался только для текстового ввода. С развитием технологий AI теперь мы можем использовать RAG с различными модальностями данных, такими как изображения, аудио, видео и т. д., что мы называем мультимодальным RAG.
В этой статье мы обсудим различные подходы к тому, как можно реализовать мультимодальный RAG в наших AI-приложениях. Прежде чем углубиться в мультимодальный RAG, давайте сначала кратко повторим основы RAG.
Основы RAG
RAG — это новый подход, который помогает снизить риск галлюцинаций LLM, предоставляя релевантный контекст к пользовательскому запросу в промпте. Прежде чем отвечать на пользовательский запрос, LLM может использовать этот релевантный контекст как основу для своего ответа, что приводит к более контекстуализированным ответам.
Как следует из названия, RAG состоит из трех основных компонентов: извлечения, дополнения и генерации.
Извлечение: В этом компоненте извлекается наиболее релевантный контекст для пользовательского запроса. В этом компоненте есть два этапа: извлечение кандидатов и переранжирование. На этапе извлечения кандидатов извлекаются top-n наиболее перспективных контекстов. В отличие от этого, на этапе переранжирования эти контексты ранжируются или сортируются по метрикам сходства, таким как косинусное сходство или евклидово расстояние.
Дополнение: В этом компоненте наиболее перспективные контексты интегрируются с исходным пользовательским запросом, чтобы сформировать один итоговый связный промпт. Затем этот итоговый промпт служит входными данными для нашей LLM.
Генерация: В этом компоненте LLM генерирует ответ на основе входного промпта, который содержит перспективные контексты для ответа на запрос пользователя. Затем ответ отправляется обратно пользователю.
Рисунок: полный рабочий процесс RAG.
Однако нам нужно настроить несколько вещей, прежде чем реализовывать RAG в нашем приложении.
Например, нам нужна эффективная и масштабируемая система хранения, чтобы хранить все возможные контексты до того, как мы сможем их извлекать. Поскольку контексты, обычно полезные для RAG, представляют собой неструктурированные данные (текст, изображение и т. д.), векторные базы данных являются наиболее распространенными системами хранения, используемыми в RAG-приложениях.
В векторной базе данных мы обычно храним embedding-представление контекстов вместо необработанных контекстов. С помощью embeddings мы можем выполнять поиск по сходству, чтобы находить наиболее перспективные контексты для любого заданного запроса. Поэтому нам также нужна модель глубокого обучения (embedding-модель), чтобы преобразовывать наши необработанные контексты в embeddings.
Embedding похожих слов в двумерном векторном пространстве.
Рабочий процесс RAG-пайплайна с самого начала выглядит следующим образом:
Преобразуйте исходные контексты в эмбеддинги с помощью модели эмбеддингов.
Сохраните и проиндексируйте эти эмбеддинги в векторной базе данных.
Для любого заданного запроса преобразуйте запрос в эмбеддинг, используя ту же модель эмбеддингов, которую мы использовали для исходных контекстов.
Выполните поиск по сходству между эмбеддингом запроса и эмбеддингами контекстов внутри векторной базы данных.
Извлеките top-n наиболее релевантных контекстов и объедините эти контексты с исходным запросом в один связный промпт в качестве входных данных для нашей LLM.
LLM генерирует ответ на запрос, используя предоставленные релевантные контексты, чтобы дать более точный результат.
Основы мультимодального RAG
Реализация RAG, которую мы обсуждали в предыдущем разделе, оказывается действительно полезной для снижения риска галлюцинаций LLM и улучшения общего качества ответов LLM. Однако, когда мы говорим о контекстах в RAG, мы обычно имеем в виду контекст как текст. Между тем мы знаем, что в реальных приложениях мы можем захотеть предоставлять в качестве контекстов другие модальности, а не только текст.
Допустим, мы хотим использовать коллекцию документов в качестве контекстов для внутреннего чатбот-приложения. Как мы уже знаем, документ обычно состоит не только из текста, но также из изображений, диаграмм и таблиц, которые содержат много полезной информации для ответа на запросы пользователей. При текстовом RAG мы не можем хранить информацию, содержащуюся в этих изображениях, диаграммах и таблицах, как контексты.
Мультимодальный RAG — это решение этой проблемы, поскольку с помощью этого метода RAG мы можем хранить все контексты из разных источников информации, тем самым также повышая общую точность ответов LLM.
Рисунок: конвейер мультимодального RAG.
Благодаря появлению и росту мультимодальных эмбеддингов, а также мультимодальных LLM, теперь мы можем реализовывать мультимодальный RAG. Идея мультимодального RAG точно такая же, как и у обычного RAG, но теперь мы можем хранить эмбеддинги из разных модальностей данных, таких как изображения, аудио и видео. Однако нам нужно убедиться, что мы используем модели мультимодальных эмбеддингов, а также мультимодальные LLM, если хотим реализовать мультимодальный RAG.
В целом мы можем реализовать мультимодальный RAG различными способами. В частности, есть три разных паттерна, о которых мы подробно поговорим в этой статье:
Свести все модальности к одной основной модальности.
Встроить все модальности в одно и то же векторное пространство.
Гибридный поиск с доступом к исходным изображениям.
Давайте обсудим эти паттерны по очереди.
Паттерн 1: Свести все модальности к одной основной модальности (мультимедиа в текст)
Первый паттерн предполагает преобразование всех модальностей в одну основную модальность. Хотя в качестве основной можно выбрать любую модальность, в мультимодальном RAG чаще всего используется текст. Поэтому на протяжении этого раздела мы будем использовать текст как нашу основную модальность.
Чтобы преобразовать разные модальности в текст, прием заключается в использовании мультимодальной LLM для генерации текстового резюме наших данных. Например, допустим, у нас есть документ, который содержит много текста и изображение. Поскольку текст — наша основная модальность, нам не нужно ничего делать с текстом в документе. Между тем мы можем использовать Vision Language Model (VLM), такую как LLAVA, Gemini, Claude Sonnet, Qwen-VL, Pixtral и т. д., которая принимает и изображения, и текст в качестве входных данных, чтобы сгенерировать текстовое резюме нашего изображения.
Получив текстовое резюме нашего изображения, мы можем преобразовать этот текст вместе с другим текстом в документе в эмбеддинги с помощью текстовой модели эмбеддингов. Существует множество текстовых моделей эмбеддингов, из которых мы можем выбирать, например модели от SentenceTransformers, OpenAI, VoyageAI и т. д. Затем эмбеддинги этих текстов сохраняются и индексируются в векторной базе данных.
Рисунок: рабочий процесс паттерна 1.
Теперь для любого заданного запроса мы можем преобразовать его в эмбеддинг с помощью той же текстовой модели эмбеддингов, которую использовали ранее. После этого мы можем выполнить поиск по сходству, чтобы найти наиболее релевантные контексты, а затем использовать текстовые контексты как часть промпта для наших текстовых или мультимодальных LLM.
Если вы хотите узнать больше о деталях реализации этого паттерна, у нас есть специальная статья, которая проведет вас по шагам создания мультимодальной RAG с помощью этого паттерна.
Этот паттерн идеально подойдет, если в вашем сценарии использования вам не нужен доступ к исходным, нетекстовым данным. Ваше приложение может принимать изображения на вход, но выход всегда основан на тексте. Например, вы можете создать приложение с функциональностью объяснения содержимого изображений во внутреннем документе.
Однако при использовании этого паттерна мы по-прежнему опираемся на текстовые контексты, как и в обычной системе RAG. В реальных приложениях нам может понадобиться использовать изображения или другие модальности в качестве контекстов. Поэтому давайте поговорим о втором паттерне.
Паттерн 2: встраивание всех модальностей в одно и то же векторное пространство
Второй паттерн предполагает преобразование данных всех модальностей в эмбеддинги в одном и том же векторном пространстве. Секрет этого подхода заключается в реализации мультимодальных моделей эмбеддингов, таких как CLIP и ALIGN. Возьмем CLIP в качестве примера.
CLIP — это модель, разработанная OpenAI, которая принимает и текст, и изображение в качестве пары входных данных и была обучена определять сходство между текстом и изображением. В результате CLIP присваивает высокий показатель сходства, если текст соответствует изображению, и наоборот.
Рисунок: эмбеддинги данных с разными модальностями с помощью CLIP в трехмерном векторном пространстве.
Как вы можете видеть выше, предположим, у нас есть предложение "A smiling dog," и изображение улыбающейся собаки. CLIP сначала преобразует и текст, и изображение в эмбеддинги с похожими размерностями, и если мы проверим векторное пространство, оба эмбеддинга, скорее всего, будут расположены близко друг к другу.
Поскольку у нас есть мультимодальная модель эмбеддингов, первый шаг этого паттерна — преобразовать наши данные в разных модальностях в эмбеддинги с помощью этой мультимодальной модели эмбеддингов. Затем мы сохраняем и индексируем эти эмбеддинги внутри векторной базы данных, такой как Milvus или Zilliz Cloud. Когда у нас появляется пользовательский запрос, мы преобразуем его с помощью той же мультимодальной модели эмбеддингов, а затем можем выполнить поиск по сходству, чтобы найти наиболее релевантные контексты.
Рисунок: рабочий процесс паттерна 2.
Извлеченные контексты при применении этого паттерна могут представлять собой данные с различными модальностями, такими как изображения и текст. Поэтому нам нужно использовать мультимодальную LLM, чтобы учитывать эти контексты и генерировать итоговый ответ. Если наши данные состоят из изображений и текста, мы можем использовать Vision Language Model (VLM), например LLAVA, Gemini, Claude Sonnet, Qwen-VL, Pixtral и т. д.
Если вы хотите узнать больше о деталях реализации этого паттерна, у нас есть специальная статья, которая проведет вас через шаги по созданию мультимодального RAG с этим паттерном. Однако имейте в виду, что в этой статье исходные изображения не хранятся напрямую внутри векторной базы данных, а вместо этого хранятся в локальной памяти.
Главное преимущество этого паттерна — его универсальность и простота. Реализация мультимодальной модели эмбеддингов означает, что нам не нужен дополнительный шаг для преобразования контента всех модальностей в основную модальность, как мы делали в первом паттерне. Кроме того, контексты, извлеченные после поиска по сходству, могут быть данными любых модальностей, а не только одной конкретной модальности.
Однако, поскольку мы можем использовать данные любых модальностей в качестве релевантных контекстов для нашей мультимодальной LLM, при реализации этого паттерна нам также нужно хранить исходные данные. Проблема в том, что объем памяти для нетекстовых данных, таких как изображения, велик, и их хранение напрямую в векторной базе данных может привести к неэффективному использованию ресурсов. В конечном итоге это также приведет к более медленному времени выполнения запросов и более высоким затратам на хранение.
Поэтому мы рекомендуем использовать этот паттерн, если вам нужно использовать данные с разными модальностями в качестве контекстов, но масштабируемость не является проблемой для вашего сценария использования.
Паттерн 3: Гибридное извлечение с доступом к исходным изображениям.
Если вам нужно использовать данные с различными модальностями в качестве контекстов, и масштабируемость также имеет значение, то вы можете реализовать этот паттерн. Основная идея этого паттерна — разделение ответственности: мы используем векторную базу данных для выполнения быстрого и эффективного поиска по сходству, чтобы находить релевантные контексты, и используем специализированные системы объектного хранилища, такие как AWS S3 или Google Cloud Storage, для хранения исходных данных.
Во время реализации этого паттерна нам нужно выполнить два разных шага. Во-первых, мы храним фактические исходные данные в специализированной системе объектного хранилища, такой как AWS S3 или Google Cloud Storage. Во-вторых, мы храним метаданные наших исходных данных внутри векторной базы данных, например URL нашего изображения, которое находится в специализированной системе объектного хранилища.
Рисунок: рабочий процесс паттерна 3.
Поскольку мы используем отдельную систему для хранения наших исходных данных, способ выполнения RAG почти аналогичен первому паттерну. Допустим, текст — наша основная модальность. Первое, что нам нужно сделать, — использовать мультимодальную LLM для генерации текстовых сводок наших исходных данных. Затем мы можем использовать текстовую модель эмбеддингов, чтобы преобразовать текстовые сводки в эмбеддинги. Затем мы сохраняем эмбеддинги, а также метаданные наших исходных данных (URL исходных данных в специализированной системе хранения) в векторную базу данных.
Для любого заданного запроса мы используем ту же мультимодальную LLM для генерации текстовой сводки, а затем преобразуем сводку запроса в эмбеддинг с помощью той же текстовой модели эмбеддингов. Далее мы можем выполнить поиск по сходству и получить текстовую сводку, а также URL релевантных контекстов. Наконец, мы можем передать исходные данные в мультимодальную LLM через извлеченный URL.
Опять же, вы можете обратиться к этой статье, которая проведет вас через шаги по созданию мультимодального RAG с этим паттерном. Однако имейте в виду, что в статье исходные изображения хранятся не в типичной готовой к production системе хранения, такой как AWS или GCP, а в локальной памяти.
Из трех вариантов этот шаблон является наиболее масштабируемым благодаря отделению хранилища необработанных данных. Как мы, возможно, уже знаем, векторные базы данных оптимизированы для запросов к неструктурированным данным, а не для хранения и выдачи крупных бинарных объектов, таких как изображения. На самом деле извлечение бинарных объектов из векторных баз данных часто медленнее, чем извлечение их из специализированной системы объектного хранилища.
Поэтому мы рекомендуем использовать этот шаблон, если вы хотите использовать данные с различными модальностями в качестве контекстов и масштабируемость является важной проблемой для вашего сценария использования.
Как векторная база данных Milvus поддерживает мультимодальный RAG
Как упоминалось в предыдущих разделах, векторные базы данных играют ключевую роль в применении Retrieval Augmented Generation (RAG). Milvus — это векторная база данных, которая идеально подойдет для использования в вашей RAG-системе или других AI-приложениях благодаря своим расширенным возможностям.
Milvus предлагает методы индексирования от самых простых до более продвинутых, таких как IVFFLAT, HNSW и SCANN, что позволяет нам хранить огромные коллекции данных быстрым и эффективным способом. Реализация этих продвинутых методов индексирования также ускоряет процесс поиска по сходству для нахождения релевантных контекстов в реализации RAG.
Простая интеграция Milvus с популярными инструментами для мультимодального RAG.
Milvus также предлагает простую интеграцию со всеми компонентами RAG, которые мы обсудили в предыдущем разделе, такими как модели эмбеддингов, LLM и инструменты оркестрации. Что касается моделей эмбеддингов, вы можете напрямую использовать популярные варианты от OpenAI, Cohere, SentenceTransformers, HuggingFace, VoyageAI и других с Python SDK для Milvus под названием pymilvus. Вы можете установить pymilvus с помощью простой команды pip:
pip install -U pymilvus
Теперь предположим, что вы хотите использовать модель эмбеддингов от SentenceTransformers, вы можете легко сделать это с помощью pymilvus следующим образом:
pip install "pymilvus[model]"
from pymilvus import model
sentence_transformer_ef = model.dense.SentenceTransformerEmbeddingFunction(
model_name='all-MiniLM-L6-v2', # Specify the model name
device='cpu' # Specify the device to use, e.g., 'cpu' or 'cuda:0'
)
doc = [
"Artificial intelligence was founded as an academic discipline in 1956."]
doc_embedding = sentence_transformer_ef.encode_documents(doc)
Вы можете узнать больше о различных видах моделей эмбеддингов, поддерживаемых Pymilvus, на этой странице интеграции.
Что касается LLM и инструментов оркестрации, Milvus можно легко интегрировать с популярными фреймворками, такими как vLLM, Ollama, Gemini, LlamaIndex и Langchain. Если вы хотите узнать больше об интеграции Milvus и всех этих инструментов, у нас есть коллекция руководств, которую вы можете посмотреть на этой странице. У нас также есть простое руководство, в котором вы можете узнать, как создать простой мультимодальный RAG с Milvus на этой странице документации.
Заключение
Мультимодальный RAG представляет собой значительный шаг вперед в использовании разнообразных модальностей данных для повышения точности ответов LLM. В этой статье мы обсудили три ключевых шаблона реализации мультимодального RAG: приведение всех модальностей к основной модальности, встраивание их в единое векторное пространство или использование гибридного поиска с доступом к необработанным данным. Выбор подходящего шаблона зависит от конкретных потребностей вашего AI-приложения.
Благодаря своим продвинутым методам индексирования и простой интеграции с моделями эмбеддингов, LLM и инструментами оркестрации, векторная база данных Milvus предлагает подходящую систему для реализации мультимодальных систем RAG. По мере расширения масштаба и сложности приложений ИИ использование масштабируемой системы векторных баз данных, такой как Milvus, становится всё более важным.
Читать далее

Announcing VDBBench 1.0: Open-Source VectorDB Benchmarking with Your Real-World Production Workloads
Discover VDBBench 1.0, an open-source tool for benchmarking vector databases with real-world production data, streaming ingestion, and concurrent workloads.

Milvus WebUI: A Visual Management Tool for Your Vector Database
Explore Milvus WebUI to monitor, manage, and optimize your vector database with real-time insights, performance tracking, and system health monitoring.

Vector Databases vs. Hierarchical Databases
Use a vector database for AI-powered similarity search; use a hierarchical database for organizing data in parent-child relationships with efficient top-down access patterns.


