Class: SwarmSDK::V3::Memory::Retriever
- Inherits:
-
Object
- Object
- SwarmSDK::V3::Memory::Retriever
- Defined in:
- lib/swarm_sdk/v3/memory/retriever.rb
Overview
Hybrid search retriever combining semantic and keyword search
Uses reciprocal rank fusion (RRF) to combine results from:
-
Semantic search via FAISS vector similarity
-
Keyword search via text matching
-
Graph expansion via 1-hop edge traversal
Instance Method Summary collapse
-
#initialize(adapter:, embedder:, semantic_weight: 0.5, keyword_weight: 0.5) ⇒ Retriever
constructor
A new instance of Retriever.
-
#search(query, top_k: 15) ⇒ Array<Card>
Search for relevant memory cards.
Constructor Details
#initialize(adapter:, embedder:, semantic_weight: 0.5, keyword_weight: 0.5) ⇒ Retriever
Returns a new instance of Retriever.
21 22 23 24 25 26 27 |
# File 'lib/swarm_sdk/v3/memory/retriever.rb', line 21 def initialize(adapter:, embedder:, semantic_weight: 0.5, keyword_weight: 0.5) @adapter = adapter @embedder = @semantic_weight = semantic_weight @keyword_weight = keyword_weight @config = Configuration.instance end |
Instance Method Details
#search(query, top_k: 15) ⇒ Array<Card>
Search for relevant memory cards
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
# File 'lib/swarm_sdk/v3/memory/retriever.rb', line 37 def search(query, top_k: 15) DebugLog.log("retriever", "search: query=#{query[0..60].inspect}, top_k=#{top_k}") semantic_results = DebugLog.time("retriever", "semantic_search(#{top_k * 2})") do semantic_search(query, top_k: top_k * 2) end keyword_results = DebugLog.time("retriever", "keyword_search(#{top_k * 2})") do keyword_search(query, top_k: top_k * 2) end DebugLog.log("retriever", "semantic=#{semantic_results.size} keyword=#{keyword_results.size}") # Reciprocal rank fusion fused = DebugLog.time("retriever", "rrf") do reciprocal_rank_fusion(semantic_results, keyword_results) end # Graph expansion: add 1-hop neighbors of top results = DebugLog.time("retriever", "graph_expand") do (fused.take(top_k), top_k: top_k) end DebugLog.log("retriever", "fused=#{fused.size} expanded=#{.size} returning=#{[.size, top_k].min}") # Return unique cards, limited to top_k .take(top_k) end |