Урок курса
Семантический поиск и эмбеддинги: как это работает
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-модель?
Продолжить с сохранением прогресса
Перейдите к уроку в учебном кабинете.
