Class: Mxrb::Semantic::VecStore

Inherits:
Object
  • Object
show all
Defined in:
lib/mxrb/semantic/vec_store.rb

Overview

Manages the _MxrbVecIndex virtual table (sqlite-vec) inside an .mpr file. Optional: if the sqlite-vec gem is not installed this object is never created and Index falls back to regex search transparently.

Constant Summary collapse

META_TABLE =
'_MxrbVecMeta'
VEC_TABLE =
'_MxrbVecIndex'

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(mpr, embedder:, fingerprint:) ⇒ VecStore

Returns a new instance of VecStore.



22
23
24
25
26
27
28
# File 'lib/mxrb/semantic/vec_store.rb', line 22

def initialize(mpr, embedder:, fingerprint:)
  @mpr = mpr
  @embedder = embedder
  @fingerprint = fingerprint
  mpr.load_vec_extension!
  ensure_tables!
end

Class Method Details

.available?Boolean

Returns:

  • (Boolean)


15
16
17
18
19
20
# File 'lib/mxrb/semantic/vec_store.rb', line 15

def self.available?
  require 'sqlite_vec'
  true
rescue LoadError
  false
end

Instance Method Details

#backendObject



30
# File 'lib/mxrb/semantic/vec_store.rb', line 30

def backend   = @embedder.backend

#compatible?Boolean

True when vectors represent this exact model and embedding backend.

Returns:

  • (Boolean)


52
53
54
55
56
57
58
59
# File 'lib/mxrb/semantic/vec_store.rb', line 52

def compatible?
  stored = @mpr.vec_meta(META_TABLE)
  return false unless stored

  stored == {
    backend: backend.to_s, dimension:, fingerprint: @fingerprint
  }
end

#dimensionObject



31
# File 'lib/mxrb/semantic/vec_store.rb', line 31

def dimension = @embedder.dimension

#rebuild!(artifacts) ⇒ Object

Replaces all vectors and marks the table with its source fingerprint.



34
35
36
37
38
39
40
41
42
# File 'lib/mxrb/semantic/vec_store.rb', line 34

def rebuild!(artifacts)
  @mpr.vec_drop_index!(VEC_TABLE, META_TABLE)
  ensure_tables!
  @mpr.vec_transaction do
    artifacts.each { upsert(_1.id, Embedder.artifact_text(_1)) }
    @mpr.write_vec_meta!(META_TABLE, backend.to_s, dimension, @fingerprint)
  end
  self
end

#search(query, limit: 10) ⇒ Object

K-nearest-neighbour search. Returns [distance:] sorted by distance.



45
46
47
48
49
# File 'lib/mxrb/semantic/vec_store.rb', line 45

def search(query, limit: 10)
  vec = @embedder.embed(query)
  json = JSON.generate(vec)
  @mpr.vec_knn(VEC_TABLE, json, limit)
end