Самостоятельное размещение эмбеддингов для DiscourseAI

Плагин Discourse AI обладает множеством функций, требующих для работы векторных представлений (embeddings), таких как «Связанные темы», «Поиск с помощью ИИ», «Помощник ИИ» и предложения категорий и тегов. Хотя вы можете использовать сторонний API, например, настроить ключи API для OpenAI, настроить ключи API для Cloudflare Workers AI или настроить ключи API для Google Gemini, мы создали Discourse AI с первого дня так, чтобы не быть зависимыми от этих сервисов.

Запуск с использованием HuggingFace TEI

HuggingFace предоставляет отличный контейнерный образ, который позволит вам быстро запустить сервис.

Например:

mkdir -p /opt/tei-cache
docker run --rm --gpus all --shm-size 1g -p 8081:80 \
  -v /opt/tei-cache:/data \
  ghcr.io/huggingface/text-embeddings-inference:latest \
  --model-id BAAI/bge-large-en-v1.5

Это позволит вам запустить локальный экземпляр модели BAAI/bge-large-en-v1.5 — очень эффективной модели с открытым исходным кодом.

Вы можете проверить, работает ли он, выполнив команду:

curl -X POST \
  'http://localhost:8081/embed' \
  -H 'Content-Type: application/json' \
  -d '{ "inputs": "Testing string for embeddings" }'

При нормальной работе должен быть возвращён массив чисел с плавающей запятой.

Доступность для вашего экземпляра Discourse

Чаще всего этот сервис будет запускаться на выделенном сервере из-за ускорения работы GPU. В таком случае рекомендуется использовать обратный прокси-сервер, завершать TLS-соединения и обеспечить безопасность конечной точки, чтобы к ней мог подключаться только ваш экземпляр Discourse.

Настройка DiscourseAI

Discourse AI теперь использует полностью настраиваемую систему определения векторных представлений, аналогичную настройке больших языковых моделей (LLM). Чтобы настроить ваш самохостинговый конечный пункт:

  1. Перейдите в Администрирование → Плагины → Discourse AI → Векторные представления (Embeddings).
  2. Нажмите Создать, чтобы создать новое определение векторных представлений.
  3. Выберите шаблон, соответствующий вашей модели (например, bge-large-en, bge-m3 или multilingual-e5-large), или выберите Настроить вручную для любой другой модели.
  4. Укажите URL, ведущий на ваш самохостинговый сервер TEI (например, https://your-tei-server:8081).
  5. Используйте кнопку Тест, чтобы проверить подключение перед сохранением.
  6. После сохранения установите параметр ai_embeddings_selected_model на ваше новое определение векторных представлений.

После настройки Discourse автоматически заполнит векторные представления для существующих тем с помощью запланированной фоновой задачи. Если у вас большая очередь, вы можете увеличить скрытый параметр ai_embeddings_backfill_batch_size (по умолчанию: 250), чтобы обрабатывать темы быстрее.

11 лайков

Модель bge-m3 должна работать для многоязычных (или не на английском) сайтов?

Да, я протестировал его на той неделе, когда его тихо опубликовали на GitHub, и он работает хорошо. Всё ещё жду, как он покажет себя в рейтинге MTEB, так как в последний раз, когда я смотрел, его там не было.

Тем не менее, у нас есть крупные размещённые экземпляры Discourse, использующие мультиязычный плагин e5, который идёт в комплекте, и он работает очень хорошо.

1 лайк

Спасибо. Планировали ли вы включить возможность настройки пользовательских конечных точек с открытым исходным кодом для встраиваний? Я пытаюсь использовать эти модели на Hugging Face.

Извините, я не совсем понял, что вы имеете в виду. Эта тема представляет собой руководство по запуску моделей с открытым исходным кодом для эмбеддингов в Discourse AI.

О, извините. Я пытаюсь использовать модель с открытым исходным кодом из HuggingFace через пользовательскую конечную точку и wondering, возможно ли это или это планируется реализовать в ближайшем будущем :slight_smile:

Чтобы проверить, что всё работает, используйте следующую команду (для модели BAAI/bge-m3):

curl -X 'POST' \
  'http://localhost:8081/embed'\
  -H 'Content-Type: application/json' \
  -d '{ "inputs": "Testing string for embeddings"}'

Кстати, вы также можете воспользоваться веб-интерфейсом Swagger по адресу http://localhost:8081/docs/.

2 лайка

Это также отличный сервер для эмбеддингов:

https://github.com/michaelfeil/infinity

1 лайк

Чтобы сэкономить место, можно ли использовать квантованные эмбеддинги? Я хочу использовать бинарные квантованные эмбеддинги, чтобы значительно уменьшить размер хранилища. Проведя некоторые тесты, я получил >90% производительности при сокращении объема хранилища в 32 раза!

1 лайк

Несколько недель назад по умолчанию мы начали хранить эмбеддинги в формате с половинной точностью (занимают вдвое меньше места), а для индексов использовать бинарную квантизацию (в 32 раза меньше), поэтому простое обновление вашего сайта до последней версии должно существенно снизить использование дискового пространства.

3 лайка

Не могли бы вы также добавить:

в список поддерживаемых моделей для векторизации?

Мы планируем сделать эмбеддинги настраиваемыми так же, как и LLM, поэтому в скором времени будет поддерживаться любая модель.

4 лайка

Если у кого-то ещё возникают проблемы с эндпоинтами в локальной сети, например 192.168.x.x, — похоже, что Discourse их блокирует (вероятно, по соображениям безопасности), и это ограничение нужно обойти. Я потратил несколько часов, чтобы разобраться в этом!

1 лайк

@Falco это было бы здорово. Тем временем, если я захочу попробовать добавить новую модель векторных представлений, мне достаточно будет добавить:

 lib/embeddings/vector_representations/mxbai-embed-xsmall-v1.rb
 lib/tokenizer/mxbai-embed-xsmall-v1.rb
 tokenizers/mxbai-embed-xsmall-v1.json

и изменить lib/embeddings/vector_representations/base.rb, включив туда новую модель, или нужно изменить что-то ещё?

@Falco Я попробовал добавить модель и отправил pull request. Извините, если я что-то сделал неправильно, так как я не совсем разработчик ПО. Надеюсь, вы сможете посмотреть на это и сказать, подходит ли это для включения.

К сожалению, мне не удалось заставить это работать с TEI. Мне удалось запустить all-mpnet с TEI, но, думаю, что-то не так с тем, что я сделал, чтобы заставить работать mxbai.

Кстати, есть ли шанс добавить поддержку https://github.com/michaelfeil/infinity в качестве сервера эмбеддингов?

РЕДАКТИРОВАНИЕ: Я вижу, что это будет запутанно, так как индексы HNSW в базе данных, похоже, прописаны жестко, поэтому новые модели нужно добавлять в конец, чтобы не нарушить порядок, и каждая новая модель должна добавлять свой собственный индекс.

Я настоятельно рекомендую подождать пару недель, пока мы не выпустим поддержку настраиваемых эмбеддингов.

Это должно работать корректно, когда мы выпустим настраиваемые эмбеддинги, но из любопытства: что это даст по сравнению с GitHub - huggingface/text-embeddings-inference: A blazing fast inference solution for text embeddings models · GitHub?

Я не следил за TEI, поэтому не буду упоминать преимущества, которые я не проверял недавно, но из того, что я видел недавно:

  • Поддержка оборудования: infinity имеет лучшую поддержку GPU, чем TEI
  • Сервер infinity может размещать несколько моделей встраивания на одном сервере (если только я не упустил это в TEI)

Это очень здорово. Если вы еще не пробовали, вам стоит взглянуть!

1 лайк

Друг только что прислал мне эту ветку в ДМ.

Плюсы и минусы:

  • Infinity поддерживает мультимодальные эмбеддинги (то есть отправку изображений и аудио) в
  • поддержку GPU от AMD
  • возможность запуска нескольких моделей в одном контейнере (управление моделью через параметр model)
  • больше типов данных, например, квантование весов до int8 (в основном это неактуально, так как память для активаций больше)
  • новые модели часто появляются в виде «пользовательского кода моделирования», поставляемого в репозитории Hugging Face. Infinity при необходимости читает этот код на PyTorch. Это поможет вам избежать постоянных вопросов «можете ли вы поддержать модель xyz»
  • поддержка большего числа моделей (например, DeBERTaV2 для Mixedbread)

Минусы:

  • время холодного запуска у TEI лучше
3 лайка

Привет, Майкл :wave:

@roman активно занимается перестройкой нашей конфигурации эмбеддингов здесь:

Мы должны завершить это очень-очень скоро; как только это будет сделано, добавление поддержки Infinity станет тривиальной задачей.

Я всё ещё часто думаю о мультимодальных эмбеддингах. Это даёт вам преимущество при выполнении RAG для PDF-файлов, так как вы просто преобразуете их в изображения и создаёте эмбеддинги для каждого изображения, избегая необходимости в OCR или дорогостоящем преобразовании изображения в текст с помощью LLM.

Как только мы завершим этот PR, мы с радостью добавим поддержку Infinity (и поддержку мультимодальных моделей) в конфигурацию эмбеддингов.

Спасибо, что заглянули :hugs:

4 лайка

Интересно, не станет ли создание поддержки litellm ускоренным решением, поскольку в этом случае вы получите доступ ко всем моделям, поддерживаемым через litellm. Другие проекты, похоже, внедряют это.