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.
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
- Execute + Data
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
scoreas 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
| Port | Wire | Payload | Notes |
|---|---|---|---|
Ranked listslists | Execute + Dataexecute_data | — | accepts many edges |
Queryquery | Datadata | — |
Outputs
| Port | Wire | Payload | Notes |
|---|---|---|---|
Contextoutput | Execute + Dataexecute_data | object |
Configuration
| Field | Type | Default | Description |
|---|---|---|---|
Output Formatformat | string | text | text: concatenated chunks separated by ---. json: array with metadata. Options: |
RRF kk | integer | 60 | Rank damping constant. Larger values flatten the rank weighting. |
Top Ntop_n | integer | 10 | 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.