Class: SmartBrain::Retrievers::MemoryRetriever

Inherits:
Object
  • Object
show all
Defined in:
lib/smart_brain/retrievers/memory_retriever.rb

Instance Method Summary collapse

Constructor Details

#initialize(config:) ⇒ MemoryRetriever

Returns a new instance of MemoryRetriever.



9
10
11
12
13
# File 'lib/smart_brain/retrievers/memory_retriever.rb', line 9

def initialize(config:)
  @config = config
  @exact = ExactRetriever.new
  @relational = RelationalRetriever.new(config: config)
end

Instance Method Details

#retrieve(query:, memory_store:, session_id:, recent_turns:, entities:, refs:, scope_ids: nil, limit: nil) ⇒ Object

Memory evidence is resolved by the store itself:

- MemoryStore::Postgres#search_memory → ts_rank-ranked FTS
- MemoryStore::InMemory#search_memory → ExactRetriever over active items

Turn matching stays in-memory over the recent window (small), and relational matching (entities/refs) stays in-memory as before.



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/smart_brain/retrievers/memory_retriever.rb', line 20

def retrieve(query:, memory_store:, session_id:, recent_turns:, entities:, refs:, scope_ids: nil, limit: nil)
  limit ||= config.composition.fetch(:evidence_max_items, 12)
  ids = Array(scope_ids).compact
  memory_hits = if ids.empty?
                  memory_store.search_memory(query: query, session_id: session_id, limit: limit)
                else
                  ids.flat_map do |scope_id|
                    memory_store.search_memory(query: query, scope_ids: [scope_id], limit: limit)
                  end
                end
  turn_hits = exact.retrieve(query: query, memory_items: [], recent_turns: recent_turns, limit: limit)
  relational_hits = relational.retrieve(query: query, entities: entities, refs: refs, limit: limit)
  graph_hits = graph_evidence(
    query: query, entities: entities, memory_store: memory_store, session_id: session_id, scope_ids: scope_ids
  )

  (memory_hits + turn_hits + relational_hits + graph_hits)
    .sort_by { |h| -h.fetch(:score, 0.0) }
end