All nodes/AI/RAG

RRF Fusion

Merges several ranked lists of chunks using Reciprocal Rank Fusion (rank-only, independent of score scales). Waits for all incoming branches, then fuses. The basis of hybrid search.

RRF Fusion
Ranked listsContext
Query

Type in the graph: rrf_fusion

Exec

An error branch can be enabled (expose_error_output) to handle failures on their own path.

Ports can be split into separate execution and data handles.

Try it

Minimal working workflow

Entry
RRF Fusion
Exit
  • Execute + Data
Press “Copy nodes”, open the editor and hit Ctrl+V on the canvas.

Runs as pasted

When to use it

Reach for RRF Fusion when the graph has several independent retrieval branches — different bases, different phrasings of the query, different filters — and one list has to come out of them. Scores from such branches are not comparable: 0.82 from one model and 0.82 from another mean different things. RRF sidesteps that by looking only at positions in the lists, not at the numbers.

Do not confuse it with Rerank: that re-scores one list with a model and costs money, RRF merges several lists with no model and for free. The usual pair is to fuse the branches first, then rerank the result.

How it works

Every branch arrives at a single Ranked lists port — no input per branch is needed. It is a barrier: the node waits until none of the connected branches is still running. A branch that was skipped or failed does not hold it.

Each branch stays a list of its own — those boundaries are exactly what RRF counts on. A chunk’s score is the sum of 1 / (k + position) over every list it appeared in. Two consequences follow: a chunk found by two branches rises, and the RRF k parameter controls how much better first place is than tenth — the larger k, the flatter the contribution of positions.

The list is then cut to Top N and handed on in the same shape as RAG Query: context, chunks, query. The Query port does not affect the merge at all — it only places the query text into the output for the next step.

Common mistakes

  • Reading score as similarity. After the merge it is an RRF score — hundredths, on its own scale. Score thresholds from the retrieval nodes do not apply to these numbers.
  • Fusing a single branch. There is nothing to do: the list is merely re-scored by position and cut to Top N. The point appears with two branches.
  • Expecting the query to change the order. RRF does not read text, it adds up positions.
  • Feeding the port something other than chunks. A model reply cannot be recognised — such a branch becomes an empty list and drops out silently. Feed it RAG Query or Rerank output.
  • Leaving Top N at its default before a rerank. The reranker then sees ten candidates only, and for it that is the entire pool.

Inputs

PortWirePayloadNotes
Ranked listslistsExecute + Dataexecute_data

accepts many edges

QueryqueryDatadata

Outputs

PortWirePayloadNotes
ContextoutputExecute + Dataexecute_dataobject

Configuration

FieldTypeDefaultDescription
Output Formatformatstringtext

text: concatenated chunks separated by ---. json: array with metadata.

Options: text — Text, json — JSON

RRF kkinteger60

Rank damping constant. Larger values flatten the rank weighting.

Top Ntop_ninteger10

Number of fused results to keep.

Shared fields

Every node has these three — the platform adds them, not the node author.

  • expose_error_output — When enabled, show an execution output to connect nodes that run if this step fails.
  • split_ports_in — Show separate execution and data input handles instead of one combined port.
  • split_ports_out — Show separate execution and data output handles instead of one combined port.