Notes

Short and frequent: a technique that worked, a link worth reading, a lesson from the week. Longer thinking lives in the essays.

Use rank fusion, not a single score, to match messy records

September 2, 2026retrievalreconciliationnotes

When matching a bank transaction to an open invoice, no single signal is reliable on its own. Vector similarity on the description catches paraphrases but is fooled by boilerplate. Semantic matching handles meaning but not identifiers. Counterparty identity is precise when present and useless when the payer name is truncated or misspelled.

The fix that held up in production was to run all three as separate ranked lists and fuse them with Reciprocal Rank Fusion: each candidate scores the sum of one over its rank in each list, plus a smoothing constant. A candidate that ranks well everywhere wins. A candidate that ranks first in one method and nowhere in the others does not, which is exactly the behavior you want when the methods fail differently.

Two practical notes. Normalize currencies before you rank, or cross-currency payments will never fuse. And treat disagreement between the lists as a confidence signal in its own right: when the fused top result is not clearly ahead, route the match to a human instead of guessing.