Class: Mxrb::Semantic::VecStore
- Inherits:
-
Object
- Object
- Mxrb::Semantic::VecStore
- 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
- #backend ⇒ Object
-
#compatible? ⇒ Boolean
True when vectors represent this exact model and embedding backend.
- #dimension ⇒ Object
-
#initialize(mpr, embedder:, fingerprint:) ⇒ VecStore
constructor
A new instance of VecStore.
-
#rebuild!(artifacts) ⇒ Object
Replaces all vectors and marks the table with its source fingerprint.
-
#search(query, limit: 10) ⇒ Object
K-nearest-neighbour search.
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 = @fingerprint = fingerprint mpr.load_vec_extension! ensure_tables! end |
Class Method Details
.available? ⇒ 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
#backend ⇒ Object
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.
52 53 54 55 56 57 58 59 |
# File 'lib/mxrb/semantic/vec_store.rb', line 52 def compatible? stored = @mpr.(META_TABLE) return false unless stored stored == { backend: backend.to_s, dimension:, fingerprint: @fingerprint } end |
#dimension ⇒ Object
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.(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.(query) json = JSON.generate(vec) @mpr.vec_knn(VEC_TABLE, json, limit) end |