Вы когда-нибудь думали: «К черту это дурацкое облако. Почему не может быть более простого способа построить на нем нейронный поиск? "

Что ж, если да, то эта статья для вас. Я расскажу, как использовать новый компонент Streamlit от Jina для поиска текста или изображений, чтобы создать интерфейс нейронного поиска.

Хотите прыгнуть прямо сейчас? Ознакомьтесь с нашим приложением для текстового поиска или приложением для поиска изображений, а вот репозиторий компонентов.

Зачем использовать Jina для создания нейронного поиска?

Jina - это поисковая платформа с открытым исходным кодом, основанная на глубоком обучении, для создания кросс- / мультимодальных поисковых систем (например, текста, изображений, видео, аудио) в облаке. По сути, он позволяет создавать поисковую систему для любых данных с любыми данными.

Таким образом, вы можете создать свою собственную поисковую систему для преобразования текста в текст, например Google, поисковую систему для преобразования текста в изображение, например, Google Images, поисковую систему для преобразования видео в видео и так далее. Такие компании, как Facebook, Google и Spotify, создают эти поисковые запросы на основе современных моделей на базе искусственного интеллекта, таких как FAISS, DistilBERT и Annoy.

Зачем использовать Streamlit с Jina?

Я был большим поклонником Streamlit еще до того, как присоединился к Jina. Я использовал его в проекте для создания ужасных сценариев Star Trek, которые позже превратились в интерфейс для генерации текста с помощью Transformers. Так что я безумно рад возможности использовать этот классный фреймворк для создания чего-то для наших пользователей.

Создание компонента Streamlit помогает специалистам по обработке данных, энтузиастам машинного обучения и всем другим разработчикам в сообществе Streamlit создавать интересные вещи на основе нейронного поиска. Он предлагает гибкость, и, будучи написанным на Python, специалистам по обработке данных может быть проще освоить его.

В стандартной комплектации компонент streamlit-jina поддерживает поиск текста в текст и изображение в изображение, но Jina предлагает расширенные возможности поиска для любых данных с помощью любые данные, так что есть еще много чего добавить в компонент!

Как это работает?

Каждый проект Jina включает в себя два Потока:

Индексирование: для разбивки и извлечения богатого смысла из набора данных с помощью моделей нейронных сетей.

Запросы: для ввода данных пользователем и поиска подходящих результатов.

Наш компонент Streamlit - это интерфейс для конечных пользователей, поэтому его не беспокоит часть индексации.

  1. Администратор запускает образ Jina Docker: docker run -p 45678:45678 jinahub/app.example.wikipedia-sentences-30k:0.2.9-1.0.1
  2. Пользователь вводит запрос в компонент Streamlit (в настоящее время либо ввод текста, либо загрузка изображения) и нажимает «поиск».
  3. Входной запрос упаковывается в JSON и отправляется в API запросов Джины.
  4. Поток запросов делает свое дело и возвращает результаты в формате JSON (вместе с большим количеством метаданных).
  5. Компонент анализирует полезную информацию (например, совпадения текста или изображения) и отображает их пользователю.

Пример кода

Давайте посмотрим на наш пример текстового поиска, так как там легче понять, что там происходит:

Как видите, приведенный выше код:

  • Импорт streamlit и streamlit_jina
  • Устанавливает конечную точку REST для поиска
  • Устанавливает заголовок страницы
  • Отображает пояснительный текст
  • Отображает виджет текстового поиска Jina с определенным endpoint

Для виджетов Jina Streamlit вы также можете передать другие параметры, чтобы определить количество результатов, которые вы хотите вернуть, или если вы хотите скрыть определенные виджеты.

За кулисами

Исходный код нашего модуля - это всего лишь один файл,. Давайте пока просто посмотрим на высокоуровневую функциональность нашего примера текстового поиска:

Установить переменные конфигурации

Компонент рендеринга

Вкратце, метод jina.text_search():

  • Создает контейнер Streamlit для хранения всего, с нормальными значениями по умолчанию, если они не указаны
  • Если виджеты не скрыты, представьте их пользователю.
  • [Запрос типов пользователей]
  • [Пользователь нажимает кнопку]
  • Отправляет запрос в Jina API и возвращает результаты
  • Отображает результаты в компоненте

Параметры нашего метода:

jina.text_search() обращается к нескольким другим методам, все из которых можно найти в __init__.py. Для поиска изображений есть еще несколько:

  • image.encode.img_base64() кодирует изображение запроса в base64 и обертывает его в JSON перед передачей в Jina API.
  • API Jina возвращает совпадения в формате base64. Метод image.render.html() помещает их в теги <IMG>, поэтому они будут красиво отображаться.

Используйте это в своем проекте

В вашем терминале:

Создайте новую папку с виртуальной средой и активируйте ее. Это предотвратит конфликты между вашими системными библиотеками и вашими индивидуальными библиотеками проекта:

mkdir my_project
virtualenv env
source env/bin/activate

Установите пакеты Streamlit и Streamlit-Jina:

pip install streamlit streamlit-jina

Проиндексируйте свои данные в Jina и запустите поток запросов. В качестве альтернативы используйте предварительно проиндексированный образ Docker:

docker run -p 45678:45678 jinahub/app.example.wikipedia-sentences-30k:0.2.9-1.0.1

Создайте свой app.py:

Запустите Streamlit:

streamlit run app.py

И вот он - ваш собственный текстовый поиск!

Для поиска изображений просто замените текстовый код выше на наш пример кода изображения и запустите изображение Jina (например, наш пример покемона.

Что делать дальше

Спасибо, что прочитали статью, и с нетерпением ждем вашего мнения о компоненте! Если вы хотите узнать больше о Jina и Streamlit, вот несколько полезных ресурсов:

Джина

Streamlit

Большое спасибо!

Большое спасибо Randy Zwitch, TC Ricks и Amanda Kelly за их помощь в запуске компонента. И спасибо всем моим коллегам из Jina за создание бэкэнда, благодаря которому это произошло!

Первоначально опубликовано на https://blog.streamlit.io 15 апреля 2021 г.