Qdrant - Vector Database
FastEmbed: эмбеддинги без GPU
Хотите добавить semantic search в serverless функцию или IoT устройство? С PyTorch это невозможно - 2 GB зависимостей. FastEmbed даёт те же эмбеддинги за 50 MB.
- Serverless RAG: AWS Lambda + FastEmbed + Qdrant Cloud без PyTorch
- Edge inference: генерация эмбеддингов на Raspberry Pi для offline поиска
- Hybrid search без внешних сервисов: BM42 sparse + BGE dense в одном процессе
Предварительные знания
FastEmbed: ONNX Runtime без PyTorch
**FastEmbed** - Python библиотека от команды Qdrant для генерации эмбеддингов. Главное отличие от transformers/sentence-transformers: работает на **ONNX Runtime** без PyTorch. Это означает: нет зависимостей весом в несколько гигабайт, работает на CPU, подходит для serverless и edge окружений.
Поддерживаемые dense модели (топ-5 для поиска):
| Модель | Размер | Язык | Dim |
|---|---|---|---|
| BAAI/bge-small-en-v1.5 | 130 MB | EN | 384 |
| BAAI/bge-base-en-v1.5 | 430 MB | EN | 768 |
| nomic-ai/nomic-embed-text-v1.5 | 275 MB | EN | 768 |
| intfloat/multilingual-e5-large | 560 MB | Multi | 1024 |
| sentence-transformers/paraphrase-multilingual | 280 MB | Multi | 768 |
FastEmbed кэширует модели в `~/.cache/fastembed/`. При холодном старте первая загрузка занимает несколько секунд. В production предварительно прогревайте модель или используйте Docker с предзагруженными весами.
Почему FastEmbed подходит для serverless окружений, а sentence-transformers - нет?
Sparse эмбеддинги: BM42, BM25, SPLADE
`SparseTextEmbedding` - отдельный класс FastEmbed для генерации sparse векторов прямо из текста. Поддерживает три алгоритма: **SPLADE** (нейронные sparse), **BM25** (классический TF-IDF), **BM42** (гибрид: attention weights из нейросети + BM25 статистика).
| Алгоритм | Качество поиска | Скорость | Детерминизм | Размер модели |
|---|---|---|---|---|
| SPLADE | Высокое | Медленно | Нет (нейронная) | 500+ MB |
| BM42 | Хорошее | Быстро | Частично | 100 MB |
| BM25 | Базовое | Очень быстро | Да | < 1 MB (no model) |
**BM42** - изобретение команды Qdrant. Идея: использовать attention weights маленькой нейросети (all-MiniLM) для взвешивания токенов вместо чистого TF-IDF. Результат: точность близкая к SPLADE при скорости близкой к BM25. Рекомендуется как default sparse модель.
Чем BM42 отличается от классического BM25?
Production pipeline: FastEmbed + Qdrant
Полный production pipeline: документы → dense + sparse эмбеддинги → hybrid upsert в Qdrant → hybrid search. FastEmbed интегрируется напрямую в `QdrantClient` (Python) через параметр `embedding_model`.
Оптимальный batch size для FastEmbed: **32-128 документов**. Меньше - overhead на вызов модели, больше - риск OOM. Для BGE-small на стандартном сервере: 64 документа за ~200ms на CPU. Для production: benchmark на реальных данных.
Почему в production FastEmbed рекомендуется обрабатывать документы батчами, а не по одному?
Итоги
- FastEmbed работает на ONNX Runtime — нет зависимости от PyTorch (50 MB vs 2 GB)
- SparseTextEmbedding поддерживает BM25, BM42 (рекомендуется) и SPLADE
- BM42 = attention weights нейросети + BM25 статистика: лучшее качество при разумной скорости
- Оптимальный batch size: 32-128 документов для эффективной CPU векторизации
- Python: QdrantClient поддерживает embedding_model параметр для прозрачной интеграции
Что дальше
FastEmbed генерирует векторы - теперь нужно эффективно их искать.
- BM25 и Full-Text Search — Native BM25 в Qdrant - альтернатива без внешнего embedder
- Universal Query и Prefetch — Как использовать generated vectors в multi-stage поиске
- Sparse Vectors — Основы: как работают sparse vectors в Qdrant
Вопросы для размышления
- В каких случаях BM25 предпочтительнее BM42? Когда детерминизм важнее качества?
- Как бы вы организовали прогрев FastEmbed модели в serverless функции для минимизации cold start?
- Если ваши документы на русском языке, какую модель из поддерживаемых FastEmbed вы бы выбрали и почему?