Semantic Search
Семантический поиск ранжирует документы и изображения по смыслу запроса, а не по точному совпадению слов, используя эмбеддинги, поиск ближайших соседей и переранжировщики.
Семантический поиск ранжирует документы, изображения и другие объекты по смысловому сходству с запросом, а не по общим с ним словам. По запросу «мой кот голоден» может найтись страница с названием «График кормления нового котёнка», хотя в запросе и названии нет общих слов. Современные системы используют для этого эмбеддинги: нейронный кодировщик преобразует запросы и объекты в векторы, которые оказываются рядом, если их смысл похож, а векторный поиск находит ближайшие объекты. Веб-поиск начал двигаться в этом направлении в 2019 году, когда Google начала применять BERT для понимания поисковых запросов. По словам компании, это изменение затронуло каждый десятый поиск на английском языке в США.
Принцип работы семантического поиска#
Большинство систем семантического поиска находят результаты с помощью двухкодировочной модели, а затем уточняют их с помощью переранжировщика. Двухкодировочная модель заранее преобразует каждый документ в эмбеддинг, а векторы сохраняются в векторной базе данных. Во время запроса в эмбеддинг преобразуется только запрос, а индекс приближённого поиска ближайших соседей возвращает лучшие кандидаты по косинусному сходству. Sentence-BERT (2019) сделал такой подход практичным для предложений: поиск наиболее похожей пары среди 10 000 предложений занимал около 65 часов с перекрёстным кодировщиком BERT и около 5 секунд с эмбеддингами предложений. Затем Dense Passage Retrieval (2020) показала, что обученные эмбеддинги превосходят ранжирование ключевых слов BM25 на 9–19 процентных пунктов по точности поиска фрагментов в топ-20 для задач ответов на вопросы открытого домена. Наконец, перекрёстный кодировщик переранжировщика совместно обрабатывает запрос и каждого кандидата, чтобы точнее упорядочить короткий список.
Этот пример с помощью библиотеки Sentence Transformers сравнивает совпадение слов и сходство эмбеддингов:
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")
documents = [
"How to reset a forgotten account password",
"Feeding schedule for a new kitten",
"Quarterly sales report for the retail division",
"Best hiking trails near Denver",
]
query = "my cat is hungry"
# Keyword search: documents sharing at least one word with the query
query_words = set(query.lower().split())
print("Keyword matches:", [d for d in documents if query_words & set(d.lower().split())])
# Semantic search: rank documents by cosine similarity of their embeddings
doc_embeddings = model.encode(documents)
query_embedding = model.encode(query)
scores = model.similarity(query_embedding, doc_embeddings)[0]
best = int(scores.argmax())
print(f"Semantic match: {documents[best]!r} (cosine {scores[best]:.2f})")Поиск по ключевым словам возвращает пустой список, потому что ни один документ не содержит слов «мой», «кот», «голоден». Семантический поиск находит график кормления котёнка с косинусным сходством 0,56 — это документ, наиболее близкий по смыслу.
Семантический поиск и связанные термины#
- Поиск по ключевым словам: ранжирует документы по точным совпадениям терминов с помощью таких формул, как BM25. Он хорошо работает с именами, номерами деталей и редкими словами, которые эмбеддинги могут размывать, но пропускает синонимы и перефразировки.
- Гибридный поиск: выполняет поиск по ключевым словам и семантический поиск вместе, а затем объединяет результаты. Это распространённый подход в производственных системах поиска и RAG.
- Семантическая сегментация: не связанная с семантическим поиском задача компьютерного зрения, в которой каждому пикселю изображения присваивается класс; эти термины объединяет только слово «семантический».
- Семантическое кэширование: применяет то же сопоставление по смыслу к запросам LLM и повторно использует сохранённый ответ, если новый запрос означает то же, что и предыдущий.
Примеры применения в реальных условиях#
- Генерация с дополнением за счёт поиска (RAG): находит фрагменты, необходимые языковой модели, даже если пользователь формулирует запрос не так, как документация.
- Поиск патентов: находит предшествующий уровень техники, описывающий то же изобретение другими терминами.
- Поиск товаров в розничной торговле: находит водонепроницаемые кроссовки по запросу вроде «обувь для поездок на работу в дождь», хотя в описаниях товаров таких слов нет.
- Рекомендательные системы: предлагают статьи или товары, эмбеддинги которых близки к эмбеддингам объектов, уже выбранных пользователем.
Поиск изображений по смыслу#
Модели, обученные с помощью контрастивного обучения на парах «изображение — подпись», например CLIP, преобразуют текст и изображения в общее пространство эмбеддингов, поэтому текстовый запрос может находить фотографии без тегов и подписей. Так устроено решение Ultralytics для семантического поиска изображений: его класс VisualAISearch один раз преобразует каждое изображение в папке в эмбеддинг с помощью CLIP, преобразует каждый текстовый запрос в то же пространство и возвращает до 30 изображений с косинусным сходством выше порогового значения, упорядоченных от наиболее до наименее похожих. Запрос вроде «собака сидит на скамейке» находит соответствующие фотографии в коллекции без меток.










