Урок курса

Семантический поиск и эмбеддинги: как это работает

Vector DB & RAG Developer

Семантический поиск пытается найти совпадение по смыслу, даже если вопрос и документ используют разные слова. Запрос «как вернуть деньги за заказ» должен находить раздел «условия оформления возврата», хотя точного совпадения фраз нет.

Что такое эмбеддинг

Embedding-модель превращает текст в вектор фиксированной длины — набор чисел, описывающий его положение в многомерном пространстве. Тексты с похожим смыслом обычно получают близкие векторы.

Для поиска заранее вычисляют эмбеддинги документов. При запросе той же моделью строят вектор вопроса и сравнивают его с индексом. Популярная мера — cosine similarity:

cosine(a, b) = (a · b) / (||a|| × ||b||)

Чем ближе направление векторов, тем выше сходство. Сам вектор человеку не объясняет смысл; интерпретация появляется только через сравнение и тестовый набор.

Семантический и лексический поиск

Классический BM25 хорошо ловит точные термины: артикулы, имена функций, коды ошибок. Семантический поиск устойчивее к синонимам и перефразированию, но может пропустить редкий идентификатор или считать похожими тексты с разными важными деталями.

Поэтому в RAG часто используют гибридную схему: BM25 и vector search формируют два списка кандидатов, затем результаты объединяются и при необходимости проходят reranking.

Качество зависит от нескольких решений:

  • одна и та же embedding-модель должна использоваться для документов и запросов;
  • смена модели требует переиндексации корпуса;
  • документы нужно делить на осмысленные чанки;
  • язык и предметная область должны быть представлены в данных модели;
  • фильтры доступа и метаданных применяются вместе с поиском.

Высокая близость не является доказательством правильного ответа — это только сигнал релевантности.

Минимальный эксперимент

Возьмите набор документов и 20 реальных вопросов. Для каждого вопроса заранее отметьте правильный фрагмент. Постройте эмбеддинги, верните top-5 и посчитайте, как часто правильный результат оказался среди пяти.

Проверьте трудные случаи отдельно: отрицания, числа, версии продукта, короткие запросы и термины с несколькими значениями. Если семантический поиск путает версии или коды, добавьте metadata-фильтр либо лексическую компоненту.

Не сравнивайте embedding-модели только по публичному benchmark. Важнее Recall@k на вашем корпусе, задержка, цена индексации и разрешение на обработку данных.

Семантический поиск — это не замена всем видам поиска. Он добавляет понимание перефразирования, а точные совпадения и бизнес-фильтры продолжают выполнять свою работу.

Косинусное сходство на маленьких векторах

Рассчитаем сходство вручную заданных векторов. Они не получены embedding-моделью, поэтому пример проверяет только математику сравнения. В рабочем поиске и документ, и запрос кодируются совместимой моделью с одинаковой размерностью.

from math import sqrt
def cosine(a, b):
    if len(a) != len(b):
        raise ValueError("Размерности различаются")
    norm_a = sqrt(sum(x*x for x in a))
    norm_b = sqrt(sum(x*x for x in b))
    if norm_a == 0 or norm_b == 0:
        raise ValueError("Нулевой вектор")
    return sum(x*y for x,y in zip(a,b))/(norm_a*norm_b)
print(round(cosine([1,0], [1,1]), 3))
assert cosine([1,0], [0,1]) == 0

Совпадающие направления дают 1, ортогональные — 0. Отрицательные значения возможны. Порог 0,7 не имеет универсального значения для любых embedding-моделей: сравнивайте распределения на релевантных и нерелевантных парах своего корпуса. Самый близкий документ может всё равно не содержать ответа.

Продолжите разбор: Гибридный поиск в RAG: BM25, векторы и reranking.

Задача 1

Почему для документов и пользовательского запроса используют одну embedding-модель?

Выберите один вариант
Без регистрации · результат не сохраняется

Продолжить с сохранением прогресса

Перейдите к уроку в учебном кабинете.

Перейти к интерактивному уроку