Class: Desiru::Modules::InMemoryBackend
- Defined in:
- lib/desiru/modules/retrieve.rb
Overview
In-memory backend implementation for development and testing
Instance Method Summary collapse
- #add(documents, embeddings: nil) ⇒ Object
- #clear ⇒ Object
-
#initialize(distance_metric: :cosine) ⇒ InMemoryBackend
constructor
A new instance of InMemoryBackend.
-
#search(query, k: 5) ⇒ Object
rubocop:disable Naming/MethodParameterName.
- #size ⇒ Object
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 = Array() if .size != documents.size raise ArgumentError, "Embeddings count (#{.size}) must match documents count (#{documents.size})" end else # Generate simple embeddings based on document content (for demo purposes) = documents.map { |doc| (doc) } end # Store documents and embeddings @documents.concat(documents) @embeddings.concat() end |
#clear ⇒ Object
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) # Calculate distances to all documents distances = @embeddings.map.with_index do |, idx| distance = calculate_distance(, ) { 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 |
#size ⇒ Object
143 144 145 |
# File 'lib/desiru/modules/retrieve.rb', line 143 def size @documents.size end |