Поймайте милого призрака в этот Хэллоуин с Milvus
Версия этой статьи опубликована на DZone.
Я только что выступил с докладом на All Things Open, и трудно поверить, что Retrieval Augmented Generation (RAG) теперь выглядит как техника, которой мы занимаемся уже много лет.
На это есть веская причина: за последние два года она стремительно расширилась в глубину и ширину, поскольку полезность RAG безгранична. Возможность улучшать результаты сгенерированных ответов от large language models постоянно совершенствуется, поскольку вариации, улучшения и новые парадигмы продвигают всё вперед.
Сегодня мы рассмотрим:
Практические применения мультимодального RAG
- Поиск изображений с фильтрами
- Поиск лучших хэллоуинских привидений
Использование Ollama, LLava 7B и LLM Reranking
Локальный запуск продвинутого мультимодального RAG
Я использую пару этих новых достижений в области RAG, чтобы решить пару хэллоуинских задач. Давайте посмотрим на задачи: определить, является ли что-то привидением, и какое привидение-кот самое милое?
Практические применения мультимодального RAG
Является ли что-то привидением? Поиск изображений с фильтрами и clip-vit-base-patch32
Мы хотим создать инструмент для всех охотников за привидениями, который поможет определить, является ли что-то «привидением». Для этого мы будем использовать нашу размещенную коллекцию “ghosts”, в которой есть ряд полей, по которым можно фильтровать, а также выполнять поиск по нашему мультимодально закодированному вектору. Мы позволяем пользователю передать фото привидения через Google form, приложение Streamlit, загрузку в S3 и Jupyter notebook. Мы кодируем этот запрос, который может быть комбинацией текста и/или изображения, используя модель CLIP от OpenAI с Sentence Transformer от Hugging Face. Это позволяет нам закодировать изображение предполагаемого привидения и использовать его для поиска по нашей коллекции, чтобы оценить его сходство. Если сходство достаточно высокое, мы можем считать его "ghost".
Дизайн коллекции
Прежде чем создавать любое приложение, следует убедиться, что оно хорошо определено со всеми полями, которые могут понадобиться, а также типами и размерами, соответствующими вашим требованиям.
Для нашей коллекции “ghosts” как минимум понадобятся:
Поле id типа INT64, заданное как первичный ключ и настроенное на автоматическую генерацию ID
Следующее поле в нашей схеме — ghostclass, представляющее собой скалярную строку VARCHAR длиной 20, в которой хранятся традиционные классификации привидений, такие как Class I, Class II, Fake и Class IV.
После этого идет category, более длинная скалярная строка VARCHAR длиной 256, в которой хранятся наши краткие описания, являющиеся классификациями, такими как Fake, Ghost, Deity, Unstable и Legend.
Мы добавляем поле для s3path, которое определено как большая скалярная строка VARCHAR длиной 1 024 и содержит S3 Path к изображению объекта.
Наконец и самое главное — vector, где хранится наш вектор с плавающей точкой размерности 512.
Теперь, когда у нас есть схема данных, мы можем построить ее и использовать для жуткой аналитики по нашим данным.
Шаг 1: Подключиться к Milvus Standalone
Шаг 2: Загрузить модель CLIP
Шаг 3: Определяем нашу коллекцию с её схемой векторов и скаляров.
Шаг 4: Кодируем наше изображение для использования в запросе.
Шаг 5: Выполняем запрос к коллекции ghosts в нашей автономной базе данных Milvus и ищем только те результаты, которые отфильтрованы по category как не Fake. Мы ограничиваем результат одним совпадением.
Шаг 6: Проверяем расстояние: если оно 0.8 или выше, мы будем считать это призраком. Мы делаем это, сравнивая подозрительную сущность с нашей большой базой данных настоящих фотографий призраков; если что-то относится к текущему классу призраков, оно должно быть похоже на уже имеющиеся у нас примеры.
Шаг 7: Результат отображается с предполагаемым призраком и его ближайшим совпадением.
Как вы можете видеть в нашем примере, мы нашли достаточно близкое совпадение с похожим "призраком", который не находился в категории Fake.
В отдельном приложении для Хэллоуина мы рассмотрим другую коллекцию и другую модель кодирования для отдельного сценария использования, также связанного с хэллоуинскими призраками.
Поиск самого милого кота-призрака с помощью визуализированной модели BGE
Мы хотим найти самых милых котов-призраков и, возможно, других участников для получения призов, публикаций в социальных сетях или других важных задач.
Дизайн коллекции
Прежде чем создавать какое-либо приложение, следует убедиться, что вы определили, какие поля могут вам понадобиться. Для этого простого сценария использования мы собираемся применить динамическую схему с автоматической генерацией id. Так нам не нужно определять поля, и они будут созданы с полями id и vector.
Для нашей коллекции “ghostslocal” они будут автоматически созданы для нас:
Поле id типа INT64, заданное как первичный ключ и настроенное на автоматическую генерацию ID
Мы настроили эту коллекцию на включение динамических полей; мы добавим одно важное поле во время вставки данных.
Наконец и самое важное: vector, который хранит наш вектор с плавающей точкой размерности 768.
Теперь, когда у нас есть схема данных, мы можем найти самого милого призрака.
Шаг 1: Подключаемся к Milvus Standalone
Шаг 2: Загружаем модель BAAI/bge-base-en-v1.5
Шаг 3: Определяем нашу коллекцию с её схемой векторов и скаляров.
Шаг 4: Проходим по нашему списку изображений, кодируем их и добавляем в dict для последующей вставки.
Шаг 5: Вставляем ****наши изображения, image_path создаётся как динамическое поле в нашей схеме для этой коллекции.
Шаг 6: Кодируем в вектор текстовый запрос “Show me the cutest cat ghost” для использования в запросе.
Шаг 5: Выполняем наш поиск по сходству
Шаг 6: Перебираем результаты и показываем изображение, соответствующее самому милому коту.
Наш векторный поиск довольно прост: мы просто кодируем наш текст, чтобы найти самого милого кота-призрака (в его маленьком хэллоуинском костюме). Milvus выполнит запрос к 768-мерному вектору с плавающей точкой и найдёт для нас ближайшее совпадение. Со всеми жуткими духами и призраками в нашей базе данных трудно спорить с такими результатами.
Использование Ollama, LLava 7B и повторного ранжирования LLM
Локальный запуск продвинутого RAG
Ладно, это небольшой трюк И угощение, мы можем заняться обеими темами одновременно. Мы можем запустить всю эту продвинутую технику RAG локально, используя Milvus Lite, Ollama, LLava 7B и Jupyter Notebook. Мы собираемся выполнить мультимодальный поиск с генеративным реранкером. Здесь используется LLM для ранжирования изображений и объяснения лучших результатов. Ранее мы уже делали это с суперзаряженной моделью GPT-4o. Я получаю хорошие результаты с LLava 7B, размещенной локально через Ollama. Давайте покажем, как это работает открыто, локально и бесплатно!
Мы повторно используем существующий пример кода, чтобы построить панорамное фото из изображений, возвращенных нашим гибридным поиском по фотографии офиса с призраками с текстом “computer monitor with ghost”. Затем мы отправляем это фото в модель LLaVA7B, размещенную в Ollama, с инструкциями о том, как ранжировать результаты. В ответ мы получаем ранжирование, объяснение и изображение.
Наше поисковое изображение и девять результатов
Результаты, возвращенные LLM для порядка ранжированного списка.
Наш простой и быстрый запрос Milvus для получения результатов, которые будут переданы LLM.
Полный код можно найти в нашем примере на github, и вы можете использовать любые изображения по вашему выбору, как показано в примере. Также там есть некоторые ссылки и документированный код, включая приложение StreamLit, с которым можно поэкспериментировать самостоятельно.
Заключение
Как видите, мультимодальный RAG не только не страшен, он еще и увлекателен и полезен для многих приложений.
Если вы заинтересованы в создании более продвинутых AI-приложений, то использование Milvus и мультимодального RAG — отличная комбинация для разработки приложений. Теперь вы можете выйти за рамки одного лишь текста и добавить изображения и многое другое. Мультимодальный RAG открывает множество новых направлений для генерации LLM, поиска и AI-приложений в целом.
Нам бы очень хотелось узнать ваше мнение!
Если вам понравилась эта статья, мы были бы очень признательны, если бы вы поставили нам звезду на GitHub! Вы также можете присоединиться к нашему сообществу Milvus в Discord, чтобы поделиться своим опытом. Пожалуйста, присоединяйтесь к одной или ко всем нашим встречам для локального очного общения в сообществе и работы с кодом, а также получите доступ к нашей библиотеке Youtube с записями выступлений, демонстраций и глубоких разборов с митапов.
Если вы хотите узнать больше, загляните в наш репозиторий Bootcamp на GitHub, где есть примеры того, как создавать приложения Multimodal RAG с Milvus.
Дополнительные ресурсы
Читать далее

VDBBench Adds Cost-Aware Benchmarking for Vector Databases
Compare Zilliz Cloud, Pinecone, and turbopuffer with VDBBench cost-aware vector database benchmarks across latency, freshness, multitenancy, and cold starts.

Introducing Customer-Managed Encryption Keys (CMEK) on Zilliz Cloud
We're announcing the general availability of Customer-Managed Encryption Keys (CMEK) on Zilliz Cloud.

AI Integration in Video Surveillance Tools: Transforming the Industry with Vector Databases
Discover how AI and vector databases are revolutionizing video surveillance with real-time analysis, faster threat detection, and intelligent search capabilities for enhanced security.



