От слов к числам: зачем нужны векторы
Векторные базы и эмбеддинги · Урок 1 / 20
Совпадение слов — плохой заменитель совпадения смысла
Классический поиск построен на инвертированном индексе: документ разбирается на токены, для каждого токена хранится список документов, релевантность считается формулой вроде BM25 — чем реже слово в коллекции и чем чаще оно в документе, тем больше вклад. Это работает, пока запрос и документ написаны одними и теми же словами. Запрос «как вернуть покупку» и статья «оформление возврата товара» не пересекаются ни одним значимым токеном. Документ не окажется на десятом месте — он не попадёт в выдачу вообще, потому что его там физически нет.
Где именно ломается лексический поиск
- Синонимия. «Машина», «автомобиль», «авто» — три токена и один объект. Словари синонимов чинят это, но их ведут руками, и они не переносятся между доменами.
- Перефразировка. Пользователь спрашивает глаголами («не приходит письмо»), документ назван существительными («доставка уведомлений»). Пересечение — ноль.
- Морфология и словоформы. Стемминг чинит окончания, но не чинит «оплата не прошла» против «списание отклонено».
- Многословные понятия. «Отказ в проведении платежа» — четыре токена, каждый по отдельности шумный, вместе они значат одно.
Идея замены: перевести объект в числа
Эмбеддинг — функция, переводящая объект (фрагмент текста, картинку, товар, пользователя) в вектор фиксированной длины: список из 256, 384, 768 или 1536 чисел с плавающей точкой. Модель обучена так, что объекты, считавшиеся похожими в её обучающих данных, получают близкие векторы. После этого вопрос «похожи ли два текста» превращается в вопрос «чему равно одно число, посчитанное по двум массивам» — операцию, которую процессор выполняет за наносекунды и умеет делать пакетами по миллиону.
запрос ──► эмбеддер ──► [0.021, -0.113, ... , 0.008] 768 чисел
|
v сравнение с векторами документов
док A ──► эмбеддер ──► [ ... ] близость 0.81
док B ──► эмбеддер ──► [ ... ] близость 0.34
Что это меняет в архитектуре поиска
Лексический индекс отвечает на вопрос «в каких документах встречаются эти токены». Векторный индекс отвечает на принципиально другой: «какие документы ближе всего к этой точке». Второй вопрос возвращает ответ всегда. На бессмысленный запрос, на запрос не по теме коллекции, на пустую строку — вы получите топ-10 с какими-то оценками близости. Лексический поиск умеет молчать, векторный не умеет. Пустая выдача — полезный сигнал; десять нерелевантных документов с оценкой 0.62 — не сигнал, и отсекать их придётся порогом, который установите вы, а не модель.
Шпаргалка
- Лексический поиск ищет токены, векторный — ближайшие точки; это разные вопросы к данным.
- Эмбеддинг — вектор фиксированной длины, обычно 256-1536 чисел.
- Векторный поиск всегда возвращает результат, даже когда правильный ответ — «ничего нет».
- Размеченный набор запросов заводят до индекса, а не после первой жалобы.