Все ноды/AI/RAG
RRF-слияние
Объединяет несколько ранжированных списков чанков по Reciprocal Rank Fusion (rank-only, не зависит от шкал score). Ждёт все входящие ветки, затем сливает. Основа hybrid search.
Тип в графе: rrf_fusion
Exec
Можно включить ветку ошибки (expose_error_output) и обработать сбой отдельным путём.
Порты можно разделить на исполнение и данные (split ports).
Как попробовать
Минимальный рабочий воркфлоу
- Исполнение + данные
Запускается сразу
Как применять
Берите 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_data | object |
Настройки
| Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
Формат выводаformat | string | text | text: чанки, объединённые через ---. json: массив с метаданными. Варианты: |
RRF kk | integer | 60 | Константа сглаживания рангов. Большие значения делают весовое влияние рангов более плоским. |
Top Ntop_n | integer | 10 | Сколько объединённых результатов оставить. |
Общие поля
Эти три поля есть у каждой ноды: платформа добавляет их сама, а не автор ноды.
expose_error_output— Если включено, показывает выход выполнения для подключения нод, которые запускаются при сбое этого шага.split_ports_in— Показывать отдельные порты входа для выполнения и данных вместо одного объединённого.split_ports_out— Показывать отдельные порты выхода для выполнения и данных вместо одного объединённого.