Class: Phronomy::VectorStore::InMemory

Inherits:
Base
  • Object
show all
Defined in:
lib/phronomy/vector_store/in_memory.rb

Overview

Pure-Ruby in-memory vector store using cosine similarity.

Intended for tests, short-lived agents, and Retrieval::Semantic scenarios where the message count is small enough that a linear scan is fast enough.

Examples:

store = Phronomy::VectorStore::InMemory.new
store.add(id: "1", embedding: [0.1, 0.9], metadata: { message: msg })
results = store.search(query_embedding: [0.1, 0.8], k: 3)

Instance Method Summary collapse

Constructor Details

#initializeInMemory

Returns a new instance of InMemory.



15
16
17
18
# File 'lib/phronomy/vector_store/in_memory.rb', line 15

def initialize
  @documents = {}
  @mutex = Mutex.new
end

Instance Method Details

#add(id:, embedding:, metadata: {}) ⇒ Object

Parameters:

  • id (String)
  • embedding (Array<Float>)
  • metadata (Hash) (defaults to: {})


23
24
25
26
# File 'lib/phronomy/vector_store/in_memory.rb', line 23

def add(id:, embedding:, metadata: {})
  @mutex.synchronize { @documents[id] = {embedding: embedding, metadata: } }
  self
end

#clearObject



45
46
47
48
# File 'lib/phronomy/vector_store/in_memory.rb', line 45

def clear
  @mutex.synchronize { @documents.clear }
  self
end

#remove(id:) ⇒ Object



40
41
42
43
# File 'lib/phronomy/vector_store/in_memory.rb', line 40

def remove(id:)
  @mutex.synchronize { @documents.delete(id) }
  self
end

#search(query_embedding:, k: 5) ⇒ Array<Hash>

Returns sorted by descending score.

Parameters:

  • query_embedding (Array<Float>)
  • k (Integer) (defaults to: 5)

Returns:

  • (Array<Hash>)

    sorted by descending score



31
32
33
34
35
36
37
38
# File 'lib/phronomy/vector_store/in_memory.rb', line 31

def search(query_embedding:, k: 5)
  snapshot = @mutex.synchronize { @documents.dup }
  results = snapshot.map do |id, doc|
    score = cosine_similarity(query_embedding, doc[:embedding])
    {id: id, score: score, metadata: doc[:metadata]}
  end
  results.sort_by { |r| -r[:score] }.first(k)
end

#sizeInteger

Returns number of documents stored.

Returns:

  • (Integer)

    number of documents stored



51
52
53
# File 'lib/phronomy/vector_store/in_memory.rb', line 51

def size
  @mutex.synchronize { @documents.size }
end