Обновить

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

Время на прочтение10 мин
Охват и читатели8.4K
Всего голосов 10: ↑10 и ↓0+10
Комментарии12

Комментарии 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

Я особо не выбирал. Что было под рукой то и сравнил... Меня больше всего интересовало сравнение OpenAI vs Gigachat, Qwen до кучи добавил, потому что он у меня запускается на моём ноуте с ноутбучной видюхой. Вообще тема интересная, можно добавлять и сравнивать разные модели.

Пробовали Vertex AI Vector Search и Vertex AI Search for commerce ?

Нет, не пробовал. Посмотрел на цены... Для сравнения - я купил 50млн токенов гигачат за 700 рублей. Полностью проиндексировать весь каталог в 10к строк - ушло примерно 220 тысяч токенов. Это примерно 3 рубля я потратил на материал для этой статьи.

Я думаю надо попробовать еще расшифровывать строчку классификатора перед взятием эмбеддинга с ЛЛМ. Вдруг индексы начнут гораздо лучше работать. Также и описание товара тоже расшифровывают, бывает.

Всё верно. Но тут не сами товары, а категории. Можно увеличить объем ключевыми словами, какими-то описаниями, тогда ассоциаций будет больше и поиск станет точней. Но это уже тюнинг под конкретные задачи.

Было бы интересно сравнить embeddinggemma с гигачатовской моделью, потому как когда делал вектора для 300к товаров из всех моделей именно embeddinggemma показал хоть что-то удовлетворительное. Гигачат потрогать возможности не было

Я как раз недавно пытался играться с похожим функционалом. У меня немного другой подход получился: Сначала с помощью LLM выбираются ключевые слова для поиска, а потом уже набор ключевых слов уходят как входные параметры для семантического поиска. Для intent это вроде бы лучше должно работать.

Вот описание моей реализации: https://github.com/alexplusplus/fin_news_agent/blob/public/fin_news_agent.ipynb

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации