Class: Desiru::Modules::InMemoryBackend

Inherits:
Backend
  • Object
show all
Defined in:
lib/desiru/modules/retrieve.rb

Overview

In-memory backend implementation for development and testing

Instance Method Summary collapse

Constructor Details

#initialize(distance_metric: :cosine) ⇒ InMemoryBackend

Returns a new instance of InMemoryBackend.



86
87
88
89
90
91
# File 'lib/desiru/modules/retrieve.rb', line 86

def initialize(distance_metric: :cosine)
  super()
  @documents = []
  @embeddings = []
  @distance_metric = distance_metric
end

Instance Method Details

#add(documents, embeddings: nil) ⇒ Object



93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/desiru/modules/retrieve.rb', line 93

def add(documents, embeddings: nil)
  documents = Array(documents)

  # If embeddings provided, they must match document count
  if embeddings
    embeddings = Array(embeddings)
    if embeddings.size != documents.size
      raise ArgumentError, "Embeddings count (#{embeddings.size}) must match documents count (#{documents.size})"
    end
  else
    # Generate simple embeddings based on document content (for demo purposes)
    embeddings = documents.map { |doc| generate_simple_embedding(doc) }
  end

  # Store documents and embeddings
  @documents.concat(documents)
  @embeddings.concat(embeddings)
end

#clearObject



138
139
140
141
# File 'lib/desiru/modules/retrieve.rb', line 138

def clear
  @documents.clear
  @embeddings.clear
end

#search(query, k: 5) ⇒ Object

rubocop:disable Naming/MethodParameterName



112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# File 'lib/desiru/modules/retrieve.rb', line 112

def search(query, k: 5) # rubocop:disable Naming/MethodParameterName
  return [] if @documents.empty?

  # Generate query embedding
  query_embedding = generate_simple_embedding(query)

  # Calculate distances to all documents
  distances = @embeddings.map.with_index do |embedding, idx|
    distance = calculate_distance(query_embedding, embedding)
    { document: @documents[idx], score: distance, index: idx }
  end

  # Sort by distance (ascending for distance, would be descending for similarity)
  sorted = case @distance_metric
           when :cosine
             # For cosine similarity, higher is better, so sort descending
             distances.sort_by { |d| -d[:score] }
           else
             # For distance metrics, lower is better
             distances.sort_by { |d| d[:score] }
           end

  # Return top k results
  sorted.first(k)
end

#sizeObject



143
144
145
# File 'lib/desiru/modules/retrieve.rb', line 143

def size
  @documents.size
end