Class: Llmemory::VectorStore::MemoryStore
- Defined in:
- lib/llmemory/vector_store/memory_store.rb
Instance Method Summary collapse
- #delete(id:, user_id: nil) ⇒ Object
- #embed(text) ⇒ Object
-
#initialize(embedding_provider: nil, cipher: nil) ⇒ MemoryStore
constructor
A new instance of MemoryStore.
- #last_usage ⇒ Object
- #search(query_embedding, top_k: 10, user_id: nil) ⇒ Object
- #search_by_text(query_text, top_k: 10, user_id: nil) ⇒ Object
- #store(id:, embedding:, metadata: {}, user_id: nil) ⇒ Object
Constructor Details
#initialize(embedding_provider: nil, cipher: nil) ⇒ MemoryStore
Returns a new instance of MemoryStore.
8 9 10 11 12 |
# File 'lib/llmemory/vector_store/memory_store.rb', line 8 def initialize(embedding_provider: nil, cipher: nil) @entries = {} @embedding_provider = @cipher = cipher || Llmemory.build_cipher end |
Instance Method Details
#delete(id:, user_id: nil) ⇒ Object
58 59 60 61 62 63 64 65 |
# File 'lib/llmemory/vector_store/memory_store.rb', line 58 def delete(id:, user_id: nil) if user_id @entries.delete("#{user_id}:#{id}") else @entries.delete_if { |_key, data| data[:source_id].to_s == id.to_s } end true end |
#embed(text) ⇒ Object
14 15 16 17 |
# File 'lib/llmemory/vector_store/memory_store.rb', line 14 def (text) return Array.new(1536, 0.0) unless @embedding_provider&.respond_to?(:embed) @embedding_provider.(text) end |
#last_usage ⇒ Object
19 20 21 22 23 |
# File 'lib/llmemory/vector_store/memory_store.rb', line 19 def last_usage return @embedding_provider.last_usage if @embedding_provider&.respond_to?(:last_usage) Llmemory::LLM::Usage.zero end |
#search(query_embedding, top_k: 10, user_id: nil) ⇒ Object
41 42 43 44 45 46 47 48 49 50 |
# File 'lib/llmemory/vector_store/memory_store.rb', line 41 def search(, top_k: 10, user_id: nil) query = .to_a.map(&:to_f) return [] if query.empty? entries = user_id ? @entries.select { |k, _| k.to_s.start_with?("#{user_id}:") } : @entries scores = entries.map do |_key, data| sim = cosine_similarity(query, data[:embedding]) { id: data[:source_id], score: sim, metadata: (data[:metadata]) } end scores.sort_by { |s| -s[:score] }.first(top_k) end |
#search_by_text(query_text, top_k: 10, user_id: nil) ⇒ Object
52 53 54 55 56 |
# File 'lib/llmemory/vector_store/memory_store.rb', line 52 def search_by_text(query_text, top_k: 10, user_id: nil) return [] unless @embedding_provider&.respond_to?(:embed) = @embedding_provider.(query_text) search(, top_k: top_k, user_id: user_id) end |
#store(id:, embedding:, metadata: {}, user_id: nil) ⇒ Object
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
# File 'lib/llmemory/vector_store/memory_store.rb', line 25 def store(id:, embedding:, metadata: {}, user_id: nil) key = user_id ? "#{user_id}:#{id}" : id.to_s = ( || {}).dup if ["text"] && @cipher.enabled? ["text"] = @cipher.encrypt(["text"].to_s) elsif [:text] && @cipher.enabled? [:text] = @cipher.encrypt([:text].to_s) end @entries[key] = { source_id: id.to_s, embedding: .to_a.map(&:to_f), metadata: .merge("user_id" => user_id) } id end |