Хакатон ЛЦТ 2024: сервис SeedVideo. Кейс (15) Сервис текстового поиска по медиаконтенту
Суть проекта:
Платформа «SeedVideo» демонстрирует работу поисковой системы видео, направленной на извлечение данных из видео с целью индексации и поиска по этим данным.
Задачи платформы:
Демонстрация работы компонентов индексации и поиска по индексированным данным. А так же фронтэнд часть для демонстрации работы этой системы с возможностью поиска видео, включая систему исправления опечаток и автодополнения при поиске видео.
Описание алгоритма получения результата:
Платформа позволяет пользователям загружать видео для индексации, а так же осуществлять поиск по ранее проиндексированным данным.
В нашем решении использована гибридная архитектура, позволяющая гибко извлекать необходимые данные из на нескольких уровнях: из произносимой речи на видео, из фоновой звуковой дорожки, из происходящего на видео, из пользовательского описания видео. Совокупность этих данных у нас векторизуется, и с помощью поиска по векторной базе мы предоставляем ТОП самых подходящих под описание запроса видео. Более того наша архитектура позволяет конфигурировать веса важности вышеописанных данных и использовать LLM с помощью RAG (контекстные запросы) чтобы находить видео еще на более глубоком уровне.
Мы извлекаем из видео 4 вида модальностей: субтитры, звуковую дорожку, описание содержимого видео, пользовательское описание. Описание содержимого мы извлекаем из n уникальных ключевых фреймов (кадров видео).
Для улучшения UX мы поддерживаем автокомплит и автоисправление поисковых запросов
Описание основных алгоритмов и моделей машинного обучения:
l Алгоритмы хэширования для определения уникальности фреймов
l Мультимодальная языковая модель
l Алгоритмы автокомплита и исправленя ошибок по близости расстояния.
В нашем решении использована гибридная архитектура, позволяющая гибко настраивать и извлекать необходимые данные из видео на нескольких уровнях: из произносимой речи на видео, из фоновой звуковой дорожки, из происходящего на видео, из пользовательского описания видео. Совокупность этих данных мы векторизуем, и с помощью поиска по векторной базе мы предоставляем ТОП самых подходящих под описание запроса видео. Более того наша архитектура позволяет конфигурировать веса важности вышеописанных данных и использовать LLM с помощью RAG (контекстные запросы) чтобы находить видео еще на более глубоком уровне.
Мы используем извлечение уникальных кадров, которые описываем с помощью мультимодальной языковой модели, чтобы понять что происходит на видео, даже если в нем нет описания, тегов и не произносится речь и нет фоновых звуков. Гибкость системы позволяет управлять количеством уникальных фреймов и порогом уникальности, размером окна ответа LLM, использовать разные модальности. Векторная база позволяет оптимизировать хранение проиндексированных данных и ускорять по ним поиск.
Мы подошли к вопросу извлечения данных для поиска основательно и используем самый глубокий из возможных подходов, который даёт глубокое понимание о происходящем на видео и позволяет его найти, даже если по нему нет информации от пользователя. Мы учли баланс между скоростью индексирования и скоростью поиска.
l На беке Python, FastAPI, Celery, ChromaDB for servers
l На фронте ReactJS, Consta.design
l Скорость индексации ~5 секунд на видео до 1 минуты в одном потоке
l Скорость поиска~470 мс на топ 10 видео
Сложности при обработке данных:
· Видео файлы разной длины, поиск наилучего числа фреймов? извлечение уникальных фреймов определяется с помощью хэширования и вычисления дистанции в различиях
· В видео загруженных пользователем может вообще не быть описания и тегов
· Языковые модели плохо работают с русским языком
· Речь в видео не всегда можно извлечь качественно
· Индексация требует ГПУ вычислительных ресурсов
Основная часть интерфейса - это поисковая строка. Поисковая строка являестя интеллектуальной, позволяет предложить варианты на начально введенный запрос пользователя:
А таr же позволяют пользователю нивелировать не верно введённый запрос, предугадывая и исправляя его:
Еще одним приимуществом нашего поисковика являеся система весов, котораяпозволяет гибко настраивать качество поисковой выдачи в зависимости от настройки весов на различные модальности:
По видео - это основная фишка сервиса, в данной модальности хранятся описанные (визуальной языковой моделью) сцены на видео, другими словами интерпретация происходящего на видео (с помощью комбинации описаний нескольких уникальных фреймов).
По аудио - наша система умеет разделять* звуковую дорожку и извлекать отдельно речь и фоновую музыку\звуки. Благодаря этому мы можем качественно транскрибировать речь и перенести её в модальность.
* - благодаря этому в будущем можно векторизовать звуки и искать видео по загруженным трекам\звукам.
По тексту - по пользовательскому описанию видео.
По тегам - по введённым пользователем тегам к видео.
Система позволяет интерпретировать результаты своего поиска и обосновывать свой выбор:
Каждому видео присваивается вероятность уверенности поисковика в принадлежности данного видео к поисковому запросу.
К тому же модель показывает на основе какой из модальностей был сделан вывод о принадлежности видео.
Мы пошли дальше и для большей интерпретируемости и продемонстрировали участки данных из модальностей, по которым система делает вывод:
В данном случае мы можем видеть разделённые фрейм и интерпретацию происходящего в них. Снизу модель обосновывает причину, в данном видео она услышала в произносимом автором видео слове Dota 2.
Дальнейшее совершенствование алгоритма позволяет добавить эвристику в динамический выбор модальностей и тем самым значительно ускорить время отклика при поиске.
В данном примере мы указали вес 80 для содержимого в видео и модель будет ориентироваться на содержимое в большей степени чем на другие модальности.
Возможности сервиса:
· Поиск по проиндексированной базе пользователя
· Индексация новых видео происходит практически реалтайм и данные попадают в базу
· Поиск по произнесённой речи в виде
· Интерпретация результатов выдачи
· Система скоринга при поисковой выдаче
· Система весов для тонкой настройки поиска\содание гибридной системы поика
· Быстрый отклик при поисковом запросе
· Исправление ошибок при наборе поискового запроса
· Система автодополнения запроса популярными запросами при наборе поискового запроса
Алгоритм работы:
API сервис:
https://api.seedvideo.ru/video/7470?query=%D1%85%D0%B0%D0%B1%D0%B0%D1%80%D0%BE%D0%B2%D1%81%D0%BA&video=90&audio=80&text=20&hashtag=30
Для работы с API сервисом вся документация по работе с сервисом указана в swagger по адресу: https://api.seedvideo.ru/docs
https://api.seedvideo.ru/openapi.json
Для установки серверной части вам необходимо использовать Docker версии не ниже 20. Инструкцию по установке можете найти здесь (https://docs.docker.com/engine/install/)
Далее вам следует заполнить файл переменных окружений. Например, следующим образом:
PROJECT_NAME=name
PGSQL_URL=postgresql://root:password@pgsql/name
PGSQL_USERNAME=root
PGSQL_PASSWORD=password
PGSQL_DATABASE=name
PGSQL_DATA=/data/
RABBITMQ_USERNAME=root
RABBITMQ_PASSWORD=password
CELERY_BROKER_URL=amqp://root:password@rabbitmq:5672//
CELERY_RESULT_BACKEND=redis://redis:6379/0
KEYCLOAK_ADMIN=root
KEYCLOAK_ADMIN_PASSWORD=password
API_BASE_URL=http://localhost:9000/
API_MEDIA_URL=http://localhost/files/
API_MEDIA_PATH=media
REACT_APP_API_URL=http://localhost:9000/
И клонируем репозиторий:
· git clone https://github.com/ShakurovR/vsm
· cd vsm
· docker compose –f docker-compose.local.yml build —no-cache —pull
· docker compose –f docker-compose.local.yml up –d
Также для разворачивания только API сервиса можно использовать файл docker-compose.back.yml
Полезные ссылки
· Веб сервис: https://seedvideo.ru
· API сервис: http://api.seedvideo.ru
· Документация API сервиса: https://api.seedvideo.ru/docs
· Github: https://github.com/ShakurovR/vsm/tree/main
Стек используемых технологий и библиотек:
· Sbercloud IaaS/PaaS Infrastructure