Skip to main content
Glama
orneryd

M.I.M.I.R - Multi-agent Intelligent Memory & Insight Repository

by orneryd
reciprocal-rank-fusion.md8.51 kB
[**mimir v1.0.0**](../README.md) *** [mimir](../README.md) / utils/reciprocal-rank-fusion # utils/reciprocal-rank-fusion ## Classes ### ReciprocalRankFusion Defined in: src/utils/reciprocal-rank-fusion.ts:79 Reciprocal Rank Fusion implementation #### Constructors ##### Constructor > **new ReciprocalRankFusion**(`config`): [`ReciprocalRankFusion`](#reciprocalrankfusion) Defined in: src/utils/reciprocal-rank-fusion.ts:82 ###### Parameters ###### config `Partial`\<[`RRFConfig`](#rrfconfig)\> = `{}` ###### Returns [`ReciprocalRankFusion`](#reciprocalrankfusion) #### Methods ##### fuse() > **fuse**(`vectorResults`, `bm25Results`): [`RRFResult`](#rrfresult)[] Defined in: src/utils/reciprocal-rank-fusion.ts:125 Fuse multiple ranked lists using Reciprocal Rank Fusion Combines results from vector search (semantic) and BM25 search (keyword) into a single ranked list. This hybrid approach leverages the strengths of both search methods: - Vector search: Understands semantic meaning and context - BM25 search: Excels at exact keyword matching The RRF formula gives higher scores to documents that appear in both result sets and rank highly in either. Documents appearing in only one result set can still score well if they rank highly there. ###### Parameters ###### vectorResults [`SearchResult`](#searchresult)[] Results from vector/semantic search, ranked by cosine similarity ###### bm25Results [`SearchResult`](#searchresult)[] Results from BM25 keyword search, ranked by relevance score ###### Returns [`RRFResult`](#rrfresult)[] Fused results sorted by RRF score (highest first), with rank metadata ###### Example ```ts const rrf = new ReciprocalRankFusion({ k: 60 }); const vectorResults = [ { id: 'doc1', title: 'Machine Learning', similarity: 0.95, ... }, { id: 'doc2', title: 'Deep Learning', similarity: 0.88, ... } ]; const bm25Results = [ { id: 'doc2', title: 'Deep Learning', ... }, { id: 'doc3', title: 'Neural Networks', ... } ]; const fused = rrf.fuse(vectorResults, bm25Results); // doc2 appears in both lists, so it gets highest RRF score // Result: [doc2, doc1, doc3] with rrfScore, vectorRank, bm25Rank ``` ##### getAdaptiveConfig() > `static` **getAdaptiveConfig**(`query`): [`RRFConfig`](#rrfconfig) Defined in: src/utils/reciprocal-rank-fusion.ts:225 Get adaptive RRF configuration based on query characteristics Automatically selects the best RRF profile based on query length: - Short queries (1-2 words): Emphasize keyword matching (KEYWORD profile) Example: "docker compose" → Better with exact term matching - Long queries (6+ words): Emphasize semantic understanding (SEMANTIC profile) Example: "How do I configure Docker containers for production?" → Better with semantic search - Medium queries (3-5 words): Balanced approach (BALANCED profile) Example: "configure docker production" → Equal weight to both This adaptive approach improves search quality without requiring manual configuration for each query type. ###### Parameters ###### query `string` The search query string ###### Returns [`RRFConfig`](#rrfconfig) Optimized RRF configuration for the query type ###### Example ```ts // Short query - emphasizes keyword matching const config1 = ReciprocalRankFusion.getAdaptiveConfig('docker'); // Returns: { k: 60, vectorWeight: 0.5, bm25Weight: 1.5, ... } // Long query - emphasizes semantic understanding const config2 = ReciprocalRankFusion.getAdaptiveConfig( 'How do I set up a development environment with Docker and Node.js?' ); // Returns: { k: 60, vectorWeight: 1.5, bm25Weight: 0.5, ... } // Use adaptive config for search const rrf = new ReciprocalRankFusion( ReciprocalRankFusion.getAdaptiveConfig(userQuery) ); const results = rrf.fuse(vectorResults, bm25Results); ``` ## Interfaces ### RRFConfig Defined in: src/utils/reciprocal-rank-fusion.ts:19 Reciprocal Rank Fusion (RRF) Industry-standard method for combining ranked lists from multiple search algorithms. Used by Azure AI Search, Google Cloud, Weaviate, Elasticsearch, and others. Formula: RRF_score(doc) = Σ (weight_i / (k + rank_i)) Where: - k = constant (typically 60) - rank_i = rank of document in result set i (1-indexed) - weight_i = importance weight for result set i References: - https://plg.uwaterloo.ca/~gvcormac/cormacksigir09-rrf.pdf (Original paper) - https://learn.microsoft.com/en-us/azure/search/hybrid-search-ranking #### Properties ##### k > **k**: `number` Defined in: src/utils/reciprocal-rank-fusion.ts:20 ##### vectorWeight > **vectorWeight**: `number` Defined in: src/utils/reciprocal-rank-fusion.ts:21 ##### bm25Weight > **bm25Weight**: `number` Defined in: src/utils/reciprocal-rank-fusion.ts:22 ##### minScore > **minScore**: `number` Defined in: src/utils/reciprocal-rank-fusion.ts:23 *** ### SearchResult Defined in: src/utils/reciprocal-rank-fusion.ts:26 #### Extended by - [`RRFResult`](#rrfresult) #### Indexable \[`key`: `string`\]: `any` #### Properties ##### id > **id**: `string` Defined in: src/utils/reciprocal-rank-fusion.ts:27 ##### type > **type**: `string` Defined in: src/utils/reciprocal-rank-fusion.ts:28 ##### title > **title**: `string` \| `null` Defined in: src/utils/reciprocal-rank-fusion.ts:29 ##### description > **description**: `string` \| `null` Defined in: src/utils/reciprocal-rank-fusion.ts:30 ##### content\_preview > **content\_preview**: `string` Defined in: src/utils/reciprocal-rank-fusion.ts:31 ##### similarity? > `optional` **similarity**: `number` Defined in: src/utils/reciprocal-rank-fusion.ts:32 ##### avg\_similarity? > `optional` **avg\_similarity**: `number` Defined in: src/utils/reciprocal-rank-fusion.ts:33 *** ### RRFResult Defined in: src/utils/reciprocal-rank-fusion.ts:37 #### Extends - [`SearchResult`](#searchresult) #### Indexable \[`key`: `string`\]: `any` #### Properties ##### id > **id**: `string` Defined in: src/utils/reciprocal-rank-fusion.ts:27 ###### Inherited from [`SearchResult`](#searchresult).[`id`](#id) ##### type > **type**: `string` Defined in: src/utils/reciprocal-rank-fusion.ts:28 ###### Inherited from [`SearchResult`](#searchresult).[`type`](#type) ##### title > **title**: `string` \| `null` Defined in: src/utils/reciprocal-rank-fusion.ts:29 ###### Inherited from [`SearchResult`](#searchresult).[`title`](#title) ##### description > **description**: `string` \| `null` Defined in: src/utils/reciprocal-rank-fusion.ts:30 ###### Inherited from [`SearchResult`](#searchresult).[`description`](#description) ##### content\_preview > **content\_preview**: `string` Defined in: src/utils/reciprocal-rank-fusion.ts:31 ###### Inherited from [`SearchResult`](#searchresult).[`content_preview`](#content_preview) ##### similarity? > `optional` **similarity**: `number` Defined in: src/utils/reciprocal-rank-fusion.ts:32 ###### Inherited from [`SearchResult`](#searchresult).[`similarity`](#similarity) ##### avg\_similarity? > `optional` **avg\_similarity**: `number` Defined in: src/utils/reciprocal-rank-fusion.ts:33 ###### Inherited from [`SearchResult`](#searchresult).[`avg_similarity`](#avg_similarity) ##### rrfScore > **rrfScore**: `number` Defined in: src/utils/reciprocal-rank-fusion.ts:38 ##### vectorRank? > `optional` **vectorRank**: `number` Defined in: src/utils/reciprocal-rank-fusion.ts:39 ##### bm25Rank? > `optional` **bm25Rank**: `number` Defined in: src/utils/reciprocal-rank-fusion.ts:40 ## Variables ### DEFAULT\_RRF\_CONFIG > `const` **DEFAULT\_RRF\_CONFIG**: [`RRFConfig`](#rrfconfig) Defined in: src/utils/reciprocal-rank-fusion.ts:47 Default RRF configuration k=60 is the standard value from research *** ### RRF\_PROFILES > `const` **RRF\_PROFILES**: `object` Defined in: src/utils/reciprocal-rank-fusion.ts:57 Adaptive RRF profiles for different query types #### Type Declaration ##### SEMANTIC > **SEMANTIC**: `object` ###### SEMANTIC.k > **k**: `number` ###### SEMANTIC.minScore > **minScore**: `number` ###### SEMANTIC.vectorWeight > **vectorWeight**: `number` = `1.5` ###### SEMANTIC.bm25Weight > **bm25Weight**: `number` = `0.5` ##### KEYWORD > **KEYWORD**: `object` ###### KEYWORD.k > **k**: `number` ###### KEYWORD.minScore > **minScore**: `number` ###### KEYWORD.vectorWeight > **vectorWeight**: `number` = `0.5` ###### KEYWORD.bm25Weight > **bm25Weight**: `number` = `1.5` ##### BALANCED > **BALANCED**: [`RRFConfig`](#rrfconfig) = `DEFAULT_RRF_CONFIG`

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/orneryd/Mimir'

If you have feedback or need assistance with the MCP directory API, please join our Discord server