Комментарии 12
Спасибо за статью:)
Видимо, вся проблема в том, что эмбеддинг модель предназначена для точных запросов, т.е. для профессиональной терминологии должно быть приемлемо.
Для варианта как в статье ей отчаянно нужен какой-то предварительный семантический обработчик, ИМХО.
OpenAI шалун
Я правильно понял, что для семантического поиска сложность O(n) вместо O(log n). Есть ли теоретическая возможность построить индекс по косинусному расстоянию?
Без индекса -- да, brute-force scan по всем векторам, O(n). Но индексы для approximate nearest neighbor (ANN) давно существуют и активно используются, в том числе в pgvector.
В проекте используется IVFFlat -- индекс, который разбивает все векторы на кластеры (параметр lists). При поиске сканируются только ближайшие кластеры (probes), а не все записи. Сложность поиска примерно O(n / lists * probes), что при правильной настройке дает существенное ускорение:
CREATE INDEX ON document_vectors
USING ivfflat (embedding vector_cosine_ops)
WITH (lists = 100);
Второй вариант -- HNSW (Hierarchical Navigable Small World), граф-based индекс. Сложность поиска O(log n), recall выше чем у IVFFlat, но потребляет больше памяти и дольше строится:
CREATE INDEX ON document_vectors
USING hnsw (embedding vector_cosine_ops)
WITH (m = 16, ef_construction = 64);
pgvector поддерживает оба. На 10K записей разница незаметна (и так быстро), но на миллионах -- принципиальна. На практике HNSW сейчас стандарт де-факто для production ANN-поиска.
Оба индекса приближенные (approximate) -- теоретически могут не вернуть абсолютно ближайшего соседа, но recall 95-99% достижим при правильной настройке параметров. Точный поиск по косинусному расстоянию за O(log n) невозможен в общем случае из-за «проклятия размерности», но ANN-индексы на практике решают задачу.
На бенчмарках Джина выше чем Квен. Наверно было бы логично с Джиной сравнивать. Чем обусловлен выбор именно Квена?
https://huggingface.co/spaces/mteb/leaderboard


Пробовали Vertex AI Vector Search и Vertex AI Search for commerce ?
Я думаю надо попробовать еще расшифровывать строчку классификатора перед взятием эмбеддинга с ЛЛМ. Вдруг индексы начнут гораздо лучше работать. Также и описание товара тоже расшифровывают, бывает.
Было бы интересно сравнить embeddinggemma с гигачатовской моделью, потому как когда делал вектора для 300к товаров из всех моделей именно embeddinggemma показал хоть что-то удовлетворительное. Гигачат потрогать возможности не было
Я как раз недавно пытался играться с похожим функционалом. У меня немного другой подход получился: Сначала с помощью LLM выбираются ключевые слова для поиска, а потом уже набор ключевых слов уходят как входные параметры для семантического поиска. Для intent это вроде бы лучше должно работать.
Вот описание моей реализации: https://github.com/alexplusplus/fin_news_agent/blob/public/fin_news_agent.ipynb

Семантический поиск vs полнотекстовый: сравниваем три embedding-модели на 10 000 категорий Ozon