Все ноды/AI/RAG

RRF-слияние

Объединяет несколько ранжированных списков чанков по Reciprocal Rank Fusion (rank-only, не зависит от шкал score). Ждёт все входящие ветки, затем сливает. Основа hybrid search.

RRF-слияние
Ranked listsContext
Query

Тип в графе: rrf_fusion

Exec

Можно включить ветку ошибки (expose_error_output) и обработать сбой отдельным путём.

Порты можно разделить на исполнение и данные (split ports).

Как попробовать

Минимальный рабочий воркфлоу

Вход
RRF-слияние
Выход
  • Исполнение + данные
Нажмите «Скопировать ноды», откройте редактор и нажмите Ctrl+V на холсте.

Запускается сразу

Как применять

Берите RRF-слияние, когда в графе несколько независимых веток поиска — по разным базам, с разными формулировками запроса, с разными фильтрами — а дальше должен идти один список. Оценки таких веток между собой несравнимы: 0.82 у одной модели и 0.82 у другой означают разное. RRF это обходит, потому что смотрит только на места в списках, а не на числа.

Не путайте с Переранжированием: оно переоценивает один список моделью и стоит денег, RRF склеивает несколько списков без всякой модели и бесплатно. Обычная связка — сначала слить ветки, потом переранжировать общий результат.

Как это работает

Все ветки приходят в один порт Ranked lists — отдельный вход на каждую заводить не нужно. Это барьер: нода ждёт, пока ни одна из подключённых веток не останется в работе. Ветка, которая была пропущена или упала, барьер не держит.

Каждая ветка остаётся отдельным списком — именно это отличает порт от обычной сборки, и именно на границах веток RRF и считает. Оценка чанка — сумма 1 / (k + место) по всем спискам, где он встретился. Отсюда два следствия: чанк, найденный двумя ветками, поднимается выше, а параметр «RRF k» управляет тем, насколько сильно первое место лучше десятого — чем больше k, тем ровнее вклад мест.

Дальше список режется по Top N и отдаётся в том же виде, что у RAG-запроса: context, chunks, query. Порт Query на слияние не влияет вовсе — он лишь кладёт текст запроса в вывод, чтобы его подхватил следующий шаг.

Частые ошибки

  • score читают как похожесть. После слияния там оценка RRF — доли сотой, своя шкала. Пороги релевантности от нод поиска к этим числам неприменимы.
  • Слияние одной ветки. Работы нет: список только переоценивается по местам и обрезается по Top N. Смысл появляется с двух веток.
  • Ожидание, что запрос повлияет на порядок. RRF не читает текст, он складывает места.
  • В порт подают не чанки. Ответ модели или произвольный объект распознать нечем — такая ветка превращается в пустой список и исчезает из слияния молча. Подавайте выводы RAG-запроса или Переранжирования.
  • Top N оставили по умолчанию перед реранком. Тогда реранкер увидит только десять кандидатов — для него это и есть весь пул.

Входы

ПортПроводДанныеПримечания
Ranked listslistsИсполнение + данныеexecute_data

несколько связей

QueryqueryДанныеdata

Выходы

ПортПроводДанныеПримечания
ContextoutputИсполнение + данныеexecute_dataobject

Настройки

ПолеТипПо умолчаниюОписание
Формат выводаformatstringtext

text: чанки, объединённые через ---. json: массив с метаданными.

Варианты: text — Текст, json — JSON

RRF kkinteger60

Константа сглаживания рангов. Большие значения делают весовое влияние рангов более плоским.

Top Ntop_ninteger10

Сколько объединённых результатов оставить.

Общие поля

Эти три поля есть у каждой ноды: платформа добавляет их сама, а не автор ноды.

  • expose_error_output — Если включено, показывает выход выполнения для подключения нод, которые запускаются при сбое этого шага.
  • split_ports_in — Показывать отдельные порты входа для выполнения и данных вместо одного объединённого.
  • split_ports_out — Показывать отдельные порты выхода для выполнения и данных вместо одного объединённого.