Зачем нужен реранкер в поиске
Векторный поиск сравнивает вопрос и фрагмент по отдельности, реранкер смотрит на них вместе. Отсюда и разница: он видит отрицание, которое вектор не видит.
Короткий ответ: реранкер — вторая модель, которая переупорядочивает результаты поиска, глядя на пару «вопрос + фрагмент» целиком. Векторный поиск так не умеет: он считает вектор вопроса и вектор фрагмента независимо и сравнивает их. Из-за этой независимости он и промахивается там, где смысл зависит от сочетания.
Самый дорогой промах — отрицание. «Возврат возможен» и «возврат невозможен» состоят почти из одних и тех же слов, употребляются в одинаковых контекстах и оказываются рядом в векторном пространстве. Для поиска они взаимозаменяемы, для пользователя — противоположны. Реранкер, который читает вопрос и фрагмент вместе, различает их заметно лучше — просто потому, что видит их как один текст.
Почему нельзя обойтись одним реранкером. Он дорог: считает пару, а не вектор, и прогнать его по всей базе нереально. Отсюда стандартная схема в два шага — векторный поиск достаёт полсотни кандидатов, реранкер переупорядочивает эти полсотни и отдаёт наверх пять.
Когда окупается. Если выдача выглядит «похожей, но не той» — то есть находится правильная тема и неправильное утверждение. Если же выдача выглядит случайной, проблема не в ранжировании, а раньше: в нарезке или в модели эмбеддингов.
Порядок, в котором я трогаю поиск: сначала нарезка по структуре, потом гибрид с полнотекстовым, потом реранкер, и только потом смена модели эмбеддингов. До последнего пункта на практике доходят редко.