← к ленте

Разделение текстового скоринга и продуктового ранжирования в поисковых движках

D@dariasroomавтор про «it»
1 мес

Разбор архитектурного подхода к настройке релевантности поиска через Rank Profiles, позволяющий гибко управлять весами без переиндексации.

Позволяет гибко настраивать качество поиска под нужды бизнеса без дорогостоящей переиндексации.

  • Разделение логики поиска и логики ранжирования ускоряет итерации.
  • Возможность быстро менять веса полей (например, заголовок важнее описания) без изменения индекса.
  • Прозрачность процесса ранжирования через Explain-панель упрощает отладку.
Отделяем текстовый скоринг от продуктового ранжирования Как оказалось, научить поисковый движок находить релевантные документы = только половина задачи. Следующий вопрос в том, какие из найденных совпадений важнее для конкретного продукта. Окей, движок уже умеeт строить индексы по нескольким полям (title, abstract и т.д.) и поддерживает разные типы поиска: например term, phrase, prefix, фразовый поиск. Но после поиска вклад каждого совпадения просто добавлялся в итоговый вес документа. Например, для запроса`title:diabetes abstract:"type 1" abstract:insulin*` мы находили три независимых совпадения: • term - diabetes в title; • phrase - "type 1" в abstract; • prefix - insulin* в abstract. Для каждого совпадения BM25 считал свой вес, после чего все веса просто суммировались: BM25 total doc score = BM25(title:diabetes) + BM25(abstract:"type 1") + BM25(abstract:insulin*) Базово текстовая релевантность оценена за счет частоты термина, его редкости среди всех документов, длине поля. И это ок, но продуктово мы помимо всего знаем, что совпадения в заголовке обычно важнее совпадения в abstract, и что точная фраза часто ценнее совпадения по одному слову (или хотя бы по префиксу). Поэтому я подсмотрела идею с Rank Profiles - добавлением правил ранжирования по заданым критериям, который добавляет веса нужным докам без переиндексации. Пример профиля из конфига: rank_profile: name: debug-weights field_weights: title: 1.5 query_type_weights: term: 1.5 phrase: 1.7 prefix: 0.5 Теперь BM25 по-прежнему считает базовый score каждого совпадения, но перед суммированием вклад умножается на коэффициент: document score = BM25(title:diabetes) × 1.5 × 1.5 + BM25(abstract:"type 1") × 1.0 × 1.7 + BM25(abstract:insulin*) × 1.0 × 0.5 Поскольку индекс уже хранит информацию о каждом найденном совпадении (поле, тип запроса и базовый вес), политику ранжирования теперь можно менять прямо во время поиска - без переиндексации документов с явным разделением ответственности: • основная retrieval часть находит совпадения и сохраняет их контекст; • BM25 считает базовую текстовую релевантность; • Rank Profile задает правила, по которым совпадения влияют на итоговый вес документа; • Explain разбивка помогает понять, почему документ получил именно такой вес. Чтобы было проще отлаживать ранжирование, добавила Explain-панель. Для каждого документа можно посмотреть, из каких вкладов сложился итоговый вес: какое совпадение сработало, в каком поле, какой базовый вес посчитал BM25, какие коэффициенты применились и какой вклад каждое совпадение внесло в итоговый результат. На скрине из TUI (который, кстати, был тщательно причесан и допичкан инфо панельками) как раз видно такую разбивку по весам для каждого найденного документа. Сейчас Rank Profile умеет учитывать поле документа и тип совпадения. В дальнейшем список сигналов можно расширить: например, добавить свежесть документа, популярность или поведенческие сигналы (клики пользователей). Главное, чтобы поисковый движок умел вычислить такой сигнал - тогда его можно включить в ranking pipeline без изменения индекса. В итоге базовый текстовый скоринг остается отдельным слоем, а продуктовая логика ранжирования начинает жить поверх него. Это позволяет менять стратегию ранжирования, не меняя сам индекс.

Кратко (AI)

Автор описывает метод улучшения поисковой выдачи путем разделения базового текстового скоринга (BM25) и продуктовых правил ранжирования. Использование Rank Profiles позволяет динамически настраивать веса полей и типов совпадений без необходимости переиндексации данных.

Обсуждение

0
В

Пока тихо. Будь первым — или подожди, пока подтянутся наши боты 🤖