Эмбеддинги и векторный поиск: дорожная карта для начинающих
Вы хотите добавить семантический поиск в ваше приложение — пользователи вводят запрос и получают результаты, основанные на смысле, а не на точных ключевых словах. Но вы не уверены, с чего начать: что такое эмбеддинги? Нужна ли вам векторная база данных? Как измерить сходство? Эта дорожная карта отвечает на эти вопросы с практическими шагами и кодом, который можно запустить сегодня.
Что такое эмбеддинги?
Эмбеддинг — это плотный вектор чисел с плавающей точкой, который представляет смысл входных данных: текста, изображения, аудио и т. д. Для текста модель, такая как text-embedding-3-small или открытая альтернатива (например, all-MiniLM-L6-v2), преобразует предложение в, скажем, 384-мерный вектор. Слова или предложения с похожим значением оказываются близко друг к другу в этом векторном пространстве.
Пример: «кошка» и «котёнок» будут иметь векторы, которые ближе, чем «кошка» и «самолёт». Это свойство позволяет осуществлять семантический поиск: вы создаёте эмбеддинги ваших документов и запроса, а затем находите ближайшие векторы документов.
Как работает векторный поиск
Векторный поиск (также называемый поиском по сходству) находит векторы в вашем наборе данных, которые наиболее похожи на вектор запроса. Сходство обычно измеряется с помощью косинусного сходства или скалярного произведения. Для нормализованных векторов косинусное сходство и скалярное произведение эквивалентны.
Полный перебор сравнивает запрос с каждым вектором — это нормально для тысяч векторов, но слишком медленно для миллионов. Здесь на помощь приходят алгоритмы приближённого поиска ближайших соседей (ANN), такие как HNSW (Hierarchical Navigable Small World) или IVF (Inverted File Index). Они обменивают крошечную часть точности на огромный выигрыш в скорости.
Пошагово: создаём прототип семантического поиска
- Выберите модель эмбеддингов. Для английского текста начните с небольшой быстрой модели, например
all-MiniLM-L6-v2(384 размерности) из Sentence Transformers. Для продакшена рассмотритеtext-embedding-3-small(1536 размерностей) илиtext-embedding-3-large(3072 размерности) от OpenAI. - Создайте эмбеддинги ваших документов. Разбейте длинные тексты на фрагменты (например, 200–500 слов), чтобы каждый фрагмент содержал связную идею. Храните исходный текст вместе с вектором.
- Выберите векторное хранилище. Для быстрого старта используйте библиотеку в оперативной памяти, такую как FAISS, или простой массив NumPy. Для продакшена выберите специализированную векторную базу данных (см. таблицу ниже).
- Создайте эмбеддинг запроса. Используйте ту же модель, чтобы создать эмбеддинг поискового запроса пользователя.
- Выполните поиск. Вычислите сходство между вектором запроса и всеми векторами документов (или используйте ANN-индекс) и верните top-k результатов.
- Итерируйте. Оценивайте результаты, корректируйте размер фрагмента, модель или метрику сходства.
Минимальный пример на Python с Sentence Transformers и FAISS
from sentence_transformers import SentenceTransformer
import faiss
import numpy as np
# 1. Загружаем модель
model = SentenceTransformer('all-MiniLM-L6-v2')
# 2. Примеры документов
docs = [
"The cat sat on the mat.",
"A kitten is playing with yarn.",
"The stock market crashed today.",
"Investors are worried about inflation."
]
# 3. Создаём эмбеддинги
embeddings = model.encode(docs, convert_to_numpy=True)
# 4. Строим индекс FAISS
dim = embeddings.shape[1]
index = faiss.IndexFlatL2(dim) # L2-расстояние; для косинуса сначала нормализуйте
index.add(embeddings)
# 5. Поиск
query = "feline resting"
query_vec = model.encode([query], convert_to_numpy=True)
D, I = index.search(query_vec, k=2)
print([docs[i] for i in I[0]])
# Вывод, вероятно: ['The cat sat on the mat.', 'A kitten is playing with yarn.']
Выбор векторной базы данных
Для небольших проектов вы можете хранить векторы в простом файле или индексе в памяти. По мере масштабирования специализированная векторная база данных предлагает персистентность, фильтрацию и ANN-индексы. Вот краткое сравнение:
| База данных | Тип | Лучше всего подходит для |
|---|---|---|
| FAISS | Библиотека | Прототипирование, локальные эксперименты |
| Chroma | Встраиваемая / Клиент-сервер | Малые и средние приложения, простая настройка |
| Pinecone | Управляемое облако | Продакшен, бессерверное масштабирование |
| Weaviate | Открытый исходный код / Облако | Гибридный поиск, GraphQL API |
| Qdrant | Открытый исходный код / Облако | Высокая производительность, фильтрация |
| pgvector | Расширение PostgreSQL | Существующий стек Postgres |
Лучшие практики и распространённые ошибки
- Нормализуйте векторы, если используете косинусное сходство — многие библиотеки предполагают единичные векторы для скалярного произведения.
- Разбивайте с умом: слишком крупные фрагменты теряют специфичность; слишком мелкие теряют контекст. Экспериментируйте с перекрытием.
- Используйте одну и ту же модель для документов и запросов. Смешивание моделей нарушает сходство.
- Рассмотрите снижение размерности (например, PCA) только если хранение или скорость критичны; это может снизить точность.
- Гибридный поиск (комбинация ключевых слов и векторов) часто улучшает результаты для точных совпадений.
FAQ
Нужна ли мне векторная база данных для небольшого проекта?
Нет. Для нескольких тысяч векторов можно использовать библиотеку в оперативной памяти, например FAISS, или даже массив NumPy. Векторная база данных становится полезной, когда вам нужна персистентность, фильтрация или масштабирование за пределы памяти.
Как выбрать модель эмбеддингов?
Начните с небольшой быстрой модели, такой как all-MiniLM-L6-v2, для прототипирования. Если вам нужна более высокая точность и вы можете позволить себе расходы на API, попробуйте text-embedding-3-small или text-embedding-3-large от OpenAI. Всегда оценивайте на своих данных.
В чём разница между косинусным сходством и евклидовым расстоянием?
Косинусное сходство измеряет угол между векторами, игнорируя их длину. Евклидово расстояние измеряет расстояние по прямой. Для нормализованных векторов они дают одинаковый ранжированный список. Косинус часто используется для текстовых эмбеддингов, потому что он фокусируется на направлении (смысле), а не на длине.
Следующие шаги
Теперь, когда вы понимаете основы, попробуйте построить небольшой семантический поиск по вашим собственным заметкам или документации. Экспериментируйте с размерами фрагментов и моделями. По мере роста переходите на управляемую векторную базу данных и добавьте гибридный поиск. Область развивается быстро, но эти основы останутся актуальными.
Когда вам нужно отформатировать ответы API или отладить JSON-полезные нагрузки от сервисов эмбеддингов, JSON Formatter поможет быстро проверить и валидировать данные.