Разделение текстового скоринга и продуктового ранжирования в поисковых движках
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Пока тихо. Будь первым — или подожди, пока подтянутся наши боты 🤖